[Scummvm-cvs-logs] scummvm master -> 0638308ef13727b4b359d98d54bc09156752aaaa

sev- sev at scummvm.org
Wed May 15 18:28:07 CEST 2013


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

Summary:
52e0ac85db NEVERHOOD: First code with basic detection, nothing else so far
3b00cfa669 NEVERHOOD: Start with the blb archive class
70d20096c1 NEVERHOOD: Start with the resource manager
7d5d5f139f NEVERHOOD: Start with graphics code (bitmap parsing and rle decompression)
a262055df2 NEVERHOOD: Start with the BaseSurface class (doesn't do much yet)
108368e9b5 NEVERHOOD: Add more
eb5ab30ce0 NEVERHOOD: More work on the Palette class
4a01a69e37 NEVERHOOD: Start with Module and GameModule classes
ce4ef688b3 NEVERHOOD: Add skeleton for Module1500 (the intro module)
aded2a104b NEVERHOOD: Start with Scene and Sprite classes
0614b288cf NEVERHOOD: Add default parameters to StaticSprite constructors
f01f9343c8 NEVERHOOD: Start with AnimatedSprite and AnimResource
3c82668fe4 NEVERHOOD: More work on Module1500
44ab81eab8 NEVERHOOD: Start with the Screen class, also
1285b37b32 NEVERHOOD: Start with the Background and DirtyBackground classes
bd1749863e NEVERHOOD: Start with the Palette2 class (which needs a better name later)
21eb88053c NEVERHOOD: Implement SmackerScene, SmackerPlayer and related stuff
9d0e90bcd2 NEVERHOOD: Add skeleton for Module1000
ae4ef4e66d NEVERHOOD: Add StaticData class
6b71d17792 NEVERHOOD: Start with the CollisionMan class
056b69f0c8 NEVERHOOD: Module1000 and Scene1001 skeletons
97f319c945 NEVERHOOD: More work on Scene1001, implement Class509 (yes, will be renamed later) and AnimResource related stuff
e6236a3978 NEVERHOOD: Add transparency and x flipping to sprite drawing (flip y still TODO but rarely used)
5a34d20ec8 NEVERHOOD: More work on Scene1001, also give sprites classes and vars some better names
88d2759f85 NEVERHOOD: Start with the Klayman class (this is quite some horrible code, also, it doesn't work yet and isn't used yet)
3131cc6f18 NEVERHOOD: Implement Klayman::update
c694ce8505 NEVERHOOD: More work on Klayman
78d632b0ed NEVERHOOD: Commit of create_neverhood and neverhood.dat
5c69ae21dd NEVERHOOD: More work on Klayman (still eye cancerous code)
222cd4a651 NEVERHOOD: More work on Scene1001 and Klayman
ed863b65b5 NEVERHOOD: More work on Scene1001/Klayman
6d81ef0199 NEVERHOOD: Implement game vars
c39fb81951 NEVERHOOD: More work on Scene1001/Klayman
9f6e6c6f7f NEVERHOOD: Implement MouseCursorResource and Mouse433 mouse cursor
626cea6d1c NEVERHOOD: Implement Mouse435
be8d542264 NEVERHOOD: Updated tables.h with data from Scene1002
92e08f21ed NEVERHOOD: Start with Scene1002 (a lot incomplete)
ffe024844b NEVERHOOD: More work on Scene1002
b611b65bf4 NEVERHOOD: Change addHitRect to use an explicit count
436f8952bb NEVERHOOD: More work on Scene1002, Klayman and the rest
2647778935 NEVERHOOD: Fix crash/corruption in clipped sprite drawing
8a5c4a84d0 NEVERHOOD: Implement color replace in AnimatedSprite
78365121ea NEVERHOOD: Add NavigationLists in create_neverhood
db9e45706c NEVERHOOD: More work on Scene1002
0bfb52df74 NEVERHOOD: Implement NavigationScene
a23b694c94 NEVERHOOD: Implement Scene1005
71da221507 NEVERHOOD: Implement Scene1004
438b6bb53c NEVERHOOD: Implement Module2300 (just a bunch of NavigationScenes)
b1377ab153 NEVERHOOD: Add entries for Module2300
720050bec1 NEVERHOOD: Start with Module1200/Scene1201 (not complete yet)
0632fc7dda NEVERHOOD: Add tables for Scene1201
f162516f25 NEVERHOOD: More work on Scene1201
04d2b9a402 NEVERHOOD: Add entries for Scene1401, Scene1402 and Scene1705
bfd71cff6e NEVERHOOD: New modules Module1200, Module1400, Module1700 and Module1800
d7dd4b4356 NEVERHOOD: Implement Scene1403, Scene1404 and Scene1405 (memory minigame)
ad7c50d593 NEVERHOOD: Add more tables
08be9cde7b NEVERHOOD: Implement Scene3010 (door lock)
63fe7bd18a NEVERHOOD: Introduce and use Module::createNavigationScene and Module::createSmackerScene
d88836596d NEVERHOOD: More work on Module3000 and Scene3009 (incomplete)
87d1f79f31 NEVERHOOD: More work on Scene3009
9d12661537 NEVERHOOD: Implement Scene3011
5fcc3af23b NEVERHOOD: Implement Module2000
8286290185 NEVERHOOD: Add tables for Module2000
bc239b3fb1 NEVERHOOD: Restructure/redesign create_neverhood tool and made it more extensible for future game structures
bec86c7c2e NEVERHOOD: Switch to initGraphics() call, rather than separate calls. Default to 1xScalar.
eb8c44b54c NEVERHOOD: Implement Scene2201
28177361bf NEVERHOOD: Add Hall of Records tables
b64b0cfac2 NEVERHOOD: Implement updateScene2201
c4a4ce4e35 NEVERHOOD: Implement Scene2202 (sliding puzzle)
9273c2e97a NEVERHOOD: Add tables for Scene2203
31457e11aa NEVERHOOD: Implement Scene2203
732f7c8845 NEVERHOOD: Add Scene2204 (just a DiskplayerScene)
e177dcf911 NEVERHOOD: Implement Scene2205
8729ca04d9 NEVERHOOD: Add tables for Scene2205
80bbb06453 NEVERHOOD: Add tables for Scene2206
f29619f655 NEVERHOOD: Implement Scene2206
8459fa9777 NEVERHOOD: Add tables for Scene2207
41f8749bd0 NEVERHOOD: Implement Scene2207 (not complete yet)
50996201f4 NEVERHOOD: Very small cleanup
730844f1b7 NEVERHOOD: Implement Scene2208 (viewer for Hall Of Records text)
904f7ac335 NEVERHOOD: Add tables for Scene2242
9133d17cdf NEVERHOOD: Implement Scene2242
49658b6b5a NEVERHOOD: Forgot to remove debug code
b16f34c376 NEVERHOOD: Add Scene2248
9b151cefc3 NEVERHOOD: Implement HallOfRecordsScene (and all HoR scenes) and Scene2247
5214284271 NEVERHOOD: Add tables for Scene1302
d4030b7a9f NEVERHOOD: Start with Module1300 and implement Scene1302
b5fc6ed2c0 NEVERHOOD: Add tables for Scene1303
9d6e3b9575 NEVERHOOD: Add Scene1303
4c7930bd34 NEVERHOOD: Add tables for Scene1304
086879a4aa NEVERHOOD: Add Scene1304
a29c62ce5a NEVERHOOD: Add tables for Scene1305
a6cb31c9c3 NEVERHOOD: Add Scene1305
089ada55ba NEVERHOOD: Add tables for Scene1306
30ff790a07 NEVERHOOD: Add Scene1306
e13b8740c9 NEVERHOOD: Add Scene1307
85a216737c NEVERHOOD: Add tables for Scene1308
3e122b002c NEVERHOOD: Add Scene1308 (renaming of stuff todo)
38378d2090 NEVERHOOD: Add Scene1317
a21f9ef891 NEVERHOOD: Add Scene1310 and Scene1311
b757e22f88 NEVERHOOD: Multiple changes to make the game logic code cleaner (hopefully :)
cac9a090e7 NEVERHOOD: Use insertStaticSprite
4a88ce37dd NEVERHOOD: Use InsertKlayman
5d63bef6a2 NEVERHOOD: Use setBackground
c30e16628e NEVERHOOD: Add Module::updateChild and use it (in most places)
fad64afa44 NEVERHOOD: Remove unused resource preloading stuff (probably resource preloading is not needed since the original game r
02fe0bc65d NEVERHOOD: Merge scene-specific createSceneXXX/updateSceneXXX methods into createScene and updateScene (for Module2200 o
67fe73352b NEVERHOOD: Merge createSceneXXX/updateSceneXXX methods into createScene and updateScene for Module1000
d24907d1bb NEVERHOOD: Rename Palette2::addPalette to addBasePalette to prepare the merge of the Palette/Palette2 classes
71ea4d5877 NEVERHOOD: Merge Palette2 class into Palette
0ec039c5b0 NEVERHOOD: Merge the three mouse classes into Mouse, introduce insertMouse433 etc. methods and use them
a4c34cedd5 NEVERHOOD: Merge createSceneXXX/updateSceneXXX methods into createScene and updateScene for Module1200
17ad070a9c NEVERHOOD: Move createSceneXXX/updateSceneXXX methods
10ff159030 NEVERHOOD: Move createModuleXXX/updateModuleXXX methods
fa695229be NEVERHOOD: Add Sprite::setVisible and use it instead of direct access to the surface member
2f670690bc NEVERHOOD: Add Scene::setPalette for simpled palette creation and use it
1b2d496d18 NEVERHOOD: Try to clean up the clipRect stuff a little
9aff6337bc NEVERHOOD: Try to cleanup sprite creation with a templated insertSprite function (only in Module1000 so far)
abf78e07ee NEVERHOOD: Replace InsertKlayman macros with template functions (still weird but nicer)
3872efe2a5 NEVERHOOD: Start with Module1100 and add Scene1105
95cfa04e3b NEVERHOOD: Add tables for Scene1105
8a08287e7b NEVERHOOD: Add tables for Scene1109
47f1fe141b NEVERHOOD: Add Scene1109
2445e6aba8 NEVERHOOD: Add tables for Module1600 and Scene1608
236ca705e8 NEVERHOOD: Add Module1600 and Scene1608 (stuff will be renamed later)
af2820fd23 NEVERHOOD: Add leaveModule and leaveScene
2275141d56 NEVERHOOD: Add Scene1609
7a0a0c4b65 NEVERHOOD: Add Module1900 and Scene1901, Scene1907
729e3ae26e NEVERHOOD: Add tables for Scene1901
ced4efc66f NEVERHOOD: Add tables for Scene2101
21ebcf2af2 NEVERHOOD: Add Module2100 and Scene2101 (not complete yet)
a7dcbd0f33 NEVERHOOD: Add floor button ("Class429") to Scene2101
8840c74819 NEVERHOOD: Add floor button to Scene1401
9f599a7dfc NEVERHOOD: Start with Module2600 (missing Scene2609)
28be9f6f4b NEVERHOOD: Add Scene2609 and hook Module2600 to the GameModule
770689b2f1 NEVERHOOD: Start with Module2700 (doesn't do anything yet)
ee1bf85456 NEVERHOOD: Add new SceneInfo2700 structure and some tables using it for Module2700
e7673ffdc6 NEVERHOOD: Updated dat
aa789ee02b NEVERHOOD: More work in Module2700
463039c406 NEVERHOOD: Add Scene2706
31b3dec8c9 NEVERHOOD: More tables for Module2700
d276e7ceaa NEVERHOOD: Add Scene2701
6315ccb552 NEVERHOOD: Add tables for Scene2702
c56c93f085 NEVERHOOD: Add Scene2702 (needs cleanup)
023c36f2b6 NEVERHOOD: Add Class437 (still needs renaming, of course :)
9cf2c83e5e NEVERHOOD: Major renaming:
01f3f3a8dd Merge branch 'master'
dac95f3f73 NEVERHOOD: More renaming (mostly in Klayman and AnimatedSprite)
adb02a9f38 NEVERHOOD: More renaming
f43b54827e NEVERHOOD: Some renaming in Module1000
5465e6fe64 NEVERHOOD: Pack the KlaymanIdleTableItem struct
4f35989ac4 NEVERHOOD: Minor renaming, avoid mixing variables with their types
13efdceb9e NEVERHOOD: Add TODO
2e94464a8a NEVERHOOD: Start with Module2800 and add Scene2801
88bfe5d076 NEVERHOOD: Added a FIXME
8613ff3a9d NEVERHOOD: Add tables for Scene2801
8172d679df NEVERHOOD: Add scene create/update handling in Module2800
9c2341678e Merge branch 'master'
0683ed9eee NEVERHOOD: Rename SetSpriteCallback to SetSpriteUpdate
9de3cf5675 NEVERHOOD: Some minor cleanup, add a TODO about some palette issues (I couldn't find any apparent causes yet)
0abba004fe NEVERHOOD: Add tables for Scene2805
6467904898 NEVERHOOD: Implement Scene2805
ee7bd2fc6c NEVERHOOD: Implement Scene2803b
f3d98e6275 NEVERHOOD: Add scene 28/05
3cee21ac93 NEVERHOOD: Add tables for Scene2803b (forgot them before) and Scene2806
c2f91e39ba NEVERHOOD: Implement Scene2806 (Class469 TODO)
404aaaad94 NEVERHOOD: Implement Class469
12bb3f23f3 NEVERHOOD: Implement Scene2808
1cb1e66c10 NEVERHOOD: Implement Class488 (renaming TODO)
5688047fe3 NEVERHOOD: Add tables for Scene2809
2aa6e6b89c NEVERHOOD: Implement Scene2809
4f1e8b2070 NEVERHOOD: Implement Scene2804
0962c594bd NEVERHOOD: Rename wrongly named stuff
6f003399c8 NEVERHOOD: Implement Scene2807
745e46279e NEVERHOOD: Add tables for Scene2810
99ebd0eca3 NEVERHOOD: Implement Scene2810
0388fb496d NEVERHOOD: Implement Scene2822
93a074e9ad NEVERHOOD: Implement Scene2812
c27e930861 NEVERHOOD: Add tables for Scene2812
43362dfbd1 NEVERHOOD: Implement Scene2803
de622586f6 NEVERHOOD: Add tables for Scene2803
b2175adf61 NEVERHOOD: Add tables for Scene2501
bbb23cdf27 NEVERHOOD: Start with Module2500
31270bc5e6 NEVERHOOD: Add car track tables for Module2500
86c75922fe NEVERHOOD: Implement Scene2504 and add all car track scenes
bd3dac9781 NEVERHOOD: Add commented out code (which is TODO) to Module2500 so I don't forget it later
d4e322bc78 NEVERHOOD: Add tables for Scene2401
402f4bd275 NEVERHOOD: Start with Module2400
49f39b0da2 NEVERHOOD: Add tables for Scene2402
7c2aa2a225 NEVERHOOD: Implement Scene2402
93614a17a8 NEVERHOOD: Implement Scene2406
2386456223 NEVERHOOD: Add tables for Scene2406
a94c1fcb8f NEVERHOOD: Add tables for Scene2403
1a581543a7 NEVERHOOD: Implement Scene2403
ee36d5d5e3 NEVERHOOD: Add remaining scenes in Module2400
d1d1596fd1 NEVERHOOD: Add support for shadow sprites, used only for the shadow of the car/vehicle thing
96153bfe04 NEVERHOOD: Implement TextSurface, used in the save/load menus
65afa25c9f NEVERHOOD: Implement the SoundMan; no sound is played yet since the important code doesn't exist yet
0bb70c39f0 NEVERHOOD: More work on the SoundMan
fc0e40db30 NEVERHOOD: Implement the actual audio code
f5a8c9d90d NEVERHOOD: Add most SoundMan remaining calls
a2bc192912 NEVERHOOD: Add sound lists to all modules which have them
ba991fe702 NEVERHOOD: Fix addSound in AsScene2609Water and add a destructor
2ba49676ea NEVERHOOD: Add destructor to AsScene2804BeamCoil
21d1372d7e NEVERHOOD: Some work on the Klayman "idle" code (when the user doesn't do something for a certain time)
8bdddfdb02 NEVERHOOD: Rename many Klayman functions/variables
a5986fd722 NEVERHOOD: Fix resource file reading by introducing SafeMutexedSeekableSubReadStream which locks a mutex during reads an
cce19001fd NEVERHOOD: Rename more Klayman stuff (not much left :)
d1927ef8e6 NEVERHOOD: Move Klayman teleporter appear/disappear animation code from the several subclasses to the base Klayman class
e1943c1e2b NEVERHOOD: Move more into the Klayman base class
6160ee3cf2 NEVERHOOD: Move code from entity.h to new entity.cpp
0f04a01338 NEVERHOOD: Change sound playing
7adc1d312e NEVERHOOD: Change sound stuff in Module1100
fc359abd08 NEVERHOOD: Change sound stuff in Module1200
5ab4eb6555 NEVERHOOD: Change sound stuff in Module1300
b119efd5ed NEVERHOOD: Change sound stuff in Module1400
2df0a0a2e1 NEVERHOOD: Change sound stuff in Module1500
0c272631df NEVERHOOD: Change sound stuff in Module1600
0a1a228a88 NEVERHOOD: Change sound stuff in Module1700
a8dda6c5b6 NEVERHOOD: Change sound stuff in Module1900
78df19c648 NEVERHOOD: Change sound stuff in Module2100
3651d982c4 NEVERHOOD: Change sound stuff in Module2200
0c5a5b3c62 NEVERHOOD: Change sound stuff in Module2400
fb9d9c30e6 NEVERHOOD: Change sound stuff in Module2500
26188a3a69 NEVERHOOD: Change sound stuff in Module2600
73f4e4bcac NEVERHOOD: Change sound stuff in Module2700
eca881bd3e NEVERHOOD: Change sound stuff in Module2800
45da15adce NEVERHOOD: Change sound stuff in Module3000 (dirty, TODO)
1b3a686cac NEVERHOOD: Fix AsScene3011Symbol
acdc0256bb NEVERHOOD: Change sound stuff in DiskplayerScene
e97bd30682 NEVERHOOD: Change sound stuff in Klayman
7e4faf3505 NEVERHOOD: More Klayman merging
22cfd04b12 NEVERHOOD: Rename handleMessage41D640
4fef1ac9f2 NEVERHOOD: Some more merging and renaming in the Klayman class
3ef691f1af NEVERHOOD: Rename
debc7e953d NEVERHOOD: More changes to the Klayman class:
bb4bda7404 NEVERHOOD: More minor Klayman changes:
c88fdc34dd NEVERHOOD: Rename Class152 to StaticScene
81667d492a NEVERHOOD: Remove SsScene1002LadderArch and Class599 and turn them into static sprites; the classes were only used to se
5e08ab3e3f NEVERHOOD: Rename Class426 to SsCommonPressButton
f77b12cf96 NEVERHOOD: Rename stuff in Module1200
7b0b3000a7 NEVERHOOD: Rename stuff in Module1200
106ec42124 NEVERHOOD: Work on Module1300:
eefa175a2f NEVERHOOD: Update todo.txt
39d1982e47 NEVERHOOD: Work on Module1400:
cb5ca83578 NEVERHOOD: Rename more stuff in Module1400; also fix some bugs
b320c9f5a0 NEVERHOOD: Work on Module1600:
2fa76ccca1 NEVERHOOD: Work on Module1700:
8a9ca493b6 NEVERHOOD: Rename stuff in several modules
15cfb9f787 NEVERHOOD: Implement clipping against multiple clipRects, used only in several scenes for the Klayman sprite.
9b7bb71dd9 NEVERHOOD: Simplify code and rename things
483d76d635 NEVERHOOD: Enable/fixup navigation scene sound update code in several modules
4c421a09c8 NEVERHOOD: Add clipRects to all Klayman subclasses
1da6b95af9 NEVERHOOD: Work on Module2500:
fcbab80507 NEVERHOOD: Rename stuff in Module2700 (also in Module2500 which uses some of it)
5aee04b127 NEVERHOOD: Work on Module2800:
016638bd9e NEVERHOOD: Rename stuff in Module2700
59901c5d13 NEVERHOOD: Rename stuff in Module3000
fd13b546a7 NEVERHOOD: Rename stuff in the Scene class and clean up a little
97ee348c2a NEVERHOOD: Rename stuff in DiskplayerScene
1539023834 NEVERHOOD: Use constants for the numbers in get/setGlobalVar
02c5cc75a7 Merge branch 'master'
2e7d100a6f NEVERHOOD: Replace most of the literal digits in get/setSubVar with constants
111b6d32c6 NEVERHOOD: Fix Smacker framerate bug after the video decoder changes
b8d939a94b NEVERHOOD: Implement Scene2802 (radio tuning scene)
a80ec8c89c NEVERHOOD: Implement Module2900, the teleporter
fa53c0cf83 NEVERHOOD: Work on the resource system:
a724e603da NEVERHOOD: Use CursorMan
676c7569f6 NEVERHOOD: Fix a very stupid bug in Scene::insertMouse433
9858705772 NEVERHOOD: Graphics related changes/fixes:
6df8fccf6b NEVERHOOD: Implement GameModule::createModuleByHash
682d15fce4 NEVERHOOD: Cleanup and fixes
f5c7070ace NEVERHOOD: Add mouse cursor hiding/showing
2c4f0b70fe NEVERHOOD: Add Entity::setSoundPan and use it in the DiskplayerScene
963b760076 NEVERHOOD: Remove TODOs concerning the original engine's debug code
692edf40c7 NEVERHOOD: Try to give the AsCommonCar identifiers better names
c09c0b8998 NEVERHOOD: Implement an experimental "render queue" to only draw and update what's actually changed; it works surprising
4295991d19 NEVERHOOD: Use hardcoded values as width/height of several sprites (in the original the values were loaded from the entr
a238f57805 NEVERHOOD: Remove DirtyBackground which became obsolete after the renderqueue stuff
a6e9475a3f NEVERHOOD: Remove Scene::_surfaceFlag which also is obsolete now
c7ad09c685 NEVERHOOD: Remove BaseSurface::addDirtyRect() which is obsolete as well
9b7354dacb NEVERHOOD: Fix mouse cursor visibility by starting out invisible when the Mouse object is created and hiding the cursor 
533eb5d61d NEVERHOOD: Rename puzzle initialization methods and give them better names
126a306c89 NEVERHOOD: Some cleanup:
ef8f0215cf NEVERHOOD: Add GameVars::dumpVars() for debugging
2e32b32808 NEVERHOOD: Start with the MenuModule
c43253bd6a NEVERHOOD: Implement CreditsScene
5ba8f2e9c8 NEVERHOOD: Add making of video to the main menu
f8ff1cc12f NEVERHOOD: Add CreditsScene to Module1300 and Module1800 (played after the game end and after jumping into the hole...)
8d97f26cef NEVERHOOD: Fix AsScene2402Door animation
54c83924ce NEVERHOOD: Add class NonRepeatingRandomNumbers
5af2de503e NEVERHOOD: Rewrite GameModule::initMemoryPuzzle() to use NonRepeatingRandomNumbers
47994441cd NEVERHOOD: Move setting of debug variables to the GameModule
eb054471e0 NEVERHOOD: Fix _drawRects in AsScene1002Door and SsCommonPressButton
9ba7a7f1a1 NEVERHOOD: Rename stuff in Sprite:
f24a6769c2 NEVERHOOD: Make use of NDrawRect::set
bf1371c9d4 NEVERHOOD: Rename and clean up fields in AnimFrameInfo
1589e4fe7d NEVERHOOD: Add new method StaticSprite::loadSprite and use it instead of setting stuff "manually"
4d7610f69d NEVERHOOD: Clean up Module1000:
f744e60e0e NEVERHOOD: Clean up Module1100:
097f1f27bb NEVERHOOD: Clean up Module1200 (like the ones before)
ee7d47cb18 NEVERHOOD: Clean up Module1300 (like the ones before)
af37a2200e NEVERHOOD: Clean up Module1400 (like the ones before)
f51140490d NEVERHOOD: Clean up Module1500 (like the ones before)
e2b696b891 NEVERHOOD: Clean up Module1600 (like the ones before)
904d9430bf NEVERHOOD: Clean up Module1700 (like the ones before)
dd26512c0d NEVERHOOD: Clean up Module1800 (like the ones before)
2fbfd673ad NEVERHOOD: Clean up Module1900 (like the ones before)
9d987a97d3 NEVERHOOD: Clean up Module2000 (like the ones before)
0dd4995af3 NEVERHOOD: Clean up Module2100 (like the ones before)
1993d4165a NEVERHOOD: Clean up Module2200 (like the ones before)
61e2a6f81d NEVERHOOD: Clean up Module2300 (like the ones before)
38df3c0d62 NEVERHOOD: Clean up Module2400 (like the ones before)
28e613c68b NEVERHOOD: Clean up Module2500 (like the ones before)
36204f573d NEVERHOOD: Clean up Module2600 (like the ones before)
8d5a4f736e NEVERHOOD: Add tables for new scenes in Module2700
c539060460 NEVERHOOD: Clean up Module2700 (like the ones before)
4df22cf979 NEVERHOOD: Remove track rectList code because none of the tracks has a rectList
228d9264c8 NEVERHOOD: Start with menu widget stuff (doesn't do anything yet!)
eecd9b8b2a NEVERHOOD: Add TextLabelWidget (still doesn't do anything)
0022c57858 NEVERHOOD: Add SavegameListBox
6be5c11713 NEVERHOOD: More work on the menu system:
73e0372cef NEVERHOOD: A little more work on the menu stuff
685ce4e312 NEVERHOOD: Add initCodeSymbolsPuzzle
1904e944c5 NEVERHOOD: Add initCubeSymbolsPuzzle
325c85fc41 NEVERHOOD: Fix Klaymen in Scene1403 (*facepalm*)
370f00e808 NEVERHOOD: New _sceneNum in Module2800
1b9807b312 NEVERHOOD: Remove more old comments
cc015e3d24 NEVERHOOD: Simplify resource loading
b2934eb166 NEVERHOOD: Fix Klaymen "grow" animation after drinking the potion
9a1d9883ad NEVERHOOD: Fix AsCommonCar turning
c182688e44 NEVERHOOD: Add saveload skeleton (doesn't actually do anything yet)
99e15e4005 NEVERHOOD: More work on saveload, saving works, loading not yet (from the GMM, in-game isn't finished yet)
060287a4f8 NEVERHOOD: Improve frame-exact seeking for Scene2802
0f1aa64fd0 NEVERHOOD: Add support for the demo version
a35cd088e5 NEVERHOOD: Remove obsolete _keyState
30178e46e5 NEVERHOOD: Implement savegame loading via GMM (in-game saving/loading still TODO)
fec1d7816a NEVERHOOD: Implement resource cache purging and purge it after each scene
4b7ad48ca8 NEVERHOOD: Rename some CollisionMan methods/fields
9963ce41ea NEVERHOOD: Merge CollisionMan into Scene class
b875696fc7 NEVERHOOD: Update todo.txt
fa205be892 NEVERHOOD: Remove some obsolete TODOs
6ddedc955a NEVERHOOD: Merge TextSurface into FontSurface
a98d9aa58a NEVERHOOD: Clean up DiskplayerScene
57497817e1 NEVERHOOD: Add enum for the resource types
f945448c7b NEVERHOOD: Change graphic resource draw method to get a Surface instead of separate pixels/pitch
df43b8bd68 NEVERHOOD: Move Scene2804::initCrystalColors() to GameModule::initCrystalColorsPuzzle()
e43184f4f2 NEVERHOOD: Remove obsolete TODOs
9ea07e0925 NEVERHOOD: Add tables for Scene2706
18ce1acc12 NEVERHOOD: Rework the car track scenes in Module2500 and Module2700
5bf8fb3e96 NEVERHOOD: Remove more old TODOs
51979c4f3f NEVERHOOD: Rename SceneInfo2700 to TrackInfo
eea9dbe2da NEVERHOOD: Minor renaming and cleanup
e51bea9b4e NEVERHOOD: Don't load a DataResource if the same data is already loaded; this fixes a nasty bug in several scenes which 
5ff11f0041 NEVERHOOD: Rework the sound system
ac1dc3e4db NEVERHOOD: Fix Module1300::createScene
4389d32974 NEVERHOOD: Rename "Klayman" to "Klaymen" (the correct name of the game's hero)
490d447ed1 NEVERHOOD: Implement restart functionality (from both main menu and game logic)
379a8cbbe0 NEVERHOOD: Add support for loading/saving games with the game's own menu
4c6e82fc05 NEVERHOOD: Remove objectPriority and surfacePriority parameters from the Klaymen class constructor since they always hav
c218cb46e0 NEVERHOOD: Remove unneeded braces
1383c5f395 NEVERHOOD: Rename stuff in the Klaymen class
9ae1888593 NEVERHOOD: Change Klaymen idle callbacks from method pointers to integers and evaluate these in a new method enterIdleAn
65c6984635 NEVERHOOD: Implement game-internal savegame overwrite query screen
53a81d11b8 NEVERHOOD: Don't allow main menu until _canRequestMainMenu is set
c96d2475b1 NEVERHOOD: Add Screen::saveParams and Screen::restoreParams, called when etnering/leaving the menu
70fdfd9d57 NEVERHOOD: Delete all sound/music items on exit
bdac28929f NEVERHOOD: Add Y-flipping to unpackSpriteNormal
dc459b5f67 NEVERHOOD: Merge some code in the save/load menus
a80bafeb2e NEVERHOOD: Support game loading from launcher/command line
2a571d71b0 NEVERHOOD: Fix GUI options and game copyright
a03879963f NEVERHOOD: Changed the save/load menu to allow gaps in saved games to simplify game deletion
8749efdea8 NEVERHOOD: Add game-internal savegame delete menu
9ca3973e6f NEVERHOOD: Work on the save/load/delete menus
9b6d813d41 NEVERHOOD: Update todo.txt
583f9abaf9 NEVERHOOD: Fix some logic bugs and minor changes
1022996309 Merge branch 'master'
78e0d6a3f1 NEVERHOOD: Move module files to own subdirectory
163023a8ed NEVERHOOD: Fix issues in the save/load screens
fb0332d884 NEVERHOOD: Fix deletes in SpriteResource::unload() and ResourceMan::purgeResources()
32c21754e2 NEVERHOOD: Fix member var initializations
0638308ef1 Merge pull request #330 from johndoe123/neverhood


Commit: 52e0ac85db1b1bc7f2670498d019cf982c16d413
    https://github.com/scummvm/scummvm/commit/52e0ac85db1b1bc7f2670498d019cf982c16d413
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:49-07:00

Commit Message:
NEVERHOOD: First code with basic detection, nothing else so far

Changed paths:
  A engines/neverhood/detection.cpp
  A engines/neverhood/module.mk
  A engines/neverhood/neverhood.cpp
  A engines/neverhood/neverhood.h
    base/plugins.cpp
    configure
    engines/engines.mk



diff --git a/base/plugins.cpp b/base/plugins.cpp
index 4c2fd2c..261ae4c 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -136,6 +136,9 @@ public:
 		#if PLUGIN_ENABLED_STATIC(MOHAWK)
 		LINK_PLUGIN(MOHAWK)
 		#endif
+		#if PLUGIN_ENABLED_STATIC(NEVERHOOD)
+		LINK_PLUGIN(NEVERHOOD)
+		#endif
 		#if PLUGIN_ENABLED_STATIC(PARALLACTION)
 		LINK_PLUGIN(PARALLACTION)
 		#endif
diff --git a/configure b/configure
index 04ca85f..fb3e869 100755
--- a/configure
+++ b/configure
@@ -102,6 +102,7 @@ add_engine mohawk "Mohawk" yes "cstime myst riven"
 add_engine cstime "Where in Time is Carmen Sandiego?" no
 add_engine riven "Riven: The Sequel to Myst" no
 add_engine myst "Myst" no
+add_engine neverhood "Neverhood" no
 add_engine parallaction "Parallaction" yes
 add_engine queen "Flight of the Amazon Queen" yes
 add_engine saga "SAGA" yes "ihnm saga2"
diff --git a/engines/engines.mk b/engines/engines.mk
index dc09fbd..fb754ef 100644
--- a/engines/engines.mk
+++ b/engines/engines.mk
@@ -116,6 +116,11 @@ DEFINES += -DENABLE_RIVEN
 endif
 endif
 
+ifdef ENABLE_NEVERHOOD
+DEFINES += -DENABLE_NEVERHOOD=$(ENABLE_NEVERHOOD)
+MODULES += engines/neverhood
+endif
+
 ifdef ENABLE_PARALLACTION
 DEFINES += -DENABLE_PARALLACTION=$(ENABLE_PARALLACTION)
 MODULES += engines/parallaction
diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
new file mode 100644
index 0000000..b80379b
--- /dev/null
+++ b/engines/neverhood/detection.cpp
@@ -0,0 +1,285 @@
+/* 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 "base/plugins.h"
+
+#include "engines/advancedDetector.h"
+#include "common/file.h"
+
+#include "neverhood/neverhood.h"
+
+
+namespace Neverhood {
+
+struct NeverhoodGameDescription {
+	ADGameDescription desc;
+
+	int gameID;
+	int gameType;
+	uint32 features;
+	uint16 version;
+};
+
+const char *NeverhoodEngine::getGameId() const {
+	return _gameDescription->desc.gameid;
+}
+
+uint32 NeverhoodEngine::getFeatures() const {
+	return _gameDescription->features;
+}
+
+Common::Platform NeverhoodEngine::getPlatform() const {
+	return _gameDescription->desc.platform;
+}
+
+uint16 NeverhoodEngine::getVersion() const {
+	return _gameDescription->version;
+}
+
+}
+
+static const PlainGameDescriptor neverhoodGames[] = {
+	{"neverhood", "The Neverhood Chronicles"},
+	{0, 0}
+};
+
+namespace Neverhood {
+
+using Common::GUIO_NONE;
+using Common::GUIO_NOSPEECH;
+
+static const NeverhoodGameDescription gameDescriptions[] = {
+
+	{
+		// Neverhood English version
+		// TODO: Maybe additional files are needed to properly detect different versions
+		{
+			"neverhood",
+			0,
+			AD_ENTRY1s("hd.blb", "22958d968458c9ff221aee38577bb2b2", 4279716),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_NO_FLAGS,
+			GUIO_NONE
+		},
+		0,
+		0,
+		0,
+		0,
+	},
+
+	{ AD_TABLE_END_MARKER, 0, 0, 0, 0 }
+};
+
+/**
+ * The fallback game descriptor used by the Neverhood engine's fallbackDetector.
+ * Contents of this struct are to be overwritten by the fallbackDetector.
+ */
+static NeverhoodGameDescription g_fallbackDesc = {
+	{
+		"",
+		"",
+		AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor
+		Common::UNK_LANG,
+		Common::kPlatformPC,
+		ADGF_NO_FLAGS,
+		GUIO_NONE
+	},
+	0,
+	0,
+	0,
+	0,
+};
+
+} // End of namespace Neverhood
+
+class NeverhoodMetaEngine : public AdvancedMetaEngine {
+public:
+	NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) {
+		_singleid = "neverhood";
+	}
+
+	virtual const char *getName() const {
+		return "Neverhood Engine";
+	}
+
+	virtual const char *getOriginalCopyright() const {
+		return "Neverhood Engine (C) Infogrames";
+	}
+
+	virtual bool hasFeature(MetaEngineFeature f) const;
+	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+
+#if 0 // Not used yet but let's keep it for later when it is	
+	SaveStateList listSaves(const char *target) const;
+	virtual int getMaximumSaveSlot() const;
+	void removeSaveState(const char *target, int slot) const;
+	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+#endif
+
+	const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const;
+
+};
+
+bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
+	return
+		false; // Nothing yet :(
+//		(f == kSupportsListSaves) ||
+//		(f == kSupportsLoadingDuringStartup) ||
+//		(f == kSupportsDeleteSave) ||
+//	   	(f == kSavesSupportMetaInfo) ||
+//		(f == kSavesSupportThumbnail);
+}
+
+bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const {
+	return
+		false; // Nothing yet :(
+//		(f == kSupportsRTL) || // TODO: Not yet...
+//		(f == kSupportsLoadingDuringRuntime) ||
+//		(f == kSupportsSavingDuringRuntime);
+}
+
+bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+	const Neverhood::NeverhoodGameDescription *gd = (const Neverhood::NeverhoodGameDescription *)desc;
+	if (gd) {
+		*engine = new Neverhood::NeverhoodEngine(syst, gd);
+	}
+	return gd != 0;
+}
+
+const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSList &fslist) const {
+	// Set the default values for the fallback descriptor's ADGameDescription part.
+	Neverhood::g_fallbackDesc.desc.language = Common::UNK_LANG;
+	Neverhood::g_fallbackDesc.desc.platform = Common::kPlatformPC;
+	Neverhood::g_fallbackDesc.desc.flags = ADGF_NO_FLAGS;
+
+	// Set default values for the fallback descriptor's NeverhoodGameDescription part.
+	Neverhood::g_fallbackDesc.gameID = 0;
+	Neverhood::g_fallbackDesc.features = 0;
+	Neverhood::g_fallbackDesc.version = 3;
+
+	return NULL;
+}
+
+#if 0 // Not used yet but let's keep it for later when it is	
+
+SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const {
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Neverhood::NeverhoodEngine::SaveHeader header;
+	Common::String pattern = target;
+	pattern += ".???";
+
+	Common::StringArray filenames;
+	filenames = saveFileMan->listSavefiles(pattern.c_str());
+	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
+
+	SaveStateList saveList;
+	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) {
+		// Obtain the last 3 digits of the filename, since they correspond to the save slot
+		int slotNum = atoi(file->c_str() + file->size() - 3);
+
+		if (slotNum >= 0 && slotNum <= 999) {
+			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
+			if (in) {
+				if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) {
+					saveList.push_back(SaveStateDescriptor(slotNum, header.description));
+				}
+				delete in;
+			}
+		}
+	}
+
+	return saveList;
+}
+
+int NeverhoodMetaEngine::getMaximumSaveSlot() const {
+	return 999;
+}
+
+void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const {
+	// Slot 0 can't be deleted, it's for restarting the game(s)
+	if (slot == 0)
+		return;
+
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot);
+
+	saveFileMan->removeSavefile(filename.c_str());
+
+	Common::StringArray filenames;
+	Common::String pattern = target;
+	pattern += ".???";
+	filenames = saveFileMan->listSavefiles(pattern.c_str());
+	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
+
+	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
+		// Obtain the last 3 digits of the filename, since they correspond to the save slot
+		int slotNum = atoi(file->c_str() + file->size() - 3);
+
+		// Rename every slot greater than the deleted slot,
+		// Also do not rename quicksaves.
+		if (slotNum > slot && slotNum < 990) {
+			// FIXME: Our savefile renaming done here is inconsitent with what we do in
+			// GUI_v2::deleteMenu. While here we rename every slot with a greater equal
+			// number of the deleted slot to deleted slot, deleted slot + 1 etc.,
+			// we only rename the following slots in GUI_v2::deleteMenu until a slot
+			// is missing.
+			saveFileMan->renameSavefile(file->c_str(), filename.c_str());
+
+			filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot);
+		}
+	}
+
+}
+
+SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot);
+	Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str());
+
+	if (in) {
+		Neverhood::NeverhoodEngine::SaveHeader header;
+		Neverhood::NeverhoodEngine::kReadSaveHeaderError error;
+
+		error = Neverhood::NeverhoodEngine::readSaveHeader(in, true, header);
+		delete in;
+
+		if (error == Neverhood::NeverhoodEngine::kRSHENoError) {
+			SaveStateDescriptor desc(slot, header.description);
+
+			desc.setDeletableFlag(false);
+			desc.setWriteProtectedFlag(false);
+			desc.setThumbnail(header.thumbnail);
+
+			return desc;
+		}
+	}
+
+	return SaveStateDescriptor();
+}
+
+#endif
+
+#if PLUGIN_ENABLED_DYNAMIC(NEVERHOOD)
+	REGISTER_PLUGIN_DYNAMIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
+#else
+	REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
+#endif
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
new file mode 100644
index 0000000..d46d6a6
--- /dev/null
+++ b/engines/neverhood/module.mk
@@ -0,0 +1,13 @@
+MODULE := engines/neverhood
+
+MODULE_OBJS = \
+	detection.o \
+	neverhood.o
+
+# This module can be built as a plugin
+ifdef BUILD_PLUGINS
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
new file mode 100644
index 0000000..9c464b9
--- /dev/null
+++ b/engines/neverhood/neverhood.cpp
@@ -0,0 +1,113 @@
+/* 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 "common/algorithm.h"
+#include "common/events.h"
+#include "common/keyboard.h"
+#include "common/file.h"
+#include "common/random.h"
+#include "common/savefile.h"
+#include "common/config-manager.h"
+
+#include "base/plugins.h"
+#include "base/version.h"
+
+#include "graphics/cursorman.h"
+
+#include "engines/util.h"
+
+#include "audio/mididrv.h"
+#include "audio/mixer.h"
+
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+NeverhoodEngine::NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) {
+	// Setup mixer
+	if (!_mixer->isReady()) {
+		warning("Sound initialization failed.");
+	}
+
+	_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
+	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
+
+	_rnd = new Common::RandomSource("neverhood");
+
+}
+
+NeverhoodEngine::~NeverhoodEngine() {
+	delete _rnd;
+}
+
+Common::Error NeverhoodEngine::run() {
+	// Initialize backend
+	_system->beginGFXTransaction();
+		initCommonGFX(false);
+	_system->initSize(640, 480);
+	_system->endGFXTransaction();
+
+	_isSaveAllowed = false;
+
+	return Common::kNoError;
+}
+
+void NeverhoodEngine::updateEvents() {
+	Common::Event event;
+	Common::EventManager *eventMan = _system->getEventManager();
+
+	while (eventMan->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_KEYDOWN:
+			_keyState = event.kbd.keycode;
+			break;
+		case Common::EVENT_KEYUP:
+			_keyState = Common::KEYCODE_INVALID;
+			break;
+		case Common::EVENT_MOUSEMOVE:
+			_mouseX = event.mouse.x;
+			_mouseY = event.mouse.y;
+			break;
+		/*			
+		case Common::EVENT_LBUTTONDOWN:
+			_buttonState |= kLeftButton;
+			break;
+		case Common::EVENT_LBUTTONUP:
+			_buttonState &= ~kLeftButton;
+			break;
+		case Common::EVENT_RBUTTONDOWN:
+			_buttonState |= kRightButton;
+			break;
+		case Common::EVENT_RBUTTONUP:
+			_buttonState &= ~kRightButton;
+			break;
+		case Common::EVENT_QUIT:
+			_system->quit();
+			break;
+		*/			
+		default:
+			break;
+		}
+	}
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
new file mode 100644
index 0000000..c17116d
--- /dev/null
+++ b/engines/neverhood/neverhood.h
@@ -0,0 +1,111 @@
+/* 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_H
+#define NEVERHOOD_H
+
+#include "common/scummsys.h"
+#include "common/events.h"
+#include "common/keyboard.h"
+#include "common/random.h"
+#include "common/savefile.h"
+#include "common/system.h"
+
+#include "audio/mixer.h"
+
+#include "graphics/surface.h"
+
+#include "engines/engine.h"
+
+namespace Neverhood {
+
+enum NeverhoodGameFeatures {
+};
+
+struct NeverhoodGameDescription;
+
+class NeverhoodEngine : public ::Engine {
+protected:
+
+	Common::Error run();
+
+public:
+	NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc);
+	virtual ~NeverhoodEngine();
+
+	// Detection related functions
+	const NeverhoodGameDescription *_gameDescription;
+	const char *getGameId() const;
+	uint32 getFeatures() const;
+	uint16 getVersion() const;
+	Common::Platform getPlatform() const;
+	bool hasFeature(EngineFeature f) const;
+
+	Common::RandomSource *_rnd;
+
+	int _mouseX, _mouseY;
+	Common::KeyCode _keyState;
+	uint16 _buttonState;
+
+    void updateEvents();
+
+public:
+	
+	/* Save/load */
+
+	enum kReadSaveHeaderError {
+		kRSHENoError = 0,
+		kRSHEInvalidType = 1,
+		kRSHEInvalidVersion = 2,
+		kRSHEIoError = 3
+	};
+
+	struct SaveHeader {
+		Common::String description;
+		uint32 version;
+		byte gameID;
+		uint32 flags;
+		Graphics::Surface *thumbnail;
+	};
+
+	bool _isSaveAllowed;
+
+	bool canLoadGameStateCurrently() { return _isSaveAllowed; }
+	bool canSaveGameStateCurrently() { return _isSaveAllowed; }
+	
+#if 0 // Not used yet but let's keep it for later when it is	
+	Common::Error loadGameState(int slot);
+	Common::Error saveGameState(int slot, const Common::String &description);
+	void savegame(const char *filename, const char *description);
+	void loadgame(const char *filename);
+	const char *getSavegameFilename(int num);
+	static Common::String getSavegameFilename(const Common::String &target, int num);
+	static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header);
+#endif
+
+public:
+
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_H */


Commit: 3b00cfa669a94490e727b065f14fb9216d43351c
    https://github.com/scummvm/scummvm/commit/3b00cfa669a94490e727b065f14fb9216d43351c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with the blb archive class

Changed paths:
  A engines/neverhood/blbarchive.cpp
  A engines/neverhood/blbarchive.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
new file mode 100644
index 0000000..48452ef
--- /dev/null
+++ b/engines/neverhood/blbarchive.cpp
@@ -0,0 +1,107 @@
+/* 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 "common/dcl.h"
+#include "neverhood/blbarchive.h"
+
+namespace Neverhood {
+
+BlbArchive::BlbArchive() : _extData(NULL) {
+}
+
+BlbArchive::~BlbArchive() {
+	delete[] _extData;
+}
+
+void BlbArchive::open(const Common::String &filename) {
+	BlbHeader header; 
+	
+	_entries.clear();		
+
+	if (!_fd.open(filename))
+		error("BlbArchive::open() Could not open %s", filename.c_str());
+
+	header.id1 = _fd.readUint32LE();
+	header.id2 = _fd.readUint16LE();
+	header.extDataSize = _fd.readUint16LE();
+	header.fileSize = _fd.readUint32LE();
+	header.fileCount = _fd.readUint32LE();
+
+	if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size())
+		error("BlbArchive::open() %s seems to be corrupt", filename.c_str());
+
+	debug("fileCount = %d", header.fileCount);
+
+	_entries.reserve(header.fileCount);
+
+	// Load file hashes
+	for (uint i = 0; i < header.fileCount; i++) {
+		BlbArchiveEntry entry;
+		entry.fileHash = _fd.readUint32LE();
+		_entries.push_back(entry);
+	}
+	
+	// Load file records
+	for (uint i = 0; i < header.fileCount; i++) {
+		BlbArchiveEntry &entry = _entries[i];
+		entry.type = _fd.readByte();
+		entry.comprType = _fd.readByte();
+		entry.extDataOfs = _fd.readUint16LE();
+		entry.timeStamp = _fd.readUint32LE();
+		entry.offset = _fd.readUint32LE();
+		entry.diskSize = _fd.readUint32LE();
+		entry.size = _fd.readUint32LE();
+		debug("%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
+			entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp,
+			entry.offset, entry.diskSize, entry.size);
+	}
+
+	// Load ext data
+	if (header.extDataSize > 0) {
+		_extData = new byte[header.extDataSize];
+		_fd.read(_extData, header.extDataSize);
+	}
+
+}
+
+void BlbArchive::load(uint index, byte *buffer, uint32 size) {
+
+	BlbArchiveEntry &entry = _entries[index];
+	
+	_fd.seek(entry.offset);
+	
+	switch (entry.comprType) {
+	case 1: // Uncompressed
+		if (size == 0)
+			size = entry.diskSize;
+		_fd.read(buffer, size);
+		break;
+	case 3: // DCL-compressed
+		Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size);
+		break;
+	default:
+		;
+	}
+
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h
new file mode 100644
index 0000000..7fc54d9
--- /dev/null
+++ b/engines/neverhood/blbarchive.h
@@ -0,0 +1,66 @@
+/* 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_BLBARCHIVE_H
+#define NEVERHOOD_BLBARCHIVE_H
+
+#include "common/array.h"
+#include "common/file.h"
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+struct BlbHeader {
+	uint32 id1;
+	uint16 id2;
+	uint16 extDataSize;
+	int32 fileSize;
+	uint32 fileCount;
+};
+
+struct BlbArchiveEntry {
+	uint32 fileHash;
+	byte type;
+	byte comprType;
+	uint16 extDataOfs;
+	uint32 timeStamp;
+	uint32 offset;
+	uint32 diskSize;
+	uint32 size;
+};
+
+class BlbArchive {
+public:
+	BlbArchive();
+	~BlbArchive();
+	void open(const Common::String &filename);
+	void load(uint index, byte *buffer, uint32 size);
+	uint32 getSize(uint index) { return _entries[index].size; }
+private:
+	Common::File _fd;
+	Common::Array<BlbArchiveEntry> _entries;
+	byte *_extData;
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_BLBARCHIVE_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index d46d6a6..0601f54 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -1,6 +1,7 @@
 MODULE := engines/neverhood
 
 MODULE_OBJS = \
+	blbarchive.o \
 	detection.o \
 	neverhood.o
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 9c464b9..873d7ff 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -20,7 +20,6 @@
  *
  */
 
-#include "common/algorithm.h"
 #include "common/events.h"
 #include "common/keyboard.h"
 #include "common/file.h"
@@ -35,10 +34,10 @@
 
 #include "engines/util.h"
 
-#include "audio/mididrv.h"
 #include "audio/mixer.h"
 
 #include "neverhood/neverhood.h"
+#include "neverhood/blbarchive.h"
 
 namespace Neverhood {
 
@@ -68,6 +67,12 @@ Common::Error NeverhoodEngine::run() {
 
 	_isSaveAllowed = false;
 
+
+	BlbArchive *blb = new BlbArchive();
+	blb->open("m.blb");
+	
+	delete blb;
+
 	return Common::kNoError;
 }
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index c17116d..63862dd 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -66,7 +66,7 @@ public:
 	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
-    void updateEvents();
+	void updateEvents();
 
 public:
 	


Commit: 70d20096c16b983d254366b82e725ce14e5b195c
    https://github.com/scummvm/scummvm/commit/70d20096c16b983d254366b82e725ce14e5b195c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with the resource manager

Changed paths:
  A engines/neverhood/resourceman.cpp
  A engines/neverhood/resourceman.h
    engines/neverhood/blbarchive.cpp
    engines/neverhood/blbarchive.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 48452ef..4259be3 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -49,7 +49,7 @@ void BlbArchive::open(const Common::String &filename) {
 	if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size())
 		error("BlbArchive::open() %s seems to be corrupt", filename.c_str());
 
-	debug("fileCount = %d", header.fileCount);
+	debug(2, "fileCount = %d", header.fileCount);
 
 	_entries.reserve(header.fileCount);
 
@@ -70,7 +70,7 @@ void BlbArchive::open(const Common::String &filename) {
 		entry.offset = _fd.readUint32LE();
 		entry.diskSize = _fd.readUint32LE();
 		entry.size = _fd.readUint32LE();
-		debug("%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
+		debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
 			entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp,
 			entry.offset, entry.diskSize, entry.size);
 	}
@@ -84,7 +84,6 @@ void BlbArchive::open(const Common::String &filename) {
 }
 
 void BlbArchive::load(uint index, byte *buffer, uint32 size) {
-
 	BlbArchiveEntry &entry = _entries[index];
 	
 	_fd.seek(entry.offset);
@@ -104,4 +103,9 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) {
 
 }
 
+byte *BlbArchive::getEntryExtData(uint index) {
+	BlbArchiveEntry &entry = _entries[index];
+	return _extData && entry.extDataOfs != 0 ? &_extData[entry.extDataOfs - 1] : NULL;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h
index 7fc54d9..3c373cc 100644
--- a/engines/neverhood/blbarchive.h
+++ b/engines/neverhood/blbarchive.h
@@ -54,7 +54,10 @@ public:
 	~BlbArchive();
 	void open(const Common::String &filename);
 	void load(uint index, byte *buffer, uint32 size);
+	byte *getEntryExtData(uint index);
 	uint32 getSize(uint index) { return _entries[index].size; }
+	BlbArchiveEntry *getEntry(uint index) { return &_entries[index]; }
+	uint getCount() { return _entries.size(); }
 private:
 	Common::File _fd;
 	Common::Array<BlbArchiveEntry> _entries;
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 0601f54..bdb6d86 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -3,7 +3,8 @@ MODULE := engines/neverhood
 MODULE_OBJS = \
 	blbarchive.o \
 	detection.o \
-	neverhood.o
+	neverhood.o \
+	resourceman.o
 
 # This module can be built as a plugin
 ifdef BUILD_PLUGINS
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 873d7ff..9254f88 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -38,6 +38,7 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
+#include "neverhood/resourceman.h"
 
 namespace Neverhood {
 
@@ -67,11 +68,25 @@ Common::Error NeverhoodEngine::run() {
 
 	_isSaveAllowed = false;
 
-
+#if 0
 	BlbArchive *blb = new BlbArchive();
 	blb->open("m.blb");
-	
 	delete blb;
+#endif
+
+#if 1
+	ResourceMan *res = new ResourceMan();
+	res->addArchive("a.blb");
+	res->addArchive("c.blb");
+	res->addArchive("hd.blb");
+	res->addArchive("i.blb");
+	res->addArchive("m.blb");
+	res->addArchive("s.blb");
+	res->addArchive("t.blb");
+	
+	ResourceFileEntry *r = res->findEntry(0x50A80517);
+	
+#endif
 
 	return Common::kNoError;
 }
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
new file mode 100644
index 0000000..59e3fad
--- /dev/null
+++ b/engines/neverhood/resourceman.cpp
@@ -0,0 +1,167 @@
+/* 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/resourceman.h"
+
+namespace Neverhood {
+
+ResourceMan::ResourceMan() {
+}
+
+ResourceMan::~ResourceMan() {
+}
+
+void ResourceMan::addArchive(const Common::String &filename) {
+	BlbArchive *archive = new BlbArchive();
+	uint archiveIndex = _archives.size();
+	archive->open(filename);
+	_archives.push_back(archive);
+	debug("ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount());
+	_entries.reserve(_entries.size() + archive->getCount());
+	for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) {
+		BlbArchiveEntry *archiveEntry = archive->getEntry(archiveEntryIndex);
+		ResourceFileEntry *entry = findEntrySimple(archiveEntry->fileHash);
+		if (entry) {
+			if (archiveEntry->timeStamp > _archives[entry->archiveIndex]->getEntry(entry->entryIndex)->timeStamp) {
+				entry->archiveIndex = archiveIndex;
+				entry->entryIndex = archiveEntryIndex;
+			} 
+		} else {
+			ResourceFileEntry newEntry;
+			newEntry.fileHash = archiveEntry->fileHash;
+			newEntry.resourceHandle = -1;
+			newEntry.archiveIndex = archiveIndex;
+			newEntry.entryIndex = archiveEntryIndex;
+			_entries.push_back(newEntry);
+		}
+	}
+}
+
+ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) {
+	for (uint i = 0; i < _entries.size(); i++) {
+		if (_entries[i].fileHash == fileHash)
+			return &_entries[i];
+	}
+	return NULL;
+}
+
+ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntrySimple(fileHash);
+	for (; entry && getArchiveEntry(entry)->comprType == 0x65; fileHash = getArchiveEntry(entry)->diskSize)
+		entry = findEntrySimple(fileHash);
+	return entry;
+}
+
+BlbArchiveEntry *ResourceMan::getArchiveEntry(ResourceFileEntry *entry) const {
+	return _archives[entry->archiveIndex]->getEntry(entry->entryIndex);
+}
+
+int ResourceMan::useResource(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntry(fileHash);
+	if (entry->resourceHandle != -1) {
+		_resources[entry->resourceHandle]->useRefCount++;
+	} else {
+		Resource *resource = new Resource();
+		resource->fileHash = entry->fileHash;
+		resource->archiveIndex = entry->archiveIndex;
+		resource->entryIndex = entry->entryIndex;
+		resource->data = NULL;
+		resource->dataRefCount = 0;
+		resource->useRefCount = 1;
+		entry->resourceHandle = (int)_resources.size();
+		_resources.push_back(resource);
+	}
+	return entry->resourceHandle;
+}
+
+void ResourceMan::unuseResource(int resourceHandle) {
+	Resource *resource = _resources[resourceHandle];
+	if (resource->useRefCount > 0)
+		resource->useRefCount--;
+}
+
+void ResourceMan::unuseResourceByHash(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntry(fileHash);
+	if (entry->resourceHandle != -1)
+		unuseResource(entry->resourceHandle);
+}
+
+int ResourceMan::getResourceHandleByHash(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntry(fileHash);
+	return entry->resourceHandle;
+}
+
+bool ResourceMan::isResourceDataValid(int resourceHandle) const {
+	return _resources[resourceHandle]->data != NULL;
+}
+
+uint32 ResourceMan::getResourceSize(int resourceHandle) const {
+	Resource *resource = _resources[resourceHandle];
+	return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->size;
+}
+
+byte ResourceMan::getResourceType(int resourceHandle) {
+	Resource *resource = _resources[resourceHandle];
+	return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->type;
+}
+
+byte ResourceMan::getResourceTypeByHash(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntry(fileHash);
+	return getArchiveEntry(entry)->type;
+}
+
+byte *ResourceMan::getResourceExtData(int resourceHandle) {
+	Resource *resource = _resources[resourceHandle];
+	return _archives[resource->archiveIndex]->getEntryExtData(resource->entryIndex);
+}
+
+byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntry(fileHash);
+	return _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex);
+}
+
+byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) {
+	Resource *resource = _resources[resourceHandle];
+	if (resource->data != NULL) {
+		resource->dataRefCount++;
+	} else {
+		BlbArchive *archive = _archives[resource->archiveIndex];
+		BlbArchiveEntry *archiveEntry = archive->getEntry(resource->entryIndex);
+		resource->data = new byte[archiveEntry->size];
+		archive->load(resource->entryIndex, resource->data, 0);
+		resource->dataRefCount = 1;
+	}
+	return resource->data;
+}
+
+void ResourceMan::unloadResource(int resourceHandle) {
+	Resource *resource = _resources[resourceHandle];
+	if (resource->dataRefCount > 0)
+		resource->dataRefCount--;
+}
+
+void ResourceMan::freeResource(Resource *resource) {
+	delete[] resource->data;
+	resource->data = NULL;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
new file mode 100644
index 0000000..0dd70e1
--- /dev/null
+++ b/engines/neverhood/resourceman.h
@@ -0,0 +1,78 @@
+/* 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_RESOURCEMAN_H
+#define NEVERHOOD_RESOURCEMAN_H
+
+#include "common/array.h"
+#include "common/file.h"
+#include "neverhood/neverhood.h"
+#include "neverhood/blbarchive.h"
+
+namespace Neverhood {
+
+struct ResourceFileEntry {
+	uint32 fileHash;
+	int resourceHandle;
+	uint archiveIndex;
+	uint entryIndex;
+};
+
+struct Resource {
+	uint32 fileHash;
+	uint archiveIndex;
+	uint entryIndex;
+	byte *data;
+	int dataRefCount;
+	int useRefCount;
+};
+
+class ResourceMan {
+public:
+	ResourceMan();
+	~ResourceMan();
+	void addArchive(const Common::String &filename);
+	ResourceFileEntry *findEntrySimple(uint32 fileHash);
+	ResourceFileEntry *findEntry(uint32 fileHash);
+	BlbArchiveEntry *getArchiveEntry(ResourceFileEntry *entry) const;
+	int useResource(uint32 fileHash);
+	void unuseResource(int resourceHandle);
+	void unuseResourceByHash(uint32 fileHash);
+	int getResourceHandleByHash(uint32 fileHash);
+	bool isResourceDataValid(int resourceHandle) const;
+	uint32 getResourceSize(int resourceHandle) const;
+	byte getResourceType(int resourceHandle);
+	byte getResourceTypeByHash(uint32 fileHash);
+	byte *getResourceExtData(int resourceHandle);
+	byte *getResourceExtDataByHash(uint32 fileHash);
+	byte *loadResource(int resourceHandle, bool moveToFront = false);
+	void unloadResource(int resourceHandle);
+	void freeResource(Resource *resource);
+private:
+	Common::Array<BlbArchive*> _archives;
+	Common::Array<ResourceFileEntry> _entries;
+	Common::Array<Resource*> _resources;
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_RESOURCEMAN_H */


Commit: 7d5d5f139f5d2ac747f1440171f4cc42735541a7
    https://github.com/scummvm/scummvm/commit/7d5d5f139f5d2ac747f1440171f4cc42735541a7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with graphics code (bitmap parsing and rle decompression)

Changed paths:
  A engines/neverhood/graphics.cpp
  A engines/neverhood/graphics.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
new file mode 100644
index 0000000..8f8849b
--- /dev/null
+++ b/engines/neverhood/graphics.cpp
@@ -0,0 +1,108 @@
+/* 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/graphics.h"
+
+namespace Neverhood {
+
+void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) {
+
+	uint16 flags;
+	
+	flags = READ_LE_UINT16(sprite);
+	sprite += 2;
+
+	if (rle)
+		*rle = flags & 1;
+
+	if (flags & 2) {
+		if (dimensions) {
+			dimensions->width = READ_LE_UINT16(sprite);
+			dimensions->height = READ_LE_UINT16(sprite + 2);
+		}
+		sprite += 4;
+	} else if (dimensions) {
+		dimensions->width = 1;
+		dimensions->height = 1;
+	}
+
+	if (flags & 4) {
+		if (unknown) {
+			unknown->unk1 = READ_LE_UINT16(sprite);
+			unknown->unk2 = READ_LE_UINT16(sprite + 2);
+		}
+		sprite += 4;
+	} else if (unknown) {
+		unknown->unk1 = 0;
+		unknown->unk2 = 0;
+	}
+
+	if (flags & 8) {
+		if (palette)
+			*palette = sprite;
+		sprite += 1024;
+	} else if (palette)
+		*palette = NULL;
+
+	if (flags & 0x10) {
+		if (pixels)
+			*pixels = sprite;
+	} else if (pixels)
+		*pixels = NULL;
+
+}
+
+void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
+
+	// TODO: Flip
+
+	int16 rows, chunks;
+	int16 skip, copy;
+
+	rows = READ_LE_UINT16(source);
+	chunks = READ_LE_UINT16(source + 2);
+	source += 4;
+
+	do {
+		if (chunks == 0) {
+			dest += rows * destPitch;
+		} else {
+			while (rows-- > 0) {
+				uint16 rowChunks = chunks;
+				while (rowChunks-- > 0) {
+					skip = READ_LE_UINT16(source);
+					copy = READ_LE_UINT16(source + 2);
+					source += 4;
+					memcpy(dest + skip, source, copy);
+					source += copy;
+				}
+				dest += destPitch;
+			}
+		}
+		rows = READ_LE_UINT16(source);
+		chunks = READ_LE_UINT16(source + 2);
+		source += 4;
+	} while (rows > 0);
+
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
new file mode 100644
index 0000000..8cac5a5
--- /dev/null
+++ b/engines/neverhood/graphics.h
@@ -0,0 +1,45 @@
+/* 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_GRAPHICS_H
+#define NEVERHOOD_GRAPHICS_H
+
+#include "common/array.h"
+#include "common/file.h"
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+struct NDimensions {
+	int16 width, height;
+};
+
+struct NUnknown {
+	int16 unk1, unk2;
+};
+
+void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels);
+void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_GRAPHICS_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index bdb6d86..57491e6 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -3,6 +3,7 @@ MODULE := engines/neverhood
 MODULE_OBJS = \
 	blbarchive.o \
 	detection.o \
+	graphics.o \
 	neverhood.o \
 	resourceman.o
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 9254f88..fa781fb 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -38,6 +38,7 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
+#include "neverhood/graphics.h"
 #include "neverhood/resourceman.h"
 
 namespace Neverhood {
@@ -68,26 +69,50 @@ Common::Error NeverhoodEngine::run() {
 
 	_isSaveAllowed = false;
 
+	_res = new ResourceMan();
+	_res->addArchive("a.blb");
+	_res->addArchive("c.blb");
+	_res->addArchive("hd.blb");
+	_res->addArchive("i.blb");
+	_res->addArchive("m.blb");
+	_res->addArchive("s.blb");
+	_res->addArchive("t.blb");
+
 #if 0
 	BlbArchive *blb = new BlbArchive();
 	blb->open("m.blb");
 	delete blb;
 #endif
 
-#if 1
-	ResourceMan *res = new ResourceMan();
-	res->addArchive("a.blb");
-	res->addArchive("c.blb");
-	res->addArchive("hd.blb");
-	res->addArchive("i.blb");
-	res->addArchive("m.blb");
-	res->addArchive("s.blb");
-	res->addArchive("t.blb");
-	
-	ResourceFileEntry *r = res->findEntry(0x50A80517);
-	
+#if 0
+	ResourceFileEntry *r = _res->findEntry(0x50A80517);
 #endif
 
+#if 0
+	int resourceHandle = _res->useResource(0x0CA04202);
+	debug("resourceHandle = %d", resourceHandle);
+	byte *data = _res->loadResource(resourceHandle);
+	bool rle;
+	NDimensions dimensions;
+	NUnknown unknown;
+	byte *palette, *pixels;
+	parseBitmapResource(data, &rle, &dimensions, &unknown, &palette, &pixels);
+	debug("%d, %d", dimensions.width, dimensions.height);
+	byte *rawpixels = new byte[dimensions.width * dimensions.height];
+	memset(rawpixels, 0, dimensions.width * dimensions.height);
+	debug("rle = %d", rle);
+	unpackSpriteRle(pixels, dimensions.width, dimensions.height, rawpixels, dimensions.width, false, false);
+	Common::DumpFile d;
+	d.open("dump.0");
+	d.write(rawpixels, dimensions.width * dimensions.height);
+	d.close();
+	delete[] rawpixels;
+	_res->unloadResource(resourceHandle);
+	_res->unuseResource(resourceHandle);
+#endif
+	
+	delete _res;
+
 	return Common::kNoError;
 }
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 63862dd..956880f 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -43,6 +43,8 @@ enum NeverhoodGameFeatures {
 
 struct NeverhoodGameDescription;
 
+class ResourceMan;
+
 class NeverhoodEngine : public ::Engine {
 protected:
 
@@ -66,6 +68,8 @@ public:
 	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
+	ResourceMan *_res;
+
 	void updateEvents();
 
 public:


Commit: a262055df25b0b00fcb0fe9e7919153f5089d615
    https://github.com/scummvm/scummvm/commit/a262055df25b0b00fcb0fe9e7919153f5089d615
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with the BaseSurface class (doesn't do much yet)

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 8f8849b..fb8ec4a 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -24,6 +24,39 @@
 
 namespace Neverhood {
 
+BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height)
+	: _vm(vm), _priority(priority), _visible(true) {
+	
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = width;
+	_drawRect.height = height;
+	_sysRect.x = 0;
+	_sysRect.y = 0;
+	_sysRect.width = (width + 3) & 0xFFFC; // align by 4 bytes
+	_sysRect.height = height;
+	_clipRect.x1 = 0;
+	_clipRect.y1 = 0;
+	_clipRect.x2 = 640;
+	_clipRect.y2 = 480;
+	_surface = new Graphics::Surface();
+	_surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+}
+
+BaseSurface::~BaseSurface() {
+	delete _surface;
+}
+
+void BaseSurface::draw() {
+	// TODO
+}
+
+void BaseSurface::addDirtyRect() {
+	// TODO
+}
+
+// Misc
+
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) {
 
 	uint16 flags;
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 8cac5a5..bc59287 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -25,6 +25,7 @@
 
 #include "common/array.h"
 #include "common/file.h"
+#include "graphics/surface.h"
 #include "neverhood/neverhood.h"
 
 namespace Neverhood {
@@ -37,6 +38,36 @@ struct NUnknown {
 	int16 unk1, unk2;
 };
 
+struct NRect {
+	int16 x1, y1, x2, y2;
+	NRect() : x1(0), y1(0), x2(0), y2(0) {}
+};
+
+struct NDrawRect {
+	int16 x, y, width, height;
+	NDrawRect() : x(0), y(0), width(0), height(0) {}
+};
+
+// NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific
+
+class BaseSurface {
+public:
+	BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height);
+	virtual ~BaseSurface();
+	virtual void draw();
+	virtual void addDirtyRect();
+protected:
+	NeverhoodEngine *_vm;
+	int _priority;
+	bool _visible;
+	Graphics::Surface *_surface;
+	NDrawRect _drawRect;
+	NDrawRect _sysRect;
+	NRect _clipRect;
+};
+
+// Misc
+
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels);
 void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 


Commit: 108368e9b5282a72d0f582e89803f5ee099baa94
    https://github.com/scummvm/scummvm/commit/108368e9b5282a72d0f582e89803f5ee099baa94
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Add more

- SpriteResource and PaletteResource resource classes
- Extend BaseSurface to be able to draw SpriteResources onto it
- Implement Entity base class (this may need some work concerning the update/message callbacks later since I'm not sure if the way it's done now is portable)

Changed paths:
  A engines/neverhood/entity.cpp
  A engines/neverhood/entity.h
  A engines/neverhood/palette.cpp
  A engines/neverhood/palette.h
  A engines/neverhood/resource.cpp
  A engines/neverhood/resource.h
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
new file mode 100644
index 0000000..9070d5c
--- /dev/null
+++ b/engines/neverhood/entity.cpp
@@ -0,0 +1,27 @@
+/* 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/entity.h"
+
+namespace Neverhood {
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
new file mode 100644
index 0000000..b7ebdd1
--- /dev/null
+++ b/engines/neverhood/entity.h
@@ -0,0 +1,64 @@
+/* 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_ENTITY_H
+#define NEVERHOOD_ENTITY_H
+
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+struct MessageParam {
+	union {
+		uint32 _integer;
+		// TODO: Other types...
+	};
+	// TODO: Constructors for the param types...
+};
+
+#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler)
+#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, MessageParam &param, Entity *sender)> (handler)
+
+class Entity {
+public:
+	Entity(NeverhoodEngine *vm, int priority)
+		: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority) {
+	}
+	~Entity() {
+	}
+	void handleUpdate() {
+		if (_updateHandlerCb)
+			(this->*_updateHandlerCb)();
+	}
+	uint32 handleMessage(int messageNum, MessageParam &param, Entity *sender) {
+		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
+	}
+protected:
+	void (Entity::*_updateHandlerCb)();
+	uint32 (Entity::*_messageHandlerCb)(int messageNum, MessageParam &param, Entity *sender);
+	NeverhoodEngine *_vm;
+	int _priority;
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_ENTITY_H */
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index fb8ec4a..315c62d 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/graphics.h"
+#include "neverhood/resource.h"
 
 namespace Neverhood {
 
@@ -55,6 +56,18 @@ void BaseSurface::addDirtyRect() {
 	// TODO
 }
 
+void BaseSurface::clear() {
+	_surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), 0);
+}
+
+void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
+	if (spriteResource.dimensions().width <= _drawRect.width && 
+		spriteResource.dimensions().height <= _drawRect.height) {
+		clear();
+		spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false);
+	}
+}
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) {
@@ -138,4 +151,18 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 
 }
 
+void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
+
+	// TODO: Flip
+
+	int sourcePitch = (width + 3) & 0xFFFC;
+
+	while (height-- > 0) {
+		memcpy(dest, source, width);
+		source += sourcePitch;
+		dest += destPitch;
+	}
+
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index bc59287..27ef6cd 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -48,6 +48,8 @@ struct NDrawRect {
 	NDrawRect() : x(0), y(0), width(0), height(0) {}
 };
 
+class SpriteResource;
+
 // NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific
 
 class BaseSurface {
@@ -56,6 +58,8 @@ public:
 	virtual ~BaseSurface();
 	virtual void draw();
 	virtual void addDirtyRect();
+	void clear();
+	void drawSpriteResource(SpriteResource &spriteResource);
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
@@ -66,10 +70,21 @@ protected:
 	NRect _clipRect;
 };
 
+/*
+class Palette {
+public:
+	Palette();
+	~Palette();
+protected:
+	
+};
+*/
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels);
 void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
+void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 
 } // End of namespace Neverhood
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 57491e6..d70c4a9 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -3,8 +3,11 @@ MODULE := engines/neverhood
 MODULE_OBJS = \
 	blbarchive.o \
 	detection.o \
+	entity.o \
 	graphics.o \
 	neverhood.o \
+	palette.o \
+	resource.o \
 	resourceman.o
 
 # This module can be built as a plugin
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index fa781fb..f7bf032 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -40,6 +40,7 @@
 #include "neverhood/blbarchive.h"
 #include "neverhood/graphics.h"
 #include "neverhood/resourceman.h"
+#include "neverhood/resource.h"
 
 namespace Neverhood {
 
@@ -111,6 +112,17 @@ Common::Error NeverhoodEngine::run() {
 	_res->unuseResource(resourceHandle);
 #endif
 	
+#if 1
+	{ // Create a new scope
+		SpriteResource r(this);
+		BaseSurface *surf = new BaseSurface(this, 0, 640, 480);
+		r.load(0x0CA04202);
+		debug("r: width = %d; height = %d", r.dimensions().width, r.dimensions().height);
+		surf->drawSpriteResource(r);
+		delete surf;
+	}
+#endif
+	
 	delete _res;
 
 	return Common::kNoError;
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
new file mode 100644
index 0000000..385cade
--- /dev/null
+++ b/engines/neverhood/palette.cpp
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "neverhood/palette.h"
+#include "neverhood/resource.h"
+
+namespace Neverhood {
+
+Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) {
+	_status = 0;
+	_palette = new byte[1024];
+	memset(_palette, 0, 1024);
+	SetUpdateHandler(&Palette::update);
+}
+
+Palette::~Palette() {
+	// TODO: _vm->_screen->unsetPaletteData(_palette);
+	delete[] _palette;
+}
+
+void Palette::update() {
+	// TODO
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
new file mode 100644
index 0000000..961b4ac
--- /dev/null
+++ b/engines/neverhood/palette.h
@@ -0,0 +1,44 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_PALETTE_H
+#define NEVERHOOD_PALETTE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/entity.h"
+
+namespace Neverhood {
+
+class Palette : public Entity {
+public:
+	// Default constructor with black palette
+	Palette(NeverhoodEngine *vm);
+	~Palette();
+protected:
+	int _status;
+	byte *_palette;
+	void update();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_PALETTE_H */
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
new file mode 100644
index 0000000..6c77c48
--- /dev/null
+++ b/engines/neverhood/resource.cpp
@@ -0,0 +1,137 @@
+/* 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/resource.h"
+#include "neverhood/resourceman.h"
+
+namespace Neverhood {
+
+SpriteResource::SpriteResource(NeverhoodEngine *vm)
+	 : _vm(vm), _resourceHandle(-1), _pixels(NULL) {
+}
+
+SpriteResource::~SpriteResource() {
+	unload();
+}
+
+void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) {
+	if (_pixels) {
+		if (_rle) {
+			unpackSpriteRle(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY);
+		} else {
+			unpackSpriteNormal(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY);
+		}
+	}
+}
+
+bool SpriteResource::load(uint32 fileHash) {
+	// TODO: Later merge with load2 and make the mode a parameter
+	unload();
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	debug("SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle);
+	if (_resourceHandle != -1) {
+		if (_vm->_res->getResourceType(_resourceHandle) == 2) {
+			byte *spriteData = _vm->_res->loadResource(_resourceHandle, true);
+			parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels);
+		} else {
+			_vm->_res->unuseResource(_resourceHandle);
+			_resourceHandle = -1;
+		}
+	} 
+	return _pixels != NULL;
+}
+
+bool SpriteResource::load2(uint32 fileHash) {
+	unload();
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	if (_resourceHandle != -1) {
+		if (_vm->_res->getResourceType(_resourceHandle) == 2) {
+			byte *spriteData = _vm->_res->loadResource(_resourceHandle, true);
+			parseBitmapResource(spriteData, &_rle, &_dimensions, &_unknown, NULL, &_pixels);
+		} else {
+			_vm->_res->unuseResource(_resourceHandle);
+			_resourceHandle = -1;
+		}
+	} 
+	return _pixels != NULL;
+}
+
+void SpriteResource::unload() {
+	if (_resourceHandle != -1) {
+		_vm->_res->unloadResource(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+	} else {
+		delete[] _pixels;
+	}
+	_pixels = NULL;
+	_rle = false;
+}
+
+PaletteResource::PaletteResource(NeverhoodEngine *vm)
+	: _vm(vm), _resourceHandle(-1), _palette(NULL) {
+}
+
+PaletteResource::~PaletteResource() {
+	unload();
+}
+
+bool PaletteResource::load(uint32 fileHash) {
+	unload();
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	if (_resourceHandle != -1) {
+		_palette = _vm->_res->loadResource(_resourceHandle, true);
+		switch (_vm->_res->getResourceType(_resourceHandle)) {
+		case 2:
+			// Palette is stored in a bitmap
+			parseBitmapResource(_palette, NULL, NULL, NULL, &_palette, NULL);
+			break;
+		case 3:
+			// _palette already points to the correct data
+			break;
+		default:						
+			_vm->_res->unuseResource(_resourceHandle);
+			_resourceHandle = -1;
+			break;
+		}
+	} 
+	return _palette != NULL;
+}
+
+void PaletteResource::unload() {
+	if (_resourceHandle != -1) {
+		_vm->_res->unloadResource(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+		_palette = NULL;
+	}
+}
+
+void PaletteResource::getPalette(byte *palette) {
+	if (_palette) {
+		memcpy(palette, _palette, 1024);
+	} else {
+		// TODO?: buildDefaultPalette(palette);
+	}
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
new file mode 100644
index 0000000..7f61af6
--- /dev/null
+++ b/engines/neverhood/resource.h
@@ -0,0 +1,64 @@
+/* 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_RESOURCE_H
+#define NEVERHOOD_RESOURCE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/graphics.h"
+
+namespace Neverhood {
+
+class SpriteResource {
+public:
+	SpriteResource(NeverhoodEngine *vm);
+	~SpriteResource();
+	void draw(byte *dest, int destPitch, bool flipX, bool flipY);
+	bool load(uint32 fileHash);
+	bool load2(uint32 fileHash);
+	void unload();
+	const NDimensions& dimensions() { return _dimensions; };
+protected:
+	NeverhoodEngine *_vm;
+	int _resourceHandle;
+	NDimensions _dimensions;
+	NUnknown _unknown;
+	byte *_pixels;
+	bool _rle;
+};
+
+class PaletteResource {
+public:
+	PaletteResource(NeverhoodEngine *vm);
+	~PaletteResource();
+	bool load(uint32 fileHash);
+	void unload();
+	void getPalette(byte *palette);
+protected:
+	NeverhoodEngine *_vm;
+	int _resourceHandle;
+	byte *_palette;
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_RESOURCE_H */


Commit: eb5ab30ce0ca0cfb58eed5a434f2252afc9718f7
    https://github.com/scummvm/scummvm/commit/eb5ab30ce0ca0cfb58eed5a434f2252afc9718f7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: More work on the Palette class

Changed paths:
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h



diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index 385cade..b45f8ee 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -32,13 +32,94 @@ Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) {
 	SetUpdateHandler(&Palette::update);
 }
 
+Palette::Palette(NeverhoodEngine *vm, byte *palette) : Entity(vm, 0) {
+	_status = 0;
+	_palette = new byte[1024];
+	memcpy(_palette, palette, 1024);
+	SetUpdateHandler(&Palette::update);
+}
+
+Palette::Palette(NeverhoodEngine *vm, const char *filename) : Entity(vm, 0) {
+	PaletteResource paletteResource(_vm);
+	_status = 0;
+	_palette = new byte[1024];
+	// TODO: paletteResource.load(calcHash(filename));
+	// paletteResource.copyPalette(_palette);
+	SetUpdateHandler(&Palette::update);
+}
+
+Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) {
+	PaletteResource paletteResource(_vm);
+	_status = 0;
+	_palette = new byte[1024];
+	paletteResource.load(fileHash);
+	paletteResource.copyPalette(_palette);
+	SetUpdateHandler(&Palette::update);
+}
+
 Palette::~Palette() {
 	// TODO: _vm->_screen->unsetPaletteData(_palette);
 	delete[] _palette;
 }
 
+void Palette::usePalette() {
+	// TODO: _vm->_screen->setPaletteData(_palette);
+}
+
+void Palette::addPalette(const char *filename, int toIndex, int count, int fromIndex) {
+	// TODO: addPalette(calcHash(filename), toIndex, count, fromIndex);
+}
+
+void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
+	PaletteResource paletteResource(_vm);
+	if (toIndex + count > 256)
+		count = 256 - toIndex;
+	paletteResource.load(fileHash);
+	memcpy(_palette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4);		
+	// TODO: _vm->_screen->testPalette(_palette);
+}
+
+void Palette::startFadeToBlack(int counter) {
+	if (counter == 0)
+		counter = 1;
+	_fadeToR = 0;
+	_fadeToG = 0;
+	_fadeToB = 0;
+	_palCounter = counter;
+	_fadeStep = 255 / counter;
+	_status = 1;			
+}
+
+void Palette::startFadeToWhite(int counter) {
+	if (counter == 0)
+		counter = 1;
+	_fadeToR = 255;
+	_fadeToG = 255;
+	_fadeToB = 255;
+	_palCounter = counter;
+	_fadeStep = 255 / counter;
+	_status = 1;			
+}
+
 void Palette::update() {
-	// TODO
+	if (_status == 1) {
+		memset(_palette, 0, 1024);
+		_status = 0;
+	} else {
+		for (int i = 0; i < 256; i++) {
+			fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB);
+		}
+		// TODO: _vm->_screen->testPalette(_palette);
+		_palCounter--;
+	}
+}
+
+void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) {
+	#define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep)
+	FADE(rgb[0], toR);
+	FADE(rgb[1], toG);
+	FADE(rgb[2], toB);
+	#undef FADE
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 961b4ac..b29d771 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -32,11 +32,26 @@ class Palette : public Entity {
 public:
 	// Default constructor with black palette
 	Palette(NeverhoodEngine *vm);
+	// Create from existing palette
+	Palette(NeverhoodEngine *vm, byte *palette);
+	// Create from resource with filename
+	Palette(NeverhoodEngine *vm, const char *filename);
+	// Create from resource with fileHash
+	Palette(NeverhoodEngine *vm, uint32 fileHash);
 	~Palette();
+	void usePalette();
+	void addPalette(const char *filename, int toIndex, int count, int fromIndex);
+	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
+	void startFadeToBlack(int counter);
+	void startFadeToWhite(int counter);
 protected:
 	int _status;
 	byte *_palette;
+	int _palCounter;
+	byte _fadeToR, _fadeToG, _fadeToB;
+	int _fadeStep;
 	void update();
+	void fadeColor(byte *rgb, byte toR, byte toG, byte toB);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 6c77c48..2dd919c 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -126,9 +126,9 @@ void PaletteResource::unload() {
 	}
 }
 
-void PaletteResource::getPalette(byte *palette) {
+void PaletteResource::copyPalette(byte *destPalette) {
 	if (_palette) {
-		memcpy(palette, _palette, 1024);
+		memcpy(destPalette, _palette, 1024);
 	} else {
 		// TODO?: buildDefaultPalette(palette);
 	}
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 7f61af6..7f699c5 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -52,7 +52,8 @@ public:
 	~PaletteResource();
 	bool load(uint32 fileHash);
 	void unload();
-	void getPalette(byte *palette);
+	void copyPalette(byte *destPalette);
+	byte *palette() { return _palette; }
 protected:
 	NeverhoodEngine *_vm;
 	int _resourceHandle;


Commit: 4a01a69e37633aad402cea8477d812df4391a84d
    https://github.com/scummvm/scummvm/commit/4a01a69e37633aad402cea8477d812df4391a84d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with Module and GameModule classes

Changed paths:
  A engines/neverhood/gamemodule.cpp
  A engines/neverhood/gamemodule.h
  A engines/neverhood/module.cpp
  A engines/neverhood/module.h
    engines/neverhood/entity.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index b7ebdd1..0b0fc74 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -32,29 +32,36 @@ struct MessageParam {
 		uint32 _integer;
 		// TODO: Other types...
 	};
+	MessageParam(uint32 value) { _integer = value; }
 	// TODO: Constructors for the param types...
 };
 
 #define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler)
-#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, MessageParam &param, Entity *sender)> (handler)
+#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler)
 
 class Entity {
 public:
 	Entity(NeverhoodEngine *vm, int priority)
 		: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority) {
 	}
-	~Entity() {
+	virtual ~Entity() {
+	}
+	virtual void draw() {
 	}
 	void handleUpdate() {
 		if (_updateHandlerCb)
 			(this->*_updateHandlerCb)();
 	}
-	uint32 handleMessage(int messageNum, MessageParam &param, Entity *sender) {
+	uint32 sendMessage(int messageNum, const MessageParam &param, Entity *sender) {
 		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
 	}
+	// Overloaded for various message parameter types
+	uint32 sendMessage(int messageNum, uint32 param, Entity *sender) {
+		return sendMessage(messageNum, MessageParam(param), sender);
+	}
 protected:
 	void (Entity::*_updateHandlerCb)();
-	uint32 (Entity::*_messageHandlerCb)(int messageNum, MessageParam &param, Entity *sender);
+	uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
 	NeverhoodEngine *_vm;
 	int _priority;
 };
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
new file mode 100644
index 0000000..887ff3d
--- /dev/null
+++ b/engines/neverhood/gamemodule.cpp
@@ -0,0 +1,98 @@
+/* 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/gamemodule.h"
+
+namespace Neverhood {
+
+GameModule::GameModule(NeverhoodEngine *vm)
+	: Module(_vm, NULL) {
+	
+	// Other initializations moved to actual engine class
+	
+	// TODO .text:0048AD96
+
+	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
+
+	
+	
+	SetMessageHandler(&GameModule::handleMessage);
+	
+}
+
+GameModule::~GameModule() {
+
+	// TODO Sound1ChList_sub_407AF0(0x2D0031);
+
+	delete _childObject;
+	_childObject = NULL;
+
+	// TODO: Set palette to black but probably not neccessary
+	
+	// TODO Sound1ChList_sub_408480();
+
+}
+
+uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0800:
+		_someFlag1 = true;
+		return messageResult;		
+	case 0x1009:
+		_field24 = -1;
+		_field26 = -1;
+		_field28 = -1;
+		_field20 = param._integer;
+		_done = true;
+		return messageResult;
+	case 0x100A:
+		_field24 = (int16)param._integer;
+		return messageResult;
+	case 0x101F:
+		_field2C = true;		
+		return messageResult;
+	case 0x1023:
+		_field26 = (int16)param._integer;
+		return messageResult;
+	}
+	return messageResult;
+}
+
+void GameModule::startup() {
+	// TODO: Displaying of error text probably not needed in ScummVM
+	createModule1500(0);
+}
+
+void GameModule::createModule1500(int which) {
+	// TODO
+	_someFlag1 = false;
+	// TODO *getGlobalGameVarValuePtr(0x91080831) = 0x0F10114;
+	// TODO _childObject = new Module1500(this, which, true);
+	SetUpdateHandler(&GameModule::updateModule1500);
+}
+
+void GameModule::updateModule1500() {
+	// TODO
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
new file mode 100644
index 0000000..6f47fb6
--- /dev/null
+++ b/engines/neverhood/gamemodule.h
@@ -0,0 +1,56 @@
+/* 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.
+ *
+ */
+
+// TODO: I couldn't come up with a better name than 'Module' so far
+
+#ifndef NEVERHOOD_GAMEMODULE_H
+#define NEVERHOOD_GAMEMODULE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+
+namespace Neverhood {
+
+class GameModule : public Module {
+public:
+	GameModule(NeverhoodEngine *vm);
+	virtual ~GameModule();
+protected:
+	Entity *_prevChildObject;
+	bool _someFlag1;
+	bool _field2C;
+	uint32 _counter;
+	/* TODO
+	ResourceTable _resourceTable1;
+	ResourceTable _resourceTable2;
+	ResourceTable _resourceTable3;
+	ResourceTable _resourceTable4;
+	*/
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void startup();
+	void createModule1500(int which);
+	void updateModule1500();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE_H */
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
new file mode 100644
index 0000000..1aa1203
--- /dev/null
+++ b/engines/neverhood/module.cpp
@@ -0,0 +1,75 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "neverhood/module.h"
+
+namespace Neverhood {
+
+Module::Module(NeverhoodEngine *vm, Module *parentModule)
+	: Entity(_vm, 0), _parentModule(parentModule), _childObject(NULL),
+	_done(false), _field24(-1), _field26(-1), _field28(-1) {
+	
+	SetMessageHandler(&Module::handleMessage);
+	
+}
+
+Module::~Module() {
+	delete _childObject;
+}
+
+void Module::draw() {
+	if (_childObject)
+		_childObject->draw();
+}
+
+uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+
+	switch (messageNum) {
+	case 0x0008:
+		if (_parentModule)
+			_parentModule->sendMessage(8, 0, this);
+		return 0;
+	case 0x1009:
+		_field24 = -1;
+		_field26 = -1;
+		_field28 = -1;
+		_field20 = param._integer;
+		_done = true;
+		return 0;
+	case 0x100A:
+		_field24 = (int16)param._integer;
+		return 0;
+	case 0x1023:
+		_field26 = (int16)param._integer;
+		return 0;
+	case 0x1024:
+		_field28 = (int16)param._integer;
+		return 0;
+	default:
+		if (_childObject && sender == _parentModule)
+			return _childObject->sendMessage(messageNum, param, sender);
+	}
+
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
new file mode 100644
index 0000000..432a04c
--- /dev/null
+++ b/engines/neverhood/module.h
@@ -0,0 +1,49 @@
+/* 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.
+ *
+ */
+
+// TODO: I couldn't come up with a better name than 'Module' so far
+
+#ifndef NEVERHOOD_MODULE_H
+#define NEVERHOOD_MODULE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/entity.h"
+
+namespace Neverhood {
+
+class Module : public Entity {
+public:
+	Module(NeverhoodEngine *vm, Module *parentModule);
+	virtual ~Module();
+	virtual void draw();
+protected:
+	Module *_parentModule;
+	Entity *_childObject;
+	bool _done;
+	int16 _field24, _field26, _field28;
+	uint32 _field20;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index d70c4a9..ef6caba 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -4,7 +4,9 @@ MODULE_OBJS = \
 	blbarchive.o \
 	detection.o \
 	entity.o \
+	gamemodule.o \
 	graphics.o \
+	module.o \
 	neverhood.o \
 	palette.o \
 	resource.o \
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 956880f..edbf165 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -45,6 +45,10 @@ struct NeverhoodGameDescription;
 
 class ResourceMan;
 
+struct GameState {
+	int field1;
+};
+
 class NeverhoodEngine : public ::Engine {
 protected:
 
@@ -68,6 +72,7 @@ public:
 	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
+	GameState _gameState;
 	ResourceMan *_res;
 
 	void updateEvents();


Commit: ce4ef688b3c52016f31e02c2cf3f2fc6703343ba
    https://github.com/scummvm/scummvm/commit/ce4ef688b3c52016f31e02c2cf3f2fc6703343ba
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Add skeleton for Module1500 (the intro module)

Changed paths:
  A engines/neverhood/module1500.cpp
  A engines/neverhood/module1500.h
    engines/neverhood/entity.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 0b0fc74..fe5d07e 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -52,6 +52,7 @@ public:
 		if (_updateHandlerCb)
 			(this->*_updateHandlerCb)();
 	}
+	bool hasMessageHandler() const { return _messageHandlerCb != NULL; } 
 	uint32 sendMessage(int messageNum, const MessageParam &param, Entity *sender) {
 		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
 	}
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index ef6caba..97ad70e 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS = \
 	gamemodule.o \
 	graphics.o \
 	module.o \
+	module1500.o \
 	neverhood.o \
 	palette.o \
 	resource.o \
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
new file mode 100644
index 0000000..05a3bec
--- /dev/null
+++ b/engines/neverhood/module1500.cpp
@@ -0,0 +1,93 @@
+/* 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/module1500.h"
+
+namespace Neverhood {
+
+Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag)
+	: Module(vm, parentModule), _flag(flag) {
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 1:
+			createScene1502();
+			break;
+		case 2:
+			createScene1503();
+			break;
+		case 3:
+			createScene1504();
+			break;
+		default:
+			createScene1501();			
+		}
+	} else {
+		createScene1504();
+	}
+
+}
+
+void Module1500::update() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene1502();
+			break;
+		case 1:
+			if (_flag) {
+				createScene1503();
+			} else {
+				_parentModule->sendMessage(0x1009, 0, this);
+			}
+			break;
+		case 3:
+			createScene1501();
+			break;
+		default:
+			_parentModule->sendMessage(0x1009, 0, this);
+			break;
+		}
+	}
+}
+
+void Module1500::createScene1501() {
+	// TODO
+}
+			
+void Module1500::createScene1502() {
+	// TODO
+}
+
+void Module1500::createScene1503() {
+	// TODO
+}
+
+void Module1500::createScene1504() {
+	// TODO
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
new file mode 100644
index 0000000..d4a4310
--- /dev/null
+++ b/engines/neverhood/module1500.h
@@ -0,0 +1,47 @@
+/* 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.
+ *
+ */
+
+// TODO: I couldn't come up with a better name than 'Module' so far
+
+#ifndef NEVERHOOD_MODULE1500_H
+#define NEVERHOOD_MODULE1500_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+
+namespace Neverhood {
+
+class Module1500 : public Module {
+public:
+	Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag);
+protected:
+	bool _flag;
+	void update();
+	void createScene1501();			
+	void createScene1502();
+	void createScene1503();
+	void createScene1504();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1500_H */
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index edbf165..8a95b05 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -46,7 +46,7 @@ struct NeverhoodGameDescription;
 class ResourceMan;
 
 struct GameState {
-	int field1;
+	int sceneNum;
 };
 
 class NeverhoodEngine : public ::Engine {
@@ -111,6 +111,8 @@ public:
 	static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header);
 #endif
 
+	GameState& gameState() { return _gameState; }
+
 public:
 
 };


Commit: aded2a104b35320951fae30f6b6c4aa18887a4f5
    https://github.com/scummvm/scummvm/commit/aded2a104b35320951fae30f6b6c4aa18887a4f5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with Scene and Sprite classes

Changed paths:
  A engines/neverhood/scene.cpp
  A engines/neverhood/scene.h
  A engines/neverhood/sprite.cpp
  A engines/neverhood/sprite.h
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index fe5d07e..bbe67a1 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -24,15 +24,18 @@
 #define NEVERHOOD_ENTITY_H
 
 #include "neverhood/neverhood.h"
+#include "neverhood/graphics.h"
 
 namespace Neverhood {
 
 struct MessageParam {
 	union {
 		uint32 _integer;
+		NPoint _point;
 		// TODO: Other types...
 	};
 	MessageParam(uint32 value) { _integer = value; }
+	MessageParam(NPoint value) { _point = value; }
 	// TODO: Constructors for the param types...
 };
 
@@ -60,6 +63,10 @@ public:
 	uint32 sendMessage(int messageNum, uint32 param, Entity *sender) {
 		return sendMessage(messageNum, MessageParam(param), sender);
 	}
+	uint32 sendMessage(int messageNum, NPoint param, Entity *sender) {
+		return sendMessage(messageNum, MessageParam(param), sender);
+	}
+	int getPriority() const { return _priority; }
 protected:
 	void (Entity::*_updateHandlerCb)();
 	uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 887ff3d..09046cf 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -29,7 +29,7 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	// Other initializations moved to actual engine class
 	
-	// TODO .text:0048AD96
+	// TODO
 
 	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
 
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 315c62d..d7c1064 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -61,8 +61,8 @@ void BaseSurface::clear() {
 }
 
 void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
-	if (spriteResource.dimensions().width <= _drawRect.width && 
-		spriteResource.dimensions().height <= _drawRect.height) {
+	if (spriteResource.getDimensions().width <= _drawRect.width && 
+		spriteResource.getDimensions().height <= _drawRect.height) {
 		clear();
 		spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false);
 	}
@@ -70,7 +70,7 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
 
 // Misc
 
-void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) {
+void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
 
 	uint16 flags;
 	
@@ -92,14 +92,14 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnkn
 	}
 
 	if (flags & 4) {
-		if (unknown) {
-			unknown->unk1 = READ_LE_UINT16(sprite);
-			unknown->unk2 = READ_LE_UINT16(sprite + 2);
+		if (position) {
+			position->x = READ_LE_UINT16(sprite);
+			position->y = READ_LE_UINT16(sprite + 2);
 		}
 		sprite += 4;
-	} else if (unknown) {
-		unknown->unk1 = 0;
-		unknown->unk2 = 0;
+	} else if (position) {
+		position->x = 0;
+		position->y = 0;
 	}
 
 	if (flags & 8) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 27ef6cd..68ff84d 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -30,12 +30,12 @@
 
 namespace Neverhood {
 
-struct NDimensions {
-	int16 width, height;
+struct NPoint {
+	int16 x, y;
 };
 
-struct NUnknown {
-	int16 unk1, unk2;
+struct NDimensions {
+	int16 width, height;
 };
 
 struct NRect {
@@ -60,6 +60,8 @@ public:
 	virtual void addDirtyRect();
 	void clear();
 	void drawSpriteResource(SpriteResource &spriteResource);
+	int getPriority() const { return _priority; }
+	void setPriority(int priority) { _priority = priority; }
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
@@ -70,19 +72,9 @@ protected:
 	NRect _clipRect;
 };
 
-/*
-class Palette {
-public:
-	Palette();
-	~Palette();
-protected:
-	
-};
-*/
-
 // Misc
 
-void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels);
+void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels);
 void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 97ad70e..709538e 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -11,7 +11,9 @@ MODULE_OBJS = \
 	neverhood.o \
 	palette.o \
 	resource.o \
-	resourceman.o
+	resourceman.o \
+	scene.o \
+	sprite.o
 
 # This module can be built as a plugin
 ifdef BUILD_PLUGINS
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index f7bf032..d4418cb 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -117,7 +117,7 @@ Common::Error NeverhoodEngine::run() {
 		SpriteResource r(this);
 		BaseSurface *surf = new BaseSurface(this, 0, 640, 480);
 		r.load(0x0CA04202);
-		debug("r: width = %d; height = %d", r.dimensions().width, r.dimensions().height);
+		debug("r: width = %d; height = %d", r.getDimensions().width, r.getDimensions().height);
 		surf->drawSpriteResource(r);
 		delete surf;
 	}
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 2dd919c..4dcbd83 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -66,7 +66,7 @@ bool SpriteResource::load2(uint32 fileHash) {
 	if (_resourceHandle != -1) {
 		if (_vm->_res->getResourceType(_resourceHandle) == 2) {
 			byte *spriteData = _vm->_res->loadResource(_resourceHandle, true);
-			parseBitmapResource(spriteData, &_rle, &_dimensions, &_unknown, NULL, &_pixels);
+			parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels);
 		} else {
 			_vm->_res->unuseResource(_resourceHandle);
 			_resourceHandle = -1;
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 7f699c5..5a30d12 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -36,12 +36,13 @@ public:
 	bool load(uint32 fileHash);
 	bool load2(uint32 fileHash);
 	void unload();
-	const NDimensions& dimensions() { return _dimensions; };
+	const NDimensions& getDimensions() { return _dimensions; }
+	const NPoint& getPosition() { return _position; }
 protected:
 	NeverhoodEngine *_vm;
 	int _resourceHandle;
 	NDimensions _dimensions;
-	NUnknown _unknown;
+	NPoint _position;
 	byte *_pixels;
 	bool _rle;
 };
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
new file mode 100644
index 0000000..ccdae3a
--- /dev/null
+++ b/engines/neverhood/scene.cpp
@@ -0,0 +1,307 @@
+/* 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/scene.h"
+
+namespace Neverhood {
+
+Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
+	: Entity(vm, 0), _parentModule(parentModule) {
+	
+	_messageListFlag1 = false;
+	_systemCallbackFlag = false;
+	_messageList = NULL;
+	// TODO _rectType = 0;
+	_mouseClickPos.x = 0;
+	_mouseClickPos.y = 0;
+	_mouseClicked = false;
+	// TODO _rectList = NULL;
+	// TODO _someRects = NULL;
+	// TODO _playerSprite = NULL;
+	// TODO _mouseSprite = NULL;
+	_palette = NULL;
+	// TODO _class300 = NULL;
+	// TODO _field_8E = -1;
+	if (clearHitRects) {
+		// TODO g_Class700->setHitRects(NULL, 0);
+		// TODO g_Class700->clear();
+	}
+	// TODO g_screen->setFps(24);
+	// TODO g_screen->hSmack = NULL;	
+	// TODO g_screen->field_24 = 0;
+	// TODO g_screen->field_26 = 0;
+	// TODO g_screen->resetDirtyRects();	
+	_messageListFlag = true;
+	_surfaceFlag = false;
+	_messageList2 = NULL;
+	// TODO _smackerPlayer = NULL;
+	_smkFileHash = 0;
+	_messageListFlag2 = false;
+	_messageValue = -1;
+	
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&Scene::handleMessage);
+}
+
+Scene::~Scene() {
+
+	if (_palette) {
+		removeEntity(_palette);
+		delete _palette;
+	}
+
+	// Delete all entities
+	for (Common::Array<Entity*>::iterator iter = _entities.begin(); iter != _entities.end(); iter++)
+		delete *iter;
+
+	// Don't delete surfaces since they always belong to an entity
+
+}
+
+void Scene::draw() {
+	//**ALL TODO
+#if 0
+	if (_smackerPlayer) {
+		if (_surfaceFlag) {
+			g_screen->resetDirtyRects();
+			g_screen->copyDirtyRects();
+			g_screen->addDirtyRects();
+		}
+		_smackerPlayer->_surface->draw();
+	} else {
+		if (_surfaceFlag) {
+			g_screen->copyDirtyRects();
+			for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
+				(*iter)->addDirtyRect();
+			g_screen->addDirtyRects();
+		}
+		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
+			(*iter)->draw();
+	}	
+#endif
+}
+
+void Scene::addEntity(Entity *entity) {
+	int index = 0, insertIndex = -1;
+	for (Common::Array<Entity*>::iterator iter = _entities.begin(); iter != _entities.end(); iter++) {
+		if ((*iter)->getPriority() > entity->getPriority()) {
+			insertIndex = index;
+			break;
+		}
+		index++;
+	}
+	if (insertIndex >= 0)
+		_entities.insert_at(insertIndex, entity);
+	else
+		_entities.push_back(entity);		
+}
+
+bool Scene::removeEntity(Entity *entity) {
+	for (uint index = 0; index < _entities.size(); index++) {
+		if (_entities[index] == entity) {
+			_entities.remove_at(index);
+			return true;
+		}
+	}
+	return false; 
+}
+
+void Scene::addSurface(BaseSurface *surface) {
+	int index = 0, insertIndex = -1;
+	for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
+		if ((*iter)->getPriority() > surface->getPriority()) {
+			insertIndex = index;
+			break;
+		}
+		index++;
+	}
+	if (insertIndex >= 0)
+		_surfaces.insert_at(insertIndex, surface);
+	else
+		_surfaces.push_back(surface);		
+}
+
+bool Scene::removeSurface(BaseSurface *surface) {
+	for (uint index = 0; index < _surfaces.size(); index++) {
+		if (_surfaces[index] == surface) {
+			_surfaces.remove_at(index);
+			return true;
+		}
+	}
+	return false; 
+}
+
+Sprite *Scene::addSprite(Sprite *sprite) {
+	addEntity(sprite);
+	addSurface(sprite->getSurface());
+	return sprite;
+}
+
+void Scene::setSurfacePriority(BaseSurface *surface, int priority) {
+	surface->setPriority(priority);
+	if (removeSurface(surface))
+		addSurface(surface);
+}
+
+void Scene::deleteSprite(Sprite **sprite) {
+	// TODO g_Class700->removeSprite(*sprite);
+	removeSurface((*sprite)->getSurface());
+	removeEntity(*sprite);
+	delete *sprite;
+	*sprite = NULL;
+}
+
+void Scene::update() {
+
+	if (_smkFileHash != 0) {
+		// TODO
+		//**** ALL TODO
+		//_smackerPlayer = new SmackerPlayer(this, _smkFileHash, true, 0);
+		_savedUpdateHandlerCb = _updateHandlerCb;
+		_savedMessageHandlerCb = _messageHandlerCb;
+		SetUpdateHandler(&Scene::smackerUpdate);  
+		SetMessageHandler(&Scene::smackerHandleMessage);
+		_smackerDone = false;
+		// smackerUpdate();
+		// g_screen->smackerPlayer = _smackerPlayer;  
+		_smkFileHash = 0;
+	} else {
+		if (_mouseClicked) {
+			//** ALL TODO
+#if 0			
+			if (_playerSprite) {
+				// TODO: Merge later
+				if (_playerSprite->hasMessageHandler() && 
+					_playerSprite->sendMessage(0x1008, 0, this) != 0 &&
+					_messageListFlag &&
+					queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) {
+					_mouseClicked = false;
+				} else if (_playerSprite->hasMessageHandler() && 
+					_playerSprite->sendMessage(0x1008, 0, this) != 0 &&
+					_messageListFlag) {
+					_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
+				}
+			} else if (queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) {
+				_mouseClicked = false;
+			}
+#endif			
+		}
+	
+		// TODO runMessageList();
+
+		// Update all entities		
+		for (Common::Array<Entity*>::iterator iter = _entities.begin(); iter != _entities.end(); iter++)
+			(*iter)->handleUpdate();
+	
+	}
+
+}
+
+uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	// TODO
+#if 0	
+	switch (messageNum) {
+	case 0: // mouse moved
+		if (_mouseSprite && _mouseSprite->hasMessageHandler())
+			_mouseSprite->sendMessage(0x4002, param, this);
+		queryPositionSomeRects(param._point.x, param._point.y);			
+		break;
+	case 1: // mouse clicked
+		_mouseClicked = true;
+		_mouseClickPos = param._point;
+		break;
+	/* ORIGINAL DEBUG		
+	case 3:
+		drawSurfaceRects();		
+		break;
+	*/		
+	/* ORIGINAL DEBUG		
+	case 4:
+		drawRectListRects();		
+		break;
+	*/		
+	case 5:
+		broadcastObjectMessage5();		
+		break;
+	case 6:
+		_parentModule->sendMessage(0x1009, param, this);		
+		break;
+	case 0x1006:
+		if (_messageListFlag1) {
+			_messageListFlag1 = false;
+			if (_messageListIndex == _messageListCount)
+				_playerSprite->sendMessage(0x4004, 0, this);
+			else
+				runMessageList();
+		}
+		break;
+	case 0x1007:
+		if (_messageListFlag1) {
+			_messageListFlag1 = false;
+			_messageList = NULL;
+			_playerSprite->sendMessage(0x4004, 0, this);
+		}
+		break;
+	case 0x101D:
+		if (_mouseSprite) {
+			_prevVisible = _mouseSprite->_drawSurface->_visible;
+			_mouseSprite->_drawSurface->_visible = false;
+		}
+		break;
+	case 0x101E:
+		if (_prevVisible && _mouseSprite) {
+			_mouseSprite->_drawSurface->_visible = true;
+			_mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this);
+		}
+		break;
+	case 0x1022:
+		setSurfacePriority(((Sprite*)sender)->_surface, param._integer);
+		break;
+	}
+#endif	
+	return 0;
+}
+
+void Scene::smackerUpdate() {
+	//**ALL TODO
+#if 0	
+	_smackerPlayer->handleUpdate();
+	if (_smackerDone) {
+		delete _smackerPlayer;
+		_smackerPlayer = NULL;
+		_updateHandlerCb = _savedUpdateHandlerCb;
+		_messageHandlerCb = _savedMessageHandlerCb;
+		if (_palette)
+			_palette->usePalette();
+		// TODO class300->restore();
+		// TODO g_screen->smackerPlayer = NULL;		
+	}
+#endif	
+}
+
+uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	if (messageNum == 0x3002)
+		_smackerDone = true;
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
new file mode 100644
index 0000000..3532a43
--- /dev/null
+++ b/engines/neverhood/scene.h
@@ -0,0 +1,100 @@
+/* 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_SCENE_H
+#define NEVERHOOD_SCENE_H
+
+#include "common/array.h"
+#include "neverhood/neverhood.h"
+#include "neverhood/entity.h"
+#include "neverhood/graphics.h"
+#include "neverhood/module.h"
+#include "neverhood/palette.h"
+#include "neverhood/sprite.h"
+
+namespace Neverhood {
+
+struct MessageListItem {
+	uint32 messageNum;
+	uint32 messageValue;
+};
+
+class Scene : public Entity {
+public:
+	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
+	virtual ~Scene();
+	virtual void draw();
+	void addEntity(Entity *entity);
+	bool removeEntity(Entity *entity);
+	void addSurface(BaseSurface *surface);
+	bool removeSurface(BaseSurface *surface);
+	Sprite *addSprite(Sprite *sprite);
+	void setSurfacePriority(BaseSurface *surface, int priority);
+	void deleteSprite(Sprite **sprite);
+protected:
+	Module *_parentModule;
+	Common::Array<Entity*> _entities;
+	Common::Array<BaseSurface*> _surfaces;
+	bool _systemCallbackFlag;
+	MessageListItem *_messageList;
+	int _messageListIndex;
+	int _messageListCount;
+	bool _messageListFlag1;
+	NPoint _mouseClickPos;
+	bool _mouseClicked;
+	// TODO RectResource _rectResource;
+	// TODO 00000080 rectList		dd ?
+	// TODO 00000084 rectType		dw ?
+	// TODO 00000086 rectListCount   dw ?
+	// TODO 00000088 someRects	   dd ?
+	// TODO 0000008C someRectsCount  dw ?
+	// TODO 0000008E field_8E		dw ?
+	// TODO 00000090 playerSprite		dd ?
+	// TODO 00000094 mouseSprite	 dd ?
+	Palette *_palette;
+	// TODO 0000009C class300		dd ?
+	bool _surfaceFlag;
+	bool _messageListFlag;
+	MessageListItem *_messageList2;
+	int _messageListStatus;
+	// TODO 000000B0 smackerPlayer   dd ?
+	void (Entity::*_savedUpdateHandlerCb)();
+	uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
+	bool _smackerDone;
+	// TODO 000000BD field_BD		db ?
+	// TODO 000000BE field_BE		db ?
+	// TODO 000000BF field_BF		db ?
+	uint32 _smkFileHash;
+	// TODO 000000C4 hitArray		dd ?
+	bool _messageListFlag2;
+	bool _prevVisible;
+	int _messageValue;
+	// TODO 000000CF field_CF		db ?
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void smackerUpdate();
+	uint32 smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_SCENE_H */
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
new file mode 100644
index 0000000..6ee0a66
--- /dev/null
+++ b/engines/neverhood/sprite.cpp
@@ -0,0 +1,179 @@
+/* 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/sprite.h"
+
+namespace Neverhood {
+
+// Sprite
+
+Sprite::Sprite(NeverhoodEngine *vm, int objectPriority)
+	: Entity(vm, objectPriority), _x(0), _y(0),
+	_spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
+	_doDeltaX(false), _doDeltaY(false), _needRedraw(false),
+	_deltaX1(0), _deltaY1(0), _deltaX2(0), _deltaY2(0),
+	_flags(0) {
+
+	SetMessageHandler(&Sprite::handleMessage);
+	
+}
+
+Sprite::~Sprite() {
+	delete _surface;
+}
+
+void Sprite::processDelta() {
+	if (_doDeltaX) {
+		_rect.x1 = _x - _deltaX1 - _deltaX2 + 1;
+		_rect.x2 = _x - _deltaX1;
+	} else {
+		_rect.x1 = _x + _deltaX1;
+		_rect.x2 = _x + _deltaX1 + _deltaX2 - 1;
+	}
+	if (_doDeltaY) {
+		_rect.y1 = _y - _deltaY1 - _deltaY2 + 1;
+		_rect.y2 = _y - _deltaY1;
+	} else {
+		_rect.y1 = _y + _deltaY1;
+		_rect.y2 = _y + _deltaY1 + _deltaY2 - 1;
+	}
+}
+
+void Sprite::setDoDeltaX(int type) {
+	// Clear, set or toggle
+	_doDeltaX = type == 2 ? !_doDeltaX : type == 1;
+}
+
+void Sprite::setDoDeltaY(int type) {
+	// Clear, set or toggle
+	_doDeltaY = type == 2 ? !_doDeltaY : type == 1;
+}
+
+bool Sprite::isPointInside(int16 x, int16 y) {
+	return x >= _rect.x1 && x <= _rect.x2 && y >= _rect.y1 && y <= _rect.y2;
+}
+
+uint32 Sprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	if (messageNum == 5) {
+		// TODO: Draw debug marker (?)
+		// TODO g_Screen->drawLine(_x - 5, _y, _x + 6, _y);
+		// TODO g_Screen->drawLine(_x, _y - 5, _x, _y + 6);
+	}
+	return 0;
+}
+
+void Sprite::createSurface(int surfacePriority, int16 width, int16 height) {
+	_surface = new BaseSurface(_vm, surfacePriority, width, height);
+}
+
+// StaticSprite
+
+StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
+	: Sprite(vm, objectPriority), _spriteResource(vm) {
+	
+}
+
+StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
+	: Sprite(vm, 0), _spriteResource(vm) {
+
+	// TODO init(calcHash(filename), surfacePriority, x, y, width, height);
+
+}
+
+StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
+	: Sprite(vm, 0), _spriteResource(vm) {
+
+	init(fileHash, surfacePriority, x, y, width, height);
+	
+}
+
+void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) {
+
+	_spriteResource.load2(fileHash);
+
+	if (width == 0)
+		width = _spriteResource.getDimensions().width;
+
+	if (height == 0)
+		height = _spriteResource.getDimensions().height;
+
+	createSurface(surfacePriority, width, height);
+
+	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
+	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
+
+	_rect1.x1 = 0;
+	_rect1.y1 = 0;
+	_rect1.x2 = width;
+	_rect1.y2 = height; 
+
+	_needRedraw = true;
+
+	update();
+	
+}
+
+void StaticSprite::update() {
+
+	if (!_surface)
+		return;
+		
+	if (_doDeltaX) {
+		_x = filterX(_x - _rect1.x1 - _rect1.x2 + 1);
+	} else {
+		_x = filterX(_x + _rect1.x1);
+	}
+		
+	if (_doDeltaY) {
+		_y = filterY(_y - _rect1.y1 - _rect1.y2 + 1);
+	} else {
+		_y = filterY(_y + _rect1.y1);
+	}
+
+	if (_needRedraw) {
+		// TODO _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2);
+		_needRedraw = false;
+	}
+
+}
+
+void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
+
+	_spriteResource.load2(fileHash);
+
+	if (dimensions) {
+		_rect1.x1 = 0;
+		_rect1.y1 = 0;
+		_rect1.x2 = _spriteResource.getDimensions().width;
+		_rect1.y2 = _spriteResource.getDimensions().height;
+	}
+
+	if (position) {
+		_x = _spriteResource.getPosition().x;
+		_y = _spriteResource.getPosition().y;
+	}
+
+	_needRedraw = true;
+
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
new file mode 100644
index 0000000..5c08e3c
--- /dev/null
+++ b/engines/neverhood/sprite.h
@@ -0,0 +1,90 @@
+/* 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_SPRITE_H
+#define NEVERHOOD_SPRITE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/entity.h"
+#include "neverhood/graphics.h"
+#include "neverhood/resource.h"
+
+namespace Neverhood {
+
+#define SetSpriteCallback(callback) _spriteCallbackCb = static_cast <void (Sprite::*)(void)> (callback)
+#define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback)
+#define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback)
+
+const int16 kDefPosition = -32768;
+
+class Sprite : public Entity {
+public:
+	Sprite(NeverhoodEngine *vm, int objectPriority);
+	~Sprite();
+	BaseSurface *getSurface() { return _surface; }
+	void processDelta();
+	void setDoDeltaX(int type);
+	void setDoDeltaY(int type);
+	bool isPointInside(int16 x, int16 y);
+protected:
+	void (Sprite::*_spriteUpdateCb)();
+	int16 (Sprite::*_filterXCb)(int16);
+	int16 (Sprite::*_filterYCb)(int16);
+	BaseSurface *_surface;
+	int16 _x, _y;
+	bool _doDeltaX, _doDeltaY;
+	bool _needRedraw;
+	//0000002B field_2B		db ?
+	//0000002C field2C		dd ? // unused
+	NRect _rect1;
+	int16 _deltaX1, _deltaY1;
+	int16 _deltaX2, _deltaY2;
+	NRect _rect;
+	uint16 _flags;
+	//0000004A field4A		dw ? // seems to be unused except in ctor
+	//0000004C rectResource	RectResource ?
+	//void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createSurface(int surfacePriority, int16 width, int16 height);
+	int16 filterX(int16 x) {
+		return _filterXCb ? (this->*_filterXCb)(x) : x;
+	}
+	int16 filterY(int16 y) {
+		return _filterYCb ? (this->*_filterYCb)(y) : y;
+	}
+};
+
+class StaticSprite : public Sprite {
+public:
+	StaticSprite(NeverhoodEngine *vm, int objectPriority);
+	StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
+	StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
+	void load(uint32 fileHash, bool dimensions, bool position);
+protected:
+	SpriteResource _spriteResource;
+	void init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
+	void update();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_SPRITE_H */


Commit: 0614b288cfc38180eddd90a41cf726718d823e13
    https://github.com/scummvm/scummvm/commit/0614b288cfc38180eddd90a41cf726718d823e13
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Add default parameters to StaticSprite constructors

Changed paths:
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 5c08e3c..c2ed720 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -76,8 +76,8 @@ protected:
 class StaticSprite : public Sprite {
 public:
 	StaticSprite(NeverhoodEngine *vm, int objectPriority);
-	StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
-	StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
+	StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
+	StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 	void load(uint32 fileHash, bool dimensions, bool position);
 protected:
 	SpriteResource _spriteResource;


Commit: f01f9343c831cda618dabd2dcda7be77b2948ecc
    https://github.com/scummvm/scummvm/commit/f01f9343c831cda618dabd2dcda7be77b2948ecc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: Start with AnimatedSprite and AnimResource

Changed paths:
    engines/neverhood/graphics.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 68ff84d..cb7474c 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -62,6 +62,9 @@ public:
 	void drawSpriteResource(SpriteResource &spriteResource);
 	int getPriority() const { return _priority; }
 	void setPriority(int priority) { _priority = priority; }
+	NDrawRect& getDrawRect() { return _drawRect; }
+	NDrawRect& getSysRect() { return _sysRect; }
+	NRect& getClipRect() { return _clipRect; }
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index d4418cb..2f27fca 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -112,7 +112,7 @@ Common::Error NeverhoodEngine::run() {
 	_res->unuseResource(resourceHandle);
 #endif
 	
-#if 1
+#if 0
 	{ // Create a new scope
 		SpriteResource r(this);
 		BaseSurface *surf = new BaseSurface(this, 0, 640, 480);
@@ -123,6 +123,13 @@ Common::Error NeverhoodEngine::run() {
 	}
 #endif
 	
+#if 1
+	{ // Create a new scope
+		AnimResource r(this);
+		r.load(0x000540B0);
+	}
+#endif
+	
 	delete _res;
 
 	return Common::kNoError;
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 4dcbd83..84eab7f 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -25,6 +25,8 @@
 
 namespace Neverhood {
 
+// SpriteResource
+
 SpriteResource::SpriteResource(NeverhoodEngine *vm)
 	 : _vm(vm), _resourceHandle(-1), _pixels(NULL) {
 }
@@ -87,6 +89,8 @@ void SpriteResource::unload() {
 	_rle = false;
 }
 
+// PaletteResource
+
 PaletteResource::PaletteResource(NeverhoodEngine *vm)
 	: _vm(vm), _resourceHandle(-1), _palette(NULL) {
 }
@@ -134,4 +138,153 @@ void PaletteResource::copyPalette(byte *destPalette) {
 	}
 }
 
+// AnimResource
+
+AnimResource::AnimResource(NeverhoodEngine *vm)
+	: _vm(vm), _width(0), _height(0), _currSpriteData(NULL) {
+	
+	clear();
+	clear2();
+}
+
+AnimResource::~AnimResource() {
+	unloadInternal();
+}
+
+bool AnimResource::load(uint32 fileHash) {
+
+	if (fileHash == _fileHash)
+		return true;
+
+	unload();
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	if (_resourceHandle == -1)
+		return false;
+	
+	byte *resourceData, *animList, *frameList;
+	uint16 animInfoStartOfs, animListIndex, animListCount;
+	uint16 frameListStartOfs, frameCount;
+	uint32 spriteDataOfs, paletteDataOfs;
+
+	if (_vm->_res->getResourceType(_resourceHandle) != 4) {
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+		return false;
+	}
+	
+	resourceData = _vm->_res->loadResource(_resourceHandle);
+	if (!resourceData) {
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+		return false;
+	}
+
+	animListCount = READ_LE_UINT16(resourceData);
+	animInfoStartOfs = READ_LE_UINT16(resourceData + 2);
+	spriteDataOfs = READ_LE_UINT32(resourceData + 4);
+	paletteDataOfs = READ_LE_UINT32(resourceData + 8);
+	
+	animList = resourceData + 12;
+	for (animListIndex = 0; animListIndex < animListCount; animListIndex++) {
+		debug("hash: %08X", READ_LE_UINT32(animList));
+		if (READ_LE_UINT32(animList) == fileHash)
+			break;
+		animList += 8;				
+	}
+	
+	if (animListIndex >= animListCount) {
+		_vm->_res->unloadResource(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+		return false;
+	}
+
+	_spriteData = resourceData + spriteDataOfs;
+	if (paletteDataOfs > 0)
+		_paletteData = resourceData + paletteDataOfs;
+	
+	frameCount = READ_LE_UINT16(animList + 4);
+	frameListStartOfs = READ_LE_UINT16(animList + 6);
+	
+	debug("frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs);
+	
+	frameList = resourceData + animInfoStartOfs + frameListStartOfs;
+
+	_frames.clear();
+	_frames.reserve(frameCount);
+
+	for (uint16 frameIndex = 0; frameIndex < frameCount; frameIndex++) {
+		AnimFrameInfo frameInfo;
+		frameInfo.frameHash = READ_LE_UINT32(frameList);
+		frameInfo.counter = READ_LE_UINT16(frameList + 4);
+		frameInfo.rect.x1 = READ_LE_UINT16(frameList + 6);
+		frameInfo.rect.y1 = READ_LE_UINT16(frameList + 8);
+		frameInfo.rect.x2 = READ_LE_UINT16(frameList + 10);
+		frameInfo.rect.y2 = READ_LE_UINT16(frameList + 12);
+		frameInfo.deltaX = READ_LE_UINT16(frameList + 14);
+		frameInfo.deltaY = READ_LE_UINT16(frameList + 16);
+		frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); 
+		frameInfo.deltaRect.y = READ_LE_UINT16(frameList + 20); 
+		frameInfo.deltaRect.width = READ_LE_UINT16(frameList + 22); 
+		frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24);
+		frameInfo.field_1A = READ_LE_UINT16(frameList + 26); 
+		frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28);
+		debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", 
+			frameInfo.frameHash, frameInfo.counter, 
+			frameInfo.rect.x1, frameInfo.rect.y1, frameInfo.rect.x2, frameInfo.rect.y2,
+			frameInfo.deltaX, frameInfo.deltaY,
+			frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height,
+			frameInfo.field_1A, frameInfo.spriteDataOffs);
+		frameList += 32;
+		_frames.push_back(frameInfo);
+	}
+	
+	_fileHash = fileHash;
+	
+	return true;
+	
+}
+
+void AnimResource::unload() {
+	if (_resourceHandle != -1) {
+		_vm->_res->unloadResource(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		clear();
+	}
+}
+
+void AnimResource::clear() {
+	_resourceHandle = -1;
+	// _count = 0;
+	// _infoStructs = NULL;
+	_currSpriteData = NULL;
+	_fileHash = 0;
+	_paletteData = NULL;
+	_spriteData = NULL;
+}
+
+void AnimResource::clear2() {
+	clear();
+	_replEnabled = true;
+	_replOldByte = 0;
+	_replNewByte = 0;
+}
+
+bool AnimResource::loadInternal(uint32 fileHash) {
+	unloadInternal();
+	return load(fileHash);
+}
+
+void AnimResource::unloadInternal() {
+	unload();
+	clear2();
+}
+
+int16 AnimResource::getFrameIndex(uint32 frameHash) {
+	for (uint i = 0; i < _frames.size(); i++)
+		if (_frames[i].frameHash == frameHash)
+			return (int16)i;
+	return -1;			
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 5a30d12..8cab1eb 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -61,6 +61,44 @@ protected:
 	byte *_palette;
 };
 
+struct AnimFrameInfo {
+	uint32 frameHash;
+	int16 counter;
+	NRect rect;
+	int16 deltaX, deltaY;
+	NDrawRect deltaRect;
+	uint16 field_1A; 
+	uint32 spriteDataOffs;
+};
+
+class AnimResource {
+public:
+	AnimResource(NeverhoodEngine *vm);
+	~AnimResource();
+	bool load(uint32 fileHash);
+	void unload();
+	void clear();
+	void clear2();
+	bool loadInternal(uint32 fileHash);
+	void unloadInternal();
+	uint getFrameCount() const { return _frames.size(); }
+	const AnimFrameInfo& getFrameInfo(int16 index) const { return _frames[index]; }
+	int16 getFrameIndex(uint32 frameHash);
+protected:
+	NeverhoodEngine *_vm;
+	int _resourceHandle;
+	int16 _width, _height;
+	byte *_currSpriteData;
+	uint32 _fileHash;
+	byte *_paletteData;
+	byte *_spriteData;
+	bool _replEnabled;
+	byte _replOldByte;
+	byte _replNewByte;
+	Common::Array<AnimFrameInfo> _frames;
+};
+
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_RESOURCE_H */
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 6ee0a66..0157673 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -30,7 +30,6 @@ Sprite::Sprite(NeverhoodEngine *vm, int objectPriority)
 	: Entity(vm, objectPriority), _x(0), _y(0),
 	_spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
 	_doDeltaX(false), _doDeltaY(false), _needRedraw(false),
-	_deltaX1(0), _deltaY1(0), _deltaX2(0), _deltaY2(0),
 	_flags(0) {
 
 	SetMessageHandler(&Sprite::handleMessage);
@@ -43,18 +42,18 @@ Sprite::~Sprite() {
 
 void Sprite::processDelta() {
 	if (_doDeltaX) {
-		_rect.x1 = _x - _deltaX1 - _deltaX2 + 1;
-		_rect.x2 = _x - _deltaX1;
+		_rect.x1 = _x - _deltaRect.x - _deltaRect.width + 1;
+		_rect.x2 = _x - _deltaRect.x;
 	} else {
-		_rect.x1 = _x + _deltaX1;
-		_rect.x2 = _x + _deltaX1 + _deltaX2 - 1;
+		_rect.x1 = _x + _deltaRect.x;
+		_rect.x2 = _x + _deltaRect.x + _deltaRect.width - 1;
 	}
 	if (_doDeltaY) {
-		_rect.y1 = _y - _deltaY1 - _deltaY2 + 1;
-		_rect.y2 = _y - _deltaY1;
+		_rect.y1 = _y - _deltaRect.y - _deltaRect.height + 1;
+		_rect.y2 = _y - _deltaRect.y;
 	} else {
-		_rect.y1 = _y + _deltaY1;
-		_rect.y2 = _y + _deltaY1 + _deltaY2 - 1;
+		_rect.y1 = _y + _deltaRect.y;
+		_rect.y2 = _y + _deltaRect.y + _deltaRect.height - 1;
 	}
 }
 
@@ -176,4 +175,274 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
 
 }
 
+// AnimatedSprite
+
+AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, int objectPriority)
+	: Sprite(vm, objectPriority), _animResource(vm) {
+
+	init();
+}
+
+AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y)
+	: Sprite(vm, 1100), _animResource(vm) {
+
+	init();
+	SetUpdateHandler(&AnimatedSprite::update);
+	createSurface1(fileHash, surfacePriority);
+	_x = x;
+	_y = y;
+	setFileHash(fileHash, 0, -1);
+	
+}
+
+void AnimatedSprite::init() {
+	_counter = 0;
+	_fileHash1 = 0;
+	_deltaX = 0;
+	_deltaY = 0;
+	_fileHash2 = 0;
+	// TODO _callbackList = 0;
+	_frameIndex3 = 0;
+	// TODO _callback3 = 0;
+	_frameIndex = 0;
+	_hashListIndex = -1;
+	// TODO _callback2 = 0;
+	_newHashListIndex = -1;
+	// TODO _callback1 = 0;
+	_fileHash4 = 0;
+	_flag = false;
+	_replOldByte = 0;
+	_replNewByte = 0;
+	// TODO _animResource.replEnabled = 0;
+	_playBackwards = 0;
+}
+
+void AnimatedSprite::update() {
+	updateAnim();
+	handleSpriteUpdate();
+	updatePosition();
+}
+
+void AnimatedSprite::updateDeltaXY() {
+	if (_doDeltaX) {
+		_x -= _deltaX;
+	} else {
+		_x += _deltaX;
+	}
+	if (_doDeltaY) {
+		_y -= _deltaY;
+	} else {
+		_y += _deltaY;
+	}
+	_deltaX = 0;
+	_deltaY = 0;
+	processDelta();
+}
+
+void AnimatedSprite::updateAnim() {
+
+	_flag = false;
+
+	if (_fileHash1 == 0) {
+		if (_newHashListIndex != -1) {
+			_hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex;
+			_newHashListIndex = -1;
+		} else if (_fileHash4 != 0) {
+			_hashListIndex = MAX<int16>(0, _animResource.getFrameIndex(_fileHash4));
+			_fileHash4 = 0;
+		}
+		if (_fileHash1 == 0 && _frameIndex != _hashListIndex) {
+			if (_counter != 0)
+				_counter--;
+			if (_counter == 0 && _animResource.getFrameCount() != 0) {
+				
+				if (_fileHash2 != 0) {
+					if (_animResource.loadInternal(_fileHash2)) {
+						_fileHash3 = _fileHash2;
+					} else {
+						// TODO _animResource.loadInternal(calcHash("sqDefault"));
+						_fileHash3 = 0;
+					}
+					// loc_43831D
+					if (_replNewByte != _replOldByte) {
+						// TODO _animResource.setRepl(_replOldByte, _replNewByte);
+					}
+					_fileHash2 = 0;
+					if (_status != 0) {
+						_frameIndex = _fileHash6 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash6)) : 0;
+						_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
+					} else {
+						_frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1;
+						_frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; 
+					}
+				} else {
+					// TODO updateFrameIndex();
+				}
+				if (_fileHash1 == 0)
+					updateFrameInfo();
+			}				
+		}
+	}
+	
+	if (_fileHash1 != 0) {
+		if (_status == 2) {
+			_hashListIndex = _frameIndex;
+		} else {
+			if (_status == 1) {
+				if (_animResource.loadInternal(_fileHash1)) {
+					_fileHash3 = _fileHash1;
+				} else {
+					// TODO _animResource.loadInternal(calcHash("sqDefault"));
+					_fileHash3 = 0;
+				}
+				if (_replNewByte != _replOldByte) {
+					// TODO _animResource.setRepl(_replOldByte, _replNewByte);
+				}
+				_fileHash1 = 0;
+				_frameIndex = _fileHash6 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash6)) : 0;
+				_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
+			} else {
+				if (_animResource.loadInternal(_fileHash1)) {
+					_fileHash3 = _fileHash1;
+				} else {
+					// TODO _animResource.loadInternal(calcHash("sqDefault"));
+					_fileHash3 = 0;
+				}
+				if (_replNewByte != _replOldByte) {
+					// TODO _animResource.setRepl(_replOldByte, _replNewByte);
+				}
+				_fileHash1 = 0;
+				_frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1;
+				_frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1;
+			}
+			updateFrameInfo();
+		}
+
+		if (_newHashListIndex != -1) {
+			_hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex;
+			_newHashListIndex = -1;
+		} else if (_fileHash4 != 0) {
+			_hashListIndex = MAX<int16>(0, _animResource.getFrameIndex(_fileHash4));
+			_fileHash4 = 0;
+		}
+
+	}
+
+}
+
+void AnimatedSprite::updatePosition() {
+
+	if (!_surface)
+		return;
+
+	if (_doDeltaX) {
+		_surface->getDrawRect().x = filterX(_x - _rect1.x1 - _rect1.x2 + 1);
+	} else {
+		_surface->getDrawRect().x = filterX(_x + _rect1.x1);
+	}
+
+	if (_doDeltaY) {
+		_surface->getDrawRect().y = filterY(_y - _rect1.y1 - _rect1.y2 + 1);
+	} else {
+		_surface->getDrawRect().y = filterY(_y + _rect1.y1);
+	}
+
+	if (_needRedraw) {
+		// TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2);
+		_needRedraw = false;
+	}
+
+}
+
+void AnimatedSprite::updateFrameIndex() {
+	if (!_playBackwards) {
+		if (_frameIndex < _frameIndex2) {
+			_frameIndex++;
+		} else {
+			// Inform self about end of current animation
+			// The caller can then e.g. set a new animation fileHash
+			sendMessage(0x3002, 0, this);
+			if (_fileHash1 == 0)
+				_frameIndex = 0;
+		}
+	} else {
+		if (_frameIndex > 0) {
+			_frameIndex--;
+		} else {
+			sendMessage(0x3002, 0, this);
+			if (_fileHash1 == 0)
+				_frameIndex = _frameIndex2;
+		}
+	}
+}
+
+void AnimatedSprite::updateFrameInfo() {
+
+	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex);
+	
+	_flag = true;
+	_rect1 = frameInfo.rect;
+	_deltaX = frameInfo.deltaX;
+	_deltaY = frameInfo.deltaY;
+	_deltaRect = frameInfo.deltaRect;
+	_counter = frameInfo.counter;
+
+	processDelta();
+
+	_needRedraw = true;
+
+	if (frameInfo.frameHash != 0) {
+		sendMessage(0x100D, frameInfo.frameHash, this);
+	}
+
+}
+
+void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
+	NDimensions dimensions;
+	// TODO dimensions = getAnimatedSpriteDimensions(fileHash);
+	dimensions.width = 640;
+	dimensions.height = 480;
+	_surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height);
+}
+
+void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) {
+	_fileHash1 = fileHash;
+	_frameIndex3 = frameIndex3;
+	_frameIndex4 = frameIndex4;
+	_fileHash4 = 0;
+	_status = 0;
+	_playBackwards = false;
+	_newHashListIndex = -1;
+	_hashListIndex = -1;
+}
+
+void AnimatedSprite::setFileHash1() {
+	_fileHash1 = 1;
+	_status = 2;
+}
+
+void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) {
+	_fileHash1 = fileHash;
+	_fileHash6 = fileHash6;
+	_fileHash5 = fileHash5;
+	_fileHash4 = 0;
+	_status = 1;
+	_playBackwards = false;
+	_newHashListIndex = -1;
+	_hashListIndex = -1;
+}
+
+void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5) {
+	_fileHash2 = fileHash2;
+	_fileHash6 = fileHash6;
+	_fileHash5 = fileHash5;
+	_fileHash4 = 0;
+	_status = 1;
+	_playBackwards = false;
+	_newHashListIndex = -1;
+	_hashListIndex = -1;
+}
+
+
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index c2ed720..708228c 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -56,8 +56,7 @@ protected:
 	//0000002B field_2B		db ?
 	//0000002C field2C		dd ? // unused
 	NRect _rect1;
-	int16 _deltaX1, _deltaY1;
-	int16 _deltaX2, _deltaY2;
+	NDrawRect _deltaRect;
 	NRect _rect;
 	uint16 _flags;
 	//0000004A field4A		dw ? // seems to be unused except in ctor
@@ -65,6 +64,10 @@ protected:
 	//void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createSurface(int surfacePriority, int16 width, int16 height);
+	void handleSpriteUpdate() {
+		if (_spriteUpdateCb)
+			(this->*_spriteUpdateCb)();
+	}
 	int16 filterX(int16 x) {
 		return _filterXCb ? (this->*_filterXCb)(x) : x;
 	}
@@ -85,6 +88,54 @@ protected:
 	void update();
 };
 
+class AnimatedSprite : public Sprite {
+public:
+	AnimatedSprite(NeverhoodEngine *vm, int objectPriority);
+	AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y);
+protected:
+	AnimResource _animResource;
+	uint32 _fileHash1;
+	uint32 _fileHash2;
+	uint32 _fileHash3;
+	int16 _frameIndex;
+	int16 _frameIndex3;
+	int16 _frameIndex2;
+	int16 _frameIndex4;
+	uint32 _fileHash6;
+	uint32 _fileHash5;
+	int16 _status;
+	int16 _counter;
+	int _hashListIndex;
+	int _newHashListIndex;
+	uint32 _fileHash4;
+	int16 _deltaX, _deltaY;
+	byte _replOldByte;
+	byte _replNewByte;
+	bool _playBackwards;
+	bool _flag;
+	/* TODO
+	callbackListIndex dw ?
+	callbackListCount dw ?
+	callbackList	dd ?
+	callback3	   dd ?
+	callback2	   dd ?
+	callback1	   dd ?
+	*/
+	void init();
+	void update();
+	void updateDeltaXY();
+	void updateAnim();
+	void updatePosition();
+	void updateFrameIndex();
+	void updateFrameInfo();
+	void createSurface1(uint32 fileHash, int surfacePriority);
+	void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4);
+	void setFileHash1();
+	void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5);
+	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);
+	int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!!
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_SPRITE_H */


Commit: 3c82668fe4267b34a9e3c7fe88f0d2a0fcfc4c4b
    https://github.com/scummvm/scummvm/commit/3c82668fe4267b34a9e3c7fe88f0d2a0fcfc4c4b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:57-07:00

Commit Message:
NEVERHOOD: More work on Module1500

- Implement Scene1501 (with yet unimpelemented stuff commented out)
- Add preliminary main loop to test stuff/updates
- Add dummy SoundResource
- And fix a mean bug/typo in some initializer lists...
(The intro now "runs" but doesn't show anything yet since the actual display code and other classes are not yet implemented yet.)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1500.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resource.h
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 09046cf..e46d23c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -22,20 +22,22 @@
 
 #include "neverhood/gamemodule.h"
 
+#include "neverhood/module1500.h"
+
 namespace Neverhood {
 
 GameModule::GameModule(NeverhoodEngine *vm)
-	: Module(_vm, NULL) {
+	: Module(vm, NULL) {
 	
 	// Other initializations moved to actual engine class
 	
 	// TODO
 
 	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
-
-	
 	
 	SetMessageHandler(&GameModule::handleMessage);
+
+	startup();
 	
 }
 
@@ -49,6 +51,8 @@ GameModule::~GameModule() {
 	// TODO: Set palette to black but probably not neccessary
 	
 	// TODO Sound1ChList_sub_408480();
+	
+	// TODO Set debug vars (maybe)
 
 }
 
@@ -84,15 +88,24 @@ void GameModule::startup() {
 }
 
 void GameModule::createModule1500(int which) {
-	// TODO
 	_someFlag1 = false;
 	// TODO *getGlobalGameVarValuePtr(0x91080831) = 0x0F10114;
-	// TODO _childObject = new Module1500(this, which, true);
+	_childObject = new Module1500(_vm, this, which, true);
 	SetUpdateHandler(&GameModule::updateModule1500);
 }
 
 void GameModule::updateModule1500() {
-	// TODO
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		debug("Done...");
+		// TODO createModule1000();
+		// TODO _childObject->handleUpdate();
+	}
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 1aa1203..c46aa79 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -25,7 +25,7 @@
 namespace Neverhood {
 
 Module::Module(NeverhoodEngine *vm, Module *parentModule)
-	: Entity(_vm, 0), _parentModule(parentModule), _childObject(NULL),
+	: Entity(vm, 0), _parentModule(parentModule), _childObject(NULL),
 	_done(false), _field24(-1), _field26(-1), _field28(-1) {
 	
 	SetMessageHandler(&Module::handleMessage);
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 05a3bec..f4c7794 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -26,6 +26,8 @@ namespace Neverhood {
 
 Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag)
 	: Module(vm, parentModule), _flag(flag) {
+	
+	debug("Create Module1500(%d)", which);
 
 	if (which < 0) {
 		switch (_vm->gameState().sceneNum) {
@@ -75,19 +77,100 @@ void Module1500::update() {
 }
 
 void Module1500::createScene1501() {
-	// TODO
+	debug("createScene1501");
+	_vm->gameState().sceneNum = 0;
+	_childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48);
+	SetUpdateHandler(&Module1500::update);
 }
 			
 void Module1500::createScene1502() {
-	// TODO
+	debug("createScene1502");
+	_vm->gameState().sceneNum = 1;
+	_childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48);
+	SetUpdateHandler(&Module1500::update);
 }
 
 void Module1500::createScene1503() {
-	// TODO
+	debug("createScene1503");
+	// TODO: This uses the MultiSmackerPlayer
+	// Game will crash now...
 }
 
 void Module1500::createScene1504() {
-	// TODO
+	debug("createScene1504");
+	_vm->gameState().sceneNum = 3;
+	_childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48);
+	SetUpdateHandler(&Module1500::update);
+}
+
+// Scene1501
+
+Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3)
+	: Scene(vm, parentModule, true), _soundResource(vm), 
+	_countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) {
+
+	debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3);
+
+	SetUpdateHandler(&Scene1501::update);
+	SetMessageHandler(&Scene1501::handleMessage);
+	
+	_surfaceFlag = true;
+
+	_palette = new Palette(_vm);//DUMMY!
+
+	/* TODO	
+	
+	_background = addBackground(new Class301(_vm, backgroundFileHash, 0, 0));
+
+	_palette = new Palette2(_vm);
+	_palette->usePalette();
+	addEntity(_palette);
+	Palette2_sub_47BF00(backgroundFileHash, 0, 256, 0);
+	Palette2_sub_47C060(12);
+	
+	if (soundFileHash != 0) {
+		_soundResource.set(soundFileHash);
+		_soundResource.load();
+		_soundResource.play();
+	}
+	*/
+
+}
+
+void Scene1501::update() {
+
+	Scene::update();
+
+	// TODO: Since these countdowns are used a lot, maybe these can be wrapped in a class/struct
+	// so the code gets a little cleaner.
+
+	if (_countdown1 != 0) {
+		_countdown1--;
+		if (_countdown1 == 0) {
+			// TODO g_screen->clear(0);
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !_soundResource.isPlaying()) {
+		_countdown1 = 12;
+		_palette->startFadeToBlack(11);
+	}
+
+	if (_countdown3 != 0)
+		_countdown3--;
+
+	if (_countdown3 == 0 && _flag && _countdown1 == 0) {
+		_countdown1 = 12;
+		_palette->startFadeToBlack(11);
+	}
+	
+}
+
+uint32 Scene1501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	if (messageNum == 0x0009) {
+		_flag = true;
+	}
+	return messageResult;
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
index d4a4310..66eef59 100644
--- a/engines/neverhood/module1500.h
+++ b/engines/neverhood/module1500.h
@@ -27,6 +27,9 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/graphics.h"
+#include "neverhood/palette.h"
 
 namespace Neverhood {
 
@@ -42,6 +45,19 @@ protected:
 	void createScene1504();
 };
 
+class Scene1501 : public Scene {
+public:
+	Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3);
+protected:
+	SoundResource _soundResource;
+	int _countdown1;
+	int _countdown2;
+	int _countdown3;
+	bool _flag;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1500_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 2f27fca..ac89a3e 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -38,6 +38,7 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/graphics.h"
 #include "neverhood/resourceman.h"
 #include "neverhood/resource.h"
@@ -123,55 +124,65 @@ Common::Error NeverhoodEngine::run() {
 	}
 #endif
 	
-#if 1
+#if 0
 	{ // Create a new scope
 		AnimResource r(this);
 		r.load(0x000540B0);
 	}
 #endif
-	
-	delete _res;
 
-	return Common::kNoError;
-}
+	_gameModule = new GameModule(this);
 
-void NeverhoodEngine::updateEvents() {
-	Common::Event event;
-	Common::EventManager *eventMan = _system->getEventManager();
-
-	while (eventMan->pollEvent(event)) {
-		switch (event.type) {
-		case Common::EVENT_KEYDOWN:
-			_keyState = event.kbd.keycode;
-			break;
-		case Common::EVENT_KEYUP:
-			_keyState = Common::KEYCODE_INVALID;
-			break;
-		case Common::EVENT_MOUSEMOVE:
-			_mouseX = event.mouse.x;
-			_mouseY = event.mouse.y;
-			break;
-		/*			
-		case Common::EVENT_LBUTTONDOWN:
-			_buttonState |= kLeftButton;
-			break;
-		case Common::EVENT_LBUTTONUP:
-			_buttonState &= ~kLeftButton;
-			break;
-		case Common::EVENT_RBUTTONDOWN:
-			_buttonState |= kRightButton;
-			break;
-		case Common::EVENT_RBUTTONUP:
-			_buttonState &= ~kRightButton;
-			break;
-		case Common::EVENT_QUIT:
-			_system->quit();
-			break;
-		*/			
-		default:
-			break;
+	while (1) {
+		Common::Event event;
+		Common::EventManager *eventMan = _system->getEventManager();
+	
+		while (eventMan->pollEvent(event)) {
+			switch (event.type) {
+			case Common::EVENT_KEYDOWN:
+				_keyState = event.kbd.keycode;
+				break;
+			case Common::EVENT_KEYUP:
+				_keyState = Common::KEYCODE_INVALID;
+				break;
+			case Common::EVENT_MOUSEMOVE:
+				_mouseX = event.mouse.x;
+				_mouseY = event.mouse.y;
+				break;
+			/*			
+			case Common::EVENT_LBUTTONDOWN:
+				_buttonState |= kLeftButton;
+				break;
+			case Common::EVENT_LBUTTONUP:
+				_buttonState &= ~kLeftButton;
+				break;
+			case Common::EVENT_RBUTTONDOWN:
+				_buttonState |= kRightButton;
+				break;
+			case Common::EVENT_RBUTTONUP:
+				_buttonState &= ~kRightButton;
+				break;
+			case Common::EVENT_QUIT:
+				_system->quit();
+				break;
+			*/			
+			default:
+				break;
+			}
 		}
+		
+		_gameModule->handleUpdate();
+		_system->updateScreen();
+	
 	}
+	
+	delete _gameModule;
+	
+	delete _res;
+	
+	debug("Ok.");
+
+	return Common::kNoError;
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 8a95b05..b261a08 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -44,6 +44,7 @@ enum NeverhoodGameFeatures {
 struct NeverhoodGameDescription;
 
 class ResourceMan;
+class GameModule;
 
 struct GameState {
 	int sceneNum;
@@ -74,8 +75,7 @@ public:
 
 	GameState _gameState;
 	ResourceMan *_res;
-
-	void updateEvents();
+	GameModule *_gameModule;
 
 public:
 	
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 8cab1eb..6a76a73 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -98,6 +98,15 @@ protected:
 	Common::Array<AnimFrameInfo> _frames;
 };
 
+// TODO: Dummy class atm
+
+class SoundResource {
+public:
+	SoundResource(NeverhoodEngine *vm) : _vm(vm) {}
+	bool isPlaying() const { return false; }
+protected:
+	NeverhoodEngine *_vm;	
+};
 
 } // End of namespace Neverhood
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 3532a43..e5a3d0e 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -71,7 +71,7 @@ protected:
 	// TODO 00000090 playerSprite		dd ?
 	// TODO 00000094 mouseSprite	 dd ?
 	Palette *_palette;
-	// TODO 0000009C class300		dd ?
+	// TODO Background *_background;
 	bool _surfaceFlag;
 	bool _messageListFlag;
 	MessageListItem *_messageList2;


Commit: 44ab81eab83189bfa0693fca564543227d423799
    https://github.com/scummvm/scummvm/commit/44ab81eab83189bfa0693fca564543227d423799
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Start with the Screen class, also

- Move common headers used in modules to module.h so they don't have to be explicitly #included in each module header
- Clean up #includes

Changed paths:
  A engines/neverhood/screen.cpp
  A engines/neverhood/screen.h
    engines/neverhood/module.h
    engines/neverhood/module.mk
    engines/neverhood/module1500.cpp
    engines/neverhood/module1500.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 432a04c..b59b532 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -27,6 +27,9 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/entity.h"
+#include "neverhood/graphics.h"
+#include "neverhood/palette.h"
+#include "neverhood/screen.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 709538e..e51565f 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -13,6 +13,7 @@ MODULE_OBJS = \
 	resource.o \
 	resourceman.o \
 	scene.o \
+	screen.o \
 	sprite.o
 
 # This module can be built as a plugin
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index f4c7794..97d125a 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -147,7 +147,7 @@ void Scene1501::update() {
 	if (_countdown1 != 0) {
 		_countdown1--;
 		if (_countdown1 == 0) {
-			// TODO g_screen->clear(0);
+			_vm->_screen->clear();
 			_parentModule->sendMessage(0x1009, 0, this);
 		}
 	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !_soundResource.isPlaying()) {
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
index 66eef59..e3633a0 100644
--- a/engines/neverhood/module1500.h
+++ b/engines/neverhood/module1500.h
@@ -28,8 +28,6 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
-#include "neverhood/graphics.h"
-#include "neverhood/palette.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index ac89a3e..4baff5e 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -20,28 +20,19 @@
  *
  */
 
-#include "common/events.h"
-#include "common/keyboard.h"
 #include "common/file.h"
-#include "common/random.h"
-#include "common/savefile.h"
 #include "common/config-manager.h"
-
 #include "base/plugins.h"
 #include "base/version.h"
-
 #include "graphics/cursorman.h"
-
 #include "engines/util.h"
-
-#include "audio/mixer.h"
-
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/graphics.h"
 #include "neverhood/resourceman.h"
 #include "neverhood/resource.h"
+#include "neverhood/screen.h"
 
 namespace Neverhood {
 
@@ -71,6 +62,8 @@ Common::Error NeverhoodEngine::run() {
 
 	_isSaveAllowed = false;
 
+	_screen = new Screen(this);
+
 	_res = new ResourceMan();
 	_res->addArchive("a.blb");
 	_res->addArchive("c.blb");
@@ -179,6 +172,7 @@ Common::Error NeverhoodEngine::run() {
 	delete _gameModule;
 	
 	delete _res;
+	delete _screen;
 	
 	debug("Ok.");
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index b261a08..c13ac51 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -29,11 +29,7 @@
 #include "common/random.h"
 #include "common/savefile.h"
 #include "common/system.h"
-
 #include "audio/mixer.h"
-
-#include "graphics/surface.h"
-
 #include "engines/engine.h"
 
 namespace Neverhood {
@@ -43,8 +39,9 @@ enum NeverhoodGameFeatures {
 
 struct NeverhoodGameDescription;
 
-class ResourceMan;
 class GameModule;
+class ResourceMan;
+class Screen;
 
 struct GameState {
 	int sceneNum;
@@ -74,6 +71,7 @@ public:
 	uint16 _buttonState;
 
 	GameState _gameState;
+	Screen *_screen;
 	ResourceMan *_res;
 	GameModule *_gameModule;
 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index ccdae3a..f120931 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -39,13 +39,13 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	// TODO _playerSprite = NULL;
 	// TODO _mouseSprite = NULL;
 	_palette = NULL;
-	// TODO _class300 = NULL;
+	// TODO _background = NULL;
 	// TODO _field_8E = -1;
 	if (clearHitRects) {
 		// TODO g_Class700->setHitRects(NULL, 0);
 		// TODO g_Class700->clear();
 	}
-	// TODO g_screen->setFps(24);
+	_vm->_screen->setFps(24);
 	// TODO g_screen->hSmack = NULL;	
 	// TODO g_screen->field_24 = 0;
 	// TODO g_screen->field_26 = 0;
@@ -292,7 +292,7 @@ void Scene::smackerUpdate() {
 		_messageHandlerCb = _savedMessageHandlerCb;
 		if (_palette)
 			_palette->usePalette();
-		// TODO class300->restore();
+		// TODO _background->restore();
 		// TODO g_screen->smackerPlayer = NULL;		
 	}
 #endif	
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
new file mode 100644
index 0000000..4b531ca
--- /dev/null
+++ b/engines/neverhood/screen.cpp
@@ -0,0 +1,88 @@
+/* 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 "graphics/palette.h"
+#include "neverhood/screen.h"
+
+namespace Neverhood {
+
+Screen::Screen(NeverhoodEngine *vm)
+	: _vm(vm), _paletteData(NULL), _paletteChanged(false) {
+	
+	_ticks = _vm->_system->getMillis();
+	
+	_backScreen = new Graphics::Surface();
+	_backScreen->create(640, 480, Graphics::PixelFormat::createFormatCLUT8());
+	
+}
+
+Screen::~Screen() {
+	delete _backScreen;
+}
+
+void Screen::wait() {
+}
+
+void Screen::setFps(int fps) {
+	_frameDelay = 1000 / fps;
+}
+
+int Screen::getFps() {
+	return 1000 / _frameDelay;
+}
+
+void Screen::setPaletteData(byte *paletteData) {
+	_paletteChanged = true;
+	_paletteData = paletteData;
+}
+
+void Screen::unsetPaletteData(byte *paletteData) {
+	if (_paletteData == paletteData) {
+		_paletteChanged = false;
+		_paletteData = NULL;
+	}
+}
+
+void Screen::testPalette(byte *paletteData) {
+	if (_paletteData == paletteData)
+		_paletteChanged = true;
+}
+
+void Screen::updatePalette() {
+	if (_paletteChanged && _paletteData) {
+		byte *tempPalette = new byte[768];
+		for (int i = 0; i < 256; i++) {
+			tempPalette[i * 3 + 0] = _paletteData[i * 4 + 0];
+			tempPalette[i * 3 + 1] = _paletteData[i * 4 + 1];
+			tempPalette[i * 3 + 2] = _paletteData[i * 4 + 2];
+		}
+		_vm->_system->getPaletteManager()->setPalette(tempPalette, 0, 256);
+		delete[] tempPalette;
+		_paletteChanged = false;
+	}
+}
+
+void Screen::clear() {
+	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
new file mode 100644
index 0000000..0e7ce3d
--- /dev/null
+++ b/engines/neverhood/screen.h
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_SCREEN_H
+#define NEVERHOOD_SCREEN_H
+
+#include "graphics/surface.h"
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+class Screen {
+public:
+	Screen(NeverhoodEngine *vm);
+	~Screen();
+	void wait();
+	void setFps(int fps);
+	int getFps();
+	void setPaletteData(byte *paletteData);
+	void unsetPaletteData(byte *paletteData);
+	void testPalette(byte *paletteData);
+	void updatePalette();
+	void clear();
+protected:
+	NeverhoodEngine *_vm;
+	Graphics::Surface *_backScreen;
+	uint32 _ticks;
+	uint32 _frameDelay;
+	byte *_paletteData;
+	bool _paletteChanged;
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_SCREEN_H */


Commit: 1285b37b321850a3584ce1bbdba58462e0b8fbe3
    https://github.com/scummvm/scummvm/commit/1285b37b321850a3584ce1bbdba58462e0b8fbe3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Start with the Background and DirtyBackground classes

- Also make related changes in other code
- Call the game module's draw method in the main loop
- Add some more debug output in resource load functions

Changed paths:
  A engines/neverhood/background.cpp
  A engines/neverhood/background.h
    engines/neverhood/graphics.cpp
    engines/neverhood/module.h
    engines/neverhood/module.mk
    engines/neverhood/module1500.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
new file mode 100644
index 0000000..abfa507
--- /dev/null
+++ b/engines/neverhood/background.cpp
@@ -0,0 +1,89 @@
+/* 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/background.h"
+
+namespace Neverhood {
+
+// Background
+
+Background::Background(NeverhoodEngine *vm, int objectPriority)
+	: Entity(vm, objectPriority), _surface(NULL), _spriteResource(vm) {
+	// Empty
+}
+
+Background::Background(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority)
+	: Entity(vm, objectPriority), _surface(NULL), _spriteResource(vm) {
+	
+	_spriteResource.load(fileHash);
+	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_surface->drawSpriteResource(_spriteResource);
+	
+}
+
+Background::~Background() {
+	delete _surface;
+}
+
+void Background::createSurface(int surfacePriority, int16 width, int16 height) {
+	_surface = new BaseSurface(_vm, surfacePriority, width, height);
+	_spriteResource.getPosition().x = width;
+	_spriteResource.getPosition().y = height;
+}
+
+void Background::load(uint32 fileHash) {
+	_spriteResource.load(fileHash);
+	if (_surface)
+		_surface->drawSpriteResource(_spriteResource);
+}
+
+// DirtyBackground
+
+DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority)
+	: Background(vm, objectPriority) {
+	
+	// TODO _spriteResource.load(calcHash(fileName));
+	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_surface->drawSpriteResource(_spriteResource);
+	
+}
+
+DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority)
+	: Background(vm, objectPriority) {
+
+	_spriteResource.load(fileHash);
+	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_surface->drawSpriteResource(_spriteResource);
+
+}
+
+void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 height) {
+
+	// TODO: Later use a DirtySurface once it is implemented
+	_surface = new BaseSurface(_vm, surfacePriority, width, height);
+	_spriteResource.getPosition().x = width;
+	_spriteResource.getPosition().y = height;
+
+}
+
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h
new file mode 100644
index 0000000..733f80b
--- /dev/null
+++ b/engines/neverhood/background.h
@@ -0,0 +1,56 @@
+/* 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_BACKGROUND_H
+#define NEVERHOOD_BACKGROUND_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/entity.h"
+#include "neverhood/graphics.h"
+#include "neverhood/resource.h"
+
+namespace Neverhood {
+
+class Background : public Entity {
+public:
+	Background(NeverhoodEngine *vm, int objectPriority);
+	Background(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority);
+	virtual ~Background();
+	BaseSurface *getSurface() { return _surface; }
+	void createSurface(int surfacePriority, int16 width, int16 height);
+	void load(uint32 fileHash);
+protected:
+	BaseSurface *_surface;
+	SpriteResource _spriteResource;
+};
+
+class DirtyBackground : public Background {
+public:
+	DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority);
+	DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority);
+	void createSurface(int surfacePriority, int16 width, int16 height);
+
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_BACKGROUND_H */
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index d7c1064..2a86966 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -32,6 +32,7 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h
 	_drawRect.y = 0;
 	_drawRect.width = width;
 	_drawRect.height = height;
+	// TODO: Check if _sysRect is needed at all in the reimplementation...
 	_sysRect.x = 0;
 	_sysRect.y = 0;
 	_sysRect.width = (width + 3) & 0xFFFC; // align by 4 bytes
@@ -49,6 +50,7 @@ BaseSurface::~BaseSurface() {
 }
 
 void BaseSurface::draw() {
+	debug("BaseSurface::draw()");
 	// TODO
 }
 
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index b59b532..d3c7b69 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -26,6 +26,7 @@
 #define NEVERHOOD_MODULE_H
 
 #include "neverhood/neverhood.h"
+#include "neverhood/background.h"
 #include "neverhood/entity.h"
 #include "neverhood/graphics.h"
 #include "neverhood/palette.h"
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index e51565f..cc7f9e1 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -1,6 +1,7 @@
 MODULE := engines/neverhood
 
 MODULE_OBJS = \
+	background.o \
 	blbarchive.o \
 	detection.o \
 	entity.o \
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 97d125a..8c4cb9c 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -116,12 +116,12 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 	
 	_surfaceFlag = true;
 
+	_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
+
 	_palette = new Palette(_vm);//DUMMY!
 
 	/* TODO	
 	
-	_background = addBackground(new Class301(_vm, backgroundFileHash, 0, 0));
-
 	_palette = new Palette2(_vm);
 	_palette->usePalette();
 	addEntity(_palette);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 4baff5e..207bd38 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -126,6 +126,7 @@ Common::Error NeverhoodEngine::run() {
 
 	_gameModule = new GameModule(this);
 
+	// Preliminary main loop, needs some more work but works for testing
 	while (1) {
 		Common::Event event;
 		Common::EventManager *eventMan = _system->getEventManager();
@@ -165,6 +166,7 @@ Common::Error NeverhoodEngine::run() {
 		}
 		
 		_gameModule->handleUpdate();
+		_gameModule->draw();
 		_system->updateScreen();
 	
 	}
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 84eab7f..300cf81 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -46,6 +46,7 @@ void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) {
 }
 
 bool SpriteResource::load(uint32 fileHash) {
+	debug("SpriteResource::load(%08X)", fileHash);
 	// TODO: Later merge with load2 and make the mode a parameter
 	unload();
 	_resourceHandle = _vm->_res->useResource(fileHash);
@@ -100,6 +101,7 @@ PaletteResource::~PaletteResource() {
 }
 
 bool PaletteResource::load(uint32 fileHash) {
+	debug("PaletteResource::load(%08X)", fileHash);
 	unload();
 	_resourceHandle = _vm->_res->useResource(fileHash);
 	if (_resourceHandle != -1) {
@@ -152,6 +154,7 @@ AnimResource::~AnimResource() {
 }
 
 bool AnimResource::load(uint32 fileHash) {
+	debug("AnimResource::load(%08X)", fileHash);
 
 	if (fileHash == _fileHash)
 		return true;
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 6a76a73..868bafd 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -37,7 +37,7 @@ public:
 	bool load2(uint32 fileHash);
 	void unload();
 	const NDimensions& getDimensions() { return _dimensions; }
-	const NPoint& getPosition() { return _position; }
+	NPoint& getPosition() { return _position; }
 protected:
 	NeverhoodEngine *_vm;
 	int _resourceHandle;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index f120931..6c3aae1 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -39,7 +39,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	// TODO _playerSprite = NULL;
 	// TODO _mouseSprite = NULL;
 	_palette = NULL;
-	// TODO _background = NULL;
+	_background = NULL;
 	// TODO _field_8E = -1;
 	if (clearHitRects) {
 		// TODO g_Class700->setHitRects(NULL, 0);
@@ -53,7 +53,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_messageListFlag = true;
 	_surfaceFlag = false;
 	_messageList2 = NULL;
-	// TODO _smackerPlayer = NULL;
+	_smackerPlayer = NULL;
 	_smkFileHash = 0;
 	_messageListFlag2 = false;
 	_messageValue = -1;
@@ -78,26 +78,25 @@ Scene::~Scene() {
 }
 
 void Scene::draw() {
+	debug("Scene::draw()");
 	//**ALL TODO
-#if 0
 	if (_smackerPlayer) {
 		if (_surfaceFlag) {
-			g_screen->resetDirtyRects();
-			g_screen->copyDirtyRects();
-			g_screen->addDirtyRects();
+			// TODO g_screen->resetDirtyRects();
+			// TODO g_screen->copyDirtyRects();
+			// TODO g_screen->addDirtyRects();
 		}
-		_smackerPlayer->_surface->draw();
+		// TODO _smackerPlayer->_surface->draw();
 	} else {
 		if (_surfaceFlag) {
-			g_screen->copyDirtyRects();
+			// TODO g_screen->copyDirtyRects();
 			for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
 				(*iter)->addDirtyRect();
-			g_screen->addDirtyRects();
+			// TODO g_screen->addDirtyRects();
 		}
 		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
 			(*iter)->draw();
 	}	
-#endif
 }
 
 void Scene::addEntity(Entity *entity) {
@@ -170,6 +169,12 @@ void Scene::deleteSprite(Sprite **sprite) {
 	*sprite = NULL;
 }
 
+Background *Scene::addBackground(Background *background) {
+	addEntity(background);
+	addSurface(background->getSurface());
+	return background;
+}
+
 void Scene::update() {
 
 	if (_smkFileHash != 0) {
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index e5a3d0e..c64c2bf 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -25,6 +25,7 @@
 
 #include "common/array.h"
 #include "neverhood/neverhood.h"
+#include "neverhood/background.h"
 #include "neverhood/entity.h"
 #include "neverhood/graphics.h"
 #include "neverhood/module.h"
@@ -38,6 +39,9 @@ struct MessageListItem {
 	uint32 messageValue;
 };
 
+class SmackerPlayer { // DUMMY!
+};
+
 class Scene : public Entity {
 public:
 	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
@@ -50,6 +54,7 @@ public:
 	Sprite *addSprite(Sprite *sprite);
 	void setSurfacePriority(BaseSurface *surface, int priority);
 	void deleteSprite(Sprite **sprite);
+	Background *addBackground(Background *background);
 protected:
 	Module *_parentModule;
 	Common::Array<Entity*> _entities;
@@ -71,12 +76,12 @@ protected:
 	// TODO 00000090 playerSprite		dd ?
 	// TODO 00000094 mouseSprite	 dd ?
 	Palette *_palette;
-	// TODO Background *_background;
+	Background *_background;
 	bool _surfaceFlag;
 	bool _messageListFlag;
 	MessageListItem *_messageList2;
 	int _messageListStatus;
-	// TODO 000000B0 smackerPlayer   dd ?
+	SmackerPlayer *_smackerPlayer;
 	void (Entity::*_savedUpdateHandlerCb)();
 	uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
 	bool _smackerDone;


Commit: bd1749863e45cde53707d0ae38b28825bc0dba2e
    https://github.com/scummvm/scummvm/commit/bd1749863e45cde53707d0ae38b28825bc0dba2e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Start with the Palette2 class (which needs a better name later)

- Implement Screen::drawSurface2 (needs color key support)
- The first intro now show up, complete with fade-in and fade-out

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 2a86966..fa7c152 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/graphics.h"
 #include "neverhood/resource.h"
+#include "neverhood/screen.h"
 
 namespace Neverhood {
 
@@ -51,7 +52,10 @@ BaseSurface::~BaseSurface() {
 
 void BaseSurface::draw() {
 	debug("BaseSurface::draw()");
-	// TODO
+	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
+		// TODO: _sysRect alternate drawing code (is that used?)
+		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect);
+	}
 }
 
 void BaseSurface::addDirtyRect() {
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 8c4cb9c..c3c0864 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -110,6 +110,8 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 	_countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) {
 
 	debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3);
+	
+	Palette2 *palette2;
 
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
@@ -118,16 +120,14 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 
 	_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
 
-	_palette = new Palette(_vm);//DUMMY!
-
-	/* TODO	
-	
-	_palette = new Palette2(_vm);
-	_palette->usePalette();
+	palette2 = new Palette2(_vm);
+	palette2->usePalette();
+	_palette = palette2; 
 	addEntity(_palette);
-	Palette2_sub_47BF00(backgroundFileHash, 0, 256, 0);
-	Palette2_sub_47C060(12);
-	
+	palette2->addPalette(backgroundFileHash, 0, 256, 0);
+	palette2->startFadeToPalette(12);
+
+	/*	
 	if (soundFileHash != 0) {
 		_soundResource.set(soundFileHash);
 		_soundResource.load();
@@ -150,7 +150,7 @@ void Scene1501::update() {
 			_vm->_screen->clear();
 			_parentModule->sendMessage(0x1009, 0, this);
 		}
-	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !_soundResource.isPlaying()) {
+	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) {
 		_countdown1 = 12;
 		_palette->startFadeToBlack(11);
 	}
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 207bd38..9019409 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -164,10 +164,14 @@ Common::Error NeverhoodEngine::run() {
 				break;
 			}
 		}
-		
+
+		debug("millis %d", _system->getMillis());		
 		_gameModule->handleUpdate();
 		_gameModule->draw();
-		_system->updateScreen();
+		_screen->wait();
+		_screen->update();
+		
+		debug("---------------------------------------");
 	
 	}
 	
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index b45f8ee..bfabf89 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -22,9 +22,12 @@
 
 #include "neverhood/palette.h"
 #include "neverhood/resource.h"
+#include "neverhood/screen.h"
 
 namespace Neverhood {
 
+// Palette
+
 Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) {
 	_status = 0;
 	_palette = new byte[1024];
@@ -58,12 +61,12 @@ Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) {
 }
 
 Palette::~Palette() {
-	// TODO: _vm->_screen->unsetPaletteData(_palette);
+	_vm->_screen->unsetPaletteData(_palette);
 	delete[] _palette;
 }
 
 void Palette::usePalette() {
-	// TODO: _vm->_screen->setPaletteData(_palette);
+	_vm->_screen->setPaletteData(_palette);
 }
 
 void Palette::addPalette(const char *filename, int toIndex, int count, int fromIndex) {
@@ -76,10 +79,11 @@ void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex)
 		count = 256 - toIndex;
 	paletteResource.load(fileHash);
 	memcpy(_palette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4);		
-	// TODO: _vm->_screen->testPalette(_palette);
+	_vm->_screen->testPalette(_palette);
 }
 
 void Palette::startFadeToBlack(int counter) {
+	debug("Palette::startFadeToBlack(%d)", counter);
 	if (counter == 0)
 		counter = 1;
 	_fadeToR = 0;
@@ -91,6 +95,7 @@ void Palette::startFadeToBlack(int counter) {
 }
 
 void Palette::startFadeToWhite(int counter) {
+	debug("Palette::startFadeToWhite(%d)", counter);
 	if (counter == 0)
 		counter = 1;
 	_fadeToR = 255;
@@ -102,15 +107,18 @@ void Palette::startFadeToWhite(int counter) {
 }
 
 void Palette::update() {
+	debug("Palette::update() _status = %d", _status);
 	if (_status == 1) {
-		memset(_palette, 0, 1024);
-		_status = 0;
-	} else {
-		for (int i = 0; i < 256; i++) {
-			fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB);
+		if (_palCounter > 1) {
+			for (int i = 0; i < 256; i++) {
+				fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB);
+			}
+			_vm->_screen->testPalette(_palette);
+			_palCounter--;
+		} else {
+			memset(_palette, 0, 1024);
+			_status = 0;
 		}
-		// TODO: _vm->_screen->testPalette(_palette);
-		_palCounter--;
 	}
 }
 
@@ -122,4 +130,58 @@ void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) {
 	#undef FADE
 }
 
+// Palette2
+
+Palette2::Palette2(NeverhoodEngine *vm)
+	: Palette(vm) {
+	_basePalette = new byte[1024];
+	SetUpdateHandler(&Palette2::update);
+}
+
+Palette2::Palette2(NeverhoodEngine *vm, uint32 fileHash)
+	: Palette(vm, fileHash) {
+	_basePalette = new byte[1024];
+	SetUpdateHandler(&Palette2::update);
+}
+
+Palette2::~Palette2() {
+	delete _basePalette;
+}
+
+void Palette2::update() {
+	debug("Palette2::update() _status = %d", _status);
+	if (_status == 1) {
+		Palette::update();
+	} else if (_status == 2) {
+	debug("... _palCounter = %d", _palCounter);
+		if (_palCounter > 1) {
+			for (int i = 0; i < 256; i++) {
+				fadeColor(_palette + i * 4, _basePalette[i * 4 + 0], _basePalette[i * 4 + 1], _basePalette[i * 4 + 2]);
+			}
+			_vm->_screen->testPalette(_palette);
+			_palCounter--;
+		} else {
+			memcpy(_palette, _basePalette, 256 * 4);
+			_status = 0;
+		}
+	}
+}
+
+void Palette2::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
+	PaletteResource paletteResource(_vm);
+	if (toIndex + count > 256)
+		count = 256 - toIndex;
+	paletteResource.load(fileHash);
+	memcpy(_basePalette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4);		
+}
+
+void Palette2::startFadeToPalette(int counter) {
+	debug("Palette2::startFadeToPalette(%d)", counter);
+	if (counter == 0)
+		counter = 1;
+	_palCounter = counter;
+	_fadeStep = 255 / counter;
+	_status = 2;			
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index b29d771..752ae3a 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -54,6 +54,19 @@ protected:
 	void fadeColor(byte *rgb, byte toR, byte toG, byte toB);
 };
 
+class Palette2 : public Palette {
+public:
+	Palette2(NeverhoodEngine *vm);
+	// TODO: Other ctors
+	Palette2(NeverhoodEngine *vm, uint32 fileHash);
+	~Palette2();
+	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
+	void startFadeToPalette(int counter);
+public:
+	byte *_basePalette;
+	void update();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_PALETTE_H */
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 4b531ca..807e241 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -39,7 +39,16 @@ Screen::~Screen() {
 	delete _backScreen;
 }
 
+void Screen::update() {
+	updatePalette();
+	// TODO: Implement actual code
+	_vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480);
+	_vm->_system->updateScreen();
+}
+
 void Screen::wait() {
+	// TODO
+	_vm->_system->delayMillis(40);
 }
 
 void Screen::setFps(int fps) {
@@ -69,6 +78,7 @@ void Screen::testPalette(byte *paletteData) {
 
 void Screen::updatePalette() {
 	if (_paletteChanged && _paletteData) {
+		debug("Screen::updatePalette() Set palette");
 		byte *tempPalette = new byte[768];
 		for (int i = 0; i < 256; i++) {
 			tempPalette[i * 3 + 0] = _paletteData[i * 4 + 0];
@@ -85,4 +95,67 @@ void Screen::clear() {
 	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
 }
 
+void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) {
+
+	int16 destX, destY;
+	NRect ddRect;
+	
+	if (drawRect.x + drawRect.width >= clipRect.x2)
+		ddRect.x2 = clipRect.x2 - drawRect.x;
+	else
+		ddRect.x2 = drawRect.width;
+		
+	if (drawRect.x <= clipRect.x1) {
+		destX = clipRect.x1;
+		ddRect.x1 = clipRect.x1 - drawRect.x;
+	} else {
+		destX = drawRect.x;
+		ddRect.x1 = 0;
+	}
+	
+	if (drawRect.y + drawRect.height >= clipRect.y2)
+		ddRect.y2 = clipRect.y2 - drawRect.y;
+	else
+		ddRect.y2 = drawRect.height;
+	
+	if (drawRect.y <= clipRect.y1) {
+		destY = clipRect.y1;
+		ddRect.y1 = clipRect.y1 - drawRect.y;
+	} else {
+		destY = drawRect.y;
+		ddRect.y1 = 0;
+	}
+	
+	debug("draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
+	
+	byte *source = (byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
+	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
+	int width = ddRect.x2 - ddRect.x1;
+	int height = ddRect.y2 - ddRect.y1;
+	
+	while (height--) {
+		memcpy(dest, source, width);
+		source += surface->pitch;
+		dest += _backScreen->pitch;
+	}
+	
+	#if 0
+	if ( ddRect.right > ddRect.left )
+	{
+	if ( ddRect.top < ddRect.bottom )
+	{
+	(*(int (__stdcall **)(_DWORD, _DWORD, _DWORD, LPDIRECTDRAWSURFACE, struct tagRECT *, unsigned int))(**(_DWORD **)(this + 8) + 28))(
+	*(_DWORD *)(this + 8),
+	destX,
+	destY,
+	ddSurface,
+	&ddRect,
+	blitFlags | (unsigned int)DDBLTFAST_WAIT);
+	}
+	}
+	#endif
+	
+}
+
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 0e7ce3d..e25b3b5 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -25,6 +25,7 @@
 
 #include "graphics/surface.h"
 #include "neverhood/neverhood.h"
+#include "neverhood/graphics.h"
 
 namespace Neverhood {
 
@@ -32,6 +33,7 @@ class Screen {
 public:
 	Screen(NeverhoodEngine *vm);
 	~Screen();
+	void update();
 	void wait();
 	void setFps(int fps);
 	int getFps();
@@ -40,6 +42,7 @@ public:
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();
+	void drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect);
 protected:
 	NeverhoodEngine *_vm;
 	Graphics::Surface *_backScreen;


Commit: 21eb88053caa4cc7167f81dba9afc7f0ef89996d
    https://github.com/scummvm/scummvm/commit/21eb88053caa4cc7167f81dba9afc7f0ef89996d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Implement SmackerScene, SmackerPlayer and related stuff

- The intro video after the logo screens is now played (still needs better sync)

Changed paths:
  A engines/neverhood/smackerplayer.cpp
  A engines/neverhood/smackerplayer.h
  A engines/neverhood/smackerscene.cpp
  A engines/neverhood/smackerscene.h
    engines/neverhood/blbarchive.cpp
    engines/neverhood/blbarchive.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.mk
    engines/neverhood/module1500.cpp
    engines/neverhood/module1500.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h
    engines/neverhood/resourceman.cpp
    engines/neverhood/resourceman.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 4259be3..3138b91 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -108,4 +108,9 @@ byte *BlbArchive::getEntryExtData(uint index) {
 	return _extData && entry.extDataOfs != 0 ? &_extData[entry.extDataOfs - 1] : NULL;
 }
 
+Common::SeekableReadStream *BlbArchive::createStream(uint index) {
+	const BlbArchiveEntry &entry = _entries[index];
+	return new Common::SeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h
index 3c373cc..ddb3f01 100644
--- a/engines/neverhood/blbarchive.h
+++ b/engines/neverhood/blbarchive.h
@@ -25,6 +25,8 @@
 
 #include "common/array.h"
 #include "common/file.h"
+#include "common/stream.h"
+#include "common/substream.h"
 #include "neverhood/neverhood.h"
 
 namespace Neverhood {
@@ -58,6 +60,7 @@ public:
 	uint32 getSize(uint index) { return _entries[index].size; }
 	BlbArchiveEntry *getEntry(uint index) { return &_entries[index]; }
 	uint getCount() { return _entries.size(); }
+	Common::SeekableReadStream *createStream(uint index);
 private:
 	Common::File _fd;
 	Common::Array<BlbArchiveEntry> _entries;
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e46d23c..3f4ad4b 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -102,7 +102,7 @@ void GameModule::updateModule1500() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
-		debug("Done...");
+		error("Done...");
 		// TODO createModule1000();
 		// TODO _childObject->handleUpdate();
 	}
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index cc7f9e1..8eb1951 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -15,6 +15,8 @@ MODULE_OBJS = \
 	resourceman.o \
 	scene.o \
 	screen.o \
+	smackerscene.o \
+	smackerplayer.o \
 	sprite.o
 
 # This module can be built as a plugin
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index c3c0864..95b3925 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -92,8 +92,14 @@ void Module1500::createScene1502() {
 
 void Module1500::createScene1503() {
 	debug("createScene1503");
-	// TODO: This uses the MultiSmackerPlayer
-	// Game will crash now...
+	SmackerScene *smackerScene;
+	_parentModule->sendMessage(0x0800, 0, this);
+	_vm->gameState().sceneNum = 2;
+	smackerScene = new SmackerScene(_vm, this, true, true, true);
+	smackerScene->setFileHash(0x001A0005);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1500::update);
 }
 
 void Module1500::createScene1504() {
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
index e3633a0..87b2a0b 100644
--- a/engines/neverhood/module1500.h
+++ b/engines/neverhood/module1500.h
@@ -28,6 +28,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/smackerscene.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 9019409..6506812 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -165,13 +165,13 @@ Common::Error NeverhoodEngine::run() {
 			}
 		}
 
-		debug("millis %d", _system->getMillis());		
+		//debug("millis %d", _system->getMillis());		
 		_gameModule->handleUpdate();
 		_gameModule->draw();
 		_screen->wait();
 		_screen->update();
 		
-		debug("---------------------------------------");
+		//debug("---------------------------------------");
 	
 	}
 	
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index bfabf89..e186d38 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -82,6 +82,13 @@ void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex)
 	_vm->_screen->testPalette(_palette);
 }
 
+void Palette::copyPalette(const byte *palette, int toIndex, int count, int fromIndex) {
+	if (toIndex + count > 256)
+		count = 256 - toIndex;
+	memcpy(_palette + toIndex * 4, palette + fromIndex * 4, count * 4);		
+	_vm->_screen->testPalette(_palette);
+}
+
 void Palette::startFadeToBlack(int counter) {
 	debug("Palette::startFadeToBlack(%d)", counter);
 	if (counter == 0)
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 752ae3a..e3d95aa 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -42,6 +42,7 @@ public:
 	void usePalette();
 	void addPalette(const char *filename, int toIndex, int count, int fromIndex);
 	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
+	void copyPalette(const byte *palette, int toIndex, int count, int fromIndex);
 	void startFadeToBlack(int counter);
 	void startFadeToWhite(int counter);
 protected:
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 59e3fad..28f0994 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -164,4 +164,9 @@ void ResourceMan::freeResource(Resource *resource) {
 	resource->data = NULL;
 }
 
+Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) {
+	ResourceFileEntry *entry = findEntry(fileHash);
+	return _archives[entry->archiveIndex]->createStream(entry->entryIndex);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index 0dd70e1..2261440 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -67,6 +67,7 @@ public:
 	byte *loadResource(int resourceHandle, bool moveToFront = false);
 	void unloadResource(int resourceHandle);
 	void freeResource(Resource *resource);
+	Common::SeekableReadStream *createStream(uint32 fileHash);
 private:
 	Common::Array<BlbArchive*> _archives;
 	Common::Array<ResourceFileEntry> _entries;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 6c3aae1..a73b45b 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -78,15 +78,14 @@ Scene::~Scene() {
 }
 
 void Scene::draw() {
-	debug("Scene::draw()");
-	//**ALL TODO
 	if (_smackerPlayer) {
 		if (_surfaceFlag) {
 			// TODO g_screen->resetDirtyRects();
 			// TODO g_screen->copyDirtyRects();
 			// TODO g_screen->addDirtyRects();
 		}
-		// TODO _smackerPlayer->_surface->draw();
+		if (_smackerPlayer->getSurface())
+			_smackerPlayer->getSurface()->draw();
 	} else {
 		if (_surfaceFlag) {
 			// TODO g_screen->copyDirtyRects();
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index c64c2bf..405a528 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -30,6 +30,7 @@
 #include "neverhood/graphics.h"
 #include "neverhood/module.h"
 #include "neverhood/palette.h"
+#include "neverhood/smackerplayer.h"
 #include "neverhood/sprite.h"
 
 namespace Neverhood {
@@ -39,9 +40,6 @@ struct MessageListItem {
 	uint32 messageValue;
 };
 
-class SmackerPlayer { // DUMMY!
-};
-
 class Scene : public Entity {
 public:
 	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 807e241..68f6110 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -78,7 +78,6 @@ void Screen::testPalette(byte *paletteData) {
 
 void Screen::updatePalette() {
 	if (_paletteChanged && _paletteData) {
-		debug("Screen::updatePalette() Set palette");
 		byte *tempPalette = new byte[768];
 		for (int i = 0; i < 256; i++) {
 			tempPalette[i * 3 + 0] = _paletteData[i * 4 + 0];
@@ -95,7 +94,7 @@ void Screen::clear() {
 	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
 }
 
-void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) {
+void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) {
 
 	int16 destX, destY;
 	NRect ddRect;
@@ -128,7 +127,7 @@ void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect
 	
 	debug("draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
 	
-	byte *source = (byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
+	const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
 	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
 	int width = ddRect.x2 - ddRect.x1;
 	int height = ddRect.y2 - ddRect.y1;
@@ -157,5 +156,22 @@ void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect
 	
 }
 
+void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) {
+
+	const byte *source = (const byte*)surface->getBasePtr(0, 0);
+	byte *dest = (byte*)_backScreen->getBasePtr(drawRect.x, drawRect.y);
+	
+	for (int16 yc = 0; yc < surface->h; yc++) {
+		byte *row = dest;
+		for (int16 xc = 0; xc < surface->w; xc++) {
+			*row++ = *source;
+			*row++ = *source++;
+		}
+		memcpy(dest + _backScreen->pitch, dest, surface->w * 2);
+		dest += _backScreen->pitch;
+		dest += _backScreen->pitch;
+	}
+
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index e25b3b5..fc56a18 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -42,7 +42,8 @@ public:
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();
-	void drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect);
+	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect);
+	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
 protected:
 	NeverhoodEngine *_vm;
 	Graphics::Surface *_backScreen;
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
new file mode 100644
index 0000000..c914b42
--- /dev/null
+++ b/engines/neverhood/smackerplayer.cpp
@@ -0,0 +1,183 @@
+/* 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/smackerplayer.h"
+#include "neverhood/palette.h"
+#include "neverhood/resourceman.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// SmackerSurface
+
+SmackerSurface::SmackerSurface(NeverhoodEngine *vm)
+	: BaseSurface(vm, 0, 0, 0), _smackerFrame(NULL) {
+}
+
+void SmackerSurface::draw() {
+	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
+		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect);
+	}
+}
+
+void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) {
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = smackerFrame->w;
+	_drawRect.height = smackerFrame->h;
+	// TODO: Check if _sysRect is needed at all in the reimplementation...
+	_sysRect.x = 0;
+	_sysRect.y = 0;
+	_sysRect.width = (smackerFrame->w + 3) & 0xFFFC; // align by 4 bytes
+	_sysRect.height = smackerFrame->h;
+	_smackerFrame = smackerFrame;
+}
+
+// SmackerDoubleSurface
+
+SmackerDoubleSurface::SmackerDoubleSurface(NeverhoodEngine *vm)
+	: SmackerSurface(vm) {
+}
+
+void SmackerDoubleSurface::draw() {
+	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
+		_vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect);
+	}
+}
+
+// SmackerPlayer
+
+SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag)
+	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false),
+	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL) {
+
+	SetUpdateHandler(&SmackerPlayer::update);
+	open(fileHash, flag);
+}
+
+SmackerPlayer::~SmackerPlayer() {
+	close();
+}
+
+void SmackerPlayer::open(uint32 fileHash, bool flag1) {
+	debug("SmackerPlayer::open(%08X)", fileHash);
+	
+	_flag1 = flag1;
+
+	close();
+
+	_stream = _vm->_res->createStream(fileHash);
+
+	// TODO: _flag1 stuff
+
+	_smackerDecoder = new Video::SmackerDecoder(_vm->_mixer);
+	_smackerDecoder->loadStream(_stream);
+	
+	_palette = new Palette(_vm);
+	_palette->usePalette();
+	
+}
+
+void SmackerPlayer::close() {
+	delete _smackerDecoder;
+	delete _palette;
+	// NOTE: The SmackerDecoder deletes the _stream
+	delete _smackerSurface;
+	_smackerDecoder = NULL;
+	_palette = NULL;
+	_stream = NULL;
+	_smackerSurface = NULL;
+}
+
+void SmackerPlayer::gotoFrame(uint frameNumber) {
+}
+
+uint SmackerPlayer::getStatus() {
+	return 0;
+}
+
+void SmackerPlayer::update() {
+
+	if (!_smackerDecoder)
+		return;
+
+	if (_dirtyFlag) {
+		// TODO _vm->_screen->resetDirtyRects();
+		_dirtyFlag = false;
+	}
+
+	if (!_smackerDecoder->endOfVideo()) {
+
+		const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
+
+		if (!_smackerSurface) {
+			if (_doubleSurface) {
+				// TODO: Use SmackerDoubleSurface
+				_smackerSurface = new SmackerDoubleSurface(_vm);
+				_smackerSurface->getDrawRect().x = 320 - _smackerDecoder->getWidth();
+				_smackerSurface->getDrawRect().y = 240 - _smackerDecoder->getHeight();
+				// TODO DoubleDrawSurface.field_28 = false;
+				_smackerSurface->setSmackerFrame(smackerFrame);
+			} else {
+				_smackerSurface = new SmackerSurface(_vm);
+				_smackerSurface->getDrawRect().x = (640 - _smackerDecoder->getWidth()) / 2;
+				_smackerSurface->getDrawRect().y = (480 - _smackerDecoder->getHeight()) / 2;
+				_smackerSurface->setSmackerFrame(smackerFrame);
+			}
+		}
+		
+		if (_doubleSurface) {
+			// TODO
+		}
+
+		// TODO _vm->_screen->_skipUpdate = true;
+		_dirtyFlag = true;
+
+		if (_smackerDecoder->hasDirtyPalette()) {
+			updatePalette();
+		}
+
+		if (_smackerDecoder->endOfVideo() && !_flag1) {
+			if (_scene) {
+				_scene->sendMessage(0x3002, 0, this);
+			}
+			_flag2 = true;
+		} else {
+			_flag2 = false;
+		}
+		
+	}
+
+}
+
+void SmackerPlayer::updatePalette() {
+	byte tempPalette[1024];
+	const byte *smackerPalette = _smackerDecoder->getPalette();
+	for (int i = 0; i < 256; i++) {
+		tempPalette[i * 4 + 0] = smackerPalette[i * 3 + 0];
+		tempPalette[i * 4 + 1] = smackerPalette[i * 3 + 1];
+		tempPalette[i * 4 + 2] = smackerPalette[i * 3 + 2];
+	}
+	_palette->copyPalette(tempPalette, 0, 256, 0);
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
new file mode 100644
index 0000000..d923bbd
--- /dev/null
+++ b/engines/neverhood/smackerplayer.h
@@ -0,0 +1,75 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_SMACKERPLAYER_H
+#define NEVERHOOD_SMACKERPLAYER_H
+
+#include "video/smk_decoder.h"
+#include "neverhood/neverhood.h"
+#include "neverhood/entity.h"
+
+namespace Neverhood {
+
+class Scene;
+class Palette;
+
+class SmackerSurface : public BaseSurface {
+public:
+	SmackerSurface(NeverhoodEngine *vm);
+	virtual void draw();
+	void setSmackerFrame(const Graphics::Surface *smackerFrame);
+protected:
+	const Graphics::Surface *_smackerFrame;
+};
+
+class SmackerDoubleSurface : public SmackerSurface {
+public:
+	SmackerDoubleSurface(NeverhoodEngine *vm);
+	virtual void draw();
+};
+
+class SmackerPlayer : public Entity {
+public:
+	SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag);
+	~SmackerPlayer();
+	BaseSurface *getSurface() { return _smackerSurface; }
+	void open(uint32 fileHash, bool flag1);
+	void close();
+	void gotoFrame(uint frameNumber);
+	uint getStatus();
+protected:
+	Scene *_scene;
+	Palette *_palette;
+	Video::SmackerDecoder *_smackerDecoder;
+	SmackerSurface *_smackerSurface;
+	bool _doubleSurface;
+	Common::SeekableReadStream *_stream;
+	bool _flag1;
+	bool _flag2;
+	bool _dirtyFlag;
+	void update();
+	void updatePalette();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_SMACKERPLAYER_H */
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
new file mode 100644
index 0000000..f3ee577
--- /dev/null
+++ b/engines/neverhood/smackerscene.cpp
@@ -0,0 +1,127 @@
+/* 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/smackerscene.h"
+
+namespace Neverhood {
+
+SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort)
+	: Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _fieldDF(false),
+	_fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) {
+
+	debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort);
+
+	// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
+	
+	/* TODO
+	if (_vm->getGlobalVarValue(0x06C02850)) {
+		_flag1 = true;
+		_canAbort = true;
+	}
+	*/
+	
+	if (_doubleSurface) {
+		_vm->_screen->clear();
+	}
+
+	_fileHash[0] = 0; 
+	_fileHash[1] = 0;
+
+	SetUpdateHandler(&SmackerScene::update);
+	SetMessageHandler(&SmackerScene::handleMessage);
+
+}
+
+SmackerScene::~SmackerScene() {
+
+}
+
+void SmackerScene::setFileHash(uint32 fileHash) {
+	debug("SmackerScene::setFileHash(%08X)", fileHash);
+	_fileHash[0] = fileHash;
+	_fileHashList = _fileHash;
+}
+
+void SmackerScene::setFileHashList(uint32 *fileHashList) {
+	debug("SmackerScene::setFileHashList(...)");
+	_fileHashList = fileHashList;
+}
+
+void SmackerScene::nextVideo() {
+	debug("SmackerScene::nextVideo()");
+
+	_fileHashListIndex++;
+	
+	if (_fileHashList && _fileHashList[_fileHashListIndex] != 0) {
+		uint32 smackerFileHash = _fileHashList[_fileHashListIndex];
+		if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) {
+			// Not a Smacker file
+			_parentModule->sendMessage(0x1009, 0, this);
+			return;
+		}
+		// TODO _fieldDF = getGlobalSubVarValue(0x00800410, smackerFileHash);
+		if (!_fieldDF) {
+			// TODO setGlobalSubVarValue(0x00800410, smackerFileHash) = 1;
+		}
+		if (_fileHashListIndex == 0) {
+			_smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false);
+			addEntity(_smackerPlayer);
+			addSurface(_smackerPlayer->getSurface());
+			// TODO? Screen.hSmack = _smackerPlayer;
+		} else {
+			_smackerPlayer->open(smackerFileHash, false);
+		}
+	} else {
+		_parentModule->sendMessage(0x1009, 0, this);
+	}
+
+
+}
+
+void SmackerScene::update() {
+	if (_playNextVideoFlag) {
+		nextVideo();
+		_playNextVideoFlag = false;
+	}
+	Scene::update();
+}
+
+uint32 SmackerScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0009:
+		if ((_fieldDF && _flag1) || (_canAbort && _flag1))
+			_playNextVideoFlag = true;
+		break;
+	case 0x000C:
+		if (_canAbort) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x3002:
+		_playNextVideoFlag = true;
+		break;
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h
new file mode 100644
index 0000000..b3c354c
--- /dev/null
+++ b/engines/neverhood/smackerscene.h
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_SMACKERSCENE_H
+#define NEVERHOOD_SMACKERSCENE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/resourceman.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class SmackerScene : public Scene {
+public:
+	SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort);
+	virtual ~SmackerScene();
+	void setFileHash(uint32 fileHash);
+	void setFileHashList(uint32 *fileHashList);
+	void nextVideo();
+protected:
+	bool _doubleSurface;
+	bool _flag1;
+	bool _canAbort;
+	bool _fieldDF;
+	bool _playNextVideoFlag;
+	int _fileHashListIndex;
+	uint32 *_fileHashList;
+	uint32 _fileHash[2];
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_SMACKERSCENE_H */


Commit: 9d0e90bcd2fc392a66d213b64dc07ccd32d438b4
    https://github.com/scummvm/scummvm/commit/9d0e90bcd2fc392a66d213b64dc07ccd32d438b4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Add skeleton for Module1000

- Add dummies for game variable access

Changed paths:
  A engines/neverhood/module1000.cpp
  A engines/neverhood/module1000.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 3f4ad4b..93687f9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/gamemodule.h"
 
+#include "neverhood/module1000.h"
 #include "neverhood/module1500.h"
 
 namespace Neverhood {
@@ -84,12 +85,14 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
-	createModule1500(0);
+//	createModule1500(0); // Logos and intro video
+
+	createModule1000(0);
 }
 
 void GameModule::createModule1500(int which) {
 	_someFlag1 = false;
-	// TODO *getGlobalGameVarValuePtr(0x91080831) = 0x0F10114;
+	_vm->setGlobalVar(0x91080831, 0x00F10114);
 	_childObject = new Module1500(_vm, this, which, true);
 	SetUpdateHandler(&GameModule::updateModule1500);
 }
@@ -102,8 +105,28 @@ void GameModule::updateModule1500() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
+		createModule1000(0);
+		_childObject->handleUpdate();
+	}
+}
+
+void GameModule::createModule1000(int which) {
+	_vm->setGlobalVar(0x91080831, 0x03294419);
+	_childObject = new Module1000(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1000);
+}
+
+void GameModule::updateModule1000() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		// TODO _resourceTable3.load();
+		delete _childObject;
+		_childObject = NULL;
 		error("Done...");
-		// TODO createModule1000();
+		// TODO createModule2300();
 		// TODO _childObject->handleUpdate();
 	}
 }
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 6f47fb6..6d65895 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -49,6 +49,8 @@ protected:
 	void startup();
 	void createModule1500(int which);
 	void updateModule1500();
+	void createModule1000(int which);
+	void updateModule1000();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 8eb1951..fe0f7de 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -8,6 +8,7 @@ MODULE_OBJS = \
 	gamemodule.o \
 	graphics.o \
 	module.o \
+	module1000.o \
 	module1500.o \
 	neverhood.o \
 	palette.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
new file mode 100644
index 0000000..d1403b9
--- /dev/null
+++ b/engines/neverhood/module1000.cpp
@@ -0,0 +1,116 @@
+/* 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/module1000.h"
+
+namespace Neverhood {
+
+Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	debug("Create Module1000(%d)", which);
+
+	_musicFileHash = _vm->getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;		
+
+	// TODO Music18hList_add(0x03294419, 0x061880C6);
+	// TODO Music18hList_add(0x03294419, _musicFileHash);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene1001(-1);
+			break;
+		case 1:
+			createScene1002(-1);
+			break;
+		case 2:
+			createScene1003(-1);
+			break;
+		case 3:
+			createScene1004(-1);
+			break;
+		case 4:
+			createScene1005(-1);
+			break;
+		}
+	} else if (which == 0) {
+		createScene1001(0);
+	} else if (which == 1) {
+		createScene1002(1);
+	}
+
+}
+
+Module1000::~Module1000() {
+	// TODO Music18hList_deleteGroup(0x03294419);
+}
+
+void Module1000::createScene1001(int which) {
+	debug("createScene1501");
+	_vm->gameState().sceneNum = 0;
+	_childObject = new Scene1001(_vm, this, which);
+	// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3);
+	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
+	SetUpdateHandler(&Module1000::updateScene1001);
+}
+			
+void Module1000::createScene1002(int which) {
+}
+
+void Module1000::createScene1003(int which) {
+}
+
+void Module1000::createScene1004(int which) {
+}
+
+void Module1000::createScene1005(int which) {
+}
+
+void Module1000::updateScene1001() {
+}
+
+void Module1000::updateScene1002() {
+}
+			
+void Module1000::updateScene1003() {
+}
+			
+void Module1000::updateScene1004() {
+}
+			
+void Module1000::updateScene1005() {
+}
+			
+// Scene1001			
+				
+Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+}
+
+void Scene1001::update() {
+}
+
+uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
new file mode 100644
index 0000000..935a8be
--- /dev/null
+++ b/engines/neverhood/module1000.h
@@ -0,0 +1,71 @@
+/* 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_MODULE1000_H
+#define NEVERHOOD_MODULE1000_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class Module1000 : public Module {
+public:
+	Module1000(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1000();
+protected:
+	uint32 _musicFileHash;
+	// TODO ResourceTable _resourceTable1;
+	// TODO ResourceTable _resourceTable2;
+	// TODO ResourceTable _resourceTable3;
+	// TODO ResourceTable _resourceTable4;
+	void createScene1001(int which);			
+	void createScene1002(int which);			
+	void createScene1003(int which);			
+	void createScene1004(int which);			
+	void createScene1005(int which);			
+	void updateScene1001();			
+	void updateScene1002();			
+	void updateScene1003();			
+	void updateScene1004();			
+	void updateScene1005();			
+};
+
+class Scene1001 : public Scene {
+public:
+	Scene1001(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_class511;
+	Sprite *_class508;
+	Sprite *_class509;
+	Sprite *_class608;
+	Sprite *_class510;
+	int16 _fieldE4;
+	int16 _fieldE6;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1000_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 6506812..b61f65c 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -185,4 +185,22 @@ Common::Error NeverhoodEngine::run() {
 	return Common::kNoError;
 }
 
+uint32 NeverhoodEngine::getGlobalVar(uint32 nameHash) {
+	// TODO
+	return 0;
+}
+
+void NeverhoodEngine::setGlobalVar(uint32 nameHash, uint32 value) {
+	// TODO
+}
+
+uint32 NeverhoodEngine::getSubVar(uint32 nameHash, uint32 subNameHash) {
+	// TODO
+	return 0;
+}
+
+void NeverhoodEngine::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
+	// TODO
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index c13ac51..dddec47 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -110,6 +110,10 @@ public:
 #endif
 
 	GameState& gameState() { return _gameState; }
+	uint32 getGlobalVar(uint32 nameHash);
+	void setGlobalVar(uint32 nameHash, uint32 value);
+	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
+	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
 
 public:
 
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index f3ee577..d47dbb0 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -32,12 +32,10 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl
 
 	// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
 	
-	/* TODO
-	if (_vm->getGlobalVarValue(0x06C02850)) {
+	if (_vm->getGlobalVar(0x06C02850)) {
 		_flag1 = true;
 		_canAbort = true;
 	}
-	*/
 	
 	if (_doubleSurface) {
 		_vm->_screen->clear();
@@ -78,9 +76,9 @@ void SmackerScene::nextVideo() {
 			_parentModule->sendMessage(0x1009, 0, this);
 			return;
 		}
-		// TODO _fieldDF = getGlobalSubVarValue(0x00800410, smackerFileHash);
+		_fieldDF = _vm->getSubVar(0x00800410, smackerFileHash);
 		if (!_fieldDF) {
-			// TODO setGlobalSubVarValue(0x00800410, smackerFileHash) = 1;
+			_vm->setSubVar(0x00800410, smackerFileHash, 1);
 		}
 		if (_fileHashListIndex == 0) {
 			_smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false);


Commit: ae4ef4e66dc69a9d60b44261596860fcc4518de9
    https://github.com/scummvm/scummvm/commit/ae4ef4e66dc69a9d60b44261596860fcc4518de9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Add StaticData class

Changed paths:
  A engines/neverhood/staticdata.cpp
  A engines/neverhood/staticdata.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/scene.h



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index fe0f7de..8a25e25 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -18,7 +18,8 @@ MODULE_OBJS = \
 	screen.o \
 	smackerscene.o \
 	smackerplayer.o \
-	sprite.o
+	sprite.o \
+	staticdata.o
 
 # This module can be built as a plugin
 ifdef BUILD_PLUGINS
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index b61f65c..24033f0 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -33,6 +33,7 @@
 #include "neverhood/resourceman.h"
 #include "neverhood/resource.h"
 #include "neverhood/screen.h"
+#include "neverhood/staticdata.h"
 
 namespace Neverhood {
 
@@ -62,6 +63,9 @@ Common::Error NeverhoodEngine::run() {
 
 	_isSaveAllowed = false;
 
+	_staticData = new StaticData();
+	_staticData->load("neverhood.dat");
+
 	_screen = new Screen(this);
 
 	_res = new ResourceMan();
@@ -176,9 +180,10 @@ Common::Error NeverhoodEngine::run() {
 	}
 	
 	delete _gameModule;
-	
 	delete _res;
 	delete _screen;
+
+	delete _staticData;
 	
 	debug("Ok.");
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index dddec47..b2ba5f7 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -42,6 +42,7 @@ struct NeverhoodGameDescription;
 class GameModule;
 class ResourceMan;
 class Screen;
+class StaticData;
 
 struct GameState {
 	int sceneNum;
@@ -74,6 +75,7 @@ public:
 	Screen *_screen;
 	ResourceMan *_res;
 	GameModule *_gameModule;
+	StaticData *_staticData;
 
 public:
 	
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 405a528..108adba 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -32,14 +32,10 @@
 #include "neverhood/palette.h"
 #include "neverhood/smackerplayer.h"
 #include "neverhood/sprite.h"
+#include "neverhood/staticdata.h"
 
 namespace Neverhood {
 
-struct MessageListItem {
-	uint32 messageNum;
-	uint32 messageValue;
-};
-
 class Scene : public Entity {
 public:
 	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
@@ -58,7 +54,7 @@ protected:
 	Common::Array<Entity*> _entities;
 	Common::Array<BaseSurface*> _surfaces;
 	bool _systemCallbackFlag;
-	MessageListItem *_messageList;
+	MessageList *_messageList;
 	int _messageListIndex;
 	int _messageListCount;
 	bool _messageListFlag1;
@@ -77,7 +73,7 @@ protected:
 	Background *_background;
 	bool _surfaceFlag;
 	bool _messageListFlag;
-	MessageListItem *_messageList2;
+	MessageList *_messageList2;
 	int _messageListStatus;
 	SmackerPlayer *_smackerPlayer;
 	void (Entity::*_savedUpdateHandlerCb)();
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
new file mode 100644
index 0000000..4cd1d30
--- /dev/null
+++ b/engines/neverhood/staticdata.cpp
@@ -0,0 +1,121 @@
+/* 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/staticdata.h"
+
+namespace Neverhood {
+
+StaticData::StaticData() {
+}
+
+StaticData::~StaticData() {
+}
+
+void StaticData::load(const char *filename) {
+
+	Common::File fd;
+	
+	if (!fd.open(filename))
+		error("StaticData::load() Could not open %s", filename);
+		
+	fd.readUint32LE(); // magic		
+	fd.readUint32LE(); // version
+	
+	// Load message lists
+	uint32 messageListsCount = fd.readUint32LE();
+	debug("messageListsCount: %d", messageListsCount);
+	for (uint32 i = 0; i < messageListsCount; i++) {
+		MessageList *messageList = new MessageList();
+		uint32 id = fd.readUint32LE();
+		uint32 itemCount = fd.readUint32LE();
+		for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) {
+			MessageItem messageItem;
+			messageItem.messageNum = fd.readUint16LE();
+			messageItem.messageValue = fd.readUint32LE();
+			messageList->push_back(messageItem);
+		}
+		_messageLists[id] = messageList;
+	}
+
+	// Load rect lists
+	uint32 rectListsCount = fd.readUint32LE();
+	debug("rectListsCount: %d", rectListsCount);
+	for (uint32 i = 0; i < rectListsCount; i++) {
+		RectList *rectList = new RectList();
+		uint32 id = fd.readUint32LE();
+		uint32 itemCount = fd.readUint32LE();
+		for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) {
+			RectItem rectItem;
+			rectItem.rect.x1 = fd.readUint16LE();
+			rectItem.rect.y1 = fd.readUint16LE();
+			rectItem.rect.x2 = fd.readUint16LE();
+			rectItem.rect.y2 = fd.readUint16LE();
+			uint32 subItemCount = fd.readUint32LE();
+			rectItem.subRects.reserve(subItemCount);
+			for (uint32 subItemIndex = 0; subItemIndex < subItemCount; subItemIndex++) {
+				SubRectItem subRectItem;
+				subRectItem.rect.x1 = fd.readUint16LE();
+				subRectItem.rect.y1 = fd.readUint16LE();
+				subRectItem.rect.x2 = fd.readUint16LE();
+				subRectItem.rect.y2 = fd.readUint16LE();
+				subRectItem.messageListId = fd.readUint32LE();
+				rectItem.subRects.push_back(subRectItem);
+			}
+			rectList->push_back(rectItem);
+		}
+		_rectLists[id] = rectList;
+	}
+	
+	// Load hit rects
+	uint32 hitRectListsCount = fd.readUint32LE();
+	debug("hitRectListsCount: %d", hitRectListsCount);
+	for (uint32 i = 0; i < hitRectListsCount; i++) {
+		HitRectList *hitRectList = new HitRectList();
+		uint32 id = fd.readUint32LE();
+		uint32 itemCount = fd.readUint32LE();
+		for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) {
+			HitRect hitRect;
+			hitRect.rect.x1 = fd.readUint16LE();
+			hitRect.rect.y1 = fd.readUint16LE();
+			hitRect.rect.x2 = fd.readUint16LE();
+			hitRect.rect.y2 = fd.readUint16LE();
+			hitRect.type = fd.readUint16LE();
+			hitRectList->push_back(hitRect);
+		}
+		_hitRectLists[id] = hitRectList;
+	}
+
+}
+
+HitRectList *StaticData::getHitRectList(uint32 id) {
+	return _hitRectLists[id];
+}
+
+RectList *StaticData::getRectList(uint32 id) {
+	return _rectLists[id];
+}
+
+MessageList *StaticData::getMessageList(uint32 id) {
+	return _messageLists[id];
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
new file mode 100644
index 0000000..a7d8a65
--- /dev/null
+++ b/engines/neverhood/staticdata.h
@@ -0,0 +1,75 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_STATICDATA_H
+#define NEVERHOOD_STATICDATA_H
+
+#include "common/array.h"
+#include "common/hashmap.h"
+#include "neverhood/neverhood.h"
+#include "neverhood/graphics.h"
+
+namespace Neverhood {
+
+struct HitRect {
+	NRect rect;
+	uint16 type;
+};
+
+typedef Common::Array<HitRect> HitRectList;
+
+struct SubRectItem {
+	NRect rect;
+	uint32 messageListId;
+};
+
+struct RectItem {
+	NRect rect;
+	Common::Array<SubRectItem> subRects;
+};
+
+typedef Common::Array<RectItem> RectList;
+
+struct MessageItem {
+	uint16 messageNum;
+	uint32 messageValue;
+};
+
+typedef Common::Array<MessageItem> MessageList;
+
+class StaticData {
+public:
+	StaticData();
+	~StaticData();
+	void load(const char *filename);
+	HitRectList *getHitRectList(uint32 id);
+	RectList *getRectList(uint32 id);
+	MessageList *getMessageList(uint32 id);
+protected:
+	Common::HashMap<uint32, HitRectList*> _hitRectLists;
+	Common::HashMap<uint32, RectList*> _rectLists;
+	Common::HashMap<uint32, MessageList*> _messageLists;
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_STATICDATA_H */


Commit: 6b71d177925ff21787fb792dc05ac048eadbbca3
    https://github.com/scummvm/scummvm/commit/6b71d177925ff21787fb792dc05ac048eadbbca3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Start with the CollisionMan class

Changed paths:
  A engines/neverhood/collisionman.cpp
  A engines/neverhood/collisionman.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
new file mode 100644
index 0000000..cc40a47
--- /dev/null
+++ b/engines/neverhood/collisionman.cpp
@@ -0,0 +1,67 @@
+/* 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/collisionman.h"
+
+namespace Neverhood {
+
+CollisionMan::CollisionMan(NeverhoodEngine *vm)
+	: _vm(vm), _hitRects(NULL) {
+}
+
+CollisionMan::~CollisionMan() {
+}
+
+void CollisionMan::setHitRects(uint32 id) {
+	setHitRects(_vm->_staticData->getHitRectList(id));
+}
+
+void CollisionMan::setHitRects(HitRectList *hitRects) {
+	_hitRects = hitRects;
+}
+
+HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) {
+	// TODO
+	return NULL;
+}
+
+void CollisionMan::addSprite(Sprite *sprite) {
+	_sprites.push_back(sprite);
+}
+
+void CollisionMan::removeSprite(Sprite *sprite) {
+	// TODO
+}
+
+void CollisionMan::clearSprites() {
+	_sprites.clear();
+}
+
+void CollisionMan::save() {
+	// TODO
+}
+
+void CollisionMan::restore() {
+	// TODO
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h
new file mode 100644
index 0000000..cfa248a
--- /dev/null
+++ b/engines/neverhood/collisionman.h
@@ -0,0 +1,53 @@
+/* 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_COLLISIONMAN_H
+#define NEVERHOOD_COLLISIONMAN_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/sprite.h"
+#include "neverhood/staticdata.h"
+
+namespace Neverhood {
+
+class CollisionMan {
+public:
+	CollisionMan(NeverhoodEngine *vm);
+	~CollisionMan();
+	void setHitRects(uint32 id);
+	void setHitRects(HitRectList *hitRects);
+	HitRect *findHitRectAtPos(int16 x, int16 y);
+	void addSprite(Sprite *sprite);
+	void removeSprite(Sprite *sprite);
+	void clearSprites();
+	void save();
+	void restore();
+protected:
+	NeverhoodEngine *_vm;
+	HitRectList *_hitRects;
+	Common::Array<Sprite*> _sprites;
+};
+
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_COLLISIONMAN_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 8a25e25..f139268 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -3,6 +3,7 @@ MODULE := engines/neverhood
 MODULE_OBJS = \
 	background.o \
 	blbarchive.o \
+	collisionman.o \
 	detection.o \
 	entity.o \
 	gamemodule.o \
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 24033f0..8b74b66 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -28,6 +28,7 @@
 #include "engines/util.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
+#include "neverhood/collisionman.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/graphics.h"
 #include "neverhood/resourceman.h"
@@ -128,6 +129,7 @@ Common::Error NeverhoodEngine::run() {
 	}
 #endif
 
+	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
 
 	// Preliminary main loop, needs some more work but works for testing
@@ -180,6 +182,8 @@ Common::Error NeverhoodEngine::run() {
 	}
 	
 	delete _gameModule;
+	delete _collisionMan;
+	
 	delete _res;
 	delete _screen;
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index b2ba5f7..4a07d6a 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -39,6 +39,7 @@ enum NeverhoodGameFeatures {
 
 struct NeverhoodGameDescription;
 
+class CollisionMan;
 class GameModule;
 class ResourceMan;
 class Screen;
@@ -76,6 +77,7 @@ public:
 	ResourceMan *_res;
 	GameModule *_gameModule;
 	StaticData *_staticData;
+	CollisionMan *_collisionMan;
 
 public:
 	


Commit: 056b69f0c8b2c69f3040fa54268b22c6463627b0
    https://github.com/scummvm/scummvm/commit/056b69f0c8b2c69f3040fa54268b22c6463627b0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Module1000 and Scene1001 skeletons

- Implement BaseSurface::drawSpriteResourceEx
- Use CollisionMan in Scene
- Some cleanup

Changed paths:
    engines/neverhood/collisionman.cpp
    engines/neverhood/collisionman.h
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module.h
    engines/neverhood/module1000.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index cc40a47..31bc16d 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -24,6 +24,8 @@
 
 namespace Neverhood {
 
+static HitRect defaultHitRect = {NRect(), 0x5000};
+
 CollisionMan::CollisionMan(NeverhoodEngine *vm)
 	: _vm(vm), _hitRects(NULL) {
 }
@@ -39,13 +41,34 @@ void CollisionMan::setHitRects(HitRectList *hitRects) {
 	_hitRects = hitRects;
 }
 
+void CollisionMan::clearHitRects() {
+	_hitRects = 0;
+}
+
 HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) {
-	// TODO
-	return NULL;
+	if (_hitRects) {
+		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) {
+			HitRect *hitRect = &(*it);
+			if (x >= hitRect->rect.x1 && x <= hitRect->rect.x2 && y >= hitRect->rect.y1 && y <= hitRect->rect.y2)
+				return hitRect;
+		}
+	}
+	return &defaultHitRect; 
 }
 
 void CollisionMan::addSprite(Sprite *sprite) {
-	_sprites.push_back(sprite);
+	int index = 0, insertIndex = -1;
+	for (Common::Array<Sprite*>::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) {
+		if ((*iter)->getPriority() > sprite->getPriority()) {
+			insertIndex = index;
+			break;
+		}
+		index++;
+	}
+	if (insertIndex >= 0)
+		_sprites.insert_at(insertIndex, sprite);
+	else
+		_sprites.push_back(sprite);		
 }
 
 void CollisionMan::removeSprite(Sprite *sprite) {
diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h
index cfa248a..426dca0 100644
--- a/engines/neverhood/collisionman.h
+++ b/engines/neverhood/collisionman.h
@@ -35,6 +35,7 @@ public:
 	~CollisionMan();
 	void setHitRects(uint32 id);
 	void setHitRects(HitRectList *hitRects);
+	void clearHitRects();
 	HitRect *findHitRectAtPos(int16 x, int16 y);
 	void addSprite(Sprite *sprite);
 	void removeSprite(Sprite *sprite);
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index fa7c152..3d21e8e 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -74,6 +74,20 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
 	}
 }
 
+void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height) {
+	if (spriteResource.getDimensions().width <= _sysRect.width && 
+		spriteResource.getDimensions().height <= _sysRect.height) {
+		if (width > 0 && width <= _sysRect.width)
+			_drawRect.width = width;
+		if (height > 0 && height <= _sysRect.height)
+			_drawRect.height = height;
+		if (_surface) {
+			clear();
+			spriteResource.draw((byte*)_surface->pixels, _surface->pitch, flipX, flipY);
+		}
+	}
+}
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index cb7474c..ce2be1a 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -41,11 +41,13 @@ struct NDimensions {
 struct NRect {
 	int16 x1, y1, x2, y2;
 	NRect() : x1(0), y1(0), x2(0), y2(0) {}
+	NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {}
 };
 
 struct NDrawRect {
 	int16 x, y, width, height;
 	NDrawRect() : x(0), y(0), width(0), height(0) {}
+	NDrawRect(int16 x0, int16 y0, int16 width0, int16 height0) : x(x0), y(y0), width(width0), height(height0) {}
 };
 
 class SpriteResource;
@@ -60,11 +62,13 @@ public:
 	virtual void addDirtyRect();
 	void clear();
 	void drawSpriteResource(SpriteResource &spriteResource);
+	void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height);
 	int getPriority() const { return _priority; }
 	void setPriority(int priority) { _priority = priority; }
 	NDrawRect& getDrawRect() { return _drawRect; }
 	NDrawRect& getSysRect() { return _sysRect; }
 	NRect& getClipRect() { return _clipRect; }
+	void setClipRect(NRect clipRect) { _clipRect = clipRect; }
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index d3c7b69..7911e44 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -27,6 +27,7 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/background.h"
+#include "neverhood/collisionman.h"
 #include "neverhood/entity.h"
 #include "neverhood/graphics.h"
 #include "neverhood/palette.h"
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index d1403b9..248769e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -103,7 +103,95 @@ void Module1000::updateScene1005() {
 // Scene1001			
 				
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) {
+
+	// TODO: Implement Sprite classes
+
+	Sprite *staticSprite1;
+
+	SetMessageHandler(&Scene1001::handleMessage);
+	
+	_vm->_collisionMan->setHitRects(0x004B4858);
+	_surfaceFlag = false;
+	_background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0));
+	_palette = new Palette(_vm, 0x4086520E);
+	_palette->usePalette();
+	
+	// TODO Mouse
+
+#if 0
+	// TODO: Player sprites...	
+	if (which < 0) {
+		setRectList(0x004B49F0);
+		_playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000);
+		setMessageList(0x004B4888);
+	} else if (which == 1) {
+		setRectList(0x004B49F0);
+		_playerSprite = new Class572(_vm, this, 640, 433, 1000, 1000);
+		setMessageList(0x004B4898);
+	} else if (which == 2) {
+		setRectList(0x004B49F0);
+		if (_vm->getGlobalVar(0xC0418A02)) {
+			_playerSprite = new Class572(_vm, this, 390, 433, 1000, 1000);
+			_playerSprite->setDoDeltaX(1);
+		} else {
+			_playerSprite = new Class572(_vm, this, 300, 433, 1000, 1000);
+		}
+		setMessageList(0x004B4970);
+	} else {
+		setRectList(0x004B4A00);
+		_playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000);
+		setMessageList(0x004B4890);
+	}
+	addSprite(_playerSprite);
+#endif
+
+	staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
+
+#if 0
+	// TODO: This sucks somehow, find a better way
+	_playerSprite->getSurface()->getClipRect().x1 = 0;
+	_playerSprite->getSurface()->getClipRect().y1 = 0;
+	_playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+	_playerSprite->getSurface()->getClipRect().y2 = 480;
+	
+	if (_vm->getGlobalVar(0xD217189D) == 0) {
+		_class509 = addSprite(new Class509(_vm));
+		_class509->getSurface()->getClipRect().x1 = 0;
+		_class509->getSurface()->getClipRect().y1 = 0;
+		_class509->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+		_class509->getSurface()->getClipRect().y2 = 480;
+	} else {
+		_class509 = NULL;
+	}
+
+	_class511 = addSprite(new Class511(_vm, this, 150, 433, 1));
+#endif
+
+	addSprite(new StaticSprite(_vm, 0x809861A6, 950));
+	addSprite(new StaticSprite(_vm, 0x89C03848, 1100));
+
+#if 0
+	_class608 = addSprite(new Class608(_vm, 0x15288120, 100, 0));
+#endif
+
+	if (_vm->getGlobalVar(0x03C698DA) == 0) {
+		staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200));
+#if 0
+		_class510 = addSprite(new Class510(_vm));
+		_class510->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x;
+		_class510->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y;
+		_class510->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+		_class510->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height;
+#endif
+	} else {
+		_class510= NULL;
+	}
+
+#if 0
+	_class508 = addSprite(new Class508(_vm, _class509));
+#endif
+
 }
 
 void Scene1001::update() {
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 300cf81..c122ca2 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -220,10 +220,10 @@ bool AnimResource::load(uint32 fileHash) {
 		AnimFrameInfo frameInfo;
 		frameInfo.frameHash = READ_LE_UINT32(frameList);
 		frameInfo.counter = READ_LE_UINT16(frameList + 4);
-		frameInfo.rect.x1 = READ_LE_UINT16(frameList + 6);
-		frameInfo.rect.y1 = READ_LE_UINT16(frameList + 8);
-		frameInfo.rect.x2 = READ_LE_UINT16(frameList + 10);
-		frameInfo.rect.y2 = READ_LE_UINT16(frameList + 12);
+		frameInfo.rect.x = READ_LE_UINT16(frameList + 6);
+		frameInfo.rect.y = READ_LE_UINT16(frameList + 8);
+		frameInfo.rect.width = READ_LE_UINT16(frameList + 10);
+		frameInfo.rect.height = READ_LE_UINT16(frameList + 12);
 		frameInfo.deltaX = READ_LE_UINT16(frameList + 14);
 		frameInfo.deltaY = READ_LE_UINT16(frameList + 16);
 		frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); 
@@ -234,7 +234,7 @@ bool AnimResource::load(uint32 fileHash) {
 		frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28);
 		debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", 
 			frameInfo.frameHash, frameInfo.counter, 
-			frameInfo.rect.x1, frameInfo.rect.y1, frameInfo.rect.x2, frameInfo.rect.y2,
+			frameInfo.rect.x, frameInfo.rect.y, frameInfo.rect.width, frameInfo.rect.height,
 			frameInfo.deltaX, frameInfo.deltaY,
 			frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height,
 			frameInfo.field_1A, frameInfo.spriteDataOffs);
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 868bafd..4199fe7 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -64,7 +64,7 @@ protected:
 struct AnimFrameInfo {
 	uint32 frameHash;
 	int16 counter;
-	NRect rect;
+	NDrawRect rect;
 	int16 deltaX, deltaY;
 	NDrawRect deltaRect;
 	uint16 field_1A; 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index a73b45b..b06caee 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/scene.h"
+#include "neverhood/collisionman.h"
 
 namespace Neverhood {
 
@@ -42,8 +43,8 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_background = NULL;
 	// TODO _field_8E = -1;
 	if (clearHitRects) {
-		// TODO g_Class700->setHitRects(NULL, 0);
-		// TODO g_Class700->clear();
+		_vm->_collisionMan->clearHitRects();
+		_vm->_collisionMan->clearSprites();
 	}
 	_vm->_screen->setFps(24);
 	// TODO g_screen->hSmack = NULL;	
@@ -161,7 +162,7 @@ void Scene::setSurfacePriority(BaseSurface *surface, int priority) {
 }
 
 void Scene::deleteSprite(Sprite **sprite) {
-	// TODO g_Class700->removeSprite(*sprite);
+	_vm->_collisionMan->removeSprite(*sprite);
 	removeSurface((*sprite)->getSurface());
 	removeEntity(*sprite);
 	delete *sprite;
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 0157673..0f44110 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -119,11 +119,13 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y,
 
 	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
 	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
+	
+	debug("StaticSprite::init() final: x = %d; y = %d", _x, _y);
 
-	_rect1.x1 = 0;
-	_rect1.y1 = 0;
-	_rect1.x2 = width;
-	_rect1.y2 = height; 
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = width;
+	_drawRect.width = height; 
 
 	_needRedraw = true;
 
@@ -137,19 +139,19 @@ void StaticSprite::update() {
 		return;
 		
 	if (_doDeltaX) {
-		_x = filterX(_x - _rect1.x1 - _rect1.x2 + 1);
+		_surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1);
 	} else {
-		_x = filterX(_x + _rect1.x1);
+		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
 	}
 		
 	if (_doDeltaY) {
-		_y = filterY(_y - _rect1.y1 - _rect1.y2 + 1);
+		_surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1);
 	} else {
-		_y = filterY(_y + _rect1.y1);
+		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
 	}
 
 	if (_needRedraw) {
-		// TODO _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2);
+		_surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
 		_needRedraw = false;
 	}
 
@@ -160,10 +162,10 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
 	_spriteResource.load2(fileHash);
 
 	if (dimensions) {
-		_rect1.x1 = 0;
-		_rect1.y1 = 0;
-		_rect1.x2 = _spriteResource.getDimensions().width;
-		_rect1.y2 = _spriteResource.getDimensions().height;
+		_drawRect.x = 0;
+		_drawRect.y = 0;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
 	}
 
 	if (position) {
@@ -276,7 +278,7 @@ void AnimatedSprite::updateAnim() {
 						_frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; 
 					}
 				} else {
-					// TODO updateFrameIndex();
+					updateFrameIndex();
 				}
 				if (_fileHash1 == 0)
 					updateFrameInfo();
@@ -336,19 +338,20 @@ void AnimatedSprite::updatePosition() {
 		return;
 
 	if (_doDeltaX) {
-		_surface->getDrawRect().x = filterX(_x - _rect1.x1 - _rect1.x2 + 1);
+		_surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1);
 	} else {
-		_surface->getDrawRect().x = filterX(_x + _rect1.x1);
+		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
 	}
 
 	if (_doDeltaY) {
-		_surface->getDrawRect().y = filterY(_y - _rect1.y1 - _rect1.y2 + 1);
+		_surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1);
 	} else {
-		_surface->getDrawRect().y = filterY(_y + _rect1.y1);
+		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
 	}
 
 	if (_needRedraw) {
-		// TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2);
+		debug("TODO: drawAnimResource");
+		// TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
 		_needRedraw = false;
 	}
 
@@ -381,7 +384,7 @@ void AnimatedSprite::updateFrameInfo() {
 	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex);
 	
 	_flag = true;
-	_rect1 = frameInfo.rect;
+	_drawRect = frameInfo.rect;
 	_deltaX = frameInfo.deltaX;
 	_deltaY = frameInfo.deltaY;
 	_deltaRect = frameInfo.deltaRect;
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 708228c..5d013a8 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -55,7 +55,7 @@ protected:
 	bool _needRedraw;
 	//0000002B field_2B		db ?
 	//0000002C field2C		dd ? // unused
-	NRect _rect1;
+	NDrawRect _drawRect;
 	NDrawRect _deltaRect;
 	NRect _rect;
 	uint16 _flags;


Commit: 97f319c945baee44947d6013de2998651b79046f
    https://github.com/scummvm/scummvm/commit/97f319c945baee44947d6013de2998651b79046f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: More work on Scene1001, implement Class509 (yes, will be renamed later) and AnimResource related stuff

Changed paths:
    engines/neverhood/entity.h
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/screen.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index bbe67a1..18b9cba 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -44,14 +44,16 @@ struct MessageParam {
 
 class Entity {
 public:
+	Common::String _name; // Entity name for debugging purposes
 	Entity(NeverhoodEngine *vm, int priority)
-		: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority) {
+		: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") {
 	}
 	virtual ~Entity() {
 	}
 	virtual void draw() {
 	}
 	void handleUpdate() {
+		//debug("Entity(%s).handleUpdate", _name.c_str());
 		if (_updateHandlerCb)
 			(this->*_updateHandlerCb)();
 	}
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 3d21e8e..b6d883c 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -51,7 +51,7 @@ BaseSurface::~BaseSurface() {
 }
 
 void BaseSurface::draw() {
-	debug("BaseSurface::draw()");
+	debug(8, "BaseSurface::draw()");
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
 		// TODO: _sysRect alternate drawing code (is that used?)
 		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect);
@@ -88,6 +88,19 @@ void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flip
 	}
 }
 
+void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height) {
+	if (width > 0 && width <= _sysRect.width)
+		_drawRect.width = width;
+	if (height > 0 && height <= _sysRect.height)
+		_drawRect.height = height;
+	if (_surface) {
+		clear();
+		if (frameIndex < animResource.getFrameCount()) {
+			animResource.draw(frameIndex, (byte*)_surface->pixels, _surface->pitch, flipX, flipY);
+		}
+	}
+}
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index ce2be1a..bf8333c 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -50,6 +50,7 @@ struct NDrawRect {
 	NDrawRect(int16 x0, int16 y0, int16 width0, int16 height0) : x(x0), y(y0), width(width0), height(height0) {}
 };
 
+class AnimResource;
 class SpriteResource;
 
 // NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific
@@ -63,12 +64,15 @@ public:
 	void clear();
 	void drawSpriteResource(SpriteResource &spriteResource);
 	void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height);
+	void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height);
 	int getPriority() const { return _priority; }
 	void setPriority(int priority) { _priority = priority; }
 	NDrawRect& getDrawRect() { return _drawRect; }
 	NDrawRect& getSysRect() { return _sysRect; }
 	NRect& getClipRect() { return _clipRect; }
 	void setClipRect(NRect clipRect) { _clipRect = clipRect; }
+	bool getVisible() const { return _visible; }
+	void setVisible(bool value) { _visible = value; }
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 248769e..162618e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -86,6 +86,36 @@ void Module1000::createScene1005(int which) {
 }
 
 void Module1000::updateScene1001() {
+	_childObject->handleUpdate();
+
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 2) {
+			// TODO createScene1003();
+			// TODO _childObject->handleUpdate();
+		} else {
+			// TODO createScene1002();
+			// TODO _childObject->handleUpdate();
+		}
+	}
+
+	if (_field24 >= 0) {
+		if (_field24 == 2) {
+			// TODO ResourceTable_multiLoad(&_resourceTable2, &_resourceTable1, &_resourceTable3);
+			_field24 = -1;
+		} else {
+			// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable1);
+			_field24 = -1;
+		}
+	}
+
+	if (_field26 >= 0) {
+		// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3);
+		_field26 = -1;
+	}
+
 }
 
 void Module1000::updateScene1002() {
@@ -101,10 +131,121 @@ void Module1000::updateScene1005() {
 }
 			
 // Scene1001			
+
+Class509::Class509(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) {
+	
+	_name = "Class509";
+	
+	createSurface(800, 137, 242);
+
+	_x = 726;
+	_y = 440;
+
+	callback1();
+
+#if 0
+	_soundResource2.set(0xED403E03);
+	_soundResource2.load();
+	_soundResource2.createSoundBuffer();
+#endif
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class509::handleMessage);
+
+}
+
+uint32 Class509::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		handleMessage2000h();
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return 0;
+}
+
+void Class509::handleMessage2000h() {
+
+	switch (_vm->getGlobalVar(0x52371C95)) {
+	case 0:
+#if 0	
+		_soundResource1.set(0x65482F03);
+		_soundResource1.load();
+		_soundResource1.play(false);
+#endif
+		setFileHash(0x624C0498, 1, 3);
+		SetAnimationCallback3(&Class509::callback1);		
+		break;
+	case 1:
+#if 0	
+		_soundResource1.set(0x65482F03);
+		_soundResource1.load();
+		_soundResource1.play(false);
+#endif
+		setFileHash(0x624C0498, 1, 3);
+		SetAnimationCallback3(&Class509::callback1);		
+		break;
+	case 2:
+#if 0	
+		_soundResource2.play(false);
+#endif
+		setFileHash(0x624C0498, 6, 6);
+		SetAnimationCallback3(&Class509::callback2);		
+		break;
+	default:
+		// Nothing
+		break;		
+	}
+
+	_vm->incGlobalVar(0x52371C95, 1);
+
+}
+
+void Class509::callback1() {
+	switch (_vm->getGlobalVar(0x52371C95)) {
+	case 1:
+		setFileHash(0x624C0498, 4, -1);
+		_newHashListIndex = 4;
+		break;
+	case 2:
+		setFileHash(0x624C0498, 1, -1);
+		_newHashListIndex = 1;
+		break;
+	case 3:
+		setFileHash1();
+		_surface->setVisible(false);
+		break;
+	default:
+		setFileHash(0x624C0498, 0, -1);
+		_newHashListIndex = 0;
+		break;
+	}
+}
+
+void Class509::callback2() {
+	_vm->setGlobalVar(0xD217189D, 1);
+	setFileHash(0x624C0498, 6, 6);
+	SetAnimationCallback3(&Class509::callback3);
+	_x = 30;
+}
+
+void Class509::callback3() {
+#if 0
+	_soundResource1.play(false);
+#endif
+	setFileHash1();
+	_surface->setVisible(false);	
+}
 				
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) {
 
+	_name = "Scene1001";
+
 	// TODO: Implement Sprite classes
 
 	Sprite *staticSprite1;
@@ -154,6 +295,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_playerSprite->getSurface()->getClipRect().y1 = 0;
 	_playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
 	_playerSprite->getSurface()->getClipRect().y2 = 480;
+#endif
 	
 	if (_vm->getGlobalVar(0xD217189D) == 0) {
 		_class509 = addSprite(new Class509(_vm));
@@ -165,6 +307,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class509 = NULL;
 	}
 
+#if 0
 	_class511 = addSprite(new Class511(_vm, this, 150, 433, 1));
 #endif
 
@@ -194,9 +337,6 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 }
 
-void Scene1001::update() {
-}
-
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	return 0;
 }
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 935a8be..4e7b292 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -29,6 +29,8 @@
 
 namespace Neverhood {
 
+// Module1000
+
 class Module1000 : public Module {
 public:
 	Module1000(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -51,18 +53,32 @@ protected:
 	void updateScene1005();			
 };
 
+// Scene1001
+
+class Class509 : public AnimatedSprite {
+public:
+	Class509(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource1;	
+	SoundResource _soundResource2;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void handleMessage2000h();
+	void callback1();
+	void callback2();
+	void callback3();
+};
+
 class Scene1001 : public Scene {
 public:
 	Scene1001(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_class511;
 	Sprite *_class508;
 	Sprite *_class509;
-	Sprite *_class608;
 	Sprite *_class510;
+	Sprite *_class511;
+	Sprite *_class608;
 	int16 _fieldE4;
 	int16 _fieldE6;
-	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 8b74b66..1ba2c98 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -203,6 +203,10 @@ void NeverhoodEngine::setGlobalVar(uint32 nameHash, uint32 value) {
 	// TODO
 }
 
+void NeverhoodEngine::incGlobalVar(uint32 nameHash, int incrValue) {
+	setGlobalVar(nameHash, getGlobalVar(nameHash) - incrValue);
+}
+
 uint32 NeverhoodEngine::getSubVar(uint32 nameHash, uint32 subNameHash) {
 	// TODO
 	return 0;
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 4a07d6a..952a99d 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -116,6 +116,7 @@ public:
 	GameState& gameState() { return _gameState; }
 	uint32 getGlobalVar(uint32 nameHash);
 	void setGlobalVar(uint32 nameHash, uint32 value);
+	void incGlobalVar(uint32 nameHash, int incrValue);
 	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
 	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
 
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index c122ca2..5fc167c 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -153,6 +153,15 @@ AnimResource::~AnimResource() {
 	unloadInternal();
 }
 
+void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) {
+	const AnimFrameInfo frameInfo = _frames[frameIndex];
+	_currSpriteData = _spriteData + frameInfo.spriteDataOffs;
+	_width = frameInfo.rect.width;
+	_height = frameInfo.rect.height;
+	// TODO: Repl stuff
+	unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY);	
+}
+
 bool AnimResource::load(uint32 fileHash) {
 	debug("AnimResource::load(%08X)", fileHash);
 
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 4199fe7..969f46d 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -75,6 +75,7 @@ class AnimResource {
 public:
 	AnimResource(NeverhoodEngine *vm);
 	~AnimResource();
+	void draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY);
 	bool load(uint32 fileHash);
 	void unload();
 	void clear();
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 68f6110..77e8c02 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -125,7 +125,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 		ddRect.y1 = 0;
 	}
 	
-	debug("draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
+	debug(8, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
 	
 	const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
 	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 0f44110..1239a30 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -29,9 +29,10 @@ namespace Neverhood {
 Sprite::Sprite(NeverhoodEngine *vm, int objectPriority)
 	: Entity(vm, objectPriority), _x(0), _y(0),
 	_spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
-	_doDeltaX(false), _doDeltaY(false), _needRedraw(false),
+	_doDeltaX(false), _doDeltaY(false), _needRefresh(false),
 	_flags(0) {
 
+	_name = "Sprite"; 
 	SetMessageHandler(&Sprite::handleMessage);
 	
 }
@@ -88,12 +89,15 @@ void Sprite::createSurface(int surfacePriority, int16 width, int16 height) {
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
 	: Sprite(vm, objectPriority), _spriteResource(vm) {
-	
+
+	_name = "StaticSprite"; 
+
 }
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
 	: Sprite(vm, 0), _spriteResource(vm) {
 
+	_name = "StaticSprite"; 
 	// TODO init(calcHash(filename), surfacePriority, x, y, width, height);
 
 }
@@ -101,6 +105,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac
 StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
 	: Sprite(vm, 0), _spriteResource(vm) {
 
+	_name = "StaticSprite"; 
 	init(fileHash, surfacePriority, x, y, width, height);
 	
 }
@@ -127,7 +132,7 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y,
 	_drawRect.width = width;
 	_drawRect.width = height; 
 
-	_needRedraw = true;
+	_needRefresh = true;
 
 	update();
 	
@@ -150,9 +155,9 @@ void StaticSprite::update() {
 		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
 	}
 
-	if (_needRedraw) {
+	if (_needRefresh) {
 		_surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
-		_needRedraw = false;
+		_needRefresh = false;
 	}
 
 }
@@ -173,7 +178,7 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
 		_y = _spriteResource.getPosition().y;
 	}
 
-	_needRedraw = true;
+	_needRefresh = true;
 
 }
 
@@ -198,6 +203,7 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface
 }
 
 void AnimatedSprite::init() {
+	_name = "AnimatedSprite"; 
 	_counter = 0;
 	_fileHash1 = 0;
 	_deltaX = 0;
@@ -205,18 +211,18 @@ void AnimatedSprite::init() {
 	_fileHash2 = 0;
 	// TODO _callbackList = 0;
 	_frameIndex3 = 0;
-	// TODO _callback3 = 0;
 	_frameIndex = 0;
 	_hashListIndex = -1;
-	// TODO _callback2 = 0;
+	_callback1Cb = NULL;
+	_callback2Cb = NULL;
+	_callback3Cb = NULL;
 	_newHashListIndex = -1;
-	// TODO _callback1 = 0;
 	_fileHash4 = 0;
 	_flag = false;
 	_replOldByte = 0;
 	_replNewByte = 0;
 	// TODO _animResource.replEnabled = 0;
-	_playBackwards = 0;
+	_playBackwards = false;
 }
 
 void AnimatedSprite::update() {
@@ -265,7 +271,6 @@ void AnimatedSprite::updateAnim() {
 						// TODO _animResource.loadInternal(calcHash("sqDefault"));
 						_fileHash3 = 0;
 					}
-					// loc_43831D
 					if (_replNewByte != _replOldByte) {
 						// TODO _animResource.setRepl(_replOldByte, _replNewByte);
 					}
@@ -349,10 +354,9 @@ void AnimatedSprite::updatePosition() {
 		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
 	}
 
-	if (_needRedraw) {
-		debug("TODO: drawAnimResource");
-		// TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
-		_needRedraw = false;
+	if (_needRefresh) {
+		_surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
+		_needRefresh = false;
 	}
 
 }
@@ -380,6 +384,7 @@ void AnimatedSprite::updateFrameIndex() {
 }
 
 void AnimatedSprite::updateFrameInfo() {
+	debug("AnimatedSprite::updateFrameInfo()");
 
 	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex);
 	
@@ -392,7 +397,7 @@ void AnimatedSprite::updateFrameInfo() {
 
 	processDelta();
 
-	_needRedraw = true;
+	_needRefresh = true;
 
 	if (frameInfo.frameHash != 0) {
 		sendMessage(0x100D, frameInfo.frameHash, this);
@@ -409,6 +414,7 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
 }
 
 void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) {
+	debug("AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4);
 	_fileHash1 = fileHash;
 	_frameIndex3 = frameIndex3;
 	_frameIndex4 = frameIndex4;
@@ -446,6 +452,29 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil
 	_hashListIndex = -1;
 }
 
+void AnimatedSprite::removeCallbacks() {
+
+	if (_callback1Cb) {
+		// _callback1Cb has to be cleared before it's called
+		AnimationCallback cb = _callback1Cb;
+		_callback1Cb = NULL;
+		debug("Fire _callback1Cb");
+		(this->*cb)();
+	}
 
+	if (_callback3Cb) {
+		_callback2Cb = _callback3Cb;
+		_callback3Cb = NULL;
+		debug("Fire _callback3Cb");
+		(this->*_callback2Cb)();
+#if 0 // TODO		
+	} else if (_callbackList) {
+		removeCallbackList();
+#endif		
+	} else {
+		_callback2Cb = NULL;
+	}
+
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 5d013a8..71067fa 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -52,7 +52,7 @@ protected:
 	BaseSurface *_surface;
 	int16 _x, _y;
 	bool _doDeltaX, _doDeltaY;
-	bool _needRedraw;
+	bool _needRefresh;
 	//0000002B field_2B		db ?
 	//0000002C field2C		dd ? // unused
 	NDrawRect _drawRect;
@@ -88,11 +88,17 @@ protected:
 	void update();
 };
 
+#define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
+#define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
+#define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
+
 class AnimatedSprite : public Sprite {
 public:
 	AnimatedSprite(NeverhoodEngine *vm, int objectPriority);
 	AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y);
+	void update();
 protected:
+	typedef void (AnimatedSprite::*AnimationCallback)();
 	AnimResource _animResource;
 	uint32 _fileHash1;
 	uint32 _fileHash2;
@@ -117,12 +123,11 @@ protected:
 	callbackListIndex dw ?
 	callbackListCount dw ?
 	callbackList	dd ?
-	callback3	   dd ?
-	callback2	   dd ?
-	callback1	   dd ?
 	*/
+	AnimationCallback _callback1Cb;
+	AnimationCallback _callback2Cb;
+	AnimationCallback _callback3Cb;
 	void init();
-	void update();
 	void updateDeltaXY();
 	void updateAnim();
 	void updatePosition();
@@ -134,6 +139,7 @@ protected:
 	void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5);
 	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);
 	int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!!
+	void removeCallbacks();
 };
 
 } // End of namespace Neverhood


Commit: e6236a39781360d2d41f5818b903d215015a1829
    https://github.com/scummvm/scummvm/commit/e6236a39781360d2d41f5818b903d215015a1829
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Add transparency and x flipping to sprite drawing (flip y still TODO but rarely used)

- Add Class511 (the lever) to Module1000

Changed paths:
    engines/neverhood/background.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h
    engines/neverhood/smackerplayer.cpp



diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
index abfa507..c47acd1 100644
--- a/engines/neverhood/background.cpp
+++ b/engines/neverhood/background.cpp
@@ -46,6 +46,7 @@ Background::~Background() {
 
 void Background::createSurface(int surfacePriority, int16 width, int16 height) {
 	_surface = new BaseSurface(_vm, surfacePriority, width, height);
+	_surface->setTransparent(false);
 	_spriteResource.getPosition().x = width;
 	_spriteResource.getPosition().y = height;
 }
@@ -80,6 +81,7 @@ void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 heig
 
 	// TODO: Later use a DirtySurface once it is implemented
 	_surface = new BaseSurface(_vm, surfacePriority, width, height);
+	_surface->setTransparent(false);
 	_spriteResource.getPosition().x = width;
 	_spriteResource.getPosition().y = height;
 
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index b6d883c..f6ae118 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -27,7 +27,7 @@
 namespace Neverhood {
 
 BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height)
-	: _vm(vm), _priority(priority), _visible(true) {
+	: _vm(vm), _priority(priority), _visible(true), _transparent(true) {
 	
 	_drawRect.x = 0;
 	_drawRect.y = 0;
@@ -54,7 +54,7 @@ void BaseSurface::draw() {
 	debug(8, "BaseSurface::draw()");
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
 		// TODO: _sysRect alternate drawing code (is that used?)
-		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect);
+		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
 	}
 }
 
@@ -152,7 +152,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 
 void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
 
-	// TODO: Flip
+	// TODO: Flip Y
 
 	int16 rows, chunks;
 	int16 skip, copy;
@@ -171,7 +171,14 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 					skip = READ_LE_UINT16(source);
 					copy = READ_LE_UINT16(source + 2);
 					source += 4;
-					memcpy(dest + skip, source, copy);
+					if (!flipX)
+						memcpy(dest + skip, source, copy);
+					else {
+						byte *flipDest = dest + width - skip - 1;
+						for (int xc = 0; xc < copy; xc++) {
+							*flipDest-- = source[xc];
+						}
+					}
 					source += copy;
 				}
 				dest += destPitch;
@@ -186,14 +193,24 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 
 void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
 
-	// TODO: Flip
+	// TODO: Flip Y
 
 	int sourcePitch = (width + 3) & 0xFFFC;
 
-	while (height-- > 0) {
-		memcpy(dest, source, width);
-		source += sourcePitch;
-		dest += destPitch;
+	if (!flipX) {
+		while (height-- > 0) {
+			memcpy(dest, source, width);
+			source += sourcePitch;
+			dest += destPitch;
+		}
+	} else {
+		while (height-- > 0) {
+			dest += width - 1;
+			for (int xc = 0; xc < width; xc++)
+				*dest-- = source[xc];
+			source += sourcePitch;
+			dest += destPitch;
+		}
 	}
 
 }
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index bf8333c..59db1e5 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -73,6 +73,7 @@ public:
 	void setClipRect(NRect clipRect) { _clipRect = clipRect; }
 	bool getVisible() const { return _visible; }
 	void setVisible(bool value) { _visible = value; }
+	void setTransparent(bool value) { _transparent = value; }
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
@@ -81,6 +82,7 @@ protected:
 	NDrawRect _drawRect;
 	NDrawRect _sysRect;
 	NRect _clipRect;
+	bool _transparent;
 };
 
 // Misc
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 162618e..c3aa0c9 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -240,7 +240,55 @@ void Class509::callback3() {
 	setFileHash1();
 	_surface->setVisible(false);	
 }
-				
+	
+Class511::Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	
+	createSurface(1010, 71, 73);
+	setDoDeltaX(deltaXType);
+	setFileHash(0x04A98C36, 0, -1);
+	_newHashListIndex = 0;
+	_x = x;
+	_y = y;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class511::handleMessage);
+}
+
+uint32 Class511::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x00C0C444) {
+			_parentScene->sendMessage(0x480F, 0, this);
+		} else if (param._integer == 0xC41A02C0) {
+#if 0		
+			_soundResource.set(0x40581882);
+			_soundResource.load();
+			_soundResource.play(false);
+#endif			
+		}
+		break;
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x3002:
+		setFileHash(0x04A98C36, 0, -1);
+		_newHashListIndex = 0;
+		break;
+	case 0x480F:
+		setFileHash(0x04A98C36, 0, -1);
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 0x3DE, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 0x3F2, this);
+		break;
+	}
+	return messageResult;
+}
+			
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) {
 
@@ -307,9 +355,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class509 = NULL;
 	}
 
-#if 0
 	_class511 = addSprite(new Class511(_vm, this, 150, 433, 1));
-#endif
 
 	addSprite(new StaticSprite(_vm, 0x809861A6, 950));
 	addSprite(new StaticSprite(_vm, 0x89C03848, 1100));
@@ -335,6 +381,8 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class508 = addSprite(new Class508(_vm, _class509));
 #endif
 
+	_class511->sendMessage(0x480F, 0, this);
+
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 4e7b292..219448a 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -68,6 +68,15 @@ protected:
 	void callback3();
 };
 
+class Class511 : public AnimatedSprite {
+public:
+	Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene1001 : public Scene {
 public:
 	Scene1001(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 77e8c02..db1c16a 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -94,7 +94,7 @@ void Screen::clear() {
 	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
 }
 
-void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) {
+void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent) {
 
 	int16 destX, destY;
 	NRect ddRect;
@@ -131,12 +131,22 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
 	int width = ddRect.x2 - ddRect.x1;
 	int height = ddRect.y2 - ddRect.y1;
-	
-	while (height--) {
-		memcpy(dest, source, width);
-		source += surface->pitch;
-		dest += _backScreen->pitch;
-	}
+
+	if (!transparent) {
+		while (height--) {
+			memcpy(dest, source, width);
+			source += surface->pitch;
+			dest += _backScreen->pitch;
+		}
+	} else {
+		while (height--) {
+			for (int xc = 0; xc < width; xc++)
+				if (source[xc] != 0)
+					dest[xc] = source[xc];
+			source += surface->pitch;
+			dest += _backScreen->pitch;
+		}
+	} 
 	
 	#if 0
 	if ( ddRect.right > ddRect.left )
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index fc56a18..922ad48 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -42,7 +42,7 @@ public:
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();
-	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect);
+	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent);
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
 protected:
 	NeverhoodEngine *_vm;
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index c914b42..bbb0db1 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -35,7 +35,7 @@ SmackerSurface::SmackerSurface(NeverhoodEngine *vm)
 
 void SmackerSurface::draw() {
 	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
-		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect);
+		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false);
 	}
 }
 


Commit: 5a34d20ec857ab6142baea9d021cb9ff84196589
    https://github.com/scummvm/scummvm/commit/5a34d20ec857ab6142baea9d021cb9ff84196589
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: More work on Scene1001, also give sprites classes and vars some better names

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index c3aa0c9..d5b7b03 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -132,30 +132,23 @@ void Module1000::updateScene1005() {
 			
 // Scene1001			
 
-Class509::Class509(NeverhoodEngine *vm)
+AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) {
 	
-	_name = "Class509";
-	
 	createSurface(800, 137, 242);
-
 	_x = 726;
 	_y = 440;
-
 	callback1();
-
 #if 0
 	_soundResource2.set(0xED403E03);
 	_soundResource2.load();
 	_soundResource2.createSoundBuffer();
 #endif
-
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class509::handleMessage);
-
+	SetMessageHandler(&AsScene1001Door::handleMessage);
 }
 
-uint32 Class509::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
@@ -168,18 +161,9 @@ uint32 Class509::handleMessage(int messageNum, const MessageParam &param, Entity
 	return 0;
 }
 
-void Class509::handleMessage2000h() {
-
+void AsScene1001Door::handleMessage2000h() {
 	switch (_vm->getGlobalVar(0x52371C95)) {
 	case 0:
-#if 0	
-		_soundResource1.set(0x65482F03);
-		_soundResource1.load();
-		_soundResource1.play(false);
-#endif
-		setFileHash(0x624C0498, 1, 3);
-		SetAnimationCallback3(&Class509::callback1);		
-		break;
 	case 1:
 #if 0	
 		_soundResource1.set(0x65482F03);
@@ -187,25 +171,23 @@ void Class509::handleMessage2000h() {
 		_soundResource1.play(false);
 #endif
 		setFileHash(0x624C0498, 1, 3);
-		SetAnimationCallback3(&Class509::callback1);		
+		SetAnimationCallback3(&AsScene1001Door::callback1);		
 		break;
 	case 2:
 #if 0	
 		_soundResource2.play(false);
 #endif
 		setFileHash(0x624C0498, 6, 6);
-		SetAnimationCallback3(&Class509::callback2);		
+		SetAnimationCallback3(&AsScene1001Door::callback2);		
 		break;
 	default:
 		// Nothing
 		break;		
 	}
-
 	_vm->incGlobalVar(0x52371C95, 1);
-
 }
 
-void Class509::callback1() {
+void AsScene1001Door::callback1() {
 	switch (_vm->getGlobalVar(0x52371C95)) {
 	case 1:
 		setFileHash(0x624C0498, 4, -1);
@@ -226,14 +208,14 @@ void Class509::callback1() {
 	}
 }
 
-void Class509::callback2() {
+void AsScene1001Door::callback2() {
 	_vm->setGlobalVar(0xD217189D, 1);
 	setFileHash(0x624C0498, 6, 6);
-	SetAnimationCallback3(&Class509::callback3);
+	SetAnimationCallback3(&AsScene1001Door::callback3);
 	_x = 30;
 }
 
-void Class509::callback3() {
+void AsScene1001Door::callback3() {
 #if 0
 	_soundResource1.play(false);
 #endif
@@ -241,7 +223,84 @@ void Class509::callback3() {
 	_surface->setVisible(false);	
 }
 	
-Class511::Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType)
+AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _asDoor(asDoor) {
+
+	_x = 547;
+	_y = 206;
+	createSurface(900, 177, 192);
+	setFileHash(0x022C90D4, -1, -1);
+	_newHashListIndex = -2;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1001Hammer::handleMessage);
+}
+
+uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x00352100) {
+			if (_asDoor) {
+				_asDoor->sendMessage(0x2000, 0, this);
+			}
+		} else if (param._integer == 0x0A1A0109) {
+#if 0		
+			_soundResource.set(0x66410886);
+			_soundResource.load();
+			_soundResource.play(false);
+#endif			
+		}
+		break;
+	case 0x2000:
+		setFileHash(0x022C90D4, 1, -1);
+#if 0		
+		_soundResource.set(0xE741020A);
+		_soundResource.load();
+		_soundResource.play(false);
+#endif			
+		_newHashListIndex = -2;
+		break;
+	}
+	return 0;
+}
+
+AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+
+	_x = 320;
+	_y = 240;
+	createSurface(100, 66, 129);
+	setFileHash(0xC68C2299, 0, -1);
+	_newHashListIndex = 0;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1001Window::handleMessage);
+}
+
+uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x0E0A1410) {
+#if 0		
+			_soundResource.set(0x60803F10);
+			_soundResource.load();
+			_soundResource.play(false);
+#endif			
+		}
+		break;
+	case 0x2001:
+		setFileHash(0xC68C2299, 0, -1);
+		break;
+	case 0x3002:
+		SetMessageHandler(NULL);
+		_vm->setGlobalVar(0x03C698DA, 1);
+		_surface->setVisible(false);
+		break;
+	}
+	return 0;
+}
+
+AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType)
 	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
 	
 	createSurface(1010, 71, 73);
@@ -251,10 +310,10 @@ Class511::Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, in
 	_x = x;
 	_y = y;
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class511::handleMessage);
+	SetMessageHandler(&AsScene1001Lever::handleMessage);
 }
 
-uint32 Class511::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -288,7 +347,40 @@ uint32 Class511::handleMessage(int messageNum, const MessageParam &param, Entity
 	}
 	return messageResult;
 }
-			
+	
+SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash)
+	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _soundResource(vm), _countdown(0) {
+
+	_priority = 1100;
+	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; 
+	_surface->setVisible(false);
+	SetUpdateHandler(&SsCommonButtonSprite::update);
+	SetMessageHandler(&SsCommonButtonSprite::handleMessage);
+}
+	
+void SsCommonButtonSprite::update() {
+	if (_countdown != 0 && (--_countdown) == 0) {
+		_surface->setVisible(false);
+	}
+}
+	
+uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x480B:
+		_parentScene->sendMessage(0x480B, 0, this);
+		_surface->setVisible(true);
+		_countdown = 8;
+#if 0		
+		_soundResource.set(_soundFileHash);
+		_soundResource.load();
+		_soundResource.play(false);
+#endif		
+		break;
+	}
+	return messageResult;
+}
+		
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) {
 
@@ -346,47 +438,90 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 #endif
 	
 	if (_vm->getGlobalVar(0xD217189D) == 0) {
-		_class509 = addSprite(new Class509(_vm));
-		_class509->getSurface()->getClipRect().x1 = 0;
-		_class509->getSurface()->getClipRect().y1 = 0;
-		_class509->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
-		_class509->getSurface()->getClipRect().y2 = 480;
+		_asDoor = addSprite(new AsScene1001Door(_vm));
+		_asDoor->getSurface()->getClipRect().x1 = 0;
+		_asDoor->getSurface()->getClipRect().y1 = 0;
+		_asDoor->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+		_asDoor->getSurface()->getClipRect().y2 = 480;
 	} else {
-		_class509 = NULL;
+		_asDoor = NULL;
 	}
 
-	_class511 = addSprite(new Class511(_vm, this, 150, 433, 1));
+	_asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1));
 
 	addSprite(new StaticSprite(_vm, 0x809861A6, 950));
 	addSprite(new StaticSprite(_vm, 0x89C03848, 1100));
 
-#if 0
-	_class608 = addSprite(new Class608(_vm, 0x15288120, 100, 0));
-#endif
+	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0));
 
 	if (_vm->getGlobalVar(0x03C698DA) == 0) {
 		staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200));
-#if 0
-		_class510 = addSprite(new Class510(_vm));
-		_class510->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x;
-		_class510->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y;
-		_class510->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
-		_class510->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height;
-#endif
+		_asWindow = addSprite(new AsScene1001Window(_vm));
+		_asWindow->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x;
+		_asWindow->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y;
+		_asWindow->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+		_asWindow->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height;
 	} else {
-		_class510= NULL;
+		_asWindow = NULL;
 	}
 
-#if 0
-	_class508 = addSprite(new Class508(_vm, _class509));
-#endif
-
-	_class511->sendMessage(0x480F, 0, this);
+	_asHammer = addSprite(new AsScene1001Hammer(_vm, _asDoor));
 
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	return 0;
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param._point.x == 0 && _vm->getGlobalVar(0xA4014072)) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x000D:
+		if (param._integer == 0x188B2105) {
+			_parentModule->sendMessage(0x1009, 0, this);
+			messageResult = 1;
+		}
+		break;
+	case 0x100D:
+		if (param._integer == 0x00342624) {
+			// TODO _playerSprite->sendMessage(0x1014, _asLever, this);
+			// TODO setMessageList2(0x004B4910, true, false);
+			messageResult = 1;
+		} else if (param._integer == 0x21E64A00) {
+			if (_vm->getGlobalVar(0xD217189D)) {
+				// TODO setMessageList(0x004B48A8, true, false);
+				messageResult = 1;
+			} else {
+				// TODO setMessageList(0x004B48C8, true, false);
+				messageResult = 1;
+			}
+		} else if (param._integer == 0x040424D0) {
+			// TODO _playerSprite->sendMessage(0x1014, _ssButton, this);
+		} else if (param._integer == 0x80006358) {
+			if (_vm->getGlobalVar(0x03C698DA)) {
+				// TODO setMessageList(0x004B4938, true, false);
+			} else {
+				// TODO setMessageList(0x004B4960, true, false);
+			}
+		}
+		break;
+	case 0x2002:
+		// TODO setRectList(0x004B49F0);
+		break;
+	case 0x480B:
+		if (_asWindow) {
+			_asWindow->sendMessage(0x2001, 0, this);
+		}
+		break;
+	case 0x480F:
+		if (_asHammer) {
+			_asHammer->sendMessage(0x2000, 0, this);
+		}
+		break;
+	}
+	return messageResult;
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 219448a..82c2fea 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -55,9 +55,9 @@ protected:
 
 // Scene1001
 
-class Class509 : public AnimatedSprite {
+class AsScene1001Door : public AnimatedSprite {
 public:
-	Class509(NeverhoodEngine *vm);
+	AsScene1001Door(NeverhoodEngine *vm);
 protected:
 	SoundResource _soundResource1;	
 	SoundResource _soundResource2;	
@@ -68,24 +68,53 @@ protected:
 	void callback3();
 };
 
-class Class511 : public AnimatedSprite {
+class AsScene1001Hammer : public AnimatedSprite {
 public:
-	Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType);
+	AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor);
+protected:
+	Sprite *_asDoor;
+	SoundResource _soundResource;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1001Window : public AnimatedSprite {
+public:
+	AsScene1001Window(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1001Lever : public AnimatedSprite {
+public:
+	AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType);
 protected:
 	Scene *_parentScene;
 	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class SsCommonButtonSprite : public StaticSprite {
+public:
+	SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 _soundFileHash;
+	int16 _countdown;
+	void update();	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene1001 : public Scene {
 public:
 	Scene1001(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_class508;
-	Sprite *_class509;
-	Sprite *_class510;
-	Sprite *_class511;
-	Sprite *_class608;
+	Sprite *_asHammer;
+	Sprite *_asDoor;
+	Sprite *_asWindow;
+	Sprite *_asLever;
+	Sprite *_ssButton;
 	int16 _fieldE4;
 	int16 _fieldE6;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 1ba2c98..4c80c40 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -133,7 +133,7 @@ Common::Error NeverhoodEngine::run() {
 	_gameModule = new GameModule(this);
 
 	// Preliminary main loop, needs some more work but works for testing
-	while (1) {
+	while (!shouldQuit()) {
 		Common::Event event;
 		Common::EventManager *eventMan = _system->getEventManager();
 	
@@ -141,6 +141,9 @@ Common::Error NeverhoodEngine::run() {
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
 				_keyState = event.kbd.keycode;
+				
+				// DEBUG gameModule->sendMessage(0x480F, 0, NULL);
+				
 				break;
 			case Common::EVENT_KEYUP:
 				_keyState = Common::KEYCODE_INVALID;


Commit: 88d2759f85443541ecdd2f50bef3492a99209309
    https://github.com/scummvm/scummvm/commit/88d2759f85443541ecdd2f50bef3492a99209309
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Start with the Klayman class (this is quite some horrible code, also, it doesn't work yet and isn't used yet)

Changed paths:
  A engines/neverhood/klayman.cpp
  A engines/neverhood/klayman.h
    engines/neverhood/entity.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 18b9cba..317672c 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -28,14 +28,18 @@
 
 namespace Neverhood {
 
+class Entity;
+
 struct MessageParam {
 	union {
 		uint32 _integer;
 		NPoint _point;
+		Entity *_entity;
 		// TODO: Other types...
 	};
 	MessageParam(uint32 value) { _integer = value; }
 	MessageParam(NPoint value) { _point = value; }
+	MessageParam(Entity *entity) { _entity = entity; }
 	// TODO: Constructors for the param types...
 };
 
@@ -61,13 +65,17 @@ public:
 	uint32 sendMessage(int messageNum, const MessageParam &param, Entity *sender) {
 		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
 	}
-	// Overloaded for various message parameter types
+	// NOTE: These were overloaded before for the various message parameter types
+	// it caused some problems so each type gets its own sendMessage variant now
 	uint32 sendMessage(int messageNum, uint32 param, Entity *sender) {
 		return sendMessage(messageNum, MessageParam(param), sender);
 	}
-	uint32 sendMessage(int messageNum, NPoint param, Entity *sender) {
+	uint32 sendPointMessage(int messageNum, NPoint param, Entity *sender) {
 		return sendMessage(messageNum, MessageParam(param), sender);
 	}
+	uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) {
+		return sendMessage(messageNum, MessageParam((Entity*)param), sender);
+	}
 	int getPriority() const { return _priority; }
 protected:
 	void (Entity::*_updateHandlerCb)();
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
new file mode 100644
index 0000000..49c6093
--- /dev/null
+++ b/engines/neverhood/klayman.cpp
@@ -0,0 +1,457 @@
+/* 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/klayman.h"
+#include "neverhood/resourceman.h"
+
+namespace Neverhood {
+
+static const KlaymanTableItem klaymanTable1[] = {
+	{1, &Klayman::sub41FD30},
+	{1, &Klayman::sub41FDA0},
+	{1, &Klayman::sub41FDF0},
+	{1, &Klayman::sub41FE60},
+	{1, &Klayman::sub41FEB0}
+}; 
+
+static const KlaymanTableItem klaymanTable2[] = {
+	{1, &Klayman::sub41FD30},
+	{1, &Klayman::sub41FDA0},
+	{1, &Klayman::sub41FE60},
+	{1, &Klayman::sub41FEB0}
+}; 
+
+#if 0
+static const KlaymanTableItem klaymanTable3[] = {
+	{1, &Klayman::sub421430},
+	{1, &Klayman::sub421480}
+}; 
+#endif
+
+Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority)
+	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
+	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
+	_counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false),
+	_status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
+	_flagFA(false), _statusE0(0) /*, _field114(0)*/, _resourceHandle(-1), _soundFlag(false) {
+	
+	// TODO
+	createSurface(surfacePriority, 320, 200);
+	_x = x;
+	_y = y;
+	_x4 = x;
+	_y4 = y;
+	_flags = 2;
+	setKlaymanTable1();
+	sub41FC80();
+	SetUpdateHandler(&Klayman::update);
+}
+
+void Klayman::xUpdate() {
+}
+
+uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
+	return 0;
+}
+
+void Klayman::update() {
+}
+
+void Klayman::setKlaymanTable(const KlaymanTableItem *table, int tableCount) {
+	_table = table;
+	_tableCount = tableCount;
+	_tableMaxValue = 0;
+	for (int i = 0; i < tableCount; i++) {
+		_tableMaxValue += table[i].value;
+	}
+}
+
+void Klayman::setKlaymanTable1() {
+	setKlaymanTable(klaymanTable1, ARRAYSIZE(klaymanTable1));
+}
+
+void Klayman::setKlaymanTable2() {
+	setKlaymanTable(klaymanTable2, ARRAYSIZE(klaymanTable2));
+}
+
+void Klayman::setKlaymanTable3() {
+	// TODO setKlaymanTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
+}
+
+void Klayman::sub41FD30() {
+	sub41D320(0x5B20C814, AnimationCallback(&Klayman::sub41FD40));
+}
+
+void Klayman::sub41FD40() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x5B20C814, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB10);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub41FCF0);
+	// TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FD90));
+}
+
+uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x04DBC02C) {
+#if 0		
+			_soundResource1.set(0x44528AA1);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FD90() {
+	// TODO _soundResource1.stop(0);
+}
+
+void Klayman::sub41FDA0() {
+	sub41D320(0xD122C137, AnimationCallback(&Klayman::sub41FDB0));
+}
+
+void Klayman::sub41FDB0() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0xD122C137, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E980);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub41FCF0);
+}
+
+uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x808A0008) {
+#if 0		
+			_soundResource1.set(0xD948A340);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FDF0() {
+	sub41D320(0x543CD054, AnimationCallback(&Klayman::sub41FE00));
+}
+
+void Klayman::sub41FE00() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x543CD054, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E9E0);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub41FCF0);
+	// TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FE50));
+}
+
+void Klayman::sub41FE50() {
+	// TODO _soundResource1.stop(0);
+}
+
+uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x5A0F0104) {
+#if 0		
+			_soundResource1.set(0x7970A100);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		} else if (param._integer == 0x9A9A0109) {
+#if 0		
+			_soundResource1.set(0xD170CF04);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		} else if (param._integer == 0x989A2169) {
+#if 0		
+			_soundResource1.set(0xD073CF14);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FE60() {
+	sub41D320(0x40A0C034, AnimationCallback(&Klayman::sub41FE70));
+}
+
+void Klayman::sub41FE70() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x40A0C034, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EF80);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub41FCF0);
+}
+
+uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x0D2A0288) {
+#if 0		
+			_soundResource1.set(0xD192A368);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FEB0() {
+	sub41D320(0x5120E137, AnimationCallback(&Klayman::sub41FEC0));
+}
+
+void Klayman::sub41FEC0() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x5120E137, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EFE0);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub41FCF0);
+}
+
+uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0xC006000C) {
+#if 0		
+			_soundResource1.set(0x9D406340);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		} else if (param._integer == 0x2E4A2940) {
+#if 0		
+			_soundResource1.set(0x53A4A1D4);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		} else if (param._integer == 0xAA0A0860) {
+#if 0		
+			_soundResource1.set(0x5BE0A3C6);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		} else if (param._integer == 0xC0180260) {
+#if 0		
+			_soundResource1.set(0x5D418366);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		}
+		break;
+	}
+	return messageResult;
+}
+
+/////////////////////////////////////////////////////////////////
+
+void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) {
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	if (_resourceHandle != -1) {
+		// TODO _vm->_res->moveToFront(_resourceHandle);
+		SetAnimationCallback3(callback);
+		SetUpdateHandler(&Klayman::update41D2B0);
+	}
+}
+
+void Klayman::update41D2B0() {
+	// TODO Check if this odd stuff is needed or just some cache optimization
+	if (_vm->_res->isResourceDataValid(_resourceHandle)) {
+		sub41C7B0();
+		// TODO _vm->_res->moveToBack(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+	} else {
+		// TODO _vm->_res->moveToFront(_resourceHandle);
+	}
+	update();
+}
+
+bool Klayman::sub41CF10(AnimationCb callback) {
+	if (_status2 != 2)
+		return false;
+	_status2 = 1;
+	setFileHash(0x9A7020B8, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41F140);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(callback);
+	_flagE5 = false; 
+	return true;
+}
+
+void Klayman::sub41C7B0() {
+	if (_callback1Cb) {
+		(this->*_callback1Cb)();
+		_callback1Cb = NULL;
+	}
+	if (_callback3Cb) {
+		AnimationCb cb = _callback3Cb;
+		_callback3Cb = NULL;
+		(this->*cb)();
+#if 0 // TODO		
+	} else if (_callbackList) {
+		removeCallbackList();
+#endif		
+	} else {
+		_parentScene->sendMessage(0x1006, 0, this);
+	}
+}
+
+void Klayman::sub41C770() {
+	_flagFA = false;
+	_status = 1;
+}
+
+void Klayman::sub41C790() {
+	if (_flagFA)
+		_status = 0;
+}
+
+void Klayman::sub41FC80() {
+	if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) {
+		setFileHash(0x5420E254, 0, -1);
+		_counter = 0;
+		_counter3 = 0;
+		_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+		SetUpdateHandler(&Klayman::update41D0F0);
+		SetMessageHandler(&Klayman::handleMessage41D360);
+		SetSpriteCallback(NULL);
+	}
+}
+
+void Klayman::update41D0F0() {
+	update();
+	_counter++;
+	if (_counter >= 720) {
+		_counter = 0;
+		if (_table) {
+			int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue);
+			for (int i = 0; i < _tableCount; i++) {
+				if (randomValue < _table[_tableCount].value) {
+					(this->*(_table[_tableCount].callback))();
+					break;
+				}
+				randomValue -= _table[_tableCount].value;
+			}
+		}
+	} else {
+		_counter3++;
+		if (_counter3 >= _counter3Max) {
+			_counter3 = 0;
+			_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+			sub41FF00();
+		}
+	}
+}
+
+uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender) {
+	Sprite::handleMessage(messageNum, param, sender);
+	uint32 messageResult = xHandleMessage(messageNum, param);
+	switch (messageNum) {
+	case 0x1008:
+		messageResult = _flagE5;
+		break;
+	case 0x1014:
+		_attachedSprite = param._entity;
+		break;
+	case 0x1019:
+		sub41C7B0();
+		break;
+	case 0x101C:
+		sub41C770();
+		break;
+	case 0x1021:
+		sub41C790();
+		break;
+	case 0x481C:
+		_status = param._integer;
+		_flagFA = true;
+		messageResult = 1;
+		break;
+	case 0x482C:
+		if (param._integer != 0) {
+			// TODO _rectResource.getRectangle2(param._integer, &_field118, &_field114,);
+		} else {
+			// TODO _field114 = 0;
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FF00() {
+	setFileHash(0x5900C41E, 0, -1);
+	_status2 = 1;
+	_flagE5 = true;
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub41FCF0);
+}
+
+uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		sub41C7B0();
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FCF0() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x5420E254, 0, -1);
+	SetUpdateHandler(&Klayman::update41D0F0);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteCallback(NULL);
+}
+
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
new file mode 100644
index 0000000..d953f55
--- /dev/null
+++ b/engines/neverhood/klayman.h
@@ -0,0 +1,132 @@
+/* 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_KLAYMAN_H
+#define NEVERHOOD_KLAYMAN_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/sprite.h"
+#include "neverhood/graphics.h"
+#include "neverhood/resource.h"
+
+namespace Neverhood {
+
+// TODO: This code is horrible and weird and a lot of stuff needs renaming once a better name is found
+
+class Klayman;
+
+struct KlaymanTableItem {
+	int value;
+	void (Klayman::*callback)();
+};
+
+class Klayman : public AnimatedSprite {
+public:
+	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority);
+
+	void sub41FD30();
+	void sub41FDA0();
+	void sub41FDF0();
+	void sub41FE60();
+	void sub41FEB0();
+
+protected:
+	Entity *_parentScene;
+	Entity *_attachedSprite;
+	int _statusE0;
+	bool _flagE1;
+	bool _flagE2;
+	bool _flagE3;
+	bool _flagE4;
+	bool _flagE5;
+	int16 _x4, _y4;
+	int16 _counter, _counterMax;
+	int16 _counter3, _counter3Max;
+	int16 _counter1;
+	int16 _counter2;
+	bool _flagF6;
+	bool _flagF7;
+	bool _flagF8;
+	int _status2;
+	bool _flagFA;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	int _status;
+	const KlaymanTableItem *_table;
+	int _tableCount;
+	int _tableMaxValue;
+	/*
+	00000114 field114		dd ?
+	00000118 field118		dw ?
+	*/
+	bool _soundFlag;
+	int _resourceHandle;
+	virtual void xUpdate();
+	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void update();
+
+	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
+	void setKlaymanTable1();
+	void setKlaymanTable2();
+	void setKlaymanTable3();
+
+	void sub41FD40();
+	void sub41FD90();
+	uint32 handleMessage41EB10(int messageNum, const MessageParam &param, Entity *sender);
+
+	void sub41FDB0();
+	uint32 handleMessage41E980(int messageNum, const MessageParam &param, Entity *sender);
+
+	void sub41FE00();
+	void sub41FE50();
+	uint32 handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub41FE70();
+	uint32 handleMessage41EF80(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub41FEC0();
+	uint32 handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender);
+
+	void sub41D320(uint32 fileHash, AnimationCb callback);
+	void update41D2B0();
+
+	bool sub41CF10(AnimationCb callback);
+	void sub41C7B0();
+	void sub41C770();
+	void sub41C790();
+	
+	void sub41FC80();
+	void update41D0F0();
+	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
+
+	void sub41FF00();
+	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub41FCF0();
+	
+	uint32 handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender);
+	
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index f139268..2058db9 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -8,6 +8,7 @@ MODULE_OBJS = \
 	entity.o \
 	gamemodule.o \
 	graphics.o \
+	klayman.o \
 	module.o \
 	module1000.o \
 	module1500.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index d5b7b03..7ee1090 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -469,6 +469,10 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 }
 
+Scene1001::~Scene1001() {
+	// TODO _vm->setGlobalVar(0xC0418A02, _playerSprite->_doDeltaX);
+}
+
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 82c2fea..21be948 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -109,6 +109,7 @@ protected:
 class Scene1001 : public Scene {
 public:
 	Scene1001(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene1001();
 protected:
 	Sprite *_asHammer;
 	Sprite *_asDoor;
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 1239a30..ce21527 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -456,7 +456,7 @@ void AnimatedSprite::removeCallbacks() {
 
 	if (_callback1Cb) {
 		// _callback1Cb has to be cleared before it's called
-		AnimationCallback cb = _callback1Cb;
+		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
 		debug("Fire _callback1Cb");
 		(this->*cb)();
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 71067fa..b3809a8 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -30,7 +30,7 @@
 
 namespace Neverhood {
 
-#define SetSpriteCallback(callback) _spriteCallbackCb = static_cast <void (Sprite::*)(void)> (callback)
+#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback)
 #define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback)
 #define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback)
 
@@ -91,6 +91,7 @@ protected:
 #define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
 #define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
 #define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
+#define AnimationCallback(callback) static_cast <void (AnimatedSprite::*)()> (callback)
 
 class AnimatedSprite : public Sprite {
 public:
@@ -98,7 +99,7 @@ public:
 	AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y);
 	void update();
 protected:
-	typedef void (AnimatedSprite::*AnimationCallback)();
+	typedef void (AnimatedSprite::*AnimationCb)();
 	AnimResource _animResource;
 	uint32 _fileHash1;
 	uint32 _fileHash2;
@@ -124,9 +125,9 @@ protected:
 	callbackListCount dw ?
 	callbackList	dd ?
 	*/
-	AnimationCallback _callback1Cb;
-	AnimationCallback _callback2Cb;
-	AnimationCallback _callback3Cb;
+	AnimationCb _callback1Cb;
+	AnimationCb _callback2Cb;
+	AnimationCb _callback3Cb;
 	void init();
 	void updateDeltaXY();
 	void updateAnim();


Commit: 3131cc6f1899b3eaa5f234d95801a8bff77144e0
    https://github.com/scummvm/scummvm/commit/3131cc6f1899b3eaa5f234d95801a8bff77144e0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:58-07:00

Commit Message:
NEVERHOOD: Implement Klayman::update

Changed paths:
    engines/neverhood/klayman.cpp



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 49c6093..836b2e0 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -74,6 +74,8 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void Klayman::update() {
+	AnimatedSprite::update();
+	xUpdate();
 }
 
 void Klayman::setKlaymanTable(const KlaymanTableItem *table, int tableCount) {


Commit: c694ce8505529478c60d23603bd9dc217dd7afb0
    https://github.com/scummvm/scummvm/commit/c694ce8505529478c60d23603bd9dc217dd7afb0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:30:59-07:00

Commit Message:
NEVERHOOD: More work on Klayman

- Rename Scene::_playerSprite to _klayman
- Send mouse clicks to the scene object (has not effect yet)

Changed paths:
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 317672c..64c1181 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -70,7 +70,7 @@ public:
 	uint32 sendMessage(int messageNum, uint32 param, Entity *sender) {
 		return sendMessage(messageNum, MessageParam(param), sender);
 	}
-	uint32 sendPointMessage(int messageNum, NPoint param, Entity *sender) {
+	uint32 sendPointMessage(int messageNum, const NPoint &param, Entity *sender) {
 		return sendMessage(messageNum, MessageParam(param), sender);
 	}
 	uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) {
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 93687f9..c63131d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/gamemodule.h"
 
+#include "neverhood/graphics.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1500.h"
 
@@ -57,6 +58,16 @@ GameModule::~GameModule() {
 
 }
 
+void GameModule::handleMouseDown(int16 x, int16 y) {
+	if (_childObject) {
+		NPoint mousePos;
+		mousePos.x = x;
+		mousePos.y = y;
+		debug("GameModule::handleMouseDown(%d, %d)", x, y);
+		_childObject->sendPointMessage(1, mousePos, this);
+	}				
+}
+
 uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 6d65895..7fce9eb 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -34,6 +34,7 @@ class GameModule : public Module {
 public:
 	GameModule(NeverhoodEngine *vm);
 	virtual ~GameModule();
+	void handleMouseDown(int16 x, int16 y);
 protected:
 	Entity *_prevChildObject;
 	bool _someFlag1;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 836b2e0..7a775bc 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -67,9 +67,22 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 }
 
 void Klayman::xUpdate() {
+	// Empty
 }
 
 uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param._point.x, false);
+		break;
+	case 0x4004:
+		// TODO AnimatedSprite_setCallback2(AnimationCallback(&sub41FC80));
+		break;
+	case 0x4818:
+		// TODO sub41C930(_rectResource.getRectangle1(param._integer).x, false);
+		break;
+	}
 	return 0;
 }
 
@@ -455,5 +468,57 @@ void Klayman::sub41FCF0() {
 	SetSpriteCallback(NULL);
 }
 
+uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param._integer == 0x271AA210) {
+#if 0		
+			_soundResource1.set(0x4924AAC4);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		} else if (param._integer == 0x2B22AA81) {
+#if 0		
+			_soundResource1.set(0x0A2AA8E0);
+			_soundResource1.load();
+			_soundResource1.play(false);
+#endif			
+		}
+		break;
+	}
+	return messageResult;
+}
+
+
+void Klayman::sub41C930(int16 x, bool flag) {
+	int16 xdiff = ABS(x - _x);
+	if (xdiff == 0) {
+		_x4 = x;
+		if (_flagE1 || _flagE2 || _flagE3) {
+			// TODO AnimatedSprite_setCallback2(NULL);
+			sub41C7B0();
+		}
+	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
+		_x4 = x;
+		// TODO AnimatedSprite_setCallback2(NULL);
+		sub41C7B0();
+	} else if (xdiff <= 42 && _status != 3) {
+		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
+			_x4 = x;
+		} else {
+			_x4 = x;
+			// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41FB40));
+		}
+	} else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_x4 = x;
+	} else if (flag) {
+		_x4 = x;
+		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
+	} else {
+		_x4 = x;
+		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41F950));
+	}
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index d953f55..69f9a34 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -124,6 +124,8 @@ protected:
 	void sub41FCF0();
 	
 	uint32 handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender);
+
+	void sub41C930(int16 x, bool flag);
 	
 };
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 7ee1090..8580620 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -400,41 +400,45 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	// TODO Mouse
 
+	//DEBUG so he's here at least
+	_klayman = new Klayman(_vm, this, 200, 433, 1000, 1000);
+	addSprite(_klayman);
+
 #if 0
 	// TODO: Player sprites...	
 	if (which < 0) {
 		setRectList(0x004B49F0);
-		_playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000);
+		_klayman = new Class572(_vm, this, 200, 433, 1000, 1000);
 		setMessageList(0x004B4888);
 	} else if (which == 1) {
 		setRectList(0x004B49F0);
-		_playerSprite = new Class572(_vm, this, 640, 433, 1000, 1000);
+		_klayman = new Class572(_vm, this, 640, 433, 1000, 1000);
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
 		setRectList(0x004B49F0);
 		if (_vm->getGlobalVar(0xC0418A02)) {
-			_playerSprite = new Class572(_vm, this, 390, 433, 1000, 1000);
-			_playerSprite->setDoDeltaX(1);
+			_klayman = new Class572(_vm, this, 390, 433, 1000, 1000);
+			_klayman->setDoDeltaX(1);
 		} else {
-			_playerSprite = new Class572(_vm, this, 300, 433, 1000, 1000);
+			_klayman = new Class572(_vm, this, 300, 433, 1000, 1000);
 		}
 		setMessageList(0x004B4970);
 	} else {
 		setRectList(0x004B4A00);
-		_playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000);
+		_klayman = new Class572(_vm, this, 200, 433, 1000, 1000);
 		setMessageList(0x004B4890);
 	}
-	addSprite(_playerSprite);
+	addSprite(_klayman);
 #endif
 
 	staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
 
 #if 0
 	// TODO: This sucks somehow, find a better way
-	_playerSprite->getSurface()->getClipRect().x1 = 0;
-	_playerSprite->getSurface()->getClipRect().y1 = 0;
-	_playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
-	_playerSprite->getSurface()->getClipRect().y2 = 480;
+	_klayman->getSurface()->getClipRect().x1 = 0;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+	_klayman->getSurface()->getClipRect().y2 = 480;
 #endif
 	
 	if (_vm->getGlobalVar(0xD217189D) == 0) {
@@ -470,7 +474,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1001::~Scene1001() {
-	// TODO _vm->setGlobalVar(0xC0418A02, _playerSprite->_doDeltaX);
+	// TODO _vm->setGlobalVar(0xC0418A02, _klayman->_doDeltaX);
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -490,7 +494,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x100D:
 		if (param._integer == 0x00342624) {
-			// TODO _playerSprite->sendMessage(0x1014, _asLever, this);
+			// TODO _klayman->sendMessage(0x1014, _asLever, this);
 			// TODO setMessageList2(0x004B4910, true, false);
 			messageResult = 1;
 		} else if (param._integer == 0x21E64A00) {
@@ -502,7 +506,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 				messageResult = 1;
 			}
 		} else if (param._integer == 0x040424D0) {
-			// TODO _playerSprite->sendMessage(0x1014, _ssButton, this);
+			// TODO _klayman->sendMessage(0x1014, _ssButton, this);
 		} else if (param._integer == 0x80006358) {
 			if (_vm->getGlobalVar(0x03C698DA)) {
 				// TODO setMessageList(0x004B4938, true, false);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 4c80c40..73e7c5f 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -152,14 +152,18 @@ Common::Error NeverhoodEngine::run() {
 				_mouseX = event.mouse.x;
 				_mouseY = event.mouse.y;
 				break;
-			/*			
+
 			case Common::EVENT_LBUTTONDOWN:
+			case Common::EVENT_RBUTTONDOWN:
+				_gameModule->handleMouseDown(event.mouse.x, event.mouse.y);
+				break;
+
+			/*			
 				_buttonState |= kLeftButton;
 				break;
 			case Common::EVENT_LBUTTONUP:
 				_buttonState &= ~kLeftButton;
 				break;
-			case Common::EVENT_RBUTTONDOWN:
 				_buttonState |= kRightButton;
 				break;
 			case Common::EVENT_RBUTTONUP:
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index b06caee..9b7b35d 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -37,7 +37,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_mouseClicked = false;
 	// TODO _rectList = NULL;
 	// TODO _someRects = NULL;
-	// TODO _playerSprite = NULL;
+	_klayman = NULL;
 	// TODO _mouseSprite = NULL;
 	_palette = NULL;
 	_background = NULL;
@@ -193,15 +193,15 @@ void Scene::update() {
 		if (_mouseClicked) {
 			//** ALL TODO
 #if 0			
-			if (_playerSprite) {
+			if (_klayman) {
 				// TODO: Merge later
-				if (_playerSprite->hasMessageHandler() && 
-					_playerSprite->sendMessage(0x1008, 0, this) != 0 &&
+				if (_klayman->hasMessageHandler() && 
+					_klayman->sendMessage(0x1008, 0, this) != 0 &&
 					_messageListFlag &&
 					queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) {
 					_mouseClicked = false;
-				} else if (_playerSprite->hasMessageHandler() && 
-					_playerSprite->sendMessage(0x1008, 0, this) != 0 &&
+				} else if (_klayman->hasMessageHandler() && 
+					_klayman->sendMessage(0x1008, 0, this) != 0 &&
 					_messageListFlag) {
 					_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
 				}
@@ -223,12 +223,13 @@ void Scene::update() {
 
 uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	// TODO
-#if 0	
 	switch (messageNum) {
 	case 0: // mouse moved
+#if 0	
 		if (_mouseSprite && _mouseSprite->hasMessageHandler())
 			_mouseSprite->sendMessage(0x4002, param, this);
 		queryPositionSomeRects(param._point.x, param._point.y);			
+#endif	
 		break;
 	case 1: // mouse clicked
 		_mouseClicked = true;
@@ -245,7 +246,9 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		break;
 	*/		
 	case 5:
+#if 0	
 		broadcastObjectMessage5();		
+#endif	
 		break;
 	case 6:
 		_parentModule->sendMessage(0x1009, param, this);		
@@ -254,35 +257,39 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		if (_messageListFlag1) {
 			_messageListFlag1 = false;
 			if (_messageListIndex == _messageListCount)
-				_playerSprite->sendMessage(0x4004, 0, this);
-			else
-				runMessageList();
+				_klayman->sendMessage(0x4004, 0, this);
+			else {
+				// TODO runMessageList();
+			}
 		}
 		break;
 	case 0x1007:
 		if (_messageListFlag1) {
 			_messageListFlag1 = false;
 			_messageList = NULL;
-			_playerSprite->sendMessage(0x4004, 0, this);
+			_klayman->sendMessage(0x4004, 0, this);
 		}
 		break;
 	case 0x101D:
+#if 0	
 		if (_mouseSprite) {
 			_prevVisible = _mouseSprite->_drawSurface->_visible;
 			_mouseSprite->_drawSurface->_visible = false;
 		}
+#endif	
 		break;
 	case 0x101E:
+#if 0	
 		if (_prevVisible && _mouseSprite) {
 			_mouseSprite->_drawSurface->_visible = true;
 			_mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this);
 		}
+#endif	
 		break;
 	case 0x1022:
-		setSurfacePriority(((Sprite*)sender)->_surface, param._integer);
+		setSurfacePriority(((Sprite*)sender)->getSurface(), param._integer);
 		break;
 	}
-#endif	
 	return 0;
 }
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 108adba..4928d20 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -28,6 +28,7 @@
 #include "neverhood/background.h"
 #include "neverhood/entity.h"
 #include "neverhood/graphics.h"
+#include "neverhood/klayman.h"
 #include "neverhood/module.h"
 #include "neverhood/palette.h"
 #include "neverhood/smackerplayer.h"
@@ -67,8 +68,8 @@ protected:
 	// TODO 00000088 someRects	   dd ?
 	// TODO 0000008C someRectsCount  dw ?
 	// TODO 0000008E field_8E		dw ?
-	// TODO 00000090 playerSprite		dd ?
 	// TODO 00000094 mouseSprite	 dd ?
+	Klayman *_klayman;
 	Palette *_palette;
 	Background *_background;
 	bool _surfaceFlag;


Commit: 78d632b0eda3c7be13a265cfb9fa5d16c7b418eb
    https://github.com/scummvm/scummvm/commit/78d632b0eda3c7be13a265cfb9fa5d16c7b418eb
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:39-07:00

Commit Message:
NEVERHOOD: Commit of create_neverhood and neverhood.dat

Changed paths:
  A devtools/create_neverhood/create_neverhood.cpp
  A devtools/create_neverhood/create_neverhood.h
  A devtools/create_neverhood/module.mk
  A devtools/create_neverhood/tables.h
  A devtools/create_neverhood/util.cpp
  A devtools/create_neverhood/util.h
  A dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
new file mode 100644
index 0000000..951a2f0
--- /dev/null
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -0,0 +1,257 @@
+/* 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.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+
+// HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+#include <vector>
+#include "create_neverhood.h"
+#include "tables.h"
+
+const int DAT_VERSION = 0;
+
+uint32 dataSize;
+byte *data;
+uint32 dataStart = 0x004AE000;
+uint32 fileStart = 0x000AC600;
+
+void loadExe(const char *filename) {
+	FILE *exe = fopen(filename, "rb");
+	dataSize = fileSize(exe);
+	data = new byte[dataSize];
+	fread(data, dataSize, 1, exe);
+	fclose(exe);
+}
+
+struct HitRect {
+	int16 x1, y1, x2, y2;
+	uint16 messageNum;
+};
+
+typedef std::vector<HitRect> HitRects;
+
+struct SubRectItem {
+	int16 x1, y1, x2, y2;
+	uint32 messageListCount;
+	uint32 messageListOffset;
+};
+
+typedef std::vector<SubRectItem> SubRectItems;
+
+struct RectItem {
+	int16 x1, y1, x2, y2;
+	uint32 subRectListCount;
+	uint32 subRectListOffset;
+	SubRectItems subRectItems;
+};
+
+typedef std::vector<RectItem> RectItems;
+
+struct MessageItem {
+	uint16 messageNum;
+	uint32 messageParam;
+};
+
+typedef std::vector<MessageItem> MessageItems;
+
+struct HitRectList {
+	uint32 id;	
+	HitRects hitRects;
+};
+
+struct RectList {
+	uint32 id;	
+	RectItems rectItems;
+};
+
+struct MessageList {
+	uint32 id;
+	MessageItems messageItems;	
+};
+
+std::vector<HitRectList*> hitRectLists;
+std::vector<RectList*> rectLists;
+std::vector<MessageList*> messageLists;
+
+byte *getData(uint32 offset) {
+	return data + offset - dataStart + fileStart;
+}
+
+void addHitRect(uint32 offset) {
+	HitRectList *hitRectList = new HitRectList();
+	hitRectList->id = offset;
+	byte *item = getData(offset);
+	uint32 count = READ_LE_UINT32(item);
+	//printf("count = %d\n", count);
+	// Align to 16 bytes
+	item = data + ((offset + 4 + 16) & 0xFFFFFFF0) - dataStart + fileStart;
+	for (uint32 i = 0; i < count; i++) {
+		HitRect hitRect;
+		hitRect.x1 = READ_LE_UINT16(item + 0);
+		hitRect.y1 = READ_LE_UINT16(item + 2);
+		hitRect.x2 = READ_LE_UINT16(item + 4);
+		hitRect.y2 = READ_LE_UINT16(item + 6);
+		hitRect.messageNum = READ_LE_UINT16(item + 8);
+		item += 10;
+		//printf("(%d, %d, %d, %d) -> %04X\n", hitRect.x1, hitRect.y1, hitRect.x2, hitRect.y2, hitRect.messageNum);
+		hitRectList->hitRects.push_back(hitRect);
+	}
+	hitRectLists.push_back(hitRectList);
+}
+
+void addMessage(uint32 count, uint32 offset) {
+	MessageList *messageList = new MessageList();
+	messageList->id = offset;
+	byte *item = getData(offset);
+	for (uint32 i = 0; i < count; i++) {
+		MessageItem messageItem;
+		messageItem.messageNum = READ_LE_UINT16(item + 0);
+		messageItem.messageParam = READ_LE_UINT32(item + 4);
+		//printf("%04X, %08X\n", messageItem.messageNum, messageItem.messageParam);
+		item += 8;
+		messageList->messageItems.push_back(messageItem);
+	}
+	messageLists.push_back(messageList);	   
+}
+
+void addRect(uint32 count, uint32 offset) {
+	RectList *rectList = new RectList();
+	rectList->id = offset;
+	byte *item = getData(offset);
+	for (uint32 i = 0; i < count; i++) {
+		RectItem rectItem;
+		byte *subItem;
+		rectItem.x1 = READ_LE_UINT16(item + 0);
+		rectItem.y1 = READ_LE_UINT16(item + 2);
+		rectItem.x2 = READ_LE_UINT16(item + 4);
+		rectItem.y2 = READ_LE_UINT16(item + 6);
+		rectItem.subRectListCount = READ_LE_UINT32(item + 8);
+		rectItem.subRectListOffset = READ_LE_UINT32(item + 12);
+		//printf("(%d, %d, %d, %d), %d, %08X\n", rectItem.x1, rectItem.y1, rectItem.x2, rectItem.y2, rectItem.subRectListCount, rectItem.subRectListOffset);
+		subItem = getData(rectItem.subRectListOffset);
+		for (uint32 j = 0; j < rectItem.subRectListCount; j++) {
+			SubRectItem subRectItem;
+			subRectItem.x1 = READ_LE_UINT16(subItem + 0);
+			subRectItem.y1 = READ_LE_UINT16(subItem + 2);
+			subRectItem.x2 = READ_LE_UINT16(subItem + 4);
+			subRectItem.y2 = READ_LE_UINT16(subItem + 6);
+			subRectItem.messageListCount = READ_LE_UINT32(subItem + 8);
+			subRectItem.messageListOffset = READ_LE_UINT32(subItem + 12);
+			subItem += 16;
+			//printf("(%d, %d, %d, %d), %d, %08X\n", subRectItem.x1, subRectItem.y1, subRectItem.x2, subRectItem.y2, subRectItem.messageListCount, subRectItem.messageListOffset);
+			addMessage(subRectItem.messageListCount, subRectItem.messageListOffset);
+			rectItem.subRectItems.push_back(subRectItem);
+		}
+		item += 16;
+		rectList->rectItems.push_back(rectItem);
+	}
+	rectLists.push_back(rectList);
+}
+
+int main(int argc, char *argv[]) {
+
+	FILE *datFile;
+
+	loadExe("nhc.exe");
+
+	for (int i = 0; hitRectListOffsets[i] != 0; i++) {
+		addHitRect(hitRectListOffsets[i]);
+	}
+
+	for (int i = 0; rectListOffsets[i] != 0; i += 2) {
+		addRect(rectListOffsets[i], rectListOffsets[i + 1]);
+	}
+	
+	for (int i = 0; messageListOffsets[i] != 0; i += 2) {
+		addMessage(messageListOffsets[i], messageListOffsets[i + 1]);
+	}
+	
+	datFile = fopen("neverhood.dat", "wb");
+
+	writeUint32LE(datFile, 0x11223344); // Some magic
+	writeUint32LE(datFile, DAT_VERSION);
+		
+	// Write all message lists
+	writeUint32LE(datFile, messageLists.size());
+	for (std::vector<MessageList*>::iterator it = messageLists.begin(); it != messageLists.end(); it++) {
+		MessageList *messageList = *it;
+		writeUint32LE(datFile, messageList->id);
+		writeUint32LE(datFile, messageList->messageItems.size());
+		for (uint32 i = 0; i < messageList->messageItems.size(); i++) {
+			writeUint16LE(datFile, messageList->messageItems[i].messageNum);
+			writeUint32LE(datFile, messageList->messageItems[i].messageParam);
+		}
+	}
+
+	// Write all rect lists
+	writeUint32LE(datFile, rectLists.size());
+	for (std::vector<RectList*>::iterator it = rectLists.begin(); it != rectLists.end(); it++) {
+		RectList *rectList = *it;
+		writeUint32LE(datFile, rectList->id);
+		writeUint32LE(datFile, rectList->rectItems.size());
+		for (uint32 i = 0; i < rectList->rectItems.size(); i++) {
+			const RectItem &rectItem = rectList->rectItems[i]; 
+			writeUint16LE(datFile, rectItem.x1);
+			writeUint16LE(datFile, rectItem.y1);
+			writeUint16LE(datFile, rectItem.x2);
+			writeUint16LE(datFile, rectItem.y2);
+			writeUint32LE(datFile, rectItem.subRectItems.size());
+			for (uint32 j = 0; j < rectItem.subRectItems.size(); j++) {
+				const SubRectItem &subRectItem = rectItem.subRectItems[j]; 
+				writeUint16LE(datFile, subRectItem.x1);
+				writeUint16LE(datFile, subRectItem.y1);
+				writeUint16LE(datFile, subRectItem.x2);
+				writeUint16LE(datFile, subRectItem.y2);
+				writeUint32LE(datFile, subRectItem.messageListOffset);
+			}
+		}
+	}
+		
+	// Write all hit rect lists
+	writeUint32LE(datFile, hitRectLists.size());
+	for (std::vector<HitRectList*>::iterator it = hitRectLists.begin(); it != hitRectLists.end(); it++) {
+		HitRectList *hitRectList = *it;
+		writeUint32LE(datFile, hitRectList->id);
+		writeUint32LE(datFile, hitRectList->hitRects.size());
+		for (uint32 i = 0; i < hitRectList->hitRects.size(); i++) {
+			const HitRect &hitRect  = hitRectList->hitRects[i]; 
+			writeUint16LE(datFile, hitRect.x1);
+			writeUint16LE(datFile, hitRect.y1);
+			writeUint16LE(datFile, hitRect.x2);
+			writeUint16LE(datFile, hitRect.y2);
+			writeUint16LE(datFile, hitRect.messageNum);
+		}
+	}
+		
+	fclose(datFile);
+
+	printf("Done.\n");
+
+	return 0;
+}
diff --git a/devtools/create_neverhood/create_neverhood.h b/devtools/create_neverhood/create_neverhood.h
new file mode 100644
index 0000000..6382c87
--- /dev/null
+++ b/devtools/create_neverhood/create_neverhood.h
@@ -0,0 +1,28 @@
+/* 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 CREATE_NEVERHOOD_H
+#define CREATE_NEVERHOOD_H
+
+#include "util.h"
+
+#endif
diff --git a/devtools/create_neverhood/module.mk b/devtools/create_neverhood/module.mk
new file mode 100644
index 0000000..284e191
--- /dev/null
+++ b/devtools/create_neverhood/module.mk
@@ -0,0 +1,12 @@
+
+MODULE := devtools/create_neverhood
+
+MODULE_OBJS := \
+	create_neverhood.o \
+	util.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_neverhood
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
new file mode 100644
index 0000000..6f1fc482
--- /dev/null
+++ b/devtools/create_neverhood/tables.h
@@ -0,0 +1,49 @@
+/* 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.
+ *
+ */
+
+static const uint32 hitRectListOffsets[] = {
+	// Scene1001
+	0x004B4858,
+	0
+};
+
+static const uint32 rectListOffsets[] = {
+	// Scene1001
+	1, 0x004B49F0,
+	1, 0x004B4A00,
+	0, 0
+};
+
+static const uint32 messageListOffsets[] = {
+	// Scene1001
+	1, 0x004B4888,
+	2, 0x004B4898,
+	1, 0x004B4970,
+	1, 0x004B4890,
+	3, 0x004B4910,
+	5, 0x004B4938,
+	1, 0x004B4960,
+	4, 0x004B48A8,
+	3, 0x004B48C8,
+	0, 0
+};
+
diff --git a/devtools/create_neverhood/util.cpp b/devtools/create_neverhood/util.cpp
new file mode 100644
index 0000000..5ce8237
--- /dev/null
+++ b/devtools/create_neverhood/util.cpp
@@ -0,0 +1,152 @@
+/* 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.
+ *
+ */
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+
+#include "util.h"
+#include <stdarg.h>
+
+#ifdef _MSC_VER
+	#define	vsnprintf _vsnprintf
+#endif
+
+void error(const char *s, ...) {
+	char buf[1024];
+	va_list va;
+
+	va_start(va, s);
+	vsnprintf(buf, 1024, s, va);
+	va_end(va);
+
+	fprintf(stderr, "ERROR: %s!\n", buf);
+
+	exit(1);
+}
+
+void warning(const char *s, ...) {
+	char buf[1024];
+	va_list va;
+
+	va_start(va, s);
+	vsnprintf(buf, 1024, s, va);
+	va_end(va);
+
+	fprintf(stderr, "WARNING: %s!\n", buf);
+}
+
+int scumm_stricmp(const char *s1, const char *s2) {
+	byte l1, l2;
+	do {
+		// Don't use ++ inside tolower, in case the macro uses its
+		// arguments more than once.
+		l1 = (byte)*s1++;
+		l1 = tolower(l1);
+		l2 = (byte)*s2++;
+		l2 = tolower(l2);
+	} while (l1 == l2 && l1 != 0);
+	return l1 - l2;
+}
+
+void debug(int level, const char *s, ...) {
+	char buf[1024];
+	va_list va;
+
+	va_start(va, s);
+	vsnprintf(buf, 1024, s, va);
+	va_end(va);
+
+	fprintf(stderr, "DEBUG: %s!\n", buf);
+}
+
+uint8 readByte(FILE *fp) {
+	return fgetc(fp);
+}
+
+uint16 readUint16BE(FILE *fp) {
+	uint16 ret = 0;
+	ret |= fgetc(fp) << 8;
+	ret |= fgetc(fp);
+	return ret;
+}
+
+uint16 readUint16LE(FILE *fp) {
+	uint16 ret = 0;
+	ret |= fgetc(fp);
+	ret |= fgetc(fp) << 8;
+	return ret;
+}
+
+uint32 readUint32BE(FILE *fp) {
+	uint32 ret = 0;
+	ret |= fgetc(fp) << 24;
+	ret |= fgetc(fp) << 16;
+	ret |= fgetc(fp) << 8;
+	ret |= fgetc(fp);
+	return ret;
+}
+
+uint32 readUint32LE(FILE *fp) {
+	uint32 ret = 0;
+	ret |= fgetc(fp);
+	ret |= fgetc(fp) << 8;
+	ret |= fgetc(fp) << 16;
+	ret |= fgetc(fp) << 24;
+	return ret;
+}
+
+void writeByte(FILE *fp, uint8 b) {
+	fwrite(&b, 1, 1, fp);
+}
+
+void writeUint16BE(FILE *fp, uint16 value) {
+	writeByte(fp, (uint8)(value >> 8));
+	writeByte(fp, (uint8)(value));
+}
+
+void writeUint16LE(FILE *fp, uint16 value) {
+	writeByte(fp, (uint8)(value));
+	writeByte(fp, (uint8)(value >> 8));
+}
+
+void writeUint32BE(FILE *fp, uint32 value) {
+	writeByte(fp, (uint8)(value >> 24));
+	writeByte(fp, (uint8)(value >> 16));
+	writeByte(fp, (uint8)(value >> 8));
+	writeByte(fp, (uint8)(value));
+}
+
+void writeUint32LE(FILE *fp, uint32 value) {
+	writeByte(fp, (uint8)(value));
+	writeByte(fp, (uint8)(value >> 8));
+	writeByte(fp, (uint8)(value >> 16));
+	writeByte(fp, (uint8)(value >> 24));
+}
+
+uint32 fileSize(FILE *fp) {
+	uint32 sz;
+	uint32 pos = ftell(fp);
+	fseek(fp, 0, SEEK_END);
+	sz = ftell(fp);
+	fseek(fp, pos, SEEK_SET);
+	return sz;
+}
diff --git a/devtools/create_neverhood/util.h b/devtools/create_neverhood/util.h
new file mode 100644
index 0000000..a2783cc
--- /dev/null
+++ b/devtools/create_neverhood/util.h
@@ -0,0 +1,57 @@
+/* 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 UTIL_H
+#define UTIL_H
+
+#include "common/scummsys.h"
+#include "common/endian.h"
+#include "common/util.h"
+
+#ifdef WIN32
+#include <io.h>
+#include <process.h>
+#endif
+
+
+/* File I/O */
+uint8 readByte(FILE *fp);
+uint16 readUint16BE(FILE *fp);
+uint16 readUint16LE(FILE *fp);
+uint32 readUint32BE(FILE *fp);
+uint32 readUint32LE(FILE *fp);
+void writeByte(FILE *fp, uint8 b);
+void writeUint16BE(FILE *fp, uint16 value);
+void writeUint16LE(FILE *fp, uint16 value);
+void writeUint32BE(FILE *fp, uint32 value);
+void writeUint32LE(FILE *fp, uint32 value);
+uint32 fileSize(FILE *fp);
+
+/* Misc stuff */
+void NORETURN_PRE error(const char *s, ...) NORETURN_POST;
+void warning(const char *s, ...);
+void debug(int level, const char *s, ...);
+int scumm_stricmp(const char *s1, const char *s2);
+
+using namespace Common;
+
+#endif
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
new file mode 100644
index 0000000..bbd7419
Binary files /dev/null and b/dists/engine-data/neverhood.dat differ


Commit: 5c69ae21ddf535f862585a4fa5892a9a1146618f
    https://github.com/scummvm/scummvm/commit/5c69ae21ddf535f862585a4fa5892a9a1146618f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:46-07:00

Commit Message:
NEVERHOOD: More work on Klayman (still eye cancerous code)

- Start to implement KmScene1001
- Implement queryPositionSprite and queryPositionRectList
- Implement message list related code (setting and running them)
- Access to message params now with accessors (so compatible types can be converted)

Changed paths:
    engines/neverhood/collisionman.h
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h
index 426dca0..1558599 100644
--- a/engines/neverhood/collisionman.h
+++ b/engines/neverhood/collisionman.h
@@ -42,6 +42,8 @@ public:
 	void clearSprites();
 	void save();
 	void restore();
+	uint getSpriteCount() const { return _sprites.size(); }
+	Sprite *getSprite(uint index) const { return _sprites[index]; }
 protected:
 	NeverhoodEngine *_vm;
 	HitRectList *_hitRects;
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 64c1181..29bf6be 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -30,16 +30,43 @@ namespace Neverhood {
 
 class Entity;
 
+enum MessageParamType {
+	mptInteger,
+	mptPoint,
+	mptEntity
+};
+
 struct MessageParam {
+public:
+	MessageParam(uint32 value) : _type(mptInteger), _integer(value) {}
+	MessageParam(NPoint value) : _type(mptPoint), _point(value) {}
+	MessageParam(Entity *entity) : _type(mptEntity), _entity(entity) {}
+	uint32 asInteger() const { 
+		assert(_type == mptInteger); 
+		return _integer; 
+	}
+	NPoint asPoint() const { 
+		assert(_type == mptInteger || _type == mptPoint);
+		if (_type == mptInteger) {
+			NPoint pt;
+			pt.x = (_integer >> 16) & 0xFFFF; 
+			pt.y = _integer & 0xFFFF;
+			return pt;
+		} 
+		return _point; 
+	}
+	Entity *asEntity() const {
+		assert(_type == mptEntity); 
+		return _entity; 
+	}
+protected:
 	union {
 		uint32 _integer;
 		NPoint _point;
 		Entity *_entity;
 		// TODO: Other types...
 	};
-	MessageParam(uint32 value) { _integer = value; }
-	MessageParam(NPoint value) { _point = value; }
-	MessageParam(Entity *entity) { _entity = entity; }
+	MessageParamType _type;
 	// TODO: Constructors for the param types...
 };
 
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c63131d..47fff17 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -78,17 +78,17 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 		_field24 = -1;
 		_field26 = -1;
 		_field28 = -1;
-		_field20 = param._integer;
+		_field20 = param.asInteger();
 		_done = true;
 		return messageResult;
 	case 0x100A:
-		_field24 = (int16)param._integer;
+		_field24 = (int16)param.asInteger();
 		return messageResult;
 	case 0x101F:
 		_field2C = true;		
 		return messageResult;
 	case 0x1023:
-		_field26 = (int16)param._integer;
+		_field26 = (int16)param.asInteger();
 		return messageResult;
 	}
 	return messageResult;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 7a775bc..eca8e02 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -21,7 +21,9 @@
  */
 
 #include "neverhood/klayman.h"
+#include "neverhood/collisionman.h"
 #include "neverhood/resourceman.h"
+#include "neverhood/staticdata.h"
 
 namespace Neverhood {
 
@@ -52,7 +54,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
 	_counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false),
 	_status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
-	_flagFA(false), _statusE0(0) /*, _field114(0)*/, _resourceHandle(-1), _soundFlag(false) {
+	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
 	// TODO
 	createSurface(surfacePriority, 320, 200);
@@ -74,13 +76,13 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param._point.x, false);
+		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		// TODO AnimatedSprite_setCallback2(AnimationCallback(&sub41FC80));
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
 		break;
 	case 0x4818:
-		// TODO sub41C930(_rectResource.getRectangle1(param._integer).x, false);
+		// TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false);
 		break;
 	}
 	return 0;
@@ -124,19 +126,15 @@ void Klayman::sub41FD40() {
 	SetMessageHandler(&Klayman::handleMessage41EB10);
 	SetSpriteCallback(NULL);
 	SetAnimationCallback3(&Klayman::sub41FCF0);
-	// TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FD90));
+	setCallback1(AnimationCallback(&Klayman::sub41FD90));
 }
 
 uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x04DBC02C) {
-#if 0		
-			_soundResource1.set(0x44528AA1);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
+		if (param.asInteger() == 0x04DBC02C) {
+			_soundResource1.play(0x44528AA1);
 		}
 		break;
 	}
@@ -165,12 +163,8 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam &param, E
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x808A0008) {
-#if 0		
-			_soundResource1.set(0xD948A340);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
+		if (param.asInteger() == 0x808A0008) {
+			_soundResource1.play(0xD948A340);
 		}
 		break;
 	}
@@ -189,7 +183,7 @@ void Klayman::sub41FE00() {
 	SetMessageHandler(&Klayman::handleMessage41E9E0);
 	SetSpriteCallback(NULL);
 	SetAnimationCallback3(&Klayman::sub41FCF0);
-	// TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FE50));
+	setCallback1(AnimationCallback(&Klayman::sub41FE50));
 }
 
 void Klayman::sub41FE50() {
@@ -200,24 +194,12 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, E
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x5A0F0104) {
-#if 0		
-			_soundResource1.set(0x7970A100);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
-		} else if (param._integer == 0x9A9A0109) {
-#if 0		
-			_soundResource1.set(0xD170CF04);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
-		} else if (param._integer == 0x989A2169) {
-#if 0		
-			_soundResource1.set(0xD073CF14);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
+		if (param.asInteger() == 0x5A0F0104) {
+			_soundResource1.play(0x7970A100);
+		} else if (param.asInteger() == 0x9A9A0109) {
+			_soundResource1.play(0xD170CF04);
+		} else if (param.asInteger() == 0x989A2169) {
+			_soundResource1.play(0xD073CF14);
 		}
 		break;
 	}
@@ -242,12 +224,8 @@ uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam &param, E
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x0D2A0288) {
-#if 0		
-			_soundResource1.set(0xD192A368);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
+		if (param.asInteger() == 0x0D2A0288) {
+			_soundResource1.play(0xD192A368);
 		}
 		break;
 	}
@@ -272,30 +250,14 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, E
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0xC006000C) {
-#if 0		
-			_soundResource1.set(0x9D406340);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
-		} else if (param._integer == 0x2E4A2940) {
-#if 0		
-			_soundResource1.set(0x53A4A1D4);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
-		} else if (param._integer == 0xAA0A0860) {
-#if 0		
-			_soundResource1.set(0x5BE0A3C6);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
-		} else if (param._integer == 0xC0180260) {
-#if 0		
-			_soundResource1.set(0x5D418366);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
+		if (param.asInteger() == 0xC006000C) {
+			_soundResource1.play(0x9D406340);
+		} else if (param.asInteger() == 0x2E4A2940) {
+			_soundResource1.play(0x53A4A1D4);
+		} else if (param.asInteger() == 0xAA0A0860) {
+			_soundResource1.play(0x5BE0A3C6);
+		} else if (param.asInteger() == 0xC0180260) {
+			_soundResource1.play(0x5D418366);
 		}
 		break;
 	}
@@ -405,6 +367,7 @@ void Klayman::update41D0F0() {
 }
 
 uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41D360(%04X)", messageNum);
 	Sprite::handleMessage(messageNum, param, sender);
 	uint32 messageResult = xHandleMessage(messageNum, param);
 	switch (messageNum) {
@@ -412,7 +375,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		messageResult = _flagE5;
 		break;
 	case 0x1014:
-		_attachedSprite = param._entity;
+		_attachedSprite = param.asEntity();
 		break;
 	case 0x1019:
 		sub41C7B0();
@@ -424,13 +387,13 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		sub41C790();
 		break;
 	case 0x481C:
-		_status = param._integer;
+		_status = param.asInteger();
 		_flagFA = true;
 		messageResult = 1;
 		break;
 	case 0x482C:
-		if (param._integer != 0) {
-			// TODO _rectResource.getRectangle2(param._integer, &_field118, &_field114,);
+		if (param.asInteger() != 0) {
+			// TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,);
 		} else {
 			// TODO _field114 = 0;
 		}
@@ -440,9 +403,9 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FF00() {
-	setFileHash(0x5900C41E, 0, -1);
 	_status2 = 1;
 	_flagE5 = true;
+	setFileHash(0x5900C41E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -472,18 +435,10 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x271AA210) {
-#if 0		
-			_soundResource1.set(0x4924AAC4);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
-		} else if (param._integer == 0x2B22AA81) {
-#if 0		
-			_soundResource1.set(0x0A2AA8E0);
-			_soundResource1.load();
-			_soundResource1.play(false);
-#endif			
+		if (param.asInteger() == 0x271AA210) {
+			_soundResource1.play(0x4924AAC4);
+		} else if (param.asInteger() == 0x2B22AA81) {
+			_soundResource1.play(0x0A2AA8E0);
 		}
 		break;
 	}
@@ -492,33 +447,323 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 
 
 void Klayman::sub41C930(int16 x, bool flag) {
+	debug("Klayman::sub41C930(%d, %d)", x, flag);
 	int16 xdiff = ABS(x - _x);
 	if (xdiff == 0) {
 		_x4 = x;
 		if (_flagE1 || _flagE2 || _flagE3) {
-			// TODO AnimatedSprite_setCallback2(NULL);
+			setCallback2(NULL);
 			sub41C7B0();
 		}
 	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
 		_x4 = x;
-		// TODO AnimatedSprite_setCallback2(NULL);
+		setCallback2(NULL);
 		sub41C7B0();
 	} else if (xdiff <= 42 && _status != 3) {
 		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
 			_x4 = x;
 		} else {
 			_x4 = x;
-			// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41FB40));
+			setCallback2(AnimationCallback(&Klayman::sub41FB40));
 		}
 	} else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
 		_x4 = x;
 	} else if (flag) {
 		_x4 = x;
+		debug("#### 1");
 		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
 	} else {
 		_x4 = x;
-		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41F950));
+		setCallback2(AnimationCallback(&Klayman::sub41F950));
+	}
+}
+
+void Klayman::sub4211F0() {
+	_status2 = 1;
+	_flagE5 = false;
+	setFileHash(0x527AC970, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub4211B0() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x5A38C110, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E920);
+	SetSpriteCallback(NULL);
+}
+
+uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x03060012) {
+			_soundResource1.play(0xC0238244);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+bool Klayman::sub41CEB0(AnimationCb callback3) {
+	if (_status2 == 1) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x5C7080D4, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41F140);
+		SetSpriteCallback(&Klayman::spriteUpdate41F250);
+		SetAnimationCallback3(callback3);
+		return true;
+	} else {
+		_x = _x4;
+		return false;
+	}
+}
+
+void Klayman::spriteUpdate41F250() {
+	debug("Klayman::spriteUpdate41F250()");
+}
+
+void Klayman::spriteUpdate41F5F0() {
+	debug("Klayman::spriteUpdate41F5F0()");
+}
+
+void Klayman::sub41FB40() {
+	_status2 = 1;
+	_flagE2 = true;
+	_flagE5 = true;
+	setDoDeltaX(_x4 < _x);
+	setFileHash(0x5C48C506, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41DD80);
+	SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
+	setCallback1(AnimationCallback(&Klayman::sub41FBB0));	
+}
+
+void Klayman::sub41FBB0() {
+	_flagE2 = false;
+}
+
+uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0A2AA8E0);
+		} else if (param.asInteger() == 0x32188010) {
+			if (_soundFlag) {
+				_soundResource1.play(0x48498E46);
+			} else {
+				_soundResource1.play(0x405002D8);
+			}
+		} else if (param.asInteger() == 0x02A2909C) {
+			if (_soundFlag) {
+				_soundResource1.play(0x50399F64);
+			} else {
+				_soundResource1.play(0x0460E2FA);
+			}
+		}
+		break;
+	case 0x3002:
+		_x = _x4;
+		sub41C7B0();
+		break;
 	}
+	return messageResult;
+}
+
+void Klayman::sub41CD70(int16 x) {
+	if (x > _x) {
+		if (ABS(x - _x) <= 105) {
+			debug("// TODO sub41CAC0(x);");
+			// TODO sub41CAC0(x);
+		} else {
+			sub41C930(x, false);
+		}
+	} else if (x == _x) {
+		_x4 = x;
+		setCallback2(NULL);
+		sub41C7B0();
+	} else {
+		sub41C930(x, false);
+	}
+}
+
+void Klayman::sub41F950() {
+	if (!sub41CF10(AnimationCallback(&Klayman::sub41F950))) {
+		_status2 = 0;
+		_flagE1 = true;
+		_flagE5 = true;
+		setDoDeltaX(_x4 < _x);
+		setFileHash(0x242C0198, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41EC70);
+		SetSpriteCallback(&Klayman::spriteUpdate41F320);
+		setCallback1(AnimationCallback(&Klayman::sub41FB30));	
+		SetAnimationCallback3(&Klayman::sub41F9E0);
+	}
+}
+
+void Klayman::sub41FB30() {
+	_flagE1 = false;
+}
+
+uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			if (_soundFlag) {
+				_soundResource1.play(0x48498E46);
+			} else {
+				_soundResource1.play(0x405002D8);
+			}
+		} else if (param.asInteger() == 0x0A2A9098) {
+			if (_soundFlag) {
+				_soundResource1.play(0x50399F64);
+			} else {
+				_soundResource1.play(0x0460E2FA);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41F9E0() {
+	_status2 = 0;
+	_flagE1 = true;
+	_flagE5 = true;
+	setFileHash(0x1A249001, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	setCallback1(AnimationCallback(&Klayman::sub41FB30));	
+	SetAnimationCallback3(&Klayman::sub41FA40);
+}
+
+void Klayman::spriteUpdate41F300() {
+	SetSpriteCallback(&Klayman::spriteUpdate41F320);
+	_deltaX = 0;
+}
+
+uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			if (_soundFlag) {
+				_soundResource1.play(0x48498E46);
+			} else {
+				_soundResource1.play(0x405002D8);
+			}
+		} else if (param.asInteger() == 0x0A2A9098) {
+			if (_soundFlag) {
+				_soundResource1.play(0x50399F64);
+			} else {
+				_soundResource1.play(0x0460E2FA);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub41FA40() {
+	if (_status == 2) {
+		sub41C7B0();
+	} else if (_status == 3) {
+		debug("// TODO sub420F20();");
+		// TODO sub420F20();
+	} else {
+		_flagE2 = true;
+		if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
+			if (_status == 0) {
+				_status2 = 1;
+				setFileHash(0xF234EE31, 0, -1);
+			} else {
+				_status2 = 2;
+				setFileHash(0xF135CC21, 0, -1);
+			}
+		} else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
+			if (_status == 0) {
+				_status2 = 1;
+				setFileHash(0x8604A152, 0, -1);
+			} else {
+				_status2 = 2;
+				setFileHash(0xA246A132, 0, -1);
+			}
+		}
+		_flagE5 = true;
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41DD80);
+		SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
+		setCallback1(AnimationCallback(&Klayman::sub41FBB0));	
+	}
+}
+
+void Klayman::spriteUpdate41F320() {
+	int16 xdiff = ABS(_x4 - _x);
+	int16 xdelta = _x4 - _x;
+	
+	if (xdelta > _deltaX)
+		xdelta = _deltaX;
+	else if (xdelta < _deltaX)
+		xdelta = -_deltaX;
+		
+	_deltaX = 0;		
+
+	if (xdiff == 0) {
+		sendMessage(0x1019, 0, this);
+	} else if (_status != 2 && _status != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
+		sendMessage(0x1019, 0, this);
+	} else if (_status != 2 && _status != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
+		sendMessage(0x1019, 0, this);
+	} else if (_status == 3 && xdiff < 30) {
+		sendMessage(0x1019, 0, this);
+	} else if (_status == 3 && xdiff < 150 && _frameIndex >= 6) {
+		sendMessage(0x1019, 0, this);
+	} else {
+		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		_x += xdelta;
+		if (_field114) {
+			debug("_field114");
+			// TODO KlaymanSprite_sub_41CF70
+		} else {
+			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+			if (hitRectNext->type == 0x5002) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
+			} else if (hitRectNext->type == 0x5003) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
+			} else if (hitRectPrev->type == 0x5002) {
+				if (xdelta > 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			} else if (hitRectPrev->type == 0x5003) {
+				if (xdelta < 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			} else if (_flagF6 && xdelta != 0) {
+				if (hitRectNext->type == 0x5000) {
+					_y++;
+				} else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) {
+					_y--;
+				}
+			}
+		}
+		processDelta();
+	}
+	
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 69f9a34..50a12ae 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -41,13 +41,21 @@ struct KlaymanTableItem {
 
 class Klayman : public AnimatedSprite {
 public:
-	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority);
+	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000);
+
+	void update();
 
 	void sub41FD30();
 	void sub41FDA0();
 	void sub41FDF0();
 	void sub41FE60();
 	void sub41FEB0();
+	void sub41FC80();
+	void sub4211F0();
+	void sub4211B0();
+	
+	void spriteUpdate41F250();
+	void spriteUpdate41F5F0();
 
 protected:
 	Entity *_parentScene;
@@ -74,15 +82,14 @@ protected:
 	const KlaymanTableItem *_table;
 	int _tableCount;
 	int _tableMaxValue;
+	uint32 _field114;
 	/*
-	00000114 field114		dd ?
 	00000118 field118		dw ?
 	*/
 	bool _soundFlag;
 	int _resourceHandle;
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void update();
 
 	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
 	void setKlaymanTable1();
@@ -114,7 +121,6 @@ protected:
 	void sub41C770();
 	void sub41C790();
 	
-	void sub41FC80();
 	void update41D0F0();
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 
@@ -126,6 +132,24 @@ protected:
 	uint32 handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender);
 
 	void sub41C930(int16 x, bool flag);
+
+	uint32 handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender);
+	
+	bool sub41CEB0(AnimationCb callback3);
+	
+	void sub41FB40();
+	void sub41FBB0();
+	uint32 handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender);
+	void sub41CD70(int16 x);
+	void sub41F950();
+	void sub41FB30();
+	uint32 handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender);
+	void sub41F9E0();
+	void spriteUpdate41F300();
+	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
+	void sub41FA40();
+
+	void spriteUpdate41F320();
 	
 };
 
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index c46aa79..03109c0 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -52,17 +52,17 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 		_field24 = -1;
 		_field26 = -1;
 		_field28 = -1;
-		_field20 = param._integer;
+		_field20 = param.asInteger();
 		_done = true;
 		return 0;
 	case 0x100A:
-		_field24 = (int16)param._integer;
+		_field24 = (int16)param.asInteger();
 		return 0;
 	case 0x1023:
-		_field26 = (int16)param._integer;
+		_field26 = (int16)param.asInteger();
 		return 0;
 	case 0x1024:
-		_field28 = (int16)param._integer;
+		_field28 = (int16)param.asInteger();
 		return 0;
 	default:
 		if (_childObject && sender == _parentModule)
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 8580620..eea0d99 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -132,6 +132,74 @@ void Module1000::updateScene1005() {
 			
 // Scene1001			
 
+KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+}
+
+uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
+	debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;		
+	case 0x4804:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub4211B0));
+		}
+		break;
+	case 0x480D:
+		debug("########### A");				
+		// TODO setCallback2(AnimationCallback(&Klayman::sub44FA50));
+		break;
+	case 0x4812:
+		debug("########### B");				
+		// TODO setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		break;
+		
+	case 0x4836:
+		if (param.asInteger() == 1) {
+			_parentScene->sendMessage(0x2002, 0, this);
+			setCallback2(AnimationCallback(&Klayman::sub4211F0));
+		}
+		break;		
+
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;		
+	}
+
+	// TODO
+
+	return 0;
+}
+
+void KmScene1001::sub44FA50() {
+	if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x00648953, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&KmScene1001::handleMessage44FA00);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	}
+}
+
+uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x480F, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) {
 	
@@ -165,18 +233,12 @@ void AsScene1001Door::handleMessage2000h() {
 	switch (_vm->getGlobalVar(0x52371C95)) {
 	case 0:
 	case 1:
-#if 0	
-		_soundResource1.set(0x65482F03);
-		_soundResource1.load();
-		_soundResource1.play(false);
-#endif
+		_soundResource1.play(0x65482F03);
 		setFileHash(0x624C0498, 1, 3);
 		SetAnimationCallback3(&AsScene1001Door::callback1);		
 		break;
 	case 2:
-#if 0	
-		_soundResource2.play(false);
-#endif
+		_soundResource2.play();
 		setFileHash(0x624C0498, 6, 6);
 		SetAnimationCallback3(&AsScene1001Door::callback2);		
 		break;
@@ -216,9 +278,7 @@ void AsScene1001Door::callback2() {
 }
 
 void AsScene1001Door::callback3() {
-#if 0
-	_soundResource1.play(false);
-#endif
+	_soundResource1.play();
 	setFileHash1();
 	_surface->setVisible(false);	
 }
@@ -239,25 +299,17 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x00352100) {
+		if (param.asInteger() == 0x00352100) {
 			if (_asDoor) {
 				_asDoor->sendMessage(0x2000, 0, this);
 			}
-		} else if (param._integer == 0x0A1A0109) {
-#if 0		
-			_soundResource.set(0x66410886);
-			_soundResource.load();
-			_soundResource.play(false);
-#endif			
+		} else if (param.asInteger() == 0x0A1A0109) {
+			_soundResource.play(0x66410886);
 		}
 		break;
 	case 0x2000:
 		setFileHash(0x022C90D4, 1, -1);
-#if 0		
-		_soundResource.set(0xE741020A);
-		_soundResource.load();
-		_soundResource.play(false);
-#endif			
+		_soundResource.play(0xE741020A);
 		_newHashListIndex = -2;
 		break;
 	}
@@ -280,12 +332,8 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x0E0A1410) {
-#if 0		
-			_soundResource.set(0x60803F10);
-			_soundResource.load();
-			_soundResource.play(false);
-#endif			
+		if (param.asInteger() == 0x0E0A1410) {
+			_soundResource.play(0x60803F10);
 		}
 		break;
 	case 0x2001:
@@ -317,17 +365,14 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param._integer == 0x00C0C444) {
+		if (param.asInteger() == 0x00C0C444) {
 			_parentScene->sendMessage(0x480F, 0, this);
-		} else if (param._integer == 0xC41A02C0) {
-#if 0		
-			_soundResource.set(0x40581882);
-			_soundResource.load();
-			_soundResource.play(false);
-#endif			
+		} else if (param.asInteger() == 0xC41A02C0) {
+			_soundResource.play(0x40581882);
 		}
 		break;
 	case 0x1011:
+		debug("Click lever");
 		_parentScene->sendMessage(0x4826, 0, this);
 		messageResult = 1;
 		break;
@@ -371,11 +416,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 		_parentScene->sendMessage(0x480B, 0, this);
 		_surface->setVisible(true);
 		_countdown = 8;
-#if 0		
-		_soundResource.set(_soundFileHash);
-		_soundResource.load();
-		_soundResource.play(false);
-#endif		
+		_soundResource.play(_soundFileHash);
 		break;
 	}
 	return messageResult;
@@ -386,8 +427,6 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_name = "Scene1001";
 
-	// TODO: Implement Sprite classes
-
 	Sprite *staticSprite1;
 
 	SetMessageHandler(&Scene1001::handleMessage);
@@ -400,46 +439,37 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	// TODO Mouse
 
-	//DEBUG so he's here at least
-	_klayman = new Klayman(_vm, this, 200, 433, 1000, 1000);
-	addSprite(_klayman);
-
-#if 0
-	// TODO: Player sprites...	
 	if (which < 0) {
 		setRectList(0x004B49F0);
-		_klayman = new Class572(_vm, this, 200, 433, 1000, 1000);
+		_klayman = new KmScene1001(_vm, this, 200, 433);
 		setMessageList(0x004B4888);
 	} else if (which == 1) {
 		setRectList(0x004B49F0);
-		_klayman = new Class572(_vm, this, 640, 433, 1000, 1000);
+		_klayman = new KmScene1001(_vm, this, 640, 433);
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
 		setRectList(0x004B49F0);
 		if (_vm->getGlobalVar(0xC0418A02)) {
-			_klayman = new Class572(_vm, this, 390, 433, 1000, 1000);
+			_klayman = new KmScene1001(_vm, this, 390, 433);
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new Class572(_vm, this, 300, 433, 1000, 1000);
+			_klayman = new KmScene1001(_vm, this, 300, 433);
 		}
 		setMessageList(0x004B4970);
 	} else {
 		setRectList(0x004B4A00);
-		_klayman = new Class572(_vm, this, 200, 433, 1000, 1000);
+		_klayman = new KmScene1001(_vm, this, 200, 433);
 		setMessageList(0x004B4890);
 	}
 	addSprite(_klayman);
-#endif
 
 	staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
 
-#if 0
 	// TODO: This sucks somehow, find a better way
 	_klayman->getSurface()->getClipRect().x1 = 0;
 	_klayman->getSurface()->getClipRect().y1 = 0;
 	_klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
 	_klayman->getSurface()->getClipRect().y2 = 480;
-#endif
 	
 	if (_vm->getGlobalVar(0xD217189D) == 0) {
 		_asDoor = addSprite(new AsScene1001Door(_vm));
@@ -478,45 +508,47 @@ Scene1001::~Scene1001() {
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Scene1001::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param._point.x == 0 && _vm->getGlobalVar(0xA4014072)) {
+		if (param.asPoint().x == 0 && _vm->getGlobalVar(0xA4014072)) {
 			_parentModule->sendMessage(0x1009, 0, this);
 		}
 		break;
 	case 0x000D:
-		if (param._integer == 0x188B2105) {
+		if (param.asInteger() == 0x188B2105) {
 			_parentModule->sendMessage(0x1009, 0, this);
 			messageResult = 1;
 		}
 		break;
 	case 0x100D:
-		if (param._integer == 0x00342624) {
-			// TODO _klayman->sendMessage(0x1014, _asLever, this);
-			// TODO setMessageList2(0x004B4910, true, false);
+		if (param.asInteger() == 0x00342624) {
+			_klayman->sendMessage(0x1014, _asLever, this);
+			setMessageList2(0x004B4910);
 			messageResult = 1;
-		} else if (param._integer == 0x21E64A00) {
+		} else if (param.asInteger() == 0x21E64A00) {
 			if (_vm->getGlobalVar(0xD217189D)) {
-				// TODO setMessageList(0x004B48A8, true, false);
+				setMessageList(0x004B48A8);
 				messageResult = 1;
 			} else {
-				// TODO setMessageList(0x004B48C8, true, false);
+				setMessageList(0x004B48C8);
 				messageResult = 1;
 			}
-		} else if (param._integer == 0x040424D0) {
-			// TODO _klayman->sendMessage(0x1014, _ssButton, this);
-		} else if (param._integer == 0x80006358) {
+		} else if (param.asInteger() == 0x040424D0) {
+			_klayman->sendMessage(0x1014, _ssButton, this);
+		} else if (param.asInteger() == 0x80006358) {
 			if (_vm->getGlobalVar(0x03C698DA)) {
-				// TODO setMessageList(0x004B4938, true, false);
+				setMessageList(0x004B4938);
 			} else {
-				// TODO setMessageList(0x004B4960, true, false);
+				setMessageList(0x004B4960);
 			}
 		}
 		break;
 	case 0x2002:
-		// TODO setRectList(0x004B49F0);
+		debug("########## setRectList(0x004B49F0);");
+		setRectList(0x004B49F0);
 		break;
 	case 0x480B:
 		if (_asWindow) {
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 21be948..d74a0e1 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -55,6 +55,15 @@ protected:
 
 // Scene1001
 
+class KmScene1001 : public Klayman {
+public:
+	KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:	
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub44FA50();
+	uint32 handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class AsScene1001Door : public AnimatedSprite {
 public:
 	AsScene1001Door(NeverhoodEngine *vm);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 73e7c5f..0e3e0a3 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -78,6 +78,8 @@ Common::Error NeverhoodEngine::run() {
 	_res->addArchive("s.blb");
 	_res->addArchive("t.blb");
 
+	CursorMan.showMouse(true);
+
 #if 0
 	BlbArchive *blb = new BlbArchive();
 	blb->open("m.blb");
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 5fc167c..e3a29c5 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -198,7 +198,7 @@ bool AnimResource::load(uint32 fileHash) {
 	
 	animList = resourceData + 12;
 	for (animListIndex = 0; animListIndex < animListCount; animListIndex++) {
-		debug("hash: %08X", READ_LE_UINT32(animList));
+		debug(8, "hash: %08X", READ_LE_UINT32(animList));
 		if (READ_LE_UINT32(animList) == fileHash)
 			break;
 		animList += 8;				
@@ -218,7 +218,7 @@ bool AnimResource::load(uint32 fileHash) {
 	frameCount = READ_LE_UINT16(animList + 4);
 	frameListStartOfs = READ_LE_UINT16(animList + 6);
 	
-	debug("frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs);
+	debug(8, "frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs);
 	
 	frameList = resourceData + animInfoStartOfs + frameListStartOfs;
 
@@ -241,7 +241,7 @@ bool AnimResource::load(uint32 fileHash) {
 		frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24);
 		frameInfo.field_1A = READ_LE_UINT16(frameList + 26); 
 		frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28);
-		debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", 
+		debug(8, "frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", 
 			frameInfo.frameHash, frameInfo.counter, 
 			frameInfo.rect.x, frameInfo.rect.y, frameInfo.rect.width, frameInfo.rect.height,
 			frameInfo.deltaX, frameInfo.deltaY,
@@ -299,4 +299,18 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) {
 	return -1;			
 }
 
+SoundResource::SoundResource(NeverhoodEngine *vm)
+	: _vm(vm) {
+}
+
+bool SoundResource::isPlaying() { 
+	return false; 
+}
+
+void SoundResource::play(uint32 fileHash, bool looping) {
+}
+
+void SoundResource::play() {
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 969f46d..7540956 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -103,8 +103,10 @@ protected:
 
 class SoundResource {
 public:
-	SoundResource(NeverhoodEngine *vm) : _vm(vm) {}
-	bool isPlaying() const { return false; }
+	SoundResource(NeverhoodEngine *vm);
+	bool isPlaying();
+	void play(uint32 fileHash, bool looping = false);
+	void play();
 protected:
 	NeverhoodEngine *_vm;	
 };
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 9b7b35d..9d7d550 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -31,11 +31,11 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_messageListFlag1 = false;
 	_systemCallbackFlag = false;
 	_messageList = NULL;
-	// TODO _rectType = 0;
+	_rectType = 0;
 	_mouseClickPos.x = 0;
 	_mouseClickPos.y = 0;
 	_mouseClicked = false;
-	// TODO _rectList = NULL;
+	_rectList = NULL;
 	// TODO _someRects = NULL;
 	_klayman = NULL;
 	// TODO _mouseSprite = NULL;
@@ -191,27 +191,24 @@ void Scene::update() {
 		_smkFileHash = 0;
 	} else {
 		if (_mouseClicked) {
-			//** ALL TODO
-#if 0			
 			if (_klayman) {
 				// TODO: Merge later
 				if (_klayman->hasMessageHandler() && 
 					_klayman->sendMessage(0x1008, 0, this) != 0 &&
 					_messageListFlag &&
-					queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) {
+					queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
 					_mouseClicked = false;
 				} else if (_klayman->hasMessageHandler() && 
 					_klayman->sendMessage(0x1008, 0, this) != 0 &&
 					_messageListFlag) {
 					_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
 				}
-			} else if (queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) {
+			} else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
 				_mouseClicked = false;
 			}
-#endif			
 		}
-	
-		// TODO runMessageList();
+
+		runMessageList();
 
 		// Update all entities		
 		for (Common::Array<Entity*>::iterator iter = _entities.begin(); iter != _entities.end(); iter++)
@@ -228,12 +225,13 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 #if 0	
 		if (_mouseSprite && _mouseSprite->hasMessageHandler())
 			_mouseSprite->sendMessage(0x4002, param, this);
-		queryPositionSomeRects(param._point.x, param._point.y);			
+		queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
 #endif	
 		break;
 	case 1: // mouse clicked
+		debug("mouse clicked");
 		_mouseClicked = true;
-		_mouseClickPos = param._point;
+		_mouseClickPos = param.asPoint();
 		break;
 	/* ORIGINAL DEBUG		
 	case 3:
@@ -259,7 +257,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 			if (_messageListIndex == _messageListCount)
 				_klayman->sendMessage(0x4004, 0, this);
 			else {
-				// TODO runMessageList();
+				runMessageList();
 			}
 		}
 		break;
@@ -287,7 +285,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 #endif	
 		break;
 	case 0x1022:
-		setSurfacePriority(((Sprite*)sender)->getSurface(), param._integer);
+		setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger());
 		break;
 	}
 	return 0;
@@ -311,9 +309,187 @@ void Scene::smackerUpdate() {
 }
 
 uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	if (messageNum == 0x3002)
+	switch (messageNum) {
+	case 0x3002:
 		_smackerDone = true;
+		break;
+	}
 	return 0;
 }
 
+bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
+	debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY);
+	for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) {
+		Sprite *sprite = _vm->_collisionMan->getSprite(i);
+		if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && 
+			sprite->sendPointMessage(0x1011, _mouseClickPos, this) != 0) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
+	if (_rectType == 1) {
+		RectList &rectList = *_rectList;
+		int16 klaymanX = _klayman->getX();
+		int16 klaymanY = _klayman->getY();
+		for (uint i = 0; i < rectList.size(); i++) {
+			debug("(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2);
+			if (klaymanX >= rectList[i].rect.x1 && klaymanX <= rectList[i].rect.x2 && 
+				klaymanY >= rectList[i].rect.y1 && klaymanY <= rectList[i].rect.y2) {
+				for (uint j = 0; j < rectList[i].subRects.size(); j++) {
+					debug("  (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2);
+					if (mouseX >= rectList[i].subRects[j].rect.x1 && mouseX <= rectList[i].subRects[j].rect.x2 && 
+						mouseY >= rectList[i].subRects[j].rect.y1 && mouseY <= rectList[i].subRects[j].rect.y2) {
+						debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId);
+						return setMessageList2(rectList[i].subRects[j].messageListId);
+					}
+				}
+			}
+		}
+		return true;
+	}
+	return false;
+}
+
+void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackFlag) {
+	setMessageList(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag);
+}
+
+void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
+	_messageList = messageList;
+	_messageListCount = _messageList ? _messageList->size() : 0;
+	_messageListIndex = 0;
+	_messageListFlag1 = false;
+	_messageListFlag = messageListFlag;
+	_systemCallbackFlag = systemCallbackFlag;
+	_messageListStatus = 1;
+	_klayman->sendMessage(0x101C, 0, this);
+}
+
+bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallbackFlag) {
+	return setMessageList2(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag);
+}
+
+bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
+	bool result = false;
+	
+	debug("Scene::setMessageList2(%p)", (void*)messageList);
+	
+	if (_messageListStatus == 1) {
+		if (messageList != _messageList2) {
+			if (_messageValue >= 0) {
+				_parentModule->sendMessage(0x1023, _messageValue, this);
+				_messageValue = -1;
+			}
+			_messageList2 = messageList;
+			setMessageList(messageList, messageListFlag, systemCallbackFlag);
+			result = true;
+		}
+	} else if (_messageListStatus == 2) {
+		if (messageList == _messageList2) {
+			if (_messageValue >= 0) {
+				_parentModule->sendMessage(0x1023, _messageValue, this);
+				_messageValue = -1;
+			}
+			_messageList2 = messageList;
+			setMessageList(messageList, messageListFlag, systemCallbackFlag);
+			result = true;
+		}
+	} else {
+		if (_messageValue >= 0) {
+			_parentModule->sendMessage(0x1023, _messageValue, this);
+			_messageValue = -1;
+		}
+		_messageList2 = messageList;
+		setMessageList(messageList, messageListFlag, systemCallbackFlag);
+	}
+	return result;
+}
+
+void Scene::runMessageList() {
+
+	//debug("_messageListFlag2 = %d", _messageListFlag2);
+
+	if (_messageListFlag2)
+		return;
+
+	_messageListFlag2 = true;
+
+	if (_messageListFlag1) {
+		_messageListFlag2 = false;
+		return;
+	}
+
+	if (!_messageList) {
+		_messageList2 = NULL;
+		_messageListStatus = 0;
+	}
+	
+	if (_messageList && _klayman) {
+	
+		while (_messageList && _messageListIndex < _messageListCount && !_messageListFlag1) {
+			int messageNum = (*_messageList)[_messageListIndex].messageNum;
+			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
+			
+			debug("$$$$$$$$$$$ Scene::runMessageList() %04X, %08X", messageNum, messageParam);
+			
+			_messageListIndex++;
+			if (_messageListIndex == _messageListCount) {
+				_klayman->sendMessage(0x1021, 0, this);
+			}
+			if (_systemCallbackFlag) {
+				// TODO messageNum = systemConvertMessageCb(messageNum);
+			}
+			if (messageNum != 0x4003) {
+				if (messageNum == 0x1009 || messageNum == 0x1024) {
+					_parentModule->sendMessage(messageNum, messageParam, this);
+				} else if (messageNum == 0x100A) {
+					_messageValue = messageParam;
+					_parentModule->sendMessage(messageNum, messageParam, this);
+				} else if (messageNum == 0x4001) {
+					_messageListFlag1 = true;
+					_klayman->sendPointMessage(0x4001, _mouseClickPos, this);
+				} else if (messageNum == 0x100D) {
+					if (this->hasMessageHandler() && this->sendMessage(0x100D, messageParam, this) != 0)
+						continue;
+				} else if (messageNum == 0x101A) {
+					_messageListStatus = 0;
+				} else if (messageNum == 0x101B) {
+					_messageListStatus = 2;
+				} else if (messageNum == 0x1020) {
+					_messageListFlag = false;
+				} else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) {
+					if (this->hasMessageHandler() && this->sendMessage(messageNum, messageParam, this) != 0) {
+						_messageListFlag2 = false;
+						return;
+					}
+				} else {
+					_messageListFlag1 = true;
+					if (_klayman->hasMessageHandler() && _klayman->sendMessage(messageNum, messageParam, this) != 0) {
+						_messageListFlag1 = false;
+					}
+				} 
+			}
+			if (_messageListIndex == _messageListCount) {
+				_messageListFlag = true;
+				_messageList = NULL;
+			}
+		}
+	}
+
+	_messageListFlag2 = false;
+	
+}
+
+void Scene::setRectList(uint32 id) {
+	setRectList(_vm->_staticData->getRectList(id));
+}
+
+void Scene::setRectList(RectList *rectList) {
+	_rectList = rectList;
+	_rectType = 1;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 4928d20..34f3c1e 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -56,15 +56,15 @@ protected:
 	Common::Array<BaseSurface*> _surfaces;
 	bool _systemCallbackFlag;
 	MessageList *_messageList;
-	int _messageListIndex;
-	int _messageListCount;
+	uint _messageListCount;
+	uint _messageListIndex;
 	bool _messageListFlag1;
 	NPoint _mouseClickPos;
 	bool _mouseClicked;
 	// TODO RectResource _rectResource;
-	// TODO 00000080 rectList		dd ?
-	// TODO 00000084 rectType		dw ?
-	// TODO 00000086 rectListCount   dw ?
+	RectList *_rectList;
+	int _rectType;
+	// rectListCount
 	// TODO 00000088 someRects	   dd ?
 	// TODO 0000008C someRectsCount  dw ?
 	// TODO 0000008E field_8E		dw ?
@@ -93,6 +93,15 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void smackerUpdate();
 	uint32 smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	bool queryPositionSprite(int16 mouseX, int16 mouseY);
+	bool queryPositionRectList(int16 mouseX, int16 mouseY);
+	void setMessageList(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false);
+	void setMessageList(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false);
+	bool setMessageList2(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false);
+	bool setMessageList2(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false);
+	void runMessageList();
+	void setRectList(uint32 id);
+	void setRectList(RectList *rectList);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index ce21527..d925750 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -384,7 +384,7 @@ void AnimatedSprite::updateFrameIndex() {
 }
 
 void AnimatedSprite::updateFrameInfo() {
-	debug("AnimatedSprite::updateFrameInfo()");
+	debug(8, "AnimatedSprite::updateFrameInfo()");
 
 	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex);
 	
@@ -452,20 +452,44 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil
 	_hashListIndex = -1;
 }
 
+void AnimatedSprite::setCallback1(AnimationCb callback1) {
+	if (_callback1Cb) {
+		(this->*_callback1Cb)();
+	}
+	SetAnimationCallback1(callback1);
+}
+
+void AnimatedSprite::setCallback2(AnimationCb callback2) {
+
+	if (_callback1Cb) {
+		// _callback1Cb has to be cleared before it's called
+		AnimationCb cb = _callback1Cb;
+		_callback1Cb = NULL;
+		(this->*cb)();
+	}
+
+	// TODO _callbackList = NULL;
+	_callback3Cb = NULL;
+	_callback2Cb = callback2;
+	
+	if (_callback2Cb) {
+		(this->*_callback2Cb)();
+	}
+
+}
+
 void AnimatedSprite::removeCallbacks() {
 
 	if (_callback1Cb) {
 		// _callback1Cb has to be cleared before it's called
 		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
-		debug("Fire _callback1Cb");
 		(this->*cb)();
 	}
 
 	if (_callback3Cb) {
 		_callback2Cb = _callback3Cb;
 		_callback3Cb = NULL;
-		debug("Fire _callback3Cb");
 		(this->*_callback2Cb)();
 #if 0 // TODO		
 	} else if (_callbackList) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index b3809a8..160bfe1 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -45,6 +45,8 @@ public:
 	void setDoDeltaX(int type);
 	void setDoDeltaY(int type);
 	bool isPointInside(int16 x, int16 y);
+	int16 getX() const { return _x; }
+	int16 getY() const { return _y; }
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	int16 (Sprite::*_filterXCb)(int16);
@@ -98,6 +100,7 @@ public:
 	AnimatedSprite(NeverhoodEngine *vm, int objectPriority);
 	AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y);
 	void update();
+	void updateDeltaXY();
 protected:
 	typedef void (AnimatedSprite::*AnimationCb)();
 	AnimResource _animResource;
@@ -129,7 +132,6 @@ protected:
 	AnimationCb _callback2Cb;
 	AnimationCb _callback3Cb;
 	void init();
-	void updateDeltaXY();
 	void updateAnim();
 	void updatePosition();
 	void updateFrameIndex();
@@ -139,6 +141,8 @@ protected:
 	void setFileHash1();
 	void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5);
 	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);
+	void setCallback1(AnimationCb callback1);
+	void setCallback2(AnimationCb callback2);
 	int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!!
 	void removeCallbacks();
 };


Commit: 222cd4a6513770914d09630d1001a8159ba3d0f9
    https://github.com/scummvm/scummvm/commit/222cd4a6513770914d09630d1001a8159ba3d0f9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:46-07:00

Commit Message:
NEVERHOOD: More work on Scene1001 and Klayman

- Fix a bug in Klayman's walking
- The lever can now be used
- Other stuff is still missing
- Remove entity.cpp since it's not needed

Changed paths:
  R engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
deleted file mode 100644
index 9070d5c..0000000
--- a/engines/neverhood/entity.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/* 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/entity.h"
-
-namespace Neverhood {
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 29bf6be..c570084 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -49,8 +49,8 @@ public:
 		assert(_type == mptInteger || _type == mptPoint);
 		if (_type == mptInteger) {
 			NPoint pt;
-			pt.x = (_integer >> 16) & 0xFFFF; 
-			pt.y = _integer & 0xFFFF;
+			pt.x = _integer & 0xFFFF;
+			pt.y = (_integer >> 16) & 0xFFFF; 
 			return pt;
 		} 
 		return _point; 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index eca8e02..4a40b2f 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -53,7 +53,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
 	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
 	_counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false),
-	_status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
+	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
 	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
 	// TODO
@@ -289,22 +289,24 @@ void Klayman::update41D2B0() {
 }
 
 bool Klayman::sub41CF10(AnimationCb callback) {
-	if (_status2 != 2)
-		return false;
-	_status2 = 1;
-	setFileHash(0x9A7020B8, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41F140);
-	SetSpriteCallback(NULL);
-	SetAnimationCallback3(callback);
-	_flagE5 = false; 
-	return true;
+	if (_status2 == 2) {
+		_status2 = 1;
+		_flagE5 = false; 
+		setFileHash(0x9A7020B8, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41F140);
+		SetSpriteCallback(NULL);
+		SetAnimationCallback3(callback);
+		return true;
+	}
+	return false;
 }
 
-void Klayman::sub41C7B0() {
+ void Klayman::sub41C7B0() {
 	if (_callback1Cb) {
-		(this->*_callback1Cb)();
+		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
+		(this->*cb)();
 	}
 	if (_callback3Cb) {
 		AnimationCb cb = _callback3Cb;
@@ -321,16 +323,18 @@ void Klayman::sub41C7B0() {
 
 void Klayman::sub41C770() {
 	_flagFA = false;
-	_status = 1;
+	_status3 = 1;
 }
 
 void Klayman::sub41C790() {
 	if (_flagFA)
-		_status = 0;
+		_status3 = 0;
 }
 
 void Klayman::sub41FC80() {
 	if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) {
+		_status2 = 1;
+		_flagE5 = true;
 		setFileHash(0x5420E254, 0, -1);
 		_counter = 0;
 		_counter3 = 0;
@@ -387,7 +391,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		sub41C790();
 		break;
 	case 0x481C:
-		_status = param.asInteger();
+		_status3 = param.asInteger();
 		_flagFA = true;
 		messageResult = 1;
 		break;
@@ -413,6 +417,7 @@ void Klayman::sub41FF00() {
 }
 
 uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41D480(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -432,6 +437,7 @@ void Klayman::sub41FCF0() {
 }
 
 uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41F140(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -449,9 +455,9 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 void Klayman::sub41C930(int16 x, bool flag) {
 	debug("Klayman::sub41C930(%d, %d)", x, flag);
 	int16 xdiff = ABS(x - _x);
-	if (xdiff == 0) {
+	if (x == _x) {
 		_x4 = x;
-		if (_flagE1 || _flagE2 || _flagE3) {
+		if (!_flagE1 && !_flagE2 && !_flagE3) {
 			setCallback2(NULL);
 			sub41C7B0();
 		}
@@ -459,7 +465,7 @@ void Klayman::sub41C930(int16 x, bool flag) {
 		_x4 = x;
 		setCallback2(NULL);
 		sub41C7B0();
-	} else if (xdiff <= 42 && _status != 3) {
+	} else if (xdiff <= 42 && _status3 != 3) {
 		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
 			_x4 = x;
 		} else {
@@ -470,7 +476,6 @@ void Klayman::sub41C930(int16 x, bool flag) {
 		_x4 = x;
 	} else if (flag) {
 		_x4 = x;
-		debug("#### 1");
 		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
 	} else {
 		_x4 = x;
@@ -497,6 +502,7 @@ void Klayman::sub4211B0() {
 }
 
 uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41E920(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -526,10 +532,82 @@ bool Klayman::sub41CEB0(AnimationCb callback3) {
 
 void Klayman::spriteUpdate41F250() {
 	debug("Klayman::spriteUpdate41F250()");
+
+	int16 xdiff = _x4 - _x;
+
+	if (_doDeltaX) {
+		_x -= _deltaX;
+	} else {
+		_x += _deltaX;
+	}
+	_deltaX = 0;
+	
+	if (_doDeltaY) {
+		_y -= _deltaY;
+	} else {
+		_y += _deltaY;
+	}
+	_deltaY = 0;
+	
+	if (_flag) {
+		if (xdiff > 6)
+			_x += 6;
+		else if (xdiff < -6)
+			_x -= 6;
+		else
+			_x = _x4;				
+	}
+	
+	processDelta();
+	
 }
 
 void Klayman::spriteUpdate41F5F0() {
 	debug("Klayman::spriteUpdate41F5F0()");
+	
+	int16 xdiff = _x4 - _x;
+	
+	if (_frameIndex == 9) {
+		if (xdiff > 26)
+			_deltaX += xdiff - 26;
+		else if (xdiff < -26)			
+			_deltaX -= xdiff + 26;
+	}
+
+	if (xdiff > _deltaX)
+		xdiff = _deltaX;
+	else if (xdiff < -_deltaX)
+		xdiff = -_deltaX;
+	_deltaX = 0;				
+
+	if (_x4 != _x) {
+		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		_x += xdiff;
+		if (_field114) {
+			// TODO KlaymanSprite_sub_41CF70
+		} else {
+			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+			if (hitRectNext->type == 0x5002) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
+			} else if (hitRectNext->type == 0x5003) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
+			} else if (hitRectPrev->type == 0x5002) {
+				if (xdiff > 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			} else if (hitRectPrev->type == 0x5003) {
+				if (xdiff < 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			}
+		}
+		processDelta();
+	}
+	
 }
 
 void Klayman::sub41FB40() {
@@ -549,6 +627,7 @@ void Klayman::sub41FBB0() {
 }
 
 uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41DD80(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -579,6 +658,7 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41CD70(int16 x) {
+	debug("Klayman::sub41CD70(%d)", x);
 	if (x > _x) {
 		if (ABS(x - _x) <= 105) {
 			debug("// TODO sub41CAC0(x);");
@@ -615,7 +695,8 @@ void Klayman::sub41FB30() {
 }
 
 uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	debug("Klayman::handleMessage41EC70(%04X)", messageNum);
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -654,6 +735,7 @@ void Klayman::spriteUpdate41F300() {
 }
 
 uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41EB70(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -676,15 +758,16 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FA40() {
-	if (_status == 2) {
+	if (_status3 == 2) {
 		sub41C7B0();
-	} else if (_status == 3) {
-		debug("// TODO sub420F20();");
+	} else if (_status3 == 3) {
+		debug("/////////////////////////////////////////////////// TODO sub420F20();");
 		// TODO sub420F20();
 	} else {
 		_flagE2 = true;
+		_flagE5 = true;
 		if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
-			if (_status == 0) {
+			if (_status3 == 0) {
 				_status2 = 1;
 				setFileHash(0xF234EE31, 0, -1);
 			} else {
@@ -692,7 +775,7 @@ void Klayman::sub41FA40() {
 				setFileHash(0xF135CC21, 0, -1);
 			}
 		} else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
-			if (_status == 0) {
+			if (_status3 == 0) {
 				_status2 = 1;
 				setFileHash(0x8604A152, 0, -1);
 			} else {
@@ -700,7 +783,6 @@ void Klayman::sub41FA40() {
 				setFileHash(0xA246A132, 0, -1);
 			}
 		}
-		_flagE5 = true;
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DD80);
 		SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
@@ -714,20 +796,20 @@ void Klayman::spriteUpdate41F320() {
 	
 	if (xdelta > _deltaX)
 		xdelta = _deltaX;
-	else if (xdelta < _deltaX)
+	else if (xdelta < -_deltaX)
 		xdelta = -_deltaX;
 		
 	_deltaX = 0;		
 
 	if (xdiff == 0) {
 		sendMessage(0x1019, 0, this);
-	} else if (_status != 2 && _status != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
+	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
 		sendMessage(0x1019, 0, this);
-	} else if (_status != 2 && _status != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
+	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
 		sendMessage(0x1019, 0, this);
-	} else if (_status == 3 && xdiff < 30) {
+	} else if (_status3 == 3 && xdiff < 30) {
 		sendMessage(0x1019, 0, this);
-	} else if (_status == 3 && xdiff < 150 && _frameIndex >= 6) {
+	} else if (_status3 == 3 && xdiff < 150 && _frameIndex >= 6) {
 		sendMessage(0x1019, 0, this);
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
@@ -766,4 +848,18 @@ void Klayman::spriteUpdate41F320() {
 	
 }
 
+uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x482A, 0, this);
+		} else if (param.asInteger() == 0x88001184) {
+			_attachedSprite->sendMessage(0x482B, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 50a12ae..7b65e8d 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -78,7 +78,7 @@ protected:
 	bool _flagFA;
 	SoundResource _soundResource1;
 	SoundResource _soundResource2;
-	int _status;
+	int _status3;
 	const KlaymanTableItem *_table;
 	int _tableCount;
 	int _tableMaxValue;
@@ -151,6 +151,8 @@ protected:
 
 	void spriteUpdate41F320();
 	
+	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
+	
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 2058db9..eb656de 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -5,7 +5,6 @@ MODULE_OBJS = \
 	blbarchive.o \
 	collisionman.o \
 	detection.o \
-	entity.o \
 	gamemodule.o \
 	graphics.o \
 	klayman.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index eea0d99..c631dc0 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -152,14 +152,17 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x480D:
-		debug("########### A");				
-		// TODO setCallback2(AnimationCallback(&Klayman::sub44FA50));
+		setCallback2(AnimationCallback(&KmScene1001::sub44FA50));
 		break;
 	case 0x4812:
 		debug("########### B");				
 		// TODO setCallback2(AnimationCallback(&Klayman::sub41FF80));
 		break;
-		
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+
 	case 0x4836:
 		if (param.asInteger() == 1) {
 			_parentScene->sendMessage(0x2002, 0, this);
@@ -169,7 +172,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 
 	case 0x4840:
 		sub41CD70(param.asInteger());
-		break;		
+		break;
 	}
 
 	// TODO
@@ -189,7 +192,8 @@ void KmScene1001::sub44FA50() {
 }
 
 uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage(messageNum, param, sender);
+	debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
+	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
@@ -372,7 +376,6 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 		}
 		break;
 	case 0x1011:
-		debug("Click lever");
 		_parentScene->sendMessage(0x4826, 0, this);
 		messageResult = 1;
 		break;
@@ -531,11 +534,10 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x21E64A00) {
 			if (_vm->getGlobalVar(0xD217189D)) {
 				setMessageList(0x004B48A8);
-				messageResult = 1;
 			} else {
 				setMessageList(0x004B48C8);
-				messageResult = 1;
 			}
+			messageResult = 1;
 		} else if (param.asInteger() == 0x040424D0) {
 			_klayman->sendMessage(0x1014, _ssButton, this);
 		} else if (param.asInteger() == 0x80006358) {
@@ -547,7 +549,6 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2002:
-		debug("########## setRectList(0x004B49F0);");
 		setRectList(0x004B49F0);
 		break;
 	case 0x480B:
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 0e3e0a3..9c02919 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -79,6 +79,11 @@ Common::Error NeverhoodEngine::run() {
 	_res->addArchive("t.blb");
 
 	CursorMan.showMouse(true);
+	{
+		byte buffer[2*2];
+		memset(buffer, 255, 4);
+		CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0);
+	}
 
 #if 0
 	BlbArchive *blb = new BlbArchive();
@@ -143,9 +148,6 @@ Common::Error NeverhoodEngine::run() {
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
 				_keyState = event.kbd.keycode;
-				
-				// DEBUG gameModule->sendMessage(0x480F, 0, NULL);
-				
 				break;
 			case Common::EVENT_KEYUP:
 				_keyState = Common::KEYCODE_INVALID;
@@ -186,7 +188,7 @@ Common::Error NeverhoodEngine::run() {
 		_screen->wait();
 		_screen->update();
 		
-		//debug("---------------------------------------");
+		debug("---------------------------------------");
 	
 	}
 	
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index e3a29c5..83078af 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -267,8 +267,6 @@ void AnimResource::unload() {
 
 void AnimResource::clear() {
 	_resourceHandle = -1;
-	// _count = 0;
-	// _infoStructs = NULL;
 	_currSpriteData = NULL;
 	_fileHash = 0;
 	_paletteData = NULL;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 9d7d550..9e1f06b 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -180,13 +180,13 @@ void Scene::update() {
 	if (_smkFileHash != 0) {
 		// TODO
 		//**** ALL TODO
-		//_smackerPlayer = new SmackerPlayer(this, _smkFileHash, true, 0);
+		_smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0);
 		_savedUpdateHandlerCb = _updateHandlerCb;
 		_savedMessageHandlerCb = _messageHandlerCb;
 		SetUpdateHandler(&Scene::smackerUpdate);  
 		SetMessageHandler(&Scene::smackerHandleMessage);
 		_smackerDone = false;
-		// smackerUpdate();
+		smackerUpdate();
 		// g_screen->smackerPlayer = _smackerPlayer;  
 		_smkFileHash = 0;
 	} else {
@@ -219,7 +219,6 @@ void Scene::update() {
 }
 
 uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	// TODO
 	switch (messageNum) {
 	case 0: // mouse moved
 #if 0	
@@ -348,9 +347,8 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 				}
 			}
 		}
-		return true;
 	}
-	return false;
+	return true;
 }
 
 void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackFlag) {
@@ -358,6 +356,7 @@ void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackF
 }
 
 void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
+	debug("Scene::setMessageList(%p)", (void*)messageList);
 	_messageList = messageList;
 	_messageListCount = _messageList ? _messageList->size() : 0;
 	_messageListIndex = 0;
@@ -366,6 +365,13 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool
 	_systemCallbackFlag = systemCallbackFlag;
 	_messageListStatus = 1;
 	_klayman->sendMessage(0x101C, 0, this);
+	
+	// DEBUG: Show message list
+	for (uint i = 0; i < messageList->size(); i++) {
+		debug("%02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
+	}
+	debug("================================================================");
+	
 }
 
 bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallbackFlag) {
@@ -404,24 +410,19 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 		}
 		_messageList2 = messageList;
 		setMessageList(messageList, messageListFlag, systemCallbackFlag);
+		result = true;
 	}
 	return result;
 }
 
 void Scene::runMessageList() {
+	debug("Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1);
 
-	//debug("_messageListFlag2 = %d", _messageListFlag2);
-
-	if (_messageListFlag2)
+	if (_messageListFlag2 || _messageListFlag1)
 		return;
 
 	_messageListFlag2 = true;
 
-	if (_messageListFlag1) {
-		_messageListFlag2 = false;
-		return;
-	}
-
 	if (!_messageList) {
 		_messageList2 = NULL;
 		_messageListStatus = 0;
@@ -433,7 +434,7 @@ void Scene::runMessageList() {
 			int messageNum = (*_messageList)[_messageListIndex].messageNum;
 			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
 			
-			debug("$$$$$$$$$$$ Scene::runMessageList() %04X, %08X", messageNum, messageParam);
+			//debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
 			
 			_messageListIndex++;
 			if (_messageListIndex == _messageListCount) {
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index d925750..713bfef 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -73,10 +73,12 @@ bool Sprite::isPointInside(int16 x, int16 y) {
 }
 
 uint32 Sprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	if (messageNum == 5) {
+	switch (messageNum) {
+	case 0x0005:
 		// TODO: Draw debug marker (?)
 		// TODO g_Screen->drawLine(_x - 5, _y, _x + 6, _y);
 		// TODO g_Screen->drawLine(_x, _y - 5, _x, _y + 6);
+		break;
 	}
 	return 0;
 }
@@ -268,14 +270,16 @@ void AnimatedSprite::updateAnim() {
 					if (_animResource.loadInternal(_fileHash2)) {
 						_fileHash3 = _fileHash2;
 					} else {
+						debug("TODO");
 						// TODO _animResource.loadInternal(calcHash("sqDefault"));
 						_fileHash3 = 0;
 					}
 					if (_replNewByte != _replOldByte) {
+						debug("TODO");
 						// TODO _animResource.setRepl(_replOldByte, _replNewByte);
 					}
 					_fileHash2 = 0;
-					if (_status != 0) {
+					if (_animStatus != 0) {
 						_frameIndex = _fileHash6 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash6)) : 0;
 						_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
 					} else {
@@ -292,17 +296,19 @@ void AnimatedSprite::updateAnim() {
 	}
 	
 	if (_fileHash1 != 0) {
-		if (_status == 2) {
+		if (_animStatus == 2) {
 			_hashListIndex = _frameIndex;
 		} else {
-			if (_status == 1) {
+			if (_animStatus == 1) {
 				if (_animResource.loadInternal(_fileHash1)) {
 					_fileHash3 = _fileHash1;
 				} else {
+					debug("TODO");
 					// TODO _animResource.loadInternal(calcHash("sqDefault"));
 					_fileHash3 = 0;
 				}
 				if (_replNewByte != _replOldByte) {
+					debug("TODO");
 					// TODO _animResource.setRepl(_replOldByte, _replNewByte);
 				}
 				_fileHash1 = 0;
@@ -312,10 +318,12 @@ void AnimatedSprite::updateAnim() {
 				if (_animResource.loadInternal(_fileHash1)) {
 					_fileHash3 = _fileHash1;
 				} else {
+					debug("TODO");
 					// TODO _animResource.loadInternal(calcHash("sqDefault"));
 					_fileHash3 = 0;
 				}
 				if (_replNewByte != _replOldByte) {
+					debug("TODO");
 					// TODO _animResource.setRepl(_replOldByte, _replNewByte);
 				}
 				_fileHash1 = 0;
@@ -419,7 +427,7 @@ void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frame
 	_frameIndex3 = frameIndex3;
 	_frameIndex4 = frameIndex4;
 	_fileHash4 = 0;
-	_status = 0;
+	_animStatus = 0;
 	_playBackwards = false;
 	_newHashListIndex = -1;
 	_hashListIndex = -1;
@@ -427,7 +435,7 @@ void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frame
 
 void AnimatedSprite::setFileHash1() {
 	_fileHash1 = 1;
-	_status = 2;
+	_animStatus = 2;
 }
 
 void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) {
@@ -435,7 +443,7 @@ void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 file
 	_fileHash6 = fileHash6;
 	_fileHash5 = fileHash5;
 	_fileHash4 = 0;
-	_status = 1;
+	_animStatus = 1;
 	_playBackwards = false;
 	_newHashListIndex = -1;
 	_hashListIndex = -1;
@@ -446,7 +454,7 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil
 	_fileHash6 = fileHash6;
 	_fileHash5 = fileHash5;
 	_fileHash4 = 0;
-	_status = 1;
+	_animStatus = 1;
 	_playBackwards = false;
 	_newHashListIndex = -1;
 	_hashListIndex = -1;
@@ -456,13 +464,12 @@ void AnimatedSprite::setCallback1(AnimationCb callback1) {
 	if (_callback1Cb) {
 		(this->*_callback1Cb)();
 	}
-	SetAnimationCallback1(callback1);
+	_callback1Cb = callback1;
 }
 
 void AnimatedSprite::setCallback2(AnimationCb callback2) {
 
 	if (_callback1Cb) {
-		// _callback1Cb has to be cleared before it's called
 		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
 		(this->*cb)();
@@ -481,7 +488,6 @@ void AnimatedSprite::setCallback2(AnimationCb callback2) {
 void AnimatedSprite::removeCallbacks() {
 
 	if (_callback1Cb) {
-		// _callback1Cb has to be cleared before it's called
 		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
 		(this->*cb)();
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 160bfe1..16f741a 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -113,7 +113,7 @@ protected:
 	int16 _frameIndex4;
 	uint32 _fileHash6;
 	uint32 _fileHash5;
-	int16 _status;
+	int16 _animStatus;
 	int16 _counter;
 	int _hashListIndex;
 	int _newHashListIndex;
@@ -143,7 +143,6 @@ protected:
 	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);
 	void setCallback1(AnimationCb callback1);
 	void setCallback2(AnimationCb callback2);
-	int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!!
 	void removeCallbacks();
 };
 


Commit: ed863b65b506fac9b55b83a4afa0a30c4bb8da8a
    https://github.com/scummvm/scummvm/commit/ed863b65b506fac9b55b83a4afa0a30c4bb8da8a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:46-07:00

Commit Message:
NEVERHOOD: More work on Scene1001/Klayman

- The button can now be used, but looking at the open window doesn't work yet since game variables aren't implemented yet.

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 4a40b2f..a256495 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -476,6 +476,7 @@ void Klayman::sub41C930(int16 x, bool flag) {
 		_x4 = x;
 	} else if (flag) {
 		_x4 = x;
+		error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));");
 		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
 	} else {
 		_x4 = x;
@@ -661,8 +662,7 @@ void Klayman::sub41CD70(int16 x) {
 	debug("Klayman::sub41CD70(%d)", x);
 	if (x > _x) {
 		if (ABS(x - _x) <= 105) {
-			debug("// TODO sub41CAC0(x);");
-			// TODO sub41CAC0(x);
+			sub41CAC0(x);
 		} else {
 			sub41C930(x, false);
 		}
@@ -761,7 +761,7 @@ void Klayman::sub41FA40() {
 	if (_status3 == 2) {
 		sub41C7B0();
 	} else if (_status3 == 3) {
-		debug("/////////////////////////////////////////////////// TODO sub420F20();");
+		error("// TODO sub420F20();");
 		// TODO sub420F20();
 	} else {
 		_flagE2 = true;
@@ -862,4 +862,244 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub41FF80() {
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x);
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub41FF80))) {
+		_status2 = 1;
+		_flagE5 = false;
+		setFileHash(0x1C28C178, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41D4C0);
+		SetSpriteCallback(NULL);
+	}
+}
+
+uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41D4C0(%04X)", messageNum);
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC1380080) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x4806, 0, this);
+			}
+			_soundResource1.play(0x40208200);
+		} else if (param.asInteger() == 0x02B20220) {
+			_soundResource1.play(0xC5408620);
+		} else if (param.asInteger() == 0x03020231) {
+			_soundResource1.play(0xD4C08010);
+		} else if (param.asInteger() == 0x67221A03) {
+			_soundResource1.play(0x44051000);
+		} else if (param.asInteger() == 0x2EAE0303) {
+			_soundResource1.play(0x03630300);
+		} else if (param.asInteger() == 0x61CE4467) {
+			_soundResource1.play(0x03630300);
+		}
+		break;
+	}
+	return messageResult;
+
+}
+
+void Klayman::sub420120() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420120))) {
+		_status2 = 2;
+		_flagE5 = true;
+		setFileHash(0x1C02B03D, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41DAD0);
+		SetSpriteCallback(NULL);
+	}
+}
+
+uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41DAD0(%04X)", messageNum);
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0D01B294) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x480B, 0, this);
+			}
+		} else if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub420170() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420170))) {
+		_status2 = 2;
+		_flagE5 = true;
+		setFileHash(0x1C16B033, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41DAD0);
+		SetSpriteCallback(NULL);
+	}
+}
+
+void Klayman::sub4200D0() {
+	if (!sub41CF10(AnimationCallback(&Klayman::sub4200D0))) {
+		_status2 = 1;
+		_flagE5 = true;
+		setFileHash(0x1CD89029, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41DAD0);
+		SetSpriteCallback(&Klayman::spriteUpdate41F250);
+	}
+}
+
+void Klayman::sub41CD00(int16 x) {
+	if (_x > x) {
+		if (_x - x <= 105) {
+			sub41CAC0(x);
+		} else {
+			sub41C930(x, false);
+		}
+	} else if (_x < x) {
+		sub41C930(x, false);
+	} else {
+		_x4 = x;
+		setCallback2(NULL);
+		sub41C7B0();
+	}
+}
+
+void Klayman::sub41CC40(int16 x1, int16 x2) {
+	if (_x > x1) {
+		if (_x == x1 + x2) {
+			_x4 = x1 + x2;
+			setCallback2(NULL);
+			sub41C7B0();
+		} else if (_x < x1 + x2) {
+			sub41CAC0(x1 + x2);
+		} else {
+			sub41C930(x1 + x2, false);
+		}
+	} else {
+		if (_x == x1 - x2) {
+			_x4 = x1 - x2;
+			setCallback2(NULL);
+			sub41C7B0();
+		} else if (_x > x1 - x2) {
+			sub41CAC0(x1 - x2);
+		} else {
+			sub41C930(x1 - x2, false);
+		}
+	}
+}
+
+void Klayman::sub41CAC0(int16 x) {
+	debug("Klayman::sub41CAC0(%d)", x);
+	int16 xdiff = ABS(x - _x);
+	if (x == _x) {
+		_x4 = x;
+		if (!_flagE1 && !_flagE2 && !_flagE3) {
+			setCallback2(NULL);
+			sub41C7B0();
+		}
+	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
+		_x4 = x;
+		setCallback2(NULL);
+		sub41C7B0();
+	} else if (xdiff <= 42 && _status3 != 3) {
+		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
+			_x4 = x;
+		} else {
+			_x4 = x;
+			setCallback2(AnimationCallback(&Klayman::sub41FB40));
+		}
+	} else if (_flagE3 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_x4 = x;
+	} else {
+		_x4 = x;
+		setCallback2(AnimationCallback(&Klayman::sub41FBC0));
+	}
+}
+
+void Klayman::sub41FBC0() {
+	_status2 = 2;
+	_flagE3 = true;
+	_flagE5 = true;
+	setDoDeltaX(_x4 >= _x);
+	setFileHash(0x08B28116, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41DF10);
+	SetSpriteCallback(&Klayman::spriteUpdate41F780);
+	setCallback1(AnimationCallback(&Klayman::sub41FC30));	
+}
+
+void Klayman::sub41FC30() {
+	_flagE3 = false;
+}
+
+void Klayman::spriteUpdate41F780() {
+	int16 xdiff = _x4 - _x;
+	
+	if (_doDeltaX) {
+		_deltaX = -_deltaX;
+	}
+	
+	if (_frameIndex == 7) {
+		_deltaX = xdiff;
+	}
+
+	if ((xdiff > 0 && xdiff > _deltaX) || (xdiff < 0 && xdiff < _deltaX))
+		xdiff = _deltaX;
+
+	_deltaX = 0;
+	
+	if (_x != _x4) {
+		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		_x += xdiff;
+		if (_field114) {
+			debug("// TODO KlaymanSprite_sub_41CF70();");
+			// TODO KlaymanSprite_sub_41CF70();
+		} else {
+			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+			if (hitRectNext->type == 0x5002) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
+			} else if (hitRectNext->type == 0x5003) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
+			} else if (hitRectPrev->type == 0x5002) {
+				if (xdiff > 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			} else if (hitRectPrev->type == 0x5003) {
+				if (xdiff < 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			}
+		}
+		processDelta();
+	}
+}
+
+uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41DF10(%04X)", messageNum);
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0A2AA8E0);
+		}
+		break;
+	case 0x3002:
+		_x = _x4;
+		sub41C7B0();
+		break;		
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 7b65e8d..860368a 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -53,9 +53,15 @@ public:
 	void sub41FC80();
 	void sub4211F0();
 	void sub4211B0();
+	void sub41FF80();
+	void sub420120();
+	void sub420170();
+	void sub4200D0();
+	void sub41FBC0();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
+	void spriteUpdate41F780();
 
 protected:
 	Entity *_parentScene;
@@ -152,6 +158,17 @@ protected:
 	void spriteUpdate41F320();
 	
 	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
+
+	uint32 handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	uint32 handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub41CD00(int16 x);
+	void sub41CC40(int16 x1, int16 x2);
+	void sub41CAC0(int16 x);
+	void sub41FC30();
+	
+	uint32 handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender);
 	
 };
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index c631dc0..0d727ba 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -155,14 +155,32 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&KmScene1001::sub44FA50));
 		break;
 	case 0x4812:
-		debug("########### B");				
-		// TODO setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		}else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		sub41C7B0();
 		break;		
 
+	case 0x481B:
+		// TODO: It's not really a point but an x1/x2 pair
+		if (param.asPoint().x != 0) {
+			sub41CC40(param.asPoint().x, param.asPoint().y);
+		} else {
+			error("// TODO sub41CCE0(param.asPoint().y);");
+			// TODO sub41CCE0(param.asPoint().y);
+		}
+		break;
+
 	case 0x4836:
 		if (param.asInteger() == 1) {
 			_parentScene->sendMessage(0x2002, 0, this);
@@ -170,6 +188,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;		
 
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+
 	case 0x4840:
 		sub41CD70(param.asInteger());
 		break;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 9e1f06b..ebf92d8 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -368,9 +368,9 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool
 	
 	// DEBUG: Show message list
 	for (uint i = 0; i < messageList->size(); i++) {
-		debug("%02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
+		debug("A: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
 	}
-	debug("================================================================");
+	debug("A: ================================================================");
 	
 }
 
@@ -382,6 +382,12 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 	bool result = false;
 	
 	debug("Scene::setMessageList2(%p)", (void*)messageList);
+
+	// DEBUG: Show message list
+	for (uint i = 0; i < messageList->size(); i++) {
+		debug("B: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
+	}
+	debug("B: ================================================================");
 	
 	if (_messageListStatus == 1) {
 		if (messageList != _messageList2) {


Commit: 6d81ef0199e3213a97c4ff8856322341ac231022
    https://github.com/scummvm/scummvm/commit/6d81ef0199e3213a97c4ff8856322341ac231022
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Implement game vars

Changed paths:
  A engines/neverhood/gamevars.cpp
  A engines/neverhood/gamevars.h
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index c570084..7538b36 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -24,6 +24,7 @@
 #define NEVERHOOD_ENTITY_H
 
 #include "neverhood/neverhood.h"
+#include "neverhood/gamevars.h"
 #include "neverhood/graphics.h"
 
 namespace Neverhood {
@@ -104,6 +105,22 @@ public:
 		return sendMessage(messageNum, MessageParam((Entity*)param), sender);
 	}
 	int getPriority() const { return _priority; }
+	// Shortcuts for game variable access
+	uint32 getGlobalVar(uint32 nameHash) {
+		return _vm->_gameVars->getGlobalVar(nameHash);
+	}
+	void setGlobalVar(uint32 nameHash, uint32 value) {
+		_vm->_gameVars->setGlobalVar(nameHash, value);
+	}
+	uint32 getSubVar(uint32 nameHash, uint32 subNameHash) {
+		return _vm->_gameVars->getSubVar(nameHash, subNameHash);
+	}
+	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
+		_vm->_gameVars->setSubVar(nameHash, subNameHash, value);
+	}
+	void incGlobalVar(uint32 nameHash, int incrValue) {
+		setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue);
+	}
 protected:
 	void (Entity::*_updateHandlerCb)();
 	uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 47fff17..9989bba 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -103,7 +103,7 @@ void GameModule::startup() {
 
 void GameModule::createModule1500(int which) {
 	_someFlag1 = false;
-	_vm->setGlobalVar(0x91080831, 0x00F10114);
+	setGlobalVar(0x91080831, 0x00F10114);
 	_childObject = new Module1500(_vm, this, which, true);
 	SetUpdateHandler(&GameModule::updateModule1500);
 }
@@ -122,7 +122,7 @@ void GameModule::updateModule1500() {
 }
 
 void GameModule::createModule1000(int which) {
-	_vm->setGlobalVar(0x91080831, 0x03294419);
+	setGlobalVar(0x91080831, 0x03294419);
 	_childObject = new Module1000(_vm, this, which);
 	SetUpdateHandler(&GameModule::updateModule1000);
 }
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
new file mode 100644
index 0000000..98ae709
--- /dev/null
+++ b/engines/neverhood/gamevars.cpp
@@ -0,0 +1,105 @@
+/* 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/gamevars.h"
+
+namespace Neverhood {
+
+GameVars::GameVars() {
+	addVar(0, 0);
+}
+
+GameVars::~GameVars() {
+}
+
+uint32 GameVars::getGlobalVar(uint32 nameHash) {
+	debug("GameVars::getGlobalVar(%08X)", nameHash);
+	int16 varIndex = findSubVarIndex(0, nameHash);
+	return varIndex != -1 ? _vars[varIndex].value : 0;
+}
+
+void GameVars::setGlobalVar(uint32 nameHash, uint32 value) {
+	debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value);
+	_vars[getSubVarIndex(0, nameHash)].value = value;
+}
+
+uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) {
+	debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash);
+	uint32 value = 0;
+	int16 varIndex = findSubVarIndex(0, nameHash);
+	if (varIndex != -1) {
+		int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
+		if (subVarIndex != -1) {
+			value = _vars[subVarIndex].value;
+		}
+	} 
+	return value;
+}
+
+void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
+	debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value);
+	_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value;
+}
+
+int16 GameVars::addVar(uint32 nameHash, uint32 value) {
+	debug("GameVars::addVar(%08X, %d)", nameHash, value);
+	GameVar gameVar;
+	gameVar.nameHash = nameHash;
+	gameVar.value = value;
+	gameVar.firstIndex = -1;
+	gameVar.nextIndex = -1;
+	_vars.push_back(gameVar);
+	return _vars.size() - 1;
+}
+
+int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) {
+	debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash);
+	for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) {
+		if (_vars[nextIndex].nameHash == subNameHash)
+			return nextIndex;
+	}
+	return -1;
+}
+
+int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
+	debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value);
+	int16 nextIndex = _vars[varIndex].firstIndex;
+	if (nextIndex == -1) {
+		_vars[varIndex].firstIndex = addVar(subNameHash, value);
+		return _vars[varIndex].firstIndex;
+	} else {
+		while (_vars[nextIndex].nextIndex != -1)
+			nextIndex = _vars[nextIndex].nextIndex;
+		_vars[nextIndex].nextIndex = addVar(subNameHash, value);
+		return _vars[nextIndex].nextIndex;
+	}
+}
+
+int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
+	debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
+	int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
+	if (subVarIndex == -1)
+		subVarIndex = addSubVar(varIndex, subNameHash, 0);
+	return subVarIndex;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
new file mode 100644
index 0000000..863aa1b
--- /dev/null
+++ b/engines/neverhood/gamevars.h
@@ -0,0 +1,57 @@
+/* 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_GAMEVARS_H
+#define NEVERHOOD_GAMEVARS_H
+
+#include "common/array.h"
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+struct GameVar {
+	uint32 nameHash;
+	uint32 value;
+	int16 firstIndex, nextIndex;
+};
+
+class GameVars {
+public:
+	GameVars();
+	~GameVars();
+	// TODO void load(???);
+	// TODO void save(???);
+	uint32 getGlobalVar(uint32 nameHash);
+	void setGlobalVar(uint32 nameHash, uint32 value);
+	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
+	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
+protected:
+	Common::Array<GameVar> _vars;
+	int16 addVar(uint32 nameHash, uint32 value);
+	int16 findSubVarIndex(int16 varIndex, uint32 subNameHash);
+	int16 addSubVar(int16 varIndex, uint32 subNameHash, uint32 value);
+	int16 getSubVarIndex(int16 varIndex, uint32 subNameHash);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_GAMEVARS_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index eb656de..7961bc9 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS = \
 	collisionman.o \
 	detection.o \
 	gamemodule.o \
+	gamevars.o \
 	graphics.o \
 	klayman.o \
 	module.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 0d727ba..b3c07c9 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -29,7 +29,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	debug("Create Module1000(%d)", which);
 
-	_musicFileHash = _vm->getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;		
+	_musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;		
 
 	// TODO Music18hList_add(0x03294419, 0x061880C6);
 	// TODO Music18hList_add(0x03294419, _musicFileHash);
@@ -256,7 +256,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param,
 }
 
 void AsScene1001Door::handleMessage2000h() {
-	switch (_vm->getGlobalVar(0x52371C95)) {
+	switch (getGlobalVar(0x52371C95)) {
 	case 0:
 	case 1:
 		_soundResource1.play(0x65482F03);
@@ -272,11 +272,11 @@ void AsScene1001Door::handleMessage2000h() {
 		// Nothing
 		break;		
 	}
-	_vm->incGlobalVar(0x52371C95, 1);
+	incGlobalVar(0x52371C95, 1);
 }
 
 void AsScene1001Door::callback1() {
-	switch (_vm->getGlobalVar(0x52371C95)) {
+	switch (getGlobalVar(0x52371C95)) {
 	case 1:
 		setFileHash(0x624C0498, 4, -1);
 		_newHashListIndex = 4;
@@ -297,7 +297,7 @@ void AsScene1001Door::callback1() {
 }
 
 void AsScene1001Door::callback2() {
-	_vm->setGlobalVar(0xD217189D, 1);
+	setGlobalVar(0xD217189D, 1);
 	setFileHash(0x624C0498, 6, 6);
 	SetAnimationCallback3(&AsScene1001Door::callback3);
 	_x = 30;
@@ -367,7 +367,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 		break;
 	case 0x3002:
 		SetMessageHandler(NULL);
-		_vm->setGlobalVar(0x03C698DA, 1);
+		setGlobalVar(0x03C698DA, 1);
 		_surface->setVisible(false);
 		break;
 	}
@@ -474,7 +474,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
 		setRectList(0x004B49F0);
-		if (_vm->getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(0xC0418A02)) {
 			_klayman = new KmScene1001(_vm, this, 390, 433);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -496,7 +496,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
 	_klayman->getSurface()->getClipRect().y2 = 480;
 	
-	if (_vm->getGlobalVar(0xD217189D) == 0) {
+	if (getGlobalVar(0xD217189D) == 0) {
 		_asDoor = addSprite(new AsScene1001Door(_vm));
 		_asDoor->getSurface()->getClipRect().x1 = 0;
 		_asDoor->getSurface()->getClipRect().y1 = 0;
@@ -513,7 +513,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0));
 
-	if (_vm->getGlobalVar(0x03C698DA) == 0) {
+	if (getGlobalVar(0x03C698DA) == 0) {
 		staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200));
 		_asWindow = addSprite(new AsScene1001Window(_vm));
 		_asWindow->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x;
@@ -529,7 +529,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1001::~Scene1001() {
-	// TODO _vm->setGlobalVar(0xC0418A02, _klayman->_doDeltaX);
+	// TODO setGlobalVar(0xC0418A02, _klayman->_doDeltaX);
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -538,7 +538,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x == 0 && _vm->getGlobalVar(0xA4014072)) {
+		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
 			_parentModule->sendMessage(0x1009, 0, this);
 		}
 		break;
@@ -554,7 +554,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 			setMessageList2(0x004B4910);
 			messageResult = 1;
 		} else if (param.asInteger() == 0x21E64A00) {
-			if (_vm->getGlobalVar(0xD217189D)) {
+			if (getGlobalVar(0xD217189D)) {
 				setMessageList(0x004B48A8);
 			} else {
 				setMessageList(0x004B48C8);
@@ -563,7 +563,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x040424D0) {
 			_klayman->sendMessage(0x1014, _ssButton, this);
 		} else if (param.asInteger() == 0x80006358) {
-			if (_vm->getGlobalVar(0x03C698DA)) {
+			if (getGlobalVar(0x03C698DA)) {
 				setMessageList(0x004B4938);
 			} else {
 				setMessageList(0x004B4960);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 9c02919..77483c5 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -30,6 +30,7 @@
 #include "neverhood/blbarchive.h"
 #include "neverhood/collisionman.h"
 #include "neverhood/gamemodule.h"
+#include "neverhood/gamevars.h"
 #include "neverhood/graphics.h"
 #include "neverhood/resourceman.h"
 #include "neverhood/resource.h"
@@ -67,6 +68,8 @@ Common::Error NeverhoodEngine::run() {
 	_staticData = new StaticData();
 	_staticData->load("neverhood.dat");
 
+	_gameVars = new GameVars();
+
 	_screen = new Screen(this);
 
 	_res = new ResourceMan();
@@ -198,6 +201,7 @@ Common::Error NeverhoodEngine::run() {
 	delete _res;
 	delete _screen;
 
+	delete _gameVars;
 	delete _staticData;
 	
 	debug("Ok.");
@@ -205,26 +209,4 @@ Common::Error NeverhoodEngine::run() {
 	return Common::kNoError;
 }
 
-uint32 NeverhoodEngine::getGlobalVar(uint32 nameHash) {
-	// TODO
-	return 0;
-}
-
-void NeverhoodEngine::setGlobalVar(uint32 nameHash, uint32 value) {
-	// TODO
-}
-
-void NeverhoodEngine::incGlobalVar(uint32 nameHash, int incrValue) {
-	setGlobalVar(nameHash, getGlobalVar(nameHash) - incrValue);
-}
-
-uint32 NeverhoodEngine::getSubVar(uint32 nameHash, uint32 subNameHash) {
-	// TODO
-	return 0;
-}
-
-void NeverhoodEngine::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
-	// TODO
-}
-
 } // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 952a99d..0070f08 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -41,6 +41,7 @@ struct NeverhoodGameDescription;
 
 class CollisionMan;
 class GameModule;
+class GameVars;
 class ResourceMan;
 class Screen;
 class StaticData;
@@ -73,6 +74,7 @@ public:
 	uint16 _buttonState;
 
 	GameState _gameState;
+	GameVars *_gameVars;
 	Screen *_screen;
 	ResourceMan *_res;
 	GameModule *_gameModule;
@@ -114,11 +116,6 @@ public:
 #endif
 
 	GameState& gameState() { return _gameState; }
-	uint32 getGlobalVar(uint32 nameHash);
-	void setGlobalVar(uint32 nameHash, uint32 value);
-	void incGlobalVar(uint32 nameHash, int incrValue);
-	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
-	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
 
 public:
 
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index d47dbb0..1584ac3 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -32,7 +32,7 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl
 
 	// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
 	
-	if (_vm->getGlobalVar(0x06C02850)) {
+	if (getGlobalVar(0x06C02850)) {
 		_flag1 = true;
 		_canAbort = true;
 	}
@@ -76,9 +76,9 @@ void SmackerScene::nextVideo() {
 			_parentModule->sendMessage(0x1009, 0, this);
 			return;
 		}
-		_fieldDF = _vm->getSubVar(0x00800410, smackerFileHash);
+		_fieldDF = getSubVar(0x00800410, smackerFileHash);
 		if (!_fieldDF) {
-			_vm->setSubVar(0x00800410, smackerFileHash, 1);
+			setSubVar(0x00800410, smackerFileHash, 1);
 		}
 		if (_fileHashListIndex == 0) {
 			_smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false);


Commit: c39fb81951dd1a442c9811ba7ce202fa3619be70
    https://github.com/scummvm/scummvm/commit/c39fb81951dd1a442c9811ba7ce202fa3619be70
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: More work on Scene1001/Klayman

- Looking through the open window now works (mostly).

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index a256495..db88daf 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -1102,4 +1102,64 @@ uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub420870() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0xD820A114, 0, 10);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub4208B0() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0xD820A114, 30, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub4208F0() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x9B250AD2, 0, 7);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EEF0);
+	SetSpriteCallback(NULL);
+}
+
+uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Klayman::handleMessage41EEF0(%04X)", messageNum);
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub420930() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x98F88391, 4, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EEF0);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub420830() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0xD820A114, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 860368a..4d883c3 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -58,6 +58,11 @@ public:
 	void sub420170();
 	void sub4200D0();
 	void sub41FBC0();
+	void sub420870();
+	void sub4208B0();
+	void sub4208F0();
+	void sub420930();
+	void sub420830();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -170,6 +175,8 @@ protected:
 	
 	uint32 handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender);
 	
+	uint32 handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender);
+	
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index b3c07c9..d31044c 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -65,7 +65,6 @@ Module1000::~Module1000() {
 }
 
 void Module1000::createScene1001(int which) {
-	debug("createScene1501");
 	_vm->gameState().sceneNum = 0;
 	_childObject = new Scene1001(_vm, this, which);
 	// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3);
@@ -77,6 +76,10 @@ void Module1000::createScene1002(int which) {
 }
 
 void Module1000::createScene1003(int which) {
+	_vm->gameState().sceneNum = 2;
+	_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
+	SetUpdateHandler(&Module1000::updateScene1003);
+	// TODO Music18hList_play(0x061880C6, 0, 0);
 }
 
 void Module1000::createScene1004(int which) {
@@ -89,12 +92,15 @@ void Module1000::updateScene1001() {
 	_childObject->handleUpdate();
 
 	if (_done) {
+	
+		debug("SCENE 1001 DONE; _field20 = %d", _field20);
+	
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 2) {
-			// TODO createScene1003();
-			// TODO _childObject->handleUpdate();
+			createScene1003(0);
+			_childObject->handleUpdate();
 		} else {
 			// TODO createScene1002();
 			// TODO _childObject->handleUpdate();
@@ -122,6 +128,14 @@ void Module1000::updateScene1002() {
 }
 			
 void Module1000::updateScene1003() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1001(2);
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module1000::updateScene1004() {
@@ -181,6 +195,25 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger());
+		sub41C7B0();
+		break;
+
 	case 0x4836:
 		if (param.asInteger() == 1) {
 			_parentScene->sendMessage(0x2002, 0, this);
@@ -197,8 +230,6 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	}
 
-	// TODO
-
 	return 0;
 }
 
@@ -461,9 +492,8 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0));
 	_palette = new Palette(_vm, 0x4086520E);
 	_palette->usePalette();
+	// TODO _mouseCursor = addSprite(new Class433(_vm, 6520A400, 0));
 	
-	// TODO Mouse
-
 	if (which < 0) {
 		setRectList(0x004B49F0);
 		_klayman = new KmScene1001(_vm, this, 200, 433);
@@ -587,4 +617,32 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+// Class152
+
+Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
+	: Scene(vm, parentModule, true), _fieldD0(-1), _fieldD2(-1) {
+
+	_surfaceFlag = false;
+
+	SetMessageHandler(&Class152::handleMessage);
+	
+	_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
+	_palette = new Palette(_vm, backgroundFileHash);
+	_palette->usePalette();
+	// TODO _mouseCursor = addSprite(new Class435(_vm, cursorFileHash, 20, 620));
+	
+}
+
+uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index d74a0e1..c1c7c8e 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -130,6 +130,18 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+// TODO: Move this to some common file since it's used several times
+
+class Class152 : public Scene {
+public:
+	Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash);
+protected:
+	// TODO: Are these used?
+	int16 _fieldD0;	
+	int16 _fieldD2;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1000_H */


Commit: 9f6e6c6f7fde2e1c927deee732cb03cf34d18455
    https://github.com/scummvm/scummvm/commit/9f6e6c6f7fde2e1c927deee732cb03cf34d18455
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Implement MouseCursorResource and Mouse433 mouse cursor

Changed paths:
  A engines/neverhood/mouse.cpp
  A engines/neverhood/mouse.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 9989bba..c2d3e6d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -58,6 +58,16 @@ GameModule::~GameModule() {
 
 }
 
+void GameModule::handleMouseMove(int16 x, int16 y) {
+	if (_childObject) {
+		NPoint mousePos;
+		mousePos.x = x;
+		mousePos.y = y;
+		debug("GameModule::handleMouseMove(%d, %d)", x, y);
+		_childObject->sendPointMessage(0, mousePos, this);
+	}				
+}
+
 void GameModule::handleMouseDown(int16 x, int16 y) {
 	if (_childObject) {
 		NPoint mousePos;
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 7fce9eb..876506c 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -34,6 +34,7 @@ class GameModule : public Module {
 public:
 	GameModule(NeverhoodEngine *vm);
 	virtual ~GameModule();
+	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
 protected:
 	Entity *_prevChildObject;
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index f6ae118..68134bd 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -101,6 +101,12 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex,
 	}
 }
 
+void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum) {
+	if (frameNum < 3) {
+		mouseCursorResource.draw(frameNum, (byte*)_surface->pixels, _surface->pitch);
+	}
+}
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 59db1e5..2bddea3 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -52,6 +52,7 @@ struct NDrawRect {
 
 class AnimResource;
 class SpriteResource;
+class MouseCursorResource;
 
 // NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific
 
@@ -65,6 +66,7 @@ public:
 	void drawSpriteResource(SpriteResource &spriteResource);
 	void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height);
 	void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height);
+	void drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum);
 	int getPriority() const { return _priority; }
 	void setPriority(int priority) { _priority = priority; }
 	NDrawRect& getDrawRect() { return _drawRect; }
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 7911e44..790130a 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -30,6 +30,7 @@
 #include "neverhood/collisionman.h"
 #include "neverhood/entity.h"
 #include "neverhood/graphics.h"
+#include "neverhood/mouse.h"
 #include "neverhood/palette.h"
 #include "neverhood/screen.h"
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 7961bc9..e39041e 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -12,6 +12,7 @@ MODULE_OBJS = \
 	module.o \
 	module1000.o \
 	module1500.o \
+	mouse.o \
 	neverhood.o \
 	palette.o \
 	resource.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index d31044c..547f8c1 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -492,7 +492,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0));
 	_palette = new Palette(_vm, 0x4086520E);
 	_palette->usePalette();
-	// TODO _mouseCursor = addSprite(new Class433(_vm, 6520A400, 0));
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x6520A400, NULL));
 	
 	if (which < 0) {
 		setRectList(0x004B49F0);
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
new file mode 100644
index 0000000..5693048
--- /dev/null
+++ b/engines/neverhood/mouse.cpp
@@ -0,0 +1,131 @@
+/* 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/mouse.h"
+
+namespace Neverhood {
+
+// TODO: Use CursorMan
+
+Mouse433::Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect)
+	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0) {
+	
+	debug("Mouse433::Mouse433(%08X)", fileHash);
+	
+	if (mouseRect) {
+		_mouseRect = *mouseRect;
+	} else {
+		_mouseRect.x1 = -1;
+		_mouseRect.y1 = -1;
+		_mouseRect.x2 = -1;
+		_mouseRect.y2 = -1;
+	}
+	_mouseCursorResource.load(fileHash);
+	_x = _vm->getMouseX();	
+	_y = _vm->getMouseY();	
+	if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 &&
+		_y >= _mouseRect.y1 && _y <= _mouseRect.y2) {
+		_mouseCursorResource.setCursorNum(1);
+	} else {
+		_mouseCursorResource.setCursorNum(4);
+	}
+	createSurface(2000, 32, 32);
+	SetUpdateHandler(&Mouse433::update);
+	SetMessageHandler(&Mouse433::handleMessage);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = 32;
+	_drawRect.height = 32;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = 32;
+	_deltaRect.height = 32;
+	processDelta();
+	_needRefresh = true;
+	updateCursor();
+}
+
+void Mouse433::load(uint32 fileHash) {
+	_mouseCursorResource.load(fileHash);
+	_needRefresh = true;
+}
+
+void Mouse433::update() {
+	debug("Mouse433::update()");
+	updateCursor();
+	_frameNum++;
+	if (_frameNum >= 6)
+		_frameNum = 0;
+	_needRefresh = _frameNum % 2 == 0;		
+}
+
+uint32 Mouse433::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Mouse433::handleMessage(%04X)", messageNum);
+	uint32 messageResult = 0;
+	if (messageNum != 5) {
+		messageResult = Sprite::handleMessage(messageNum, param, sender);
+		switch (messageNum) {
+		case 0x4002:
+			_x = param.asPoint().x;
+			_y = param.asPoint().y;
+			if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 &&
+				_y >= _mouseRect.y1 && _y <= _mouseRect.y2) {
+				_mouseCursorResource.setCursorNum(1);
+			} else {
+				_mouseCursorResource.setCursorNum(4);
+			}
+			processDelta();
+			break;
+		}
+	} else {
+		// TODO: Debug stuff
+	}
+	return messageResult;
+}
+
+void Mouse433::updateCursor() {
+	debug("Mouse433::updateCursor()");
+	
+	if (!_surface)
+		return;
+
+	if (_doDeltaX) {
+		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
+	} else {
+		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
+	}   
+
+	if (_doDeltaY) {
+		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
+	} else {
+		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+	}
+
+	if (_needRefresh) {
+		_needRefresh = false;
+		_drawRect = _mouseCursorResource.getRect();
+		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
+	}
+
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
new file mode 100644
index 0000000..d03588f
--- /dev/null
+++ b/engines/neverhood/mouse.h
@@ -0,0 +1,48 @@
+/* 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_MOUSE_H
+#define NEVERHOOD_MOUSE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/sprite.h"
+#include "neverhood/graphics.h"
+#include "neverhood/resource.h"
+
+namespace Neverhood {
+
+class Mouse433 : public StaticSprite {
+public:
+	Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect);
+	void load(uint32 fileHash);
+protected:
+	MouseCursorResource _mouseCursorResource;
+	int _frameNum;
+	NRect _mouseRect;	
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void updateCursor();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MOUSE_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 77483c5..ab3cdc6 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -158,6 +158,7 @@ Common::Error NeverhoodEngine::run() {
 			case Common::EVENT_MOUSEMOVE:
 				_mouseX = event.mouse.x;
 				_mouseY = event.mouse.y;
+				_gameModule->handleMouseMove(event.mouse.x, event.mouse.y);
 				break;
 
 			case Common::EVENT_LBUTTONDOWN:
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 0070f08..4f6131a 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -69,7 +69,7 @@ public:
 
 	Common::RandomSource *_rnd;
 
-	int _mouseX, _mouseY;
+	int16 _mouseX, _mouseY;
 	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
@@ -116,6 +116,8 @@ public:
 #endif
 
 	GameState& gameState() { return _gameState; }
+	int16 getMouseX() const { return _mouseX; }
+	int16 getMouseY() const { return _mouseY; }
 
 public:
 
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 83078af..841827a 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -297,6 +297,58 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) {
 	return -1;			
 }
 
+MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) 
+	: _cursorSprite(vm), _cursorNum(4), _currFileHash(0) {
+
+	_rect.width = 32;
+	_rect.height = 32;
+}
+
+void MouseCursorResource::load(uint32 fileHash) {
+	if (_currFileHash != fileHash) {
+		if (_cursorSprite.load(fileHash) && !_cursorSprite.isRle() &&
+			_cursorSprite.getDimensions().width == 96 && _cursorSprite.getDimensions().height == 224) {
+			debug("load ok");
+			_currFileHash = fileHash; 
+		} else {
+			unload();
+		}
+	}
+}
+
+void MouseCursorResource::unload() {
+	_cursorSprite.unload();
+	_currFileHash = 0;
+	_cursorNum = 4;
+}
+
+NDrawRect& MouseCursorResource::getRect() {
+	static const NPoint kCursorHotSpots[] = {
+		{-15, -5},
+		{-17, -25},
+		{-17, -30},
+		{-14, -1},
+		{-3, -7},
+		{-30, -18},
+		{-1, -18}
+	};
+	_rect.x = kCursorHotSpots[_cursorNum].x;
+	_rect.y = kCursorHotSpots[_cursorNum].y;
+	return _rect;
+}
+
+void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) {
+	if (_cursorSprite.getPixels()) {
+		int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment
+		byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32;
+		for (int16 yc = 0; yc < 32; yc++) {
+			memcpy(dest, source, 32);
+			source += sourcePitch;
+			dest += destPitch;
+		}	
+	}
+}
+
 SoundResource::SoundResource(NeverhoodEngine *vm)
 	: _vm(vm) {
 }
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 7540956..b2a98c7 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -38,6 +38,8 @@ public:
 	void unload();
 	const NDimensions& getDimensions() { return _dimensions; }
 	NPoint& getPosition() { return _position; }
+	bool isRle() const { return _rle; }
+	byte *getPixels() const { return _pixels; }
 protected:
 	NeverhoodEngine *_vm;
 	int _resourceHandle;
@@ -99,6 +101,22 @@ protected:
 	Common::Array<AnimFrameInfo> _frames;
 };
 
+class MouseCursorResource {
+public:
+	MouseCursorResource(NeverhoodEngine *vm);
+	void load(uint32 fileHash);
+	void unload();
+	NDrawRect& getRect();
+	void draw(int frameNum, byte *dest, int destPitch);
+	int getCursorNum() const { return _cursorNum; }
+	void setCursorNum(int value) { _cursorNum = value; }
+protected:
+	int _cursorNum;
+	SpriteResource _cursorSprite;
+	NDrawRect _rect;
+	uint32 _currFileHash;
+};
+
 // TODO: Dummy class atm
 
 class SoundResource {
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index ebf92d8..3851cfa 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -38,7 +38,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_rectList = NULL;
 	// TODO _someRects = NULL;
 	_klayman = NULL;
-	// TODO _mouseSprite = NULL;
+	_mouseCursor = NULL;
 	_palette = NULL;
 	_background = NULL;
 	// TODO _field_8E = -1;
@@ -221,11 +221,9 @@ void Scene::update() {
 uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0: // mouse moved
-#if 0	
-		if (_mouseSprite && _mouseSprite->hasMessageHandler())
-			_mouseSprite->sendMessage(0x4002, param, this);
-		queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
-#endif	
+		if (_mouseCursor && _mouseCursor->hasMessageHandler())
+			_mouseCursor->sendMessage(0x4002, param, this);
+		// TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
 		break;
 	case 1: // mouse clicked
 		debug("mouse clicked");
@@ -268,20 +266,16 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		}
 		break;
 	case 0x101D:
-#if 0	
-		if (_mouseSprite) {
-			_prevVisible = _mouseSprite->_drawSurface->_visible;
-			_mouseSprite->_drawSurface->_visible = false;
+		if (_mouseCursor) {
+			_prevVisible = _mouseCursor->getSurface()->getVisible();
+			_mouseCursor->getSurface()->setVisible(false);
 		}
-#endif	
 		break;
 	case 0x101E:
-#if 0	
-		if (_prevVisible && _mouseSprite) {
-			_mouseSprite->_drawSurface->_visible = true;
-			_mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this);
+		if (_prevVisible && _mouseCursor) {
+			_mouseCursor->getSurface()->setVisible(false);
+			// TODO _mouseCursor->sendMessage(0x4002, g_Screen->_mousePos, this);
 		}
-#endif	
 		break;
 	case 0x1022:
 		setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger());
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 34f3c1e..0878380 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -68,7 +68,7 @@ protected:
 	// TODO 00000088 someRects	   dd ?
 	// TODO 0000008C someRectsCount  dw ?
 	// TODO 0000008E field_8E		dw ?
-	// TODO 00000094 mouseSprite	 dd ?
+	Sprite *_mouseCursor;
 	Klayman *_klayman;
 	Palette *_palette;
 	Background *_background;


Commit: 626cea6d1c516d4da1f8c6aad1bdb0552e54bf91
    https://github.com/scummvm/scummvm/commit/626cea6d1c516d4da1f8c6aad1bdb0552e54bf91
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Implement Mouse435

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/mouse.cpp
    engines/neverhood/mouse.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 547f8c1..bc52cfd 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -629,7 +629,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF
 	_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
 	_palette = new Palette(_vm, backgroundFileHash);
 	_palette->usePalette();
-	// TODO _mouseCursor = addSprite(new Class435(_vm, cursorFileHash, 20, 620));
+	_mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620));
 	
 }
 
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 5693048..c753183 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -112,7 +112,103 @@ void Mouse433::updateCursor() {
 		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
 	} else {
 		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
-	}   
+	}
+
+	if (_doDeltaY) {
+		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
+	} else {
+		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+	}
+
+	if (_needRefresh) {
+		_needRefresh = false;
+		_drawRect = _mouseCursorResource.getRect();
+		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
+	}
+
+}
+
+Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
+	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
+	
+	debug("Mouse435::Mouse435(%08X)", fileHash);
+	
+	_mouseCursorResource.load(fileHash);
+	_x = _vm->getMouseX();	
+	_y = _vm->getMouseY();
+	if (_x <= _x1) {
+		_mouseCursorResource.setCursorNum(6);
+	} else if (_x >= _x2) {
+		_mouseCursorResource.setCursorNum(5);
+	} else {
+		_mouseCursorResource.setCursorNum(4);
+	}
+	createSurface(2000, 32, 32);
+	SetUpdateHandler(&Mouse435::update);
+	SetMessageHandler(&Mouse435::handleMessage);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = 32;
+	_drawRect.height = 32;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = 32;
+	_deltaRect.height = 32;
+	processDelta();
+	_needRefresh = true;
+	updateCursor();
+}
+
+void Mouse435::load(uint32 fileHash) {
+	_mouseCursorResource.load(fileHash);
+	_needRefresh = true;
+}
+
+void Mouse435::update() {
+	debug("Mouse435::update()");
+	updateCursor();
+	_frameNum++;
+	if (_frameNum >= 6)
+		_frameNum = 0;
+	_needRefresh = _frameNum % 2 == 0;		
+}
+
+uint32 Mouse435::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Mouse435::handleMessage(%04X)", messageNum);
+	uint32 messageResult = 0;
+	if (messageNum != 5) {
+		messageResult = Sprite::handleMessage(messageNum, param, sender);
+		switch (messageNum) {
+		case 0x4002:
+			_x = param.asPoint().x;
+			_y = param.asPoint().y;
+			if (_x <= _x1) {
+				_mouseCursorResource.setCursorNum(6);
+			} else if (_x >= _x2) {
+				_mouseCursorResource.setCursorNum(5);
+			} else {
+				_mouseCursorResource.setCursorNum(4);
+			}
+			processDelta();
+			break;
+		}
+	} else {
+		// TODO: Debug stuff
+	}
+	return messageResult;
+}
+
+void Mouse435::updateCursor() {
+	debug("Mouse435::updateCursor()");
+	
+	if (!_surface)
+		return;
+
+	if (_doDeltaX) {
+		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
+	} else {
+		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
+	}
 
 	if (_doDeltaY) {
 		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index d03588f..4bda936 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -43,6 +43,20 @@ protected:
 	void updateCursor();
 };
 
+class Mouse435 : public StaticSprite {
+public:
+	Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2);
+	void load(uint32 fileHash);
+protected:
+	MouseCursorResource _mouseCursorResource;
+	int _frameNum;
+	int16 _x1;
+	int16 _x2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void updateCursor();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MOUSE_H */


Commit: be8d542264288343a4d60936f73f94906fc0e181
    https://github.com/scummvm/scummvm/commit/be8d542264288343a4d60936f73f94906fc0e181
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Updated tables.h with data from Scene1002

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 6f1fc482..d6e230a 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -23,6 +23,8 @@
 static const uint32 hitRectListOffsets[] = {
 	// Scene1001
 	0x004B4858,
+	// Scene1002
+	0x004B4134,
 	0
 };
 
@@ -30,6 +32,10 @@ static const uint32 rectListOffsets[] = {
 	// Scene1001
 	1, 0x004B49F0,
 	1, 0x004B4A00,
+	// Scene1002
+	3, 0x004B43A0,
+	1, 0x004B4418,
+	3, 0x004B43A0,
 	0, 0
 };
 
@@ -44,6 +50,20 @@ static const uint32 messageListOffsets[] = {
 	1, 0x004B4960,
 	4, 0x004B48A8,
 	3, 0x004B48C8,
+	// Scene1002
+	1, 0x004B4270,
+	1, 0x004B4478,
+	3, 0x004B4298,
+	1, 0x004B4470,
+	4, 0x004B4428,
+	5, 0x004B4448,
+	1, 0x004B44B8,
+	2, 0x004B44A8,
+	1, 0x004B44A0,
+	2, 0x004B43D0,
+	4, 0x004B4480,
+	2, 0x004B41E0,
+	5, 0x004B4148,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index bbd7419..99e3fcc 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 92e08f21edfe48e6eb2a6c0b4f2a481f9df9827d
    https://github.com/scummvm/scummvm/commit/92e08f21edfe48e6eb2a6c0b4f2a481f9df9827d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Start with Scene1002 (a lot incomplete)

Changed paths:
    engines/neverhood/background.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
index c47acd1..0c522db 100644
--- a/engines/neverhood/background.cpp
+++ b/engines/neverhood/background.cpp
@@ -65,7 +65,6 @@ DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int
 	// TODO _spriteResource.load(calcHash(fileName));
 	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_surface->drawSpriteResource(_spriteResource);
-	
 }
 
 DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority)
@@ -74,7 +73,6 @@ DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objec
 	_spriteResource.load(fileHash);
 	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_surface->drawSpriteResource(_spriteResource);
-
 }
 
 void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 height) {
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index db88daf..9acda93 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -49,6 +49,8 @@ static const KlaymanTableItem klaymanTable3[] = {
 }; 
 #endif
 
+// Klayman
+
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority)
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
 	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
@@ -1162,4 +1164,118 @@ void Klayman::sub420830() {
 	SetSpriteCallback(NULL);
 }
 
+// KmScene1001
+
+KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+}
+
+uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
+	debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;		
+	case 0x4804:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub4211B0));
+		}
+		break;
+	case 0x480D:
+		setCallback2(AnimationCallback(&KmScene1001::sub44FA50));
+		break;
+	case 0x4812:
+		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		}else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+
+	case 0x481B:
+		// TODO: It's not really a point but an x1/x2 pair
+		if (param.asPoint().x != 0) {
+			sub41CC40(param.asPoint().x, param.asPoint().y);
+		} else {
+			error("// TODO sub41CCE0(param.asPoint().y);");
+			// TODO sub41CCE0(param.asPoint().y);
+		}
+		break;
+
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger());
+		sub41C7B0();
+		break;
+
+	case 0x4836:
+		if (param.asInteger() == 1) {
+			_parentScene->sendMessage(0x2002, 0, this);
+			setCallback2(AnimationCallback(&Klayman::sub4211F0));
+		}
+		break;		
+
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+
+	return 0;
+}
+
+void KmScene1001::sub44FA50() {
+	if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x00648953, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&KmScene1001::handleMessage44FA00);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	}
+}
+
+uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
+	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x480F, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 4d883c3..24f70e1 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -179,6 +179,15 @@ protected:
 	
 };
 
+class KmScene1001 : public Klayman {
+public:
+	KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:	
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub44FA50();
+	uint32 handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index bc52cfd..f4b1694 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -53,7 +53,9 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 			break;
 		}
 	} else if (which == 0) {
-		createScene1001(0);
+		//createScene1001(0);
+		// DEBUG: Jump to room
+		createScene1002(0);
 	} else if (which == 1) {
 		createScene1002(1);
 	}
@@ -73,6 +75,11 @@ void Module1000::createScene1001(int which) {
 }
 			
 void Module1000::createScene1002(int which) {
+	_vm->gameState().sceneNum = 1;
+	_childObject = new Scene1002(_vm, this, which);
+	// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
+	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
+	SetUpdateHandler(&Module1000::updateScene1002);
 }
 
 void Module1000::createScene1003(int which) {
@@ -125,6 +132,51 @@ void Module1000::updateScene1001() {
 }
 
 void Module1000::updateScene1002() {
+
+	_childObject->handleUpdate();
+
+	if (_done) {
+	
+		debug("SCENE 1002 DONE; _field20 = %d", _field20);
+	
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		} else if (_field20 == 2) {
+			// TODO createScene1004(0);
+			// TODO _childObject->handleUpdate();
+		} else {
+			createScene1001(1);
+			_childObject->handleUpdate();
+		}
+	}
+
+	if (_field24 >= 0) {
+		if (_field24 == 1) {
+			_parentModule->sendMessage(0x100A, 0, this);
+		} else if (_field24 == 2) {
+			// TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1);
+		} else {
+			// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable3);
+		}
+		_field24 = -1;
+	}
+
+	if (_field26 >= 0) {
+		if (_field26 == 1) {
+			_parentModule->sendMessage(0x1023, 0, this);
+		} else {
+			// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
+		}
+		_field26 = -1;
+	}
+
+	if (_field28 >= 0) {
+		_field28 = -1;
+	}
+
 }
 			
 void Module1000::updateScene1003() {
@@ -146,117 +198,6 @@ void Module1000::updateScene1005() {
 			
 // Scene1001			
 
-KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-}
-
-uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
-	debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		sub41C930(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
-		break;		
-	case 0x4804:
-		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub4211B0));
-		}
-		break;
-	case 0x480D:
-		setCallback2(AnimationCallback(&KmScene1001::sub44FA50));
-		break;
-	case 0x4812:
-		setCallback2(AnimationCallback(&Klayman::sub41FF80));
-		break;
-	case 0x4816:
-		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
-		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
-		}else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		sub41C7B0();
-		break;		
-
-	case 0x481B:
-		// TODO: It's not really a point but an x1/x2 pair
-		if (param.asPoint().x != 0) {
-			sub41CC40(param.asPoint().x, param.asPoint().y);
-		} else {
-			error("// TODO sub41CCE0(param.asPoint().y);");
-			// TODO sub41CCE0(param.asPoint().y);
-		}
-		break;
-
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
-		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
-		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
-		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
-		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
-		}
-		break;
-
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger());
-		sub41C7B0();
-		break;
-
-	case 0x4836:
-		if (param.asInteger() == 1) {
-			_parentScene->sendMessage(0x2002, 0, this);
-			setCallback2(AnimationCallback(&Klayman::sub4211F0));
-		}
-		break;		
-
-	case 0x483F:
-		sub41CD00(param.asInteger());
-		break;		
-
-	case 0x4840:
-		sub41CD70(param.asInteger());
-		break;
-	}
-
-	return 0;
-}
-
-void KmScene1001::sub44FA50() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) {
-		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x00648953, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1001::handleMessage44FA00);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	}
-}
-
-uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
-	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x480F, 0, this);
-		}
-		break;
-	}
-	return messageResult;
-}
-
 AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) {
 	
@@ -483,7 +424,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_name = "Scene1001";
 
-	Sprite *staticSprite1;
+	Sprite *tempSprite;
 
 	SetMessageHandler(&Scene1001::handleMessage);
 	
@@ -518,19 +459,19 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	addSprite(_klayman);
 
-	staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
+	tempSprite = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
 
 	// TODO: This sucks somehow, find a better way
 	_klayman->getSurface()->getClipRect().x1 = 0;
 	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+	_klayman->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
 	_klayman->getSurface()->getClipRect().y2 = 480;
 	
 	if (getGlobalVar(0xD217189D) == 0) {
 		_asDoor = addSprite(new AsScene1001Door(_vm));
 		_asDoor->getSurface()->getClipRect().x1 = 0;
 		_asDoor->getSurface()->getClipRect().y1 = 0;
-		_asDoor->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
+		_asDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
 		_asDoor->getSurface()->getClipRect().y2 = 480;
 	} else {
 		_asDoor = NULL;
@@ -544,12 +485,12 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0));
 
 	if (getGlobalVar(0x03C698DA) == 0) {
-		staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200));
+		tempSprite = addSprite(new StaticSprite(_vm, 0x8C066150, 200));
 		_asWindow = addSprite(new AsScene1001Window(_vm));
-		_asWindow->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x;
-		_asWindow->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y;
-		_asWindow->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width;
-		_asWindow->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height;
+		_asWindow->getSurface()->getClipRect().x1 = tempSprite->getSurface()->getDrawRect().x;
+		_asWindow->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
+		_asWindow->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
+		_asWindow->getSurface()->getClipRect().y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
 	} else {
 		_asWindow = NULL;
 	}
@@ -559,7 +500,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1001::~Scene1001() {
-	// TODO setGlobalVar(0xC0418A02, _klayman->_doDeltaX);
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX());
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -617,6 +558,335 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+// Scene1002
+
+SsScene1002LadderArch::SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene)
+	: StaticSprite(vm, 0x152C1313, 1015), _parentScene(parentScene) {
+
+	SetMessageHandler(&SsScene1002LadderArch::handleMessage);
+}
+
+uint32 SsScene1002LadderArch::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 995, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1015, this);
+		break;
+	}
+	return messageResult;
+}
+
+Class599::Class599(NeverhoodEngine *vm, Scene *parentScene)
+	: StaticSprite(vm, 0x316C4BB4, 1015), _parentScene(parentScene) {
+
+	SetMessageHandler(&Class599::handleMessage);
+}
+
+uint32 Class599::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 995, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1015, this);
+		break;
+	}
+	return messageResult;
+}
+
+Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
+	_flag1B4(false), _flag1BE(false) {
+
+	static const uint32 kClass426FileHashList[] = {
+		0x00412692,
+		0x140B60BE
+	};
+
+	NRect tempClipRect;
+	Sprite *tempSprite;
+
+	// TODO _field1B6 = -1;
+	// TODO _resourceTable8.setResourceList(0x004B4110);
+	// TODO _resourceTable7.setResourceList(0x004B4100);
+	// TODO _resourceTable6.setResourceList(0x004B40E8);
+	// TODO _resourceTable5.setResourceList(0x004B40C0);
+	// TODO _resourceTable4.setResourceList(0x004B4080);
+	// TODO _resourceTable3.setResourceList(0x004B4060);
+	// TODO _resourceTable2.setResourceList(0x004B4000, true);
+	// TODO _resourceTable1.setResourceList(0x004B3F90, true);
+	// TODO _resourceTable1.loadSome(3000);
+
+	SetUpdateHandler(&Scene1002::update);
+	SetMessageHandler(&Scene1002::handleMessage);
+
+	_vm->_collisionMan->setHitRects(0x004B4134);
+
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x12C23307, 0, 0));
+	_palette = new Palette(_vm, 0x12C23307);
+	_palette->usePalette();
+
+	_flag = false;
+
+	addSprite(new StaticSprite(_vm, 0x06149428, 1100));
+	addSprite(new StaticSprite(_vm, 0x312C8774, 1100));
+
+	_ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this));
+	_ssLadderArchPart1 = addSprite(new StaticSprite(_vm, 0x060000A0, 1200));
+	_ssLadderArchPart2 = addSprite(new StaticSprite(_vm, 0xB2A423B0, 1100));
+	_ssLadderArchPart3 = addSprite(new StaticSprite(_vm, 0x316E0772, 1100));
+
+	_class599 = addSprite(new Class599(_vm, this));
+
+//	_ssLadderArchPart3->getSurface()->getDrawRect().x = 200;
+	
+#if 0
+	if (which < 0) {
+		if (_vm->_gameState.field2 == 0) {
+			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226));
+			_class478 = addSprite(new Class478(_vm, _klayman));
+			setMessageList(0x004B4270);
+			// TODO
+			// TODO _klayman->setRepl(64, 0);
+		} else {
+			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435));
+			_class478 = addSprite(new Class478(_vm, _klayman));
+			setMessageList(0x004B4270);
+			// TODO
+		}
+	} else {
+		if (which == 1) {
+			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435));
+			_class478 = addSprite(new Class478(_vm, _klayman));
+			setMessageList(0x004B4478);
+			// TODO
+			_vm->_gameState.field2 = 1;
+		} else if (which == 2) {
+			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645));
+			_class478 = addSprite(new Class478(_vm, _klayman));
+			setMessageList(0x004B4298);
+			// TODO
+			_vm->_gameState.field2 = 1;
+			_klayman->sendMessage(0x4820, 0, this);
+		} else {
+			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226));
+			_class478 = addSprite(new Class478(_vm, _klayman));
+			setMessageList(0x004B4470);
+			// TODO
+			_class479 = addSprite(new Class479(_vm, this, _klayman));
+			// TODO
+			// TODO _klayman->setRepl(64, 0);
+			_vm->_gameState.field2 = 0;
+		} 
+	}
+#endif
+
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL));
+
+	// TODO
+
+	addSprite(new StaticSprite(_vm, 0xB3242310, 825));
+
+	// TODO
+
+#if 0
+
+	_class502_1 = addSprite(new Class502(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false);
+	_class502_2 = addSprite(new Class502(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false);
+	_class502_3 = addSprite(new Class502(_vm, this, true, 201, 370, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0);
+	_class502_4 = addSprite(new Class502(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false);
+	_class502_5 = addSprite(new Class502(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false);
+
+	_class431 = addSprite(new Class431(_vm, tempClipRect));
+	
+	tempSprite = addSprite(new Class505(_vm, tempClipRect));
+
+	_class504 = addSprite(new Class504(_vm, tempClipRect, this, _class431, tempSprite));
+	_class426 = addSprite(new Class426(_vm, this, kClass426FileHashList, 800, 0));
+	_class503 = addSprite(new Class503(_vm, this, _klayman, false));
+	
+	_vm->_collisionMan->addSprite(_class503);
+	_klayman->sendEntityMessage(0x2007, _class503, this);
+
+	_class506 = addSprite(new Class506(_vm));
+								  
+	setRectList(0x004B43A0);
+
+#endif
+								  
+#if 0 // TODO
+	_soundResource2.load(0x60755842);
+	_soundResource3.load(0x616D5821);
+#endif
+
+}
+
+Scene1002::~Scene1002() {
+}
+
+void Scene1002::update() {
+	Scene::update();
+#if 0 // TODO: Waiting for Klayman...	
+	if (!_flag1B4 && _klayman->getY() > 230) {
+		// TODO
+		deleteSprite(&_ssLadderArchPart3);
+		_klayman->clearRepl();
+		_flag1B4 = true;
+		_vm->_gameState.field2 = 1;
+	}
+
+	if (_flag1BE && _klayman->getY() > 422) {
+		_parentModule->sendMessage(0x1024, 1, this);
+		_flag1BE = false;
+	}
+	
+#endif
+
+}
+
+uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
+			setGlobalVar(0x8306F218, 1);
+			setGlobalVar(0x1B144052, 3);
+			_parentModule->sendMessage(0x1009, 1, this);
+		}
+		break;
+	case 0x000D:
+		if (param.asInteger() == 0x48848178) {
+			setGlobalVar(0x8306F218, 1);
+			setGlobalVar(0x1B144052, 3);
+			_parentModule->sendMessage(0x1009, 1, this);
+		}
+		messageResult = 1;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0xE6EE60E1) {
+			if (getGlobalVar(0x8306F218)) {
+				setMessageList(0x004B4428);
+			} else {
+				// TODO _resourceTable3.load();
+				setMessageList(0x004B4448);
+			}
+			messageResult = 1;
+		} else if (param.asInteger() == 0x4A845A00) {
+			// TODO _resourceTable4.load();
+			_klayman->sendEntityMessage(0x1014, _class502_1, this);
+		} else if (param.asInteger() == 0x43807801) {
+			// TODO _resourceTable4.load();
+			_klayman->sendEntityMessage(0x1014, _class502_2, this);
+		} else if (param.asInteger() == 0x46C26A01) {
+			if (getGlobalVar(0x8306F218)) {
+				setMessageList(0x004B44B8);
+			} else {
+				_klayman->sendEntityMessage(0x1014, _class502_3, this);
+				if (_class503->getX() - 10 < 366 && _class503->getX() + 10 > 366) {
+					setGlobalVar(0x2B514304, 1);
+					setMessageList(0x004B44A8);
+				} else {
+					// TODO _resourceTable5.load();
+					setMessageList(0x004B44A0);
+				}
+			}
+			messageResult = 1;
+		} else if (param.asInteger() == 0x468C7B11) {
+			// TODO _resourceTable4.load();
+			_klayman->sendEntityMessage(0x1014, _class502_4, this);
+		} else if (param.asInteger() == 0x42845B19) {
+			// TODO _resourceTable4.load();
+			_klayman->sendEntityMessage(0x1014, _class502_5, this);
+		} else if (param.asInteger() == 0xC0A07458) {
+			_klayman->sendEntityMessage(0x1014, _class426, this);
+		}
+		break;
+	case 0x1024:
+		if (param.asInteger() == 1) {
+			// TODO _resourceTable3.load();
+		} else if (param.asInteger() == 3) {
+			// TODO _resourceTable2.load();
+		}
+		_parentModule->sendMessage(0x1024, param, this);
+		break;
+	case 0x2000:
+		if (_flag) {
+			setMessageList2(0x004B43D0);
+		} else {
+			if (_klayman->getY() > 420) {
+				_klayman->sendEntityMessage(0x1014, _class503, this);
+				setMessageList2(0x004B4480);
+			} else if (_klayman->getY() > 227) {
+				setMessageList2(0x004B41E0);
+			} else {
+				setMessageList2(0x004B4148);
+			}
+		}
+		break;
+	case 0x2002:
+		_messageList = NULL;
+		break;										
+	case 0x2005:
+		_flag = true;
+		setRectList(0x004B4418);
+		break;										
+	case 0x2006:
+		_flag = false;
+		setRectList(0x004B43A0);
+		break;
+	case 0x4806:
+		_parentModule->sendMessage(0x1024, 2, this);
+		_flag1BE = true;
+		if (sender == _class502_1) {
+			setGlobalVar(0x4DE80AC0, 0);
+			_soundResource1.play(0x665198C0);
+		} else if (sender == _class502_2) {
+			setGlobalVar(0x4DE80AC0, 0);
+			_soundResource1.play(0xE2D389C0);
+		} else if (sender == _class502_3) {
+			setGlobalVar(0x4DE80AC0, 0);
+			_soundResource2.play();
+			_class431->sendMessage(0x4808, 0, this);
+			_class506->sendMessage(0x4808, 0, this);
+		} else if (sender == _class502_4) {
+			setGlobalVar(0x4DE80AC0, 0);
+			_soundResource1.play(0xE0558848);
+		} else if (sender == _class502_5) {
+			setGlobalVar(0x4DE80AC0, 1);
+			_soundResource1.play(0x44014282);
+		}
+		break;
+	case 0x4807:
+		if (sender == _class502_3) {
+			_soundResource3.play();
+			_class431->sendMessage(0x4809, 0, this);
+			_class506->sendMessage(0x4809, 0, this);
+		} else if (sender == _class503) {
+			if (getGlobalVar(0x8306F218)) {
+				_class502_3->sendMessage(0x4807, 0, this);
+			}
+		}	
+		break;
+	case 0x480B:
+		_klayman->sendEntityMessage(0x1014, _class504, this);
+		break;				
+	case 0x480F:
+		setGlobalVar(0x4DE80AC0, 0);
+		_soundResource2.play();
+		_class431->sendMessage(0x4808, 0, this);
+		_class506->sendMessage(0x4808, 0, this);
+		break;				
+	}	
+	return messageResult;
+}
+
 // Class152
 
 Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
@@ -630,7 +900,6 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF
 	_palette = new Palette(_vm, backgroundFileHash);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620));
-	
 }
 
 uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index c1c7c8e..c5c03b5 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -55,15 +55,6 @@ protected:
 
 // Scene1001
 
-class KmScene1001 : public Klayman {
-public:
-	KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-protected:	
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub44FA50();
-	uint32 handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class AsScene1001Door : public AnimatedSprite {
 public:
 	AsScene1001Door(NeverhoodEngine *vm);
@@ -142,6 +133,64 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+// Scene1002
+
+class SsScene1002LadderArch : public StaticSprite {
+public:
+	SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Class599 : public StaticSprite {
+public:
+	Class599(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1002 : public Scene {
+public:
+	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene1002();
+protected:
+	// TODO ResourceTable _resourceTable1;
+	// TODO ResourceTable _resourceTable2;
+	// TODO ResourceTable _resourceTable3;
+	// TODO ResourceTable _resourceTable4;
+	// TODO ResourceTable _resourceTable5;
+	// TODO ResourceTable _resourceTable6;
+	// TODO ResourceTable _resourceTable7;
+	// TODO ResourceTable _resourceTable8;
+	Sprite *_class502_1;
+	Sprite *_class502_2;
+	Sprite *_class502_3;
+	Sprite *_class502_4;
+	Sprite *_class502_5;
+	Sprite *_class431;
+	Sprite *_class504;
+	Sprite *_class503;
+	Sprite *_ssLadderArch;
+	Sprite *_ssLadderArchPart1;
+	Sprite *_ssLadderArchPart2;
+	Sprite *_ssLadderArchPart3;
+	Sprite *_class599;
+	Sprite *_class478;
+	Sprite *_class479;
+	Sprite *_class506;
+	Sprite *_class426;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	bool _flag1B4;
+	bool _flag1BE;
+	bool _flag;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1000_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index ab3cdc6..abae6eb 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -65,6 +65,12 @@ Common::Error NeverhoodEngine::run() {
 
 	_isSaveAllowed = false;
 
+	_mouseX = 0;
+	_mouseY = 0;
+
+	_gameState.sceneNum = 0;
+	_gameState.field2 = 0;
+
 	_staticData = new StaticData();
 	_staticData->load("neverhood.dat");
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 4f6131a..38d773a 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -48,6 +48,7 @@ class StaticData;
 
 struct GameState {
 	int sceneNum;
+	int field2;
 };
 
 class NeverhoodEngine : public ::Engine {
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 713bfef..222368c 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -106,10 +106,12 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
 	: Sprite(vm, 0), _spriteResource(vm) {
+	
+	debug("StaticSprite::StaticSprite(%08X)", fileHash);
 
 	_name = "StaticSprite"; 
 	init(fileHash, surfacePriority, x, y, width, height);
-	
+
 }
 
 void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 16f741a..0368d2d 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -47,6 +47,8 @@ public:
 	bool isPointInside(int16 x, int16 y);
 	int16 getX() const { return _x; }
 	int16 getY() const { return _y; }
+	bool isDoDeltaX() const { return _doDeltaX; }
+	bool isDoDeltaY() const { return _doDeltaY; }
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	int16 (Sprite::*_filterXCb)(int16);


Commit: ffe024844b2f97fe4e735603308e505a7bcd982d
    https://github.com/scummvm/scummvm/commit/ffe024844b2f97fe4e735603308e505a7bcd982d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: More work on Scene1002

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/scene.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/smackerplayer.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c2d3e6d..4354797 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -33,7 +33,7 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	// Other initializations moved to actual engine class
 	
-	// TODO
+	// TODO .text:0048AD96
 
 	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
 	
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9acda93..562624d 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
 	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
-	// TODO
+	// TODO .text:0041C4D3 DirtySurface
 	createSurface(surfacePriority, 320, 200);
 	_x = x;
 	_y = y;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index f4b1694..703796e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -598,6 +598,230 @@ uint32 Class599::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
+AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _flag1(flag1) {
+
+	SetUpdateHandler(&AsScene1002Ring::update);
+	
+	if (flag1) {
+		createSurface(990, 68, 314);
+		if (flag2) {
+			setFileHash(0x04103090, 0, -1);
+			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+		} else {
+			setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
+			SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
+		}
+	} else {
+		createSurface(990, 68, 138);
+		setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
+		SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
+	}
+
+	debug("clipY1 = %d", clipY1);
+
+	_surface->getClipRect().x1 = 0;
+	_surface->getClipRect().y1 = clipY1;
+	_surface->getClipRect().x2 = 640;
+	_surface->getClipRect().y2 = 480;
+
+	_x = x;
+	_y = y;
+
+	setDoDeltaX(_vm->_rnd->getRandomNumber(1));
+
+}
+
+void AsScene1002Ring::update() {
+	AnimatedSprite::updateAnim();
+	AnimatedSprite::updatePosition();
+}
+
+uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4806:
+		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
+		_parentScene->sendMessage(0x4806, 0, this);
+		SetMessageHandler(&AsScene1002Ring::handleMessage447760);
+		if (_flag1) {
+			setFileHash(0x87502558, 0, -1);
+		} else {
+			setFileHash(0x80DD4010, 0, -1);
+		}
+		break;
+	case 0x480F:
+		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
+		_parentScene->sendMessage(0x480F, 0, this);
+		SetMessageHandler(&AsScene1002Ring::handleMessage447890);
+		setFileHash(0x861A2020, 0, -1);
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		if (_flag1) {
+			setFileHash(0x78D0A812, 0, -1);
+			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+		} else {
+			setFileHash(0xB85D2A10, 0, -1);
+			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+		}
+		break;
+	case 0x4807:
+		_parentScene->sendMessage(0x4807, 0, this);
+		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
+		setFileHash(0x8258A030, 0, -1);
+		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		setFileHash(0x04103090, 0, -1);
+		SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4807:
+		_parentScene->sendMessage(0x4807, 0, this);
+		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
+		setFileHash(0x8258A030, 0, -1);
+		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage4475E0(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x05410F72) {
+			_soundResource.play(0x21EE40A9);
+		}
+		break;
+	case 0x3002:
+		setFileHash(0xA85C4011, 0, -1);
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
+	: StaticSprite(vm, 1200) {
+	
+	_spriteResource.load2(0x1052370F);
+	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_surface->getClipRect() = clipRect;
+
+	_x = 526;
+	
+	if (getGlobalVar(0x8306F218)) {
+		_y = 49; 
+	} else {
+		_y = 239; 
+	}
+
+	_surface->getDrawRect().x = 0;
+	_surface->getDrawRect().y = 0;
+	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+	_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+
+	_needRefresh = true;
+	
+	SetUpdateHandler(&AsScene1002Door::update);
+	SetMessageHandler(&AsScene1002Door::handleMessage);
+	SetSpriteCallback(NULL);
+	StaticSprite::update();
+	
+}
+
+void AsScene1002Door::update() {
+	handleSpriteUpdate();
+	StaticSprite::update();
+}
+
+uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4808:
+		setGlobalVar(0x8306F218, 1);
+		SetSpriteCallback(&AsScene1002Door::spriteUpdate447D10);
+		break;
+	case 0x4809:
+		setGlobalVar(0x8306F218, 0);
+		SetSpriteCallback(&AsScene1002Door::spriteUpdate447D40);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1002Door::spriteUpdate447D10() {
+	if (_y > 49) {
+		_y -= 8;
+		if (_y < 49) {
+			SetSpriteCallback(NULL);
+			_y = 49;
+		}
+		_needRefresh = true;
+	}
+}
+
+void AsScene1002Door::spriteUpdate447D40() {
+	if (_y < 239) {
+		_y += 8;
+		if (_y > 239) {
+			SetSpriteCallback(NULL);
+			_y = 239;
+		}
+		_needRefresh = true;
+	}
+}
+
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
 	_flag1B4(false), _flag1BE(false) {
@@ -644,28 +868,26 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_class599 = addSprite(new Class599(_vm, this));
 
-//	_ssLadderArchPart3->getSurface()->getDrawRect().x = 200;
-	
 #if 0
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
 			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226));
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
-			// TODO
+			// TODO			
 			// TODO _klayman->setRepl(64, 0);
 		} else {
 			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435));
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
-			// TODO
+			// TODO			
 		}
 	} else {
 		if (which == 1) {
 			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435));
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4478);
-			// TODO
+			// TODO			
 			_vm->_gameState.field2 = 1;
 		} else if (which == 2) {
 			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645));
@@ -689,25 +911,25 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL));
 
-	// TODO
-
-	addSprite(new StaticSprite(_vm, 0xB3242310, 825));
+	tempSprite = addSprite(new StaticSprite(_vm, 0xB3242310, 825));
+	tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x;
+	tempClipRect.y1 = tempSprite->getSurface()->getDrawRect().y;
+	tempClipRect.x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+	tempClipRect.y2 = _ssLadderArchPart2->getSurface()->getDrawRect().y + _ssLadderArchPart2->getSurface()->getDrawRect().height;
 
-	// TODO
+	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false));
+	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false));
+	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0));
+	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false));
+	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false));
 
+	_asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect));
+	
 #if 0
 
-	_class502_1 = addSprite(new Class502(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false);
-	_class502_2 = addSprite(new Class502(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false);
-	_class502_3 = addSprite(new Class502(_vm, this, true, 201, 370, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0);
-	_class502_4 = addSprite(new Class502(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false);
-	_class502_5 = addSprite(new Class502(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false);
-
-	_class431 = addSprite(new Class431(_vm, tempClipRect));
-	
 	tempSprite = addSprite(new Class505(_vm, tempClipRect));
 
-	_class504 = addSprite(new Class504(_vm, tempClipRect, this, _class431, tempSprite));
+	_class504 = addSprite(new Class504(_vm, tempClipRect, this, _asDoor, tempSprite));
 	_class426 = addSprite(new Class426(_vm, this, kClass426FileHashList, 800, 0));
 	_class503 = addSprite(new Class503(_vm, this, _klayman, false));
 	
@@ -780,15 +1002,15 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			messageResult = 1;
 		} else if (param.asInteger() == 0x4A845A00) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _class502_1, this);
+			_klayman->sendEntityMessage(0x1014, _asRing1, this);
 		} else if (param.asInteger() == 0x43807801) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _class502_2, this);
+			_klayman->sendEntityMessage(0x1014, _asRing2, this);
 		} else if (param.asInteger() == 0x46C26A01) {
 			if (getGlobalVar(0x8306F218)) {
 				setMessageList(0x004B44B8);
 			} else {
-				_klayman->sendEntityMessage(0x1014, _class502_3, this);
+				_klayman->sendEntityMessage(0x1014, _asRing3, this);
 				if (_class503->getX() - 10 < 366 && _class503->getX() + 10 > 366) {
 					setGlobalVar(0x2B514304, 1);
 					setMessageList(0x004B44A8);
@@ -800,10 +1022,10 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			messageResult = 1;
 		} else if (param.asInteger() == 0x468C7B11) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _class502_4, this);
+			_klayman->sendEntityMessage(0x1014, _asRing4, this);
 		} else if (param.asInteger() == 0x42845B19) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _class502_5, this);
+			_klayman->sendEntityMessage(0x1014, _asRing5, this);
 		} else if (param.asInteger() == 0xC0A07458) {
 			_klayman->sendEntityMessage(0x1014, _class426, this);
 		}
@@ -844,33 +1066,33 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x4806:
 		_parentModule->sendMessage(0x1024, 2, this);
 		_flag1BE = true;
-		if (sender == _class502_1) {
+		if (sender == _asRing1) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource1.play(0x665198C0);
-		} else if (sender == _class502_2) {
+		} else if (sender == _asRing2) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource1.play(0xE2D389C0);
-		} else if (sender == _class502_3) {
+		} else if (sender == _asRing3) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource2.play();
-			_class431->sendMessage(0x4808, 0, this);
+			_asDoor->sendMessage(0x4808, 0, this);
 			_class506->sendMessage(0x4808, 0, this);
-		} else if (sender == _class502_4) {
+		} else if (sender == _asRing4) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource1.play(0xE0558848);
-		} else if (sender == _class502_5) {
+		} else if (sender == _asRing5) {
 			setGlobalVar(0x4DE80AC0, 1);
 			_soundResource1.play(0x44014282);
 		}
 		break;
 	case 0x4807:
-		if (sender == _class502_3) {
+		if (sender == _asRing3) {
 			_soundResource3.play();
-			_class431->sendMessage(0x4809, 0, this);
+			_asDoor->sendMessage(0x4809, 0, this);
 			_class506->sendMessage(0x4809, 0, this);
 		} else if (sender == _class503) {
 			if (getGlobalVar(0x8306F218)) {
-				_class502_3->sendMessage(0x4807, 0, this);
+				_asRing3->sendMessage(0x4807, 0, this);
 			}
 		}	
 		break;
@@ -880,7 +1102,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x480F:
 		setGlobalVar(0x4DE80AC0, 0);
 		_soundResource2.play();
-		_class431->sendMessage(0x4808, 0, this);
+		_asDoor->sendMessage(0x4808, 0, this);
 		_class506->sendMessage(0x4808, 0, this);
 		break;				
 	}	
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index c5c03b5..c78658f 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -151,6 +151,31 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class AsScene1002Ring : public AnimatedSprite {
+public:
+	AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2);
+protected:
+	Scene *_parentScene;
+	bool _flag1;
+	SoundResource _soundResource;
+	void update();
+	uint32 handleMessage4475E0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage447760(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage447890(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage447930(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage447A00(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1002Door : public StaticSprite {
+public:
+	AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect);
+protected:
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate447D10();
+	void spriteUpdate447D40();
+};
+
 class Scene1002 : public Scene {
 public:
 	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -164,12 +189,12 @@ protected:
 	// TODO ResourceTable _resourceTable6;
 	// TODO ResourceTable _resourceTable7;
 	// TODO ResourceTable _resourceTable8;
-	Sprite *_class502_1;
-	Sprite *_class502_2;
-	Sprite *_class502_3;
-	Sprite *_class502_4;
-	Sprite *_class502_5;
-	Sprite *_class431;
+	Sprite *_asRing1;
+	Sprite *_asRing2;
+	Sprite *_asRing3;
+	Sprite *_asRing4;
+	Sprite *_asRing5;
+	Sprite *_asDoor;
 	Sprite *_class504;
 	Sprite *_class503;
 	Sprite *_ssLadderArch;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 3851cfa..1aee786 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -178,7 +178,7 @@ Background *Scene::addBackground(Background *background) {
 void Scene::update() {
 
 	if (_smkFileHash != 0) {
-		// TODO
+		// TODO .text:0040138D
 		//**** ALL TODO
 		_smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0);
 		_savedUpdateHandlerCb = _updateHandlerCb;
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index db1c16a..7b3d4bc 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -148,22 +148,6 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 		}
 	} 
 	
-	#if 0
-	if ( ddRect.right > ddRect.left )
-	{
-	if ( ddRect.top < ddRect.bottom )
-	{
-	(*(int (__stdcall **)(_DWORD, _DWORD, _DWORD, LPDIRECTDRAWSURFACE, struct tagRECT *, unsigned int))(**(_DWORD **)(this + 8) + 28))(
-	*(_DWORD *)(this + 8),
-	destX,
-	destY,
-	ddSurface,
-	&ddRect,
-	blitFlags | (unsigned int)DDBLTFAST_WAIT);
-	}
-	}
-	#endif
-	
 }
 
 void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) {
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index bbb0db1..a13276a 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -146,7 +146,7 @@ void SmackerPlayer::update() {
 		}
 		
 		if (_doubleSurface) {
-			// TODO
+			// TODO .text:0046422D				 mov	 byte ptr [eax+28h], 1
 		}
 
 		// TODO _vm->_screen->_skipUpdate = true;


Commit: b611b65bf42a3f2d710199fa69428ec1012a0108
    https://github.com/scummvm/scummvm/commit/b611b65bf42a3f2d710199fa69428ec1012a0108
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Change addHitRect to use an explicit count

- This is since the alignment stuff didn't work and it's not worth it to investigate
- Add possibility to write out hardcoded message lists instead of reading from the exe for special lists

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/smackerplayer.cpp



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 951a2f0..84f3f74 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -76,6 +76,7 @@ typedef std::vector<RectItem> RectItems;
 struct MessageItem {
 	uint16 messageNum;
 	uint32 messageParam;
+	MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {}
 };
 
 typedef std::vector<MessageItem> MessageItems;
@@ -103,14 +104,10 @@ byte *getData(uint32 offset) {
 	return data + offset - dataStart + fileStart;
 }
 
-void addHitRect(uint32 offset) {
+void addHitRect(uint32 count, uint32 offset) {
 	HitRectList *hitRectList = new HitRectList();
 	hitRectList->id = offset;
 	byte *item = getData(offset);
-	uint32 count = READ_LE_UINT32(item);
-	//printf("count = %d\n", count);
-	// Align to 16 bytes
-	item = data + ((offset + 4 + 16) & 0xFFFFFFF0) - dataStart + fileStart;
 	for (uint32 i = 0; i < count; i++) {
 		HitRect hitRect;
 		hitRect.x1 = READ_LE_UINT16(item + 0);
@@ -128,15 +125,43 @@ void addHitRect(uint32 offset) {
 void addMessage(uint32 count, uint32 offset) {
 	MessageList *messageList = new MessageList();
 	messageList->id = offset;
-	byte *item = getData(offset);
-	for (uint32 i = 0; i < count; i++) {
-		MessageItem messageItem;
-		messageItem.messageNum = READ_LE_UINT16(item + 0);
-		messageItem.messageParam = READ_LE_UINT32(item + 4);
-		//printf("%04X, %08X\n", messageItem.messageNum, messageItem.messageParam);
-		item += 8;
-		messageList->messageItems.push_back(messageItem);
+	
+	// Special code for message lists which are set at runtime (but otherwise constant)
+	switch (offset) {
+	// Scene 1002 rings
+	case 0x004B4200:
+		messageList->messageItems.push_back(MessageItem(0x4800, 258));
+		messageList->messageItems.push_back(MessageItem(0x100D, 0x4A845A00));
+		messageList->messageItems.push_back(MessageItem(0x4805, 1));
+		break;
+	case 0x004B4218:
+		messageList->messageItems.push_back(MessageItem(0x4800, 297));
+		messageList->messageItems.push_back(MessageItem(0x100D, 0x43807801));
+		messageList->messageItems.push_back(MessageItem(0x4805, 2));
+		break;
+	case 0x004B4230:
+		messageList->messageItems.push_back(MessageItem(0x4800, 370));
+		messageList->messageItems.push_back(MessageItem(0x100D, 0x46C26A01));
+		break;
+	case 0x004B4240:
+		messageList->messageItems.push_back(MessageItem(0x4800, 334));
+		messageList->messageItems.push_back(MessageItem(0x100D, 0x468C7B11));
+		messageList->messageItems.push_back(MessageItem(0x4805, 1));
+		break;
+	case 0x004B4258:
+		messageList->messageItems.push_back(MessageItem(0x4800, 425));
+		messageList->messageItems.push_back(MessageItem(0x100D, 0x42845B19));
+		messageList->messageItems.push_back(MessageItem(0x4805, 1));
+		break;
+	default:
+		// Read message list from the exe
+		byte *item = getData(offset);
+		for (uint32 i = 0; i < count; i++) {
+			messageList->messageItems.push_back(MessageItem(READ_LE_UINT16(item + 0), READ_LE_UINT32(item + 4)));
+			item += 8;
+		}
 	}
+	
 	messageLists.push_back(messageList);	   
 }
 
@@ -180,8 +205,8 @@ int main(int argc, char *argv[]) {
 
 	loadExe("nhc.exe");
 
-	for (int i = 0; hitRectListOffsets[i] != 0; i++) {
-		addHitRect(hitRectListOffsets[i]);
+	for (int i = 0; hitRectListOffsets[i] != 0; i += 2) {
+		addHitRect(hitRectListOffsets[i], hitRectListOffsets[i + 1]);
 	}
 
 	for (int i = 0; rectListOffsets[i] != 0; i += 2) {
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index d6e230a..7aba996 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -22,10 +22,10 @@
 
 static const uint32 hitRectListOffsets[] = {
 	// Scene1001
-	0x004B4858,
+	1, 0x004B4860,
 	// Scene1002
-	0x004B4134,
-	0
+	1, 0x004B4138,
+	0, 0
 };
 
 static const uint32 rectListOffsets[] = {
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 99e3fcc..f02d72c 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 4354797..c2d3e6d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -33,7 +33,7 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	// Other initializations moved to actual engine class
 	
-	// TODO .text:0048AD96
+	// TODO
 
 	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
 	
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 562624d..9acda93 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
 	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
-	// TODO .text:0041C4D3 DirtySurface
+	// TODO
 	createSurface(surfacePriority, 320, 200);
 	_x = x;
 	_y = y;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 1aee786..3851cfa 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -178,7 +178,7 @@ Background *Scene::addBackground(Background *background) {
 void Scene::update() {
 
 	if (_smkFileHash != 0) {
-		// TODO .text:0040138D
+		// TODO
 		//**** ALL TODO
 		_smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0);
 		_savedUpdateHandlerCb = _updateHandlerCb;
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index a13276a..bbb0db1 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -146,7 +146,7 @@ void SmackerPlayer::update() {
 		}
 		
 		if (_doubleSurface) {
-			// TODO .text:0046422D				 mov	 byte ptr [eax+28h], 1
+			// TODO
 		}
 
 		// TODO _vm->_screen->_skipUpdate = true;


Commit: 436f8952bbd168c53481bd19f9d79372dd0561c9
    https://github.com/scummvm/scummvm/commit/436f8952bbd168c53481bd19f9d79372dd0561c9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: More work on Scene1002, Klayman and the rest

- Add "heavy debug" output to Entity (display which update/message handler is called)
- Also add more debug output
- Error out when a StaticData resource could not be found

Changed paths:
    engines/neverhood/collisionman.cpp
    engines/neverhood/collisionman.h
    engines/neverhood/entity.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/mouse.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h
    engines/neverhood/staticdata.cpp



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index 31bc16d..87ec0cd 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -39,6 +39,16 @@ void CollisionMan::setHitRects(uint32 id) {
 
 void CollisionMan::setHitRects(HitRectList *hitRects) {
 	_hitRects = hitRects;
+
+	// DEBUG
+	if (_hitRects) {
+		debug("CollisionMan::setHitRects() count = %d", _hitRects->size());
+		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) {
+			HitRect *hitRect = &(*it);
+			debug("(%d, %d, %d, %d) -> %04X", hitRect->rect.x1, hitRect->rect.y1, hitRect->rect.x2, hitRect->rect.y2, hitRect->type);
+		}
+	}
+	
 }
 
 void CollisionMan::clearHitRects() {
@@ -79,6 +89,15 @@ void CollisionMan::clearSprites() {
 	_sprites.clear();
 }
 
+void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) {
+	for (Common::Array<Sprite*>::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) {
+		Sprite *collSprite = *iter;
+		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getRect())) {
+			collSprite->sendMessage(messageNum, messageParam, sprite);
+		}
+	}	
+}
+
 void CollisionMan::save() {
 	// TODO
 }
diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h
index 1558599..8635952 100644
--- a/engines/neverhood/collisionman.h
+++ b/engines/neverhood/collisionman.h
@@ -40,6 +40,7 @@ public:
 	void addSprite(Sprite *sprite);
 	void removeSprite(Sprite *sprite);
 	void clearSprites();
+	void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam);
 	void save();
 	void restore();
 	uint getSpriteCount() const { return _sprites.size(); }
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 7538b36..18c6b7e 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -23,6 +23,7 @@
 #ifndef NEVERHOOD_ENTITY_H
 #define NEVERHOOD_ENTITY_H
 
+#include "common/str.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/gamevars.h"
 #include "neverhood/graphics.h"
@@ -71,12 +72,16 @@ protected:
 	// TODO: Constructors for the param types...
 };
 
-#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler)
-#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler)
+// TODO: Disable heavy debug stuff in release mode
+
+#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler); debug("SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler
+#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug("SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
 
 class Entity {
 public:
 	Common::String _name; // Entity name for debugging purposes
+	Common::String _updateHandlerCbName;
+	Common::String _messageHandlerCbName;
 	Entity(NeverhoodEngine *vm, int priority)
 		: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") {
 	}
@@ -86,11 +91,13 @@ public:
 	}
 	void handleUpdate() {
 		//debug("Entity(%s).handleUpdate", _name.c_str());
+		debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str());
 		if (_updateHandlerCb)
 			(this->*_updateHandlerCb)();
 	}
 	bool hasMessageHandler() const { return _messageHandlerCb != NULL; } 
 	uint32 sendMessage(int messageNum, const MessageParam &param, Entity *sender) {
+		debug(2, "sendMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
 		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
 	}
 	// NOTE: These were overloaded before for the various message parameter types
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9acda93..51dde55 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
 	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
-	// TODO
+	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
 	_x = x;
 	_y = y;
@@ -84,6 +84,7 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&Klayman::sub41FC80));
 		break;
 	case 0x4818:
+		debug("TODO sub41C930");
 		// TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false);
 		break;
 	}
@@ -304,7 +305,8 @@ bool Klayman::sub41CF10(AnimationCb callback) {
 	return false;
 }
 
- void Klayman::sub41C7B0() {
+void Klayman::sub41C7B0() {
+	debug("Klayman::sub41C7B0()");
 	if (_callback1Cb) {
 		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
@@ -334,6 +336,7 @@ void Klayman::sub41C790() {
 }
 
 void Klayman::sub41FC80() {
+	//ok
 	if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) {
 		_status2 = 1;
 		_flagE5 = true;
@@ -430,6 +433,7 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FCF0() {
+	//ok
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x5420E254, 0, -1);
@@ -505,6 +509,7 @@ void Klayman::sub4211B0() {
 }
 
 uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
 	debug("Klayman::handleMessage41E920(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
@@ -587,7 +592,8 @@ void Klayman::spriteUpdate41F5F0() {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdiff;
 		if (_field114) {
-			// TODO KlaymanSprite_sub_41CF70
+			error("// TODO Klayman_sub_41CF70");
+			// TODO Klayman_sub_41CF70
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
@@ -818,7 +824,7 @@ void Klayman::spriteUpdate41F320() {
 		_x += xdelta;
 		if (_field114) {
 			debug("_field114");
-			// TODO KlaymanSprite_sub_41CF70
+			// TODO Klayman_sub_41CF70
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
@@ -1059,8 +1065,8 @@ void Klayman::spriteUpdate41F780() {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdiff;
 		if (_field114) {
-			debug("// TODO KlaymanSprite_sub_41CF70();");
-			// TODO KlaymanSprite_sub_41CF70();
+			error("// TODO Klayman_sub_41CF70();");
+			// TODO Klayman_sub_41CF70();
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
@@ -1164,6 +1170,405 @@ void Klayman::sub420830() {
 	SetSpriteCallback(NULL);
 }
 
+void Klayman::sub41FC40() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0xAC20C012, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E3C0);
+	SetSpriteCallback(NULL);
+}
+
+uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x1008:
+		debug("case 0x1008");
+#if 0 // TODO
+		if (_frameIndex < getHashListIndexByString("SpeedUp")) {
+			setFileHash(0xAC20C012, getHashListIndexByString("SpeedUp"), -1)
+			_y = 435;
+		}
+#endif		
+		return 0;
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0460E2FA);
+		}
+		break;
+	}
+	return handleMessage41D480(messageNum, param, sender);
+}
+
+void Klayman::sub420210() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420210))) {
+		_status2 = 0;
+		setFileHash(0xD82890BA, 0, -1);
+		sub4201C0();
+	}
+}
+
+void Klayman::sub4201C0() {
+	_flagE5 = false;
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D790);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetAnimationCallback3(&Klayman::sub420340);
+	_attachedSprite->sendMessage(0x482B, 0, this);
+}
+
+uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x4806, 0, this);
+			}
+			_flagE5 = true;
+		} else if (param.asInteger() == 0x320AC306) {
+			_soundResource1.play(0x5860C640);
+		} else if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x482A, 0, this);
+		} else if (param.asInteger() == 0x88001184) {
+			_attachedSprite->sendMessage(0x482B, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::spriteUpdate41F230() {
+	AnimatedSprite::updateDeltaXY();
+	_x4 = _x;
+}
+
+void Klayman::sub420340() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x4829E0B8, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub420250() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420250))) {
+		_status2 = 0;
+		setFileHash(0x900980B2, 0, -1);
+		sub4201C0();
+	}
+}
+
+void Klayman::sub420290() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420290))) {
+		_status2 = 0;
+		_flagE5 = false;
+		setFileHash(0xBA1910B2, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetMessageHandler(&Klayman::handleMessage41D880);
+		SetAnimationCallback3(&Klayman::sub420380);
+		_attachedSprite->sendMessage(0x482B, 0, this);
+	}
+}
+
+uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x4806, 0, this);
+			}
+		} else if (param.asInteger() == 0x320AC306) {
+			_soundResource1.play(0x5860C640);
+		} else if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x482A, 0, this);
+		} else if (param.asInteger() == 0x88001184) {
+			_attachedSprite->sendMessage(0x482B, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub420380() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x4A293FB0, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41DAA0);
+	SetSpriteCallback(NULL);
+}
+
+uint32 Klayman::handleMessage41DAA0(int messageNum, const MessageParam &param, Entity *sender) {
+	if (messageNum == 0x1008) {
+		sub4203C0();
+		return 0;
+	}
+	return handleMessage41D360(messageNum, param, sender);
+}
+
+void Klayman::sub4203C0() {
+	_status2 = 1;
+	_flagE5 = false;
+	if (_attachedSprite) {
+		_attachedSprite->sendMessage(0x4807, 0, this);
+		_attachedSprite = NULL;
+	}
+	setFileHash(0xB869A4B9, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub420300() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420300))) {
+		_status2 = 0;
+		setFileHash(0xB8699832, 0, -1);
+		sub4201C0();
+	}
+}
+
+void Klayman::sub41CCE0(int16 x) {
+	sub41CC40(((Sprite*)_attachedSprite)->getX(), x);
+}
+
+void Klayman::sub420970() {
+	_status2 = 0;
+	_flagE5 = true;
+	_statusE0 = 3;
+	setFileHash2(0x3A292504, 0x01084280, 0);
+	_fileHash4 = 0x01084280;
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteCallback(NULL);
+	sub41C7B0();
+}
+
+void Klayman::sub4209D0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub4209D0))) {
+		_status2 = 0;
+		if (_y4 < _y) {
+			if (_statusE0 == 1) {
+				_statusE0 = 2;
+				sub420BC0();
+			} else {
+				sub41C7B0();
+			}
+		} else if (_statusE0 == 0) {
+			_statusE0 = 2;
+			_flagE5 = false;
+			setFileHash(0x122D1505, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		} else if (_statusE0 == 3) {
+			_statusE0 = 2;
+			_flagE5 = false;
+			setFileHash2(0x122D1505, 0x01084280, 0);
+			SetUpdateHandler(&Klayman::update);
+			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		} else if (_statusE0 == 1) {
+			_statusE0 = 2;
+			_flagE5 = true;
+			setFileHash(0x122D1505, 29 - _frameIndex, -1);
+		} 
+	}
+}
+
+void Klayman::sub420BC0() {
+	_status2 = 2;
+	if (_statusE0 == 1) {
+		_statusE0 = 0;
+		_flagE5 = false;
+		setFileHash2(0x3A292504, 0x02421405, 0);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41DFD0);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	} else if (_statusE0 == 1) {
+		_statusE0 = 0;
+		_flagE5 = false;
+		setFileHash2(0x122D1505, 0x02421405, 0);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41DFD0);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	} else {
+		sub41C7B0();
+	}
+}
+
+uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x489B025C) {
+			_soundResource1.play(0x52C4C2D7);
+		} else if (param.asInteger() == 0x400A0E64) {
+			_soundResource1.play(0x50E081D9);
+		} else if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			_flagE5 = true;
+		} else if (param.asInteger() == 0x489B025C) {
+			_soundResource1.play(0x52C4C2D7);
+		} else if (param.asInteger() == 0x400A0E64) {
+			_soundResource1.play(0x50E081D9);
+		} else if (param.asInteger() == 0x02421405) {
+			if (_statusE0 == 1) {
+				setFileHash2(0x3A292504, 0x01084280, 0);
+			} else {
+				setFileHash2(0x122D1505, 0x01084280, 0);
+			}
+			if (_statusE0 == 1) {
+				if (_y4 >= _y - 30) {
+					sendMessage(0x1019, 0, this);
+				}
+			} else {
+				if (_y4 <= _y) {
+					sendMessage(0x1019, 0, this);
+				}
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub420AD0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420AD0))) {
+		_status2 = 0;
+		if (_y4 >= _y - 30) {
+			sub41C7B0();
+		} else if (_statusE0 == 0) {
+			_statusE0 = 1;
+			_flagE5 = false;
+			setFileHash(0x3A292504, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		} else if (_statusE0 == 3) {
+			_statusE0 = 1;
+			_flagE5 = true;
+			setFileHash2(0x3A292504, 0x01084280, 0);
+			SetUpdateHandler(&Klayman::update);
+			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		} else if (_statusE0 == 2) {
+			_statusE0 = 1;
+			_flagE5 = true;
+			setFileHash(0x3A292504, 29 - _frameIndex, -1);
+		}
+	}
+}
+
+void Klayman::sub421030() {
+	_status2 = 2;
+	_flagE5 = false;
+	setFileHash2(0xF229C003, 0x14884392, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E490);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+}
+
+uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5) {
+			_parentScene->sendMessage(0x482A, 0, this);
+		} else if (param.asInteger() == 0x110010D1) {
+			_parentScene->sendMessage(0x482B, 0, this);
+		} else if (param.asInteger() == 0x32180101) {
+			if (_soundFlag) {
+				_soundResource1.play(0x48498E46);
+			} else {
+				_soundResource1.play(0x405002D8);
+			}
+		} else if (param.asInteger() == 0x0A2A9098) {
+			if (_soundFlag) {
+				_soundResource1.play(0x50399F64);
+			} else {
+				_soundResource1.play(0x0460E2FA);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub420FE0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420FE0))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0xF229C003, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E490);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	}
+}
+
+void Klayman::sub4210C0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub4210C0))) {
+		_status2 = 0;
+		_flagE5 = false;
+		setFileHash2(0xCA221107, 0x8520108C, 0);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E490);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	}
+}
+
+void Klayman::sub421070() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub421070))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0xCA221107, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E490);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	}
+}
+
+void Klayman::sub420420() {
+	_status2 = 1;
+	_flagE5 = true;
+	setFileHash(0x18118554, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E290);
+	SetSpriteCallback(NULL);
+}
+
+uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender) {
+
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x320AC306) {
+			_soundResource1.play(0x5860C640);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+//##############################################################################
+
 // KmScene1001
 
 KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -1210,8 +1615,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asPoint().x != 0) {
 			sub41CC40(param.asPoint().x, param.asPoint().y);
 		} else {
-			error("// TODO sub41CCE0(param.asPoint().y);");
-			// TODO sub41CCE0(param.asPoint().y);
+			sub41CCE0(param.asPoint().y);
 		}
 		break;
 
@@ -1277,5 +1681,532 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
+// KmScene1002
+
+KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _class599(class599), _ssLadderArch(ssLadderArch), _otherSprite(NULL),
+	_status(0) {
+	
+	setKlaymanTable1();
+	
+}
+
+void KmScene1002::xUpdate() {
+	if (_x >= 250 && _x <= 435 && _y >= 420) {
+		if (_status == 0) {
+			// TODO setKlaymanTable(stru_4B44C8);
+			_status = 1;
+		}
+	} else if (_status == 1) {
+		setKlaymanTable1();
+		_status = 0;
+	}
+}
+	
+uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
+	//ok
+	debug("KmScene1002::xHandleMessage(%04X)", messageNum);
+	if (messageNum == 0x100D)
+		debug("-> %08X", param.asInteger());
+	switch (messageNum) {
+	case 0x2001:
+		setCallback2(AnimationCallback(&KmScene1002::sub449E90));
+		break;
+	case 0x2007:
+		_otherSprite = (Sprite*)param.asEntity();
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004: 
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4803:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&KmScene1002::sub44A250));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&KmScene1002::sub44A2C0));
+		}
+		break;
+	case 0x4804:
+		setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		break;
+	case 0x4805:
+		switch (param.asInteger()) {
+		case 1:
+			setCallback2(AnimationCallback(&Klayman::sub420210));
+			break;
+		case 2:
+			setCallback2(AnimationCallback(&Klayman::sub420250));
+			break;
+		case 3:
+			setCallback2(AnimationCallback(&Klayman::sub420290));
+			break;
+		case 4:
+			setCallback2(AnimationCallback(&Klayman::sub420300));
+			break;
+		}
+		break;
+	case 0x480A:	  
+		setCallback2(AnimationCallback(&KmScene1002::sub44A3E0));
+		break;
+	case 0x480D:			   
+		setCallback2(AnimationCallback(&KmScene1002::sub449E20));
+		break;
+	case 0x4816:  
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&KmScene1002::sub44A330));
+		}
+		break;
+	case 0x4817:				  
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481B:				
+		sub41CCE0(param.asInteger());
+		break;
+	case 0x4820:  
+		_parentScene->sendMessage(0x2005, 0, this);
+		setCallback2(AnimationCallback(&Klayman::sub420970));	 
+		break;
+	case 0x4821:	
+		_parentScene->sendMessage(0x2005, 0, this);
+		_y4 = param.asInteger();
+		setCallback2(AnimationCallback(&Klayman::sub4209D0));	 
+		break;
+	case 0x4822:  
+		_parentScene->sendMessage(0x2005, 0, this);
+		_y4 = param.asInteger();
+		setCallback2(AnimationCallback(&Klayman::sub420AD0));	 
+		break;
+	case 0x4823:
+		_parentScene->sendMessage(0x2006, 0, this);
+		setCallback2(AnimationCallback(&Klayman::sub420BC0));	 
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub421030));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub421070));
+		}
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;
+	case 0x4840: 
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+void KmScene1002::update4497D0() {
+	debug("KmScene1002::update4497D0()");
+	Klayman::update();
+	if (_counter1 != 0 && (--_counter1 == 0)) {
+		_surface->setVisible(true);
+		SetUpdateHandler(&Klayman::update);
+	}
+}
+
+uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x480F, 0, this);
+			}
+		} else if (param.asInteger() == 0x586B0300) {
+			if (_otherSprite) {
+				_otherSprite->sendMessage(0x480E, 1, this);
+			}
+		} else if (param.asInteger() == 0x4AB28209) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x482A, 0, this);
+			}
+		} else if (param.asInteger() == 0x88001184) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x482B, 0, this);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
+	switch (messageNum) {
+	case 0x4811:
+		_soundResource1.play(0x5252A0E4);
+		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
+		if (_doDeltaX) {
+			_x = ((Sprite*)sender)->getX() - 75;
+		} else {
+			_x = ((Sprite*)sender)->getX() + 75;
+		}
+		_y = ((Sprite*)sender)->getY() - 200;
+		
+		debug("&&&&&&&&&&& param.asInteger() = %d", param.asInteger());
+		
+		if (param.asInteger() == 0) {
+			sub449EF0();
+		} else if (param.asInteger() == 1) {
+			sub44A0D0();
+		} else if (param.asInteger() == 2) {
+			sub44A050();
+		}
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x942D2081) {
+			_flagE5 = false;
+			_attachedSprite->sendMessage(0x2003, 0, this);
+		} else if (param.asInteger() == 0xDA600012) {
+			sub44A370();
+		} else if (param.asInteger() == 0x0D01B294) {
+			_flagE5 = false;
+			_attachedSprite->sendMessage(0x480B, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x480B, (uint32)_doDeltaX, this);
+			}
+		} else if (param.asInteger() == 0x02421405) {
+			if (_flagE4) {
+				if (_attachedSprite) {
+					if (_attachedSprite->sendMessage(0x480C, (uint32)_doDeltaX, this) != 0) {
+						sub44A460();
+					}
+				}
+			} else {
+				SetMessageHandler(&KmScene1002::handleMessage449BA0);
+			}
+		} else if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x482A, 0, this);
+		} else if (param.asInteger() == 0x88001184) {
+			_attachedSprite->sendMessage(0x482B, 0, this);
+		} else if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0460E2FA);
+		}
+		break;
+	case 0x480A:
+		_flagE4 = true;
+		return 0;
+	}
+	return handleMessage41D480(messageNum, param, sender);
+}
+
+uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			_attachedSprite->sendMessage(0x482A, 0, this);
+		} else if (param.asInteger() == 0x88001184) {
+			_attachedSprite->sendMessage(0x482B, 0, this);
+		} else if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1008:
+		debug("case 0x1008");
+#if 0 // TODO
+		if (_frameIndex < getHashListIndexByString("SpeedUp")) {
+			setFileHash(0x35AA8059, getHashListIndexByString("SpeedUp"), -1)
+			_y = 435;
+		}
+#endif		
+		messageResult = 0;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x1A1A0785) {
+			_soundResource1.play(0x40F0A342);
+		} else if (param.asInteger() == 0x60428026) {
+			_soundResource1.play(0x40608A59);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender) {
+	//ok
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x1307050A) {
+			_soundResource1.play(0x40428A09);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1002::spriteUpdate449DC0() {
+	debug("KmScene1002::spriteUpdate449DC0()");
+	AnimatedSprite::updateDeltaXY();
+	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
+	debug("$$$ hitRect->type = %04X", hitRect->type);
+	if (hitRect->type == 0x5001) {
+		_y = hitRect->rect.y1;
+		processDelta();
+		sendMessage(0x1019, 0, this);
+	}
+	_vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0);
+}
+
+void KmScene1002::sub449E20() {
+	debug("KmScene1002::sub449E20()");
+	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x584984B4, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetMessageHandler(&KmScene1002::handleMessage449800);
+		SetAnimationCallback3(&Klayman::sub420420);
+		_attachedSprite->sendMessage(0x482B, 0, this);
+	}
+}
+
+void KmScene1002::sub449E90() {
+	debug("KmScene1002::sub449E90()");
+	_soundResource1.play(0x56548280);
+	_status2 = 0;
+	_flagE5 = false;
+	_surface->setVisible(false);
+	setFileHash(0x5420E254, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1002::handleMessage4498E0);
+}
+
+void KmScene1002::sub449EF0() {
+	//ok
+	debug("KmScene1002::sub449EF0()");
+	_counter1 = 1;
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x000BAB02, 0, -1);
+	SetUpdateHandler(&KmScene1002::update4497D0);
+
+	// Weird stuff happening
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	//SetMessageHandler(&Klayman::handleMessage41D480);
+	
+	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
+	SetAnimationCallback3(&KmScene1002::sub449F70);
+	_class599->sendMessage(0x482A, 0, this);
+	_ssLadderArch->sendMessage(0x482A, 0, this);
+}
+
+void KmScene1002::sub449F70() {
+	//ok
+	debug("KmScene1002::sub449F70()");
+	_parentScene->sendMessage(0x1024, 1, this);
+	_soundResource1.play(0x41648271);
+	_status2 = 1;
+	_flagE5 = false;
+	_flagE1 = false;
+	setFileHash2(0x000BAB02, 0x88003000, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1002::handleMessage41D480);
+	SetAnimationCallback3(&KmScene1002::sub44A230);
+	_parentScene->sendMessage(0x2002, 0, this);
+	// TODO _callbackList = NULL;
+	_attachedSprite = NULL;
+	_class599->sendMessage(0x482B, 0, this);
+	_ssLadderArch->sendMessage(0x482B, 0, this);
+}
+
+void KmScene1002::sub44A050() {
+	//ok
+	debug("KmScene1002::sub44A050()");
+	_counter1 = 1;
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x9308C132, 0, -1);
+	SetUpdateHandler(&KmScene1002::update4497D0);
+	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetAnimationCallback3(&KmScene1002::sub449F70);
+	_class599->sendMessage(0x482A, 0, this);
+	_ssLadderArch->sendMessage(0x482A, 0, this);
+}
+
+void KmScene1002::sub44A0D0() {
+	//ok
+	debug("KmScene1002::sub44A0D0()");
+	_counter1 = 1;
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x0013A206, 0, -1);
+	SetUpdateHandler(&KmScene1002::update4497D0);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
+	SetAnimationCallback3(&KmScene1002::sub44A150);
+	_class599->sendMessage(0x482A, 0, this);
+	_ssLadderArch->sendMessage(0x482A, 0, this);
+}
+
+void KmScene1002::sub44A150() {
+	//ok
+	debug("KmScene1002::sub44A150()");
+	_parentScene->sendMessage(0x1024, 1, this);
+	_soundResource1.play(0x41648271);
+	_status2 = 1;
+	_flagE5 = false;
+	_flagE1 = false;
+	setFileHash2(0x0013A206, 0x88003000, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene1002::handleMessage41D480);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&KmScene1002::sub44A230);
+	_parentScene->sendMessage(0x2002, 0, this);
+	// TODO _callbackList = NULL;
+	_attachedSprite = NULL;
+	_class599->sendMessage(0x482B, 0, this);
+	_ssLadderArch->sendMessage(0x482B, 0, this);
+}
+
+void KmScene1002::sub44A230() {
+	//ok
+	debug("KmScene1002::sub44A230()");
+	setDoDeltaX(2);
+	sub41FC80();
+}
+
+void KmScene1002::sub44A250() {
+	//ok
+	debug("KmScene1002::sub44A250()");
+	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) {
+		_parentScene->sendMessage(0x1024, 3, this);
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0xB93AB151, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&KmScene1002::handleMessage449D60);
+		SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
+		SetAnimationCallback3(&Klayman::sub420420);
+	}
+}
+
+void KmScene1002::sub44A2C0() {
+	//ok
+	debug("KmScene1002::sub44A2C0()");
+	if (_attachedSprite) {
+		_x = ((Sprite*)_attachedSprite)->getX();
+		_attachedSprite->sendMessage(0x4807, 0, this);
+		_attachedSprite = NULL;
+	}
+	_status2 = 2;
+	_flagE5 = false;
+	setFileHash(0x586984B1, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene1002::handleMessage41D360);
+	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
+	SetAnimationCallback3(&Klayman::sub420420);
+}
+
+void KmScene1002::sub44A330() {
+	//ok
+	debug("KmScene1002::sub44A330()");
+	_status2 = 2;
+	_flagE5 = true;
+	setDoDeltaX(0);
+	setFileHash(0x1CD89029, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene1002::handleMessage449990);
+	SetSpriteCallback(&Klayman::spriteUpdate41F250);
+}
+
+void KmScene1002::sub44A370() {
+	//ok
+	debug("KmScene1002::sub44A370()");
+	_status2 = 1;
+	_flagE5 = false;
+	setFileHash(0x35AA8059, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene1002::handleMessage449C90);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	setCallback1(AnimationCallback(&KmScene1002::sub44A3C0));
+}
+
+void KmScene1002::sub44A3C0() {
+	debug("KmScene1002::sub44A3C0()");
+	_parentScene->sendMessage(0x1024, 1, this);
+}
+
+void KmScene1002::sub44A3E0() {
+	//ok
+	debug("KmScene1002::sub44A3E0()");
+	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) {
+		_status2 = 2;
+		_flagE4 = false;
+		_flagE5 = true;
+		setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+		setFileHash(0x5C01A870, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&KmScene1002::handleMessage449A30);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		setCallback1(AnimationCallback(&KmScene1002::sub44A4B0));
+	}
+}
+
+void KmScene1002::sub44A460() {
+	//ok
+	debug("KmScene1002::sub44A460()");
+	_flagE4 = false;
+	_flagE5 = true;
+	setFileHash2(0x5C01A870, 0x01084280, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene1002::handleMessage449A30);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	setCallback1(AnimationCallback(&KmScene1002::sub44A4B0));
+}
+
+void KmScene1002::sub44A4B0() {
+	_attachedSprite->sendMessage(0x482A, 0, this);
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 24f70e1..20d0e88 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -63,10 +63,32 @@ public:
 	void sub4208F0();
 	void sub420930();
 	void sub420830();
+	void sub41FC40();
+	void sub420210();
+	void sub4201C0();
+	void sub420340();
+	void sub420250();
+	void sub420290();
+	void sub420380();
+	void sub4203C0();
+	void sub420300();
+	void sub420970();
+	void sub4209D0();
+	void sub420BC0();
+	void sub420AD0();
+	void sub421030();
+	void sub420FE0();
+	void sub4210C0();
+	void sub421070();
+	void sub420420();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
 	void spriteUpdate41F780();
+	void spriteUpdate41F230();
+
+	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
 
 protected:
 	Entity *_parentScene;
@@ -133,10 +155,8 @@ protected:
 	void sub41C790();
 	
 	void update41D0F0();
-	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 
 	void sub41FF00();
-	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void sub41FCF0();
 	
@@ -171,11 +191,19 @@ protected:
 	void sub41CD00(int16 x);
 	void sub41CC40(int16 x1, int16 x2);
 	void sub41CAC0(int16 x);
+	void sub41CCE0(int16 x);
 	void sub41FC30();
 	
 	uint32 handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender);
-	
 	uint32 handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41E3C0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41D790(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41D880(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41DAA0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41E0D0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41E490(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender);
 	
 };
 
@@ -188,6 +216,43 @@ protected:
 	uint32 handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class KmScene1002 : public Klayman {
+public:
+	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y);
+protected:
+	Sprite *_class599;
+	Sprite *_ssLadderArch;
+	Sprite *_otherSprite;
+	int _status;
+	void xUpdate();	
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void update4497D0();
+	uint32 handleMessage449800(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage449990(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage449A30(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate449DC0();
+	void sub449E20();
+	void sub449E90();
+	void sub449EF0();
+	void sub449F70();
+	void sub44A050();
+	void sub44A0D0();
+	void sub44A150();
+	void sub44A230();
+	void sub44A250();
+	void sub44A2C0();
+	void sub44A330();
+	void sub44A370();
+	void sub44A3C0();
+	void sub44A3E0();
+	void sub44A460();
+	void sub44A4B0();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 703796e..529cbea 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -381,10 +381,10 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 		setFileHash(0x04A98C36, 0, -1);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 0x3DE, this);
+		_parentScene->sendMessage(0x1022, 990, this);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 0x3F2, this);
+		_parentScene->sendMessage(0x1022, 1010, this);
 		break;
 	}
 	return messageResult;
@@ -428,7 +428,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene1001::handleMessage);
 	
-	_vm->_collisionMan->setHitRects(0x004B4858);
+	_vm->_collisionMan->setHitRects(0x004B4860);
 	_surfaceFlag = false;
 	_background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0));
 	_palette = new Palette(_vm, 0x4086520E);
@@ -822,15 +822,520 @@ void AsScene1002Door::spriteUpdate447D40() {
 	}
 }
 
+Class505::Class505(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1400) {
+
+	createSurface(1025, 88, 165);
+	_surface->setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class505::handleMessage);	
+}
+
+uint32 Class505::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2004:
+		_x = ((Sprite*)sender)->getX() - 98;
+		_y = ((Sprite*)sender)->getY() - 111;
+		setFileHash(0x0422255A, 0, -1);
+		_surface->setVisible(true);
+		break;
+	case 0x3002:
+		setFileHash1();
+		_surface->setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505)
+	: AnimatedSprite(vm, 1300), _rect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _class505(class505),
+	_soundResource(vm) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
+	SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0);
+	
+	createSurface(800, 136, 147);
+	_surface->getClipRect() = clipRect;
+	
+	spriteUpdate448AA0();
+
+	// TODO _soundResource.load(0xC0C40298);
+	
+	setFileHash(0x586C1D48, 0, 0);
+		
+}
+
+uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xA61CA1C2) {
+			_class505->sendMessage(0x2004, 0, this);
+		} else if (param.asInteger() == 0x14CE0620) {
+			// TODO _soundResource.play();
+		}
+		break;
+	case 0x2003:
+		sub448B10();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage4489D0(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1002DoorSpy::spriteUpdate448AA0() {
+	_x = _asDoor->getX() + 34;
+	_y = _asDoor->getY() + 175;
+}
+
+void AsScene1002DoorSpy::sub448AC0() {
+	_surface->getClipRect() = _rect;
+	_parentScene->setSurfacePriority(getSurface(), 800);
+	setFileHash(0x586C1D48, 0, 0);
+	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
+}
+
+void AsScene1002DoorSpy::sub448B10() {
+	_surface->getClipRect().x1 = 0;
+	_surface->getClipRect().y1 = 0;
+	_surface->getClipRect().x2 = 640;
+	_surface->getClipRect().y2 = 480;
+	_parentScene->setSurfacePriority(getSurface(), 1200);
+	setFileHash(0x586C1D48, 1, -1);
+	SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60);
+	SetAnimationCallback3(&AsScene1002DoorSpy::sub448AC0);
+}
+
+Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
+	: StaticSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm), _status(0) {
+
+	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000;
+
+	_fileHashes[0] = fileHash1;
+	_fileHashes[1] = fileHash2;
+	    
+	_spriteResource.load2(fileHash1);
+	createSurface(surfacePriority, 40, 40);
+	    
+	_surface->getDrawRect().x = 0;
+	_surface->getDrawRect().y = 0;
+	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+	_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+
+	_surface->setVisible(false);
+	_needRefresh = true;
+	
+	SetUpdateHandler(&Class426::update);
+	SetMessageHandler(&Class426::handleMessage);
+
+}
+
+void Class426::update() {
+	if (_countdown != 0 && (--_countdown) == 0) {
+		if (_status == 1) {
+			_status = 2;
+			_spriteResource.load2(_fileHashes[1]);
+			_surface->getDrawRect().x = 0;
+			_surface->getDrawRect().y = 0;
+			_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+			_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+			_x = _spriteResource.getPosition().x;
+			_y = _spriteResource.getPosition().y;
+			_needRefresh = true;
+			StaticSprite::update();
+			_countdown = 4;
+		} else if (_status == 2) {
+			_status = 3;
+			_spriteResource.load2(_fileHashes[0]);
+			_surface->getDrawRect().x = 0;
+			_surface->getDrawRect().y = 0;
+			_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+			_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+			_x = _spriteResource.getPosition().x;
+			_y = _spriteResource.getPosition().y;
+			_needRefresh = true;
+			StaticSprite::update();
+			_countdown = 4;
+		} else if (_status == 3) {
+			_status = 0;
+			_surface->setVisible(false);
+		}
+	}
+}
+
+uint32 Class426::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x480B:
+		_parentScene->sendMessage(0x480B, 0, this);
+		_status = 1;
+		_countdown = 4;
+		_surface->setVisible(true);
+		_soundResource.play(_soundFileHash);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _klayman(klayman),
+	_flag(flag), _countdown(0) {
+
+	createSurface(995, 175, 195);
+
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+
+	if (!flag) {
+		if (getGlobalVar(0x8306F218)) {
+			setDoDeltaX(1);
+			_x = 366;
+			_y = 435;
+			sub4485F0();
+		} else {
+			_x = 174 + getGlobalVar(0x1B144052) * 32;
+			_y = 435;
+			sub448660();
+		}
+	} else {
+		_x = 186 + getGlobalVar(0x86341E88) * 32;
+		_y = 364;
+		if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) {
+			sub4485F0();
+		} else {
+			sub448660();
+		} 
+	}
+	
+	_flags = 4;
+}
+
+void AsScene1002VenusFlyTrap::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		removeCallbacks();
+	}
+	AnimatedSprite::update();
+}
+
+void AsScene1002VenusFlyTrap::update447FB0() {
+	if (_countdown == 0 && _klayman->getX() - 20 > _x) {
+		setDoDeltaX(1);
+	} else if (_klayman->getX() + 20 < _x) {
+		setDoDeltaX(0);
+	}
+	update();
+}
+
+uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x000890C4) {
+			_soundResource.play(0xC21190D8);
+		} else if (param.asInteger() == 0x522200A0) {
+			_soundResource.play(0x931080C8);
+		}
+		break;
+	case 0x1011:
+		if (_flag) {
+			if (_x >= 154 && _x <= 346) {
+				_parentScene->sendMessage(0x2000, 0, this);
+				messageResult = 1;
+			}
+		} else {
+			if (_x >= 174 && _x <= 430) {
+				_parentScene->sendMessage(0x2000, 0, this);
+				messageResult = 1;
+			}
+		}
+		break;
+	case 0x480B:
+		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
+		if (_flag) {
+			if (getGlobalVar(0x8306F218)) {
+				sub448560();
+			} else {
+				sub448530();
+			}
+		} else {
+			if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) {
+				sub448560();
+			} else {
+				sub448530();
+			}
+		}
+		break;
+	case 0x480C:
+		if (_flag) {
+			if (_x >= 154 && _x <= 346)
+				messageResult = 1;
+			else				
+				messageResult = 0;
+		} else {
+			if (_x >= 174 && _x <= 430)
+				messageResult = 1;
+			else				
+				messageResult = 0;
+		}
+		break;
+	case 0x480E:
+		if (param.asInteger() == 1) {
+			sub4485B0();
+		}
+		break;
+	case 0x4810:
+	debug("trap collision");
+		sub448780();
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 995, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1015, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage448000(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x000890C4) {
+			_soundResource.play(0xC21190D8);
+		} else if (param.asInteger() == 0x41881801) {
+			if (_flag) {
+				if (_x > 330) {
+					_klayman->sendMessage(0x4811, 2, this);
+				} else if (_x > 265) {
+					_klayman->sendMessage(0x4811, 0, this);
+				} else {
+					_klayman->sendMessage(0x4811, 0, this);
+				}
+			} else {
+				_klayman->sendMessage(0x4811, 0, this);
+			}
+		} else if (param.asInteger() == 0x522200A0) {
+			_soundResource.play(0x931080C8);
+		}
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 995, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1015, this);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1002VenusFlyTrap::sub4484F0() {
+	//ok
+	setDoDeltaX(2);
+	setFileHash(0xC4080034, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+}
+
+void AsScene1002VenusFlyTrap::sub448530() {
+	//ok
+	setFileHash(0xC4080034, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+}
+
+void AsScene1002VenusFlyTrap::sub448560() {
+	//ok
+	_parentScene->sendMessage(0x4807, 0, this);
+	setFileHash(0x82292851, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+}
+
+void AsScene1002VenusFlyTrap::sub4485B0() {
+	//ok
+	setDoDeltaX(1);
+	setFileHash(0x86A82A11, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4485F0);
+}
+
+void AsScene1002VenusFlyTrap::sub4485F0() {
+	//ok
+	setFileHash(0xB5A86034, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
+}
+
+void AsScene1002VenusFlyTrap::sub448620() {
+	//ok
+	setFileHash(0x31303094, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(NULL);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448720);
+	_countdown = 24;
+}
+
+void AsScene1002VenusFlyTrap::sub448660() {
+	setFileHash(0xC8204250, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update447FB0);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
+	if (_flag) {
+		if (_x >= 154 && _x <= 346) {
+			setGlobalVar(0x86341E88, (_x - 186) / 32);
+		} else {
+			SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0);
+			_countdown = 12;
+		}
+	} else {
+		if (_x >= 174 && _x <= 430) {
+			setGlobalVar(0x1B144052, (_x - 174) / 32);
+		} else {
+			SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0);
+			_countdown = 12;
+		}
+	}
+}
+
+void AsScene1002VenusFlyTrap::sub448720() {
+	//ok
+	setFileHash(0x152920C4, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448750);
+}
+
+void AsScene1002VenusFlyTrap::sub448750() {
+	//ok
+	setFileHash(0x84001117, 0, -1);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
+	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+}
+
+void AsScene1002VenusFlyTrap::sub448780() {
+debug("AsScene1002VenusFlyTrap::sub448780()");
+	if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) {
+		if (_flag) {
+			setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0);
+		} else {
+			setDoDeltaX(_x > 320 ? 1 : 0);
+		}
+		_klayman->sendMessage(0x2001, 0, this);
+		setFileHash(0x8C2C80D4, 0, -1);
+		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+		SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
+		SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448620);
+	}
+}
+
+Class506::Class506(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _countdown(0) {
+
+	createSurface(850, 186, 212);
+	_x = 320;
+	_y = 240;
+	if (getGlobalVar(0x8306F218)) {
+		setFileHash(0x004A4495, -1, -1);
+		_newHashListIndex = -2;
+	} else {
+		_surface->setVisible(false);
+	}
+	SetUpdateHandler(&Class506::update);
+	SetMessageHandler(&Class506::handleMessage4491B0);	
+}
+
+void Class506::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		if (_flag) {
+			sub449280();
+		} else {
+			sub449250();
+		}
+	}
+	AnimatedSprite::update();
+}
+
+uint32 Class506::handleMessage4491B0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageResult) {
+	case 0x4808:
+		_flag = false;
+		_countdown = 2;
+		break;
+	case 0x4809:
+		_flag = true;
+		_countdown = 2;
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Class506::handleMessage449210(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage4491B0(messageNum, param, sender);
+	switch (messageResult) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class506::sub449250() {
+	setFileHash(0x004A4495, 0, -1);
+	SetMessageHandler(&Class506::handleMessage4491B0);
+	_newHashListIndex = -2;
+	_surface->setVisible(true);
+}
+
+void Class506::sub449280() {
+	setFileHash(0x004A4495, -1, -1);
+	_playBackwards = true;
+	SetMessageHandler(&Class506::handleMessage449210);
+	SetAnimationCallback3(&Class506::sub4492C0);
+	_surface->setVisible(true);
+}
+
+void Class506::sub4492C0() {
+	_surface->setVisible(false);
+	setFileHash1();
+}
+
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
 	_flag1B4(false), _flag1BE(false) {
 
-	static const uint32 kClass426FileHashList[] = {
-		0x00412692,
-		0x140B60BE
-	};
-
 	NRect tempClipRect;
 	Sprite *tempSprite;
 
@@ -848,7 +1353,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1002::update);
 	SetMessageHandler(&Scene1002::handleMessage);
 
-	_vm->_collisionMan->setHitRects(0x004B4134);
+	_vm->_collisionMan->setHitRects(0x004B4138);
 
 	_surfaceFlag = true;
 
@@ -868,46 +1373,46 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_class599 = addSprite(new Class599(_vm, this));
 
-#if 0
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
-			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226));
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
+			//_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			// TODO			
 			// TODO _klayman->setRepl(64, 0);
 		} else {
-			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435));
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435);
+			//_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			// TODO			
 		}
 	} else {
 		if (which == 1) {
-			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435));
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
+			//_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4478);
 			// TODO			
 			_vm->_gameState.field2 = 1;
 		} else if (which == 2) {
-			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645));
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
+			//_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4298);
 			// TODO
 			_vm->_gameState.field2 = 1;
 			_klayman->sendMessage(0x4820, 0, this);
 		} else {
-			_klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226));
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
+			//_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4470);
 			// TODO
-			_class479 = addSprite(new Class479(_vm, this, _klayman));
+			//_class479 = addSprite(new Class479(_vm, this, _klayman));
 			// TODO
 			// TODO _klayman->setRepl(64, 0);
 			_vm->_gameState.field2 = 0;
 		} 
 	}
-#endif
+
+    addSprite(_klayman);
 
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL));
 
@@ -925,22 +1430,21 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect));
 	
-#if 0
+	tempSprite = addSprite(new Class505(_vm));
 
-	tempSprite = addSprite(new Class505(_vm, tempClipRect));
-
-	_class504 = addSprite(new Class504(_vm, tempClipRect, this, _asDoor, tempSprite));
-	_class426 = addSprite(new Class426(_vm, this, kClass426FileHashList, 800, 0));
-	_class503 = addSprite(new Class503(_vm, this, _klayman, false));
+	_asDoorSpy = addSprite(new AsScene1002DoorSpy(_vm, tempClipRect, this, _asDoor, tempSprite));
+	
+	_class426 = addSprite(new Class426(_vm, this, 0x00412692, 0x140B60BE, 800, 0));
+	_asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, false));
 	
-	_vm->_collisionMan->addSprite(_class503);
-	_klayman->sendEntityMessage(0x2007, _class503, this);
+	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
+
+	_klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this);
 
 	_class506 = addSprite(new Class506(_vm));
 								  
 	setRectList(0x004B43A0);
 
-#endif
 								  
 #if 0 // TODO
 	_soundResource2.load(0x60755842);
@@ -954,11 +1458,10 @@ Scene1002::~Scene1002() {
 
 void Scene1002::update() {
 	Scene::update();
-#if 0 // TODO: Waiting for Klayman...	
 	if (!_flag1B4 && _klayman->getY() > 230) {
 		// TODO
 		deleteSprite(&_ssLadderArchPart3);
-		_klayman->clearRepl();
+		// TODO _klayman->clearRepl();
 		_flag1B4 = true;
 		_vm->_gameState.field2 = 1;
 	}
@@ -968,11 +1471,10 @@ void Scene1002::update() {
 		_flag1BE = false;
 	}
 	
-#endif
-
 }
 
 uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Scene1002::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -1011,7 +1513,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 				setMessageList(0x004B44B8);
 			} else {
 				_klayman->sendEntityMessage(0x1014, _asRing3, this);
-				if (_class503->getX() - 10 < 366 && _class503->getX() + 10 > 366) {
+				if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) {
 					setGlobalVar(0x2B514304, 1);
 					setMessageList(0x004B44A8);
 				} else {
@@ -1043,7 +1545,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			setMessageList2(0x004B43D0);
 		} else {
 			if (_klayman->getY() > 420) {
-				_klayman->sendEntityMessage(0x1014, _class503, this);
+				_klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this);
 				setMessageList2(0x004B4480);
 			} else if (_klayman->getY() > 227) {
 				setMessageList2(0x004B41E0);
@@ -1090,14 +1592,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			_soundResource3.play();
 			_asDoor->sendMessage(0x4809, 0, this);
 			_class506->sendMessage(0x4809, 0, this);
-		} else if (sender == _class503) {
+		} else if (sender == _asVenusFlyTrap) {
 			if (getGlobalVar(0x8306F218)) {
 				_asRing3->sendMessage(0x4807, 0, this);
 			}
 		}	
 		break;
 	case 0x480B:
-		_klayman->sendEntityMessage(0x1014, _class504, this);
+		_klayman->sendEntityMessage(0x1014, _asDoorSpy, this);
 		break;				
 	case 0x480F:
 		setGlobalVar(0x4DE80AC0, 0);
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index c78658f..79a4985 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -176,6 +176,84 @@ protected:
 	void spriteUpdate447D40();
 };
 
+class Class505 : public AnimatedSprite {
+public:
+	Class505(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1002DoorSpy : public AnimatedSprite {
+public:
+	AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505);
+protected:
+	Scene *_parentScene;
+	Sprite *_asDoor;
+	Sprite *_class505;
+	SoundResource _soundResource;
+	NRect _rect;
+	uint32 handleMessage4489D0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage448A60(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate448AA0();
+	void sub448AC0();
+	void sub448B10();
+};
+
+class Class426 : public StaticSprite {
+public:
+	Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
+	// TODO Class426_sub433660 (not used yet)
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	uint32 _fileHashes[2];
+	int _status;
+	SoundResource _soundResource;
+	uint32 _soundFileHash;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene1002VenusFlyTrap : public AnimatedSprite {
+public:
+	AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag);
+protected:
+	Scene *_parentScene;
+	Sprite *_klayman;
+	int _countdown;
+	SoundResource _soundResource;
+	bool _flag;
+	void update();
+	void update447FB0();
+	uint32 handleMessage448000(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage4482E0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage448320(int messageNum, const MessageParam &param, Entity *sender);
+	void sub4484F0();
+	void sub448530();
+	void sub448560();
+	void sub4485B0();
+	void sub4485F0();
+	void sub448620();
+	void sub448660();
+	void sub448720();
+	void sub448750();
+	void sub448780();
+};
+
+class Class506 : public AnimatedSprite {
+public:
+	Class506(NeverhoodEngine *vm);
+protected:
+	int _countdown;
+	bool _flag;
+	void update();
+	uint32 handleMessage4491B0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage449210(int messageNum, const MessageParam &param, Entity *sender);
+	void sub449250();
+	void sub449280();
+	void sub4492C0();
+};
+
 class Scene1002 : public Scene {
 public:
 	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -195,8 +273,8 @@ protected:
 	Sprite *_asRing4;
 	Sprite *_asRing5;
 	Sprite *_asDoor;
-	Sprite *_class504;
-	Sprite *_class503;
+	Sprite *_asDoorSpy;
+	Sprite *_asVenusFlyTrap;
 	Sprite *_ssLadderArch;
 	Sprite *_ssLadderArchPart1;
 	Sprite *_ssLadderArchPart2;
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index c753183..381f4a7 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -29,7 +29,7 @@ namespace Neverhood {
 Mouse433::Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect)
 	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0) {
 	
-	debug("Mouse433::Mouse433(%08X)", fileHash);
+	debug(7, "Mouse433::Mouse433(%08X)", fileHash);
 	
 	if (mouseRect) {
 		_mouseRect = *mouseRect;
@@ -70,7 +70,7 @@ void Mouse433::load(uint32 fileHash) {
 }
 
 void Mouse433::update() {
-	debug("Mouse433::update()");
+	debug(7, "Mouse433::update()");
 	updateCursor();
 	_frameNum++;
 	if (_frameNum >= 6)
@@ -79,7 +79,7 @@ void Mouse433::update() {
 }
 
 uint32 Mouse433::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Mouse433::handleMessage(%04X)", messageNum);
+	debug(7, "Mouse433::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	if (messageNum != 5) {
 		messageResult = Sprite::handleMessage(messageNum, param, sender);
@@ -103,7 +103,7 @@ uint32 Mouse433::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Mouse433::updateCursor() {
-	debug("Mouse433::updateCursor()");
+	debug(7, "Mouse433::updateCursor()");
 	
 	if (!_surface)
 		return;
@@ -131,7 +131,7 @@ void Mouse433::updateCursor() {
 Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
 	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
 	
-	debug("Mouse435::Mouse435(%08X)", fileHash);
+	debug(7, "Mouse435::Mouse435(%08X)", fileHash);
 	
 	_mouseCursorResource.load(fileHash);
 	_x = _vm->getMouseX();	
@@ -165,7 +165,7 @@ void Mouse435::load(uint32 fileHash) {
 }
 
 void Mouse435::update() {
-	debug("Mouse435::update()");
+	debug(7, "Mouse435::update()");
 	updateCursor();
 	_frameNum++;
 	if (_frameNum >= 6)
@@ -174,7 +174,7 @@ void Mouse435::update() {
 }
 
 uint32 Mouse435::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Mouse435::handleMessage(%04X)", messageNum);
+	debug(7, "Mouse435::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	if (messageNum != 5) {
 		messageResult = Sprite::handleMessage(messageNum, param, sender);
@@ -199,7 +199,7 @@ uint32 Mouse435::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Mouse435::updateCursor() {
-	debug("Mouse435::updateCursor()");
+	debug(7, "Mouse435::updateCursor()");
 	
 	if (!_surface)
 		return;
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 841827a..dde80eb 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -291,10 +291,14 @@ void AnimResource::unloadInternal() {
 }
 
 int16 AnimResource::getFrameIndex(uint32 frameHash) {
+	int16 frameIndex = -1;
 	for (uint i = 0; i < _frames.size(); i++)
-		if (_frames[i].frameHash == frameHash)
-			return (int16)i;
-	return -1;			
+		if (_frames[i].frameHash == frameHash) {
+			frameIndex = (int16)i;
+			break;
+		}
+	debug("AnimResource::getFrameIndex(%08X) -> %d", frameHash, frameIndex);
+	return frameIndex;			
 }
 
 MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 3851cfa..7252e39 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -416,7 +416,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 }
 
 void Scene::runMessageList() {
-	debug("Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1);
+	debug(7, "Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1);
 
 	if (_messageListFlag2 || _messageListFlag1)
 		return;
@@ -434,7 +434,7 @@ void Scene::runMessageList() {
 			int messageNum = (*_messageList)[_messageListIndex].messageNum;
 			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
 			
-			//debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
+			debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
 			
 			_messageListIndex++;
 			if (_messageListIndex == _messageListCount) {
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 222368c..155d325 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -72,6 +72,10 @@ bool Sprite::isPointInside(int16 x, int16 y) {
 	return x >= _rect.x1 && x <= _rect.x2 && y >= _rect.y1 && y <= _rect.y2;
 }
 
+bool Sprite::checkCollision(NRect &rect) {
+	return (_rect.x1 < rect.x2) && (rect.x1 < _rect.x2) && (_rect.y1 < rect.y2) && (rect.y1 < _rect.y2);	
+}
+
 uint32 Sprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x0005:
@@ -373,6 +377,7 @@ void AnimatedSprite::updatePosition() {
 
 void AnimatedSprite::updateFrameIndex() {
 	if (!_playBackwards) {
+		debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2);
 		if (_frameIndex < _frameIndex2) {
 			_frameIndex++;
 		} else {
@@ -441,6 +446,7 @@ void AnimatedSprite::setFileHash1() {
 }
 
 void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) {
+	debug("AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5);
 	_fileHash1 = fileHash;
 	_fileHash6 = fileHash6;
 	_fileHash5 = fileHash5;
@@ -498,6 +504,7 @@ void AnimatedSprite::removeCallbacks() {
 	if (_callback3Cb) {
 		_callback2Cb = _callback3Cb;
 		_callback3Cb = NULL;
+		debug("Fire _callback3Cb '%s'", _callback3CbName.c_str());
 		(this->*_callback2Cb)();
 #if 0 // TODO		
 	} else if (_callbackList) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 0368d2d..996c063 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -30,9 +30,9 @@
 
 namespace Neverhood {
 
-#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback)
-#define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback)
-#define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback)
+#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback); debug("SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback
+#define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug("SetFilterX(" #callback ")")
+#define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug("SetFilterY(" #callback ")")
 
 const int16 kDefPosition = -32768;
 
@@ -45,12 +45,16 @@ public:
 	void setDoDeltaX(int type);
 	void setDoDeltaY(int type);
 	bool isPointInside(int16 x, int16 y);
+	bool checkCollision(NRect &rect);
 	int16 getX() const { return _x; }
 	int16 getY() const { return _y; }
+	uint16 getFlags() const { return _flags; }
 	bool isDoDeltaX() const { return _doDeltaX; }
 	bool isDoDeltaY() const { return _doDeltaY; }
+	NRect& getRect() { return _rect; }
 protected:
 	void (Sprite::*_spriteUpdateCb)();
+	Common::String _spriteUpdateCbName; // For debugging purposes
 	int16 (Sprite::*_filterXCb)(int16);
 	int16 (Sprite::*_filterYCb)(int16);
 	BaseSurface *_surface;
@@ -92,9 +96,9 @@ protected:
 	void update();
 };
 
-#define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
-#define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
-#define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback)
+#define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback
+#define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback
+#define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback
 #define AnimationCallback(callback) static_cast <void (AnimatedSprite::*)()> (callback)
 
 class AnimatedSprite : public Sprite {
@@ -133,6 +137,10 @@ protected:
 	AnimationCb _callback1Cb;
 	AnimationCb _callback2Cb;
 	AnimationCb _callback3Cb;
+	// For debugging purposes
+	Common::String _callback1CbName;
+	Common::String _callback2CbName;
+	Common::String _callback3CbName;
 	void init();
 	void updateAnim();
 	void updatePosition();
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 4cd1d30..b9ac232 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -107,14 +107,20 @@ void StaticData::load(const char *filename) {
 }
 
 HitRectList *StaticData::getHitRectList(uint32 id) {
+	if (!_hitRectLists[id])
+		error("StaticData::getHitRectList() HitRectList with id %08X not found", id);
 	return _hitRectLists[id];
 }
 
 RectList *StaticData::getRectList(uint32 id) {
+	if (!_rectLists[id])
+		error("StaticData::getRectList() RectList with id %08X not found", id);
 	return _rectLists[id];
 }
 
 MessageList *StaticData::getMessageList(uint32 id) {
+	if (!_messageLists[id])
+		error("StaticData::getMessageList() MessageList with id %08X not found", id);
 	return _messageLists[id];
 }
 


Commit: 264777893578186cb27113f5918ef5e62fcfb836
    https://github.com/scummvm/scummvm/commit/264777893578186cb27113f5918ef5e62fcfb836
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Fix crash/corruption in clipped sprite drawing

Changed paths:
    engines/neverhood/neverhood.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/screen.cpp



diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index abae6eb..9e1475f 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -89,6 +89,7 @@ Common::Error NeverhoodEngine::run() {
 
 	CursorMan.showMouse(true);
 	{
+		// DEBUG: Dummy cursor
 		byte buffer[2*2];
 		memset(buffer, 255, 4);
 		CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0);
@@ -166,22 +167,13 @@ Common::Error NeverhoodEngine::run() {
 				_mouseY = event.mouse.y;
 				_gameModule->handleMouseMove(event.mouse.x, event.mouse.y);
 				break;
-
 			case Common::EVENT_LBUTTONDOWN:
 			case Common::EVENT_RBUTTONDOWN:
 				_gameModule->handleMouseDown(event.mouse.x, event.mouse.y);
 				break;
-
 			/*			
-				_buttonState |= kLeftButton;
-				break;
 			case Common::EVENT_LBUTTONUP:
-				_buttonState &= ~kLeftButton;
-				break;
-				_buttonState |= kRightButton;
-				break;
 			case Common::EVENT_RBUTTONUP:
-				_buttonState &= ~kRightButton;
 				break;
 			case Common::EVENT_QUIT:
 				_system->quit();
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 7252e39..2b5c81b 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -179,7 +179,6 @@ void Scene::update() {
 
 	if (_smkFileHash != 0) {
 		// TODO
-		//**** ALL TODO
 		_smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0);
 		_savedUpdateHandlerCb = _updateHandlerCb;
 		_savedMessageHandlerCb = _messageHandlerCb;
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 7b3d4bc..a884914 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -104,7 +104,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 	else
 		ddRect.x2 = drawRect.width;
 		
-	if (drawRect.x <= clipRect.x1) {
+	if (drawRect.x < clipRect.x1) {
 		destX = clipRect.x1;
 		ddRect.x1 = clipRect.x1 - drawRect.x;
 	} else {
@@ -117,7 +117,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 	else
 		ddRect.y2 = drawRect.height;
 	
-	if (drawRect.y <= clipRect.y1) {
+	if (drawRect.y < clipRect.y1) {
 		destY = clipRect.y1;
 		ddRect.y1 = clipRect.y1 - drawRect.y;
 	} else {
@@ -125,13 +125,16 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 		ddRect.y1 = 0;
 	}
 	
-	debug(8, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
-	
+	debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
+
 	const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
 	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
 	int width = ddRect.x2 - ddRect.x1;
 	int height = ddRect.y2 - ddRect.y1;
 
+	if (width <= 0 || height <= 0)
+		return;
+	
 	if (!transparent) {
 		while (height--) {
 			memcpy(dest, source, width);
@@ -146,8 +149,13 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 			source += surface->pitch;
 			dest += _backScreen->pitch;
 		}
-	} 
-	
+	}
+
+	// Useful for debugging	
+	//_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); 
+	//_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); 
+	//_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255);
+
 }
 
 void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) {


Commit: 8a5c4a84d082074ad7aa47c5f797876b1cb7120f
    https://github.com/scummvm/scummvm/commit/8a5c4a84d082074ad7aa47c5f797876b1cb7120f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:47-07:00

Commit Message:
NEVERHOOD: Implement color replace in AnimatedSprite

(used to disable a color in sprite drawing)

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module1000.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 68134bd..b9e2c48 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -197,6 +197,51 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 
 }
 
+void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY) {
+
+	// TODO: Flip Y
+	
+	debug("unpackSpriteRleRepl(%d, %d)", oldColor, newColor);
+
+	int16 rows, chunks;
+	int16 skip, copy;
+
+	rows = READ_LE_UINT16(source);
+	chunks = READ_LE_UINT16(source + 2);
+	source += 4;
+
+	do {
+		if (chunks == 0) {
+			dest += rows * destPitch;
+		} else {
+			while (rows-- > 0) {
+				uint16 rowChunks = chunks;
+				while (rowChunks-- > 0) {
+					skip = READ_LE_UINT16(source);
+					copy = READ_LE_UINT16(source + 2);
+					source += 4;
+					if (!flipX) {
+						for (int xc = 0; xc < copy; xc++) {
+							dest[skip + xc] = source[xc] == oldColor ? newColor : source[xc];
+						}
+					} else {
+						byte *flipDest = dest + width - skip - 1;
+						for (int xc = 0; xc < copy; xc++) {
+							*flipDest-- = source[xc] == oldColor ? newColor : source[xc];
+						}
+					}
+					source += copy;
+				}
+				dest += destPitch;
+			}
+		}
+		rows = READ_LE_UINT16(source);
+		chunks = READ_LE_UINT16(source + 2);
+		source += 4;
+	} while (rows > 0);
+
+}
+
 void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
 
 	// TODO: Flip Y
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 2bddea3..9ac23a8 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -91,6 +91,7 @@ protected:
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels);
 void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
+void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY);
 void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 529cbea..04059ca 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -924,10 +924,10 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui
 
 	_fileHashes[0] = fileHash1;
 	_fileHashes[1] = fileHash2;
-	    
+	
 	_spriteResource.load2(fileHash1);
 	createSurface(surfacePriority, 40, 40);
-	    
+	
 	_surface->getDrawRect().x = 0;
 	_surface->getDrawRect().y = 0;
 	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
@@ -1379,7 +1379,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			//_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			// TODO			
-			// TODO _klayman->setRepl(64, 0);
+			_klayman->setRepl(64, 0);
 		} else {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435);
 			//_class478 = addSprite(new Class478(_vm, _klayman));
@@ -1407,7 +1407,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			// TODO
 			//_class479 = addSprite(new Class479(_vm, this, _klayman));
 			// TODO
-			// TODO _klayman->setRepl(64, 0);
+			_klayman->setRepl(64, 0);
 			_vm->_gameState.field2 = 0;
 		} 
 	}
@@ -1461,7 +1461,7 @@ void Scene1002::update() {
 	if (!_flag1B4 && _klayman->getY() > 230) {
 		// TODO
 		deleteSprite(&_ssLadderArchPart3);
-		// TODO _klayman->clearRepl();
+		_klayman->clearRepl();
 		_flag1B4 = true;
 		_vm->_gameState.field2 = 1;
 	}
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index dde80eb..97eae89 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -158,8 +158,10 @@ void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX,
 	_currSpriteData = _spriteData + frameInfo.spriteDataOffs;
 	_width = frameInfo.rect.width;
 	_height = frameInfo.rect.height;
-	// TODO: Repl stuff
-	unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY);	
+	if (_replEnabled && _replOldColor != _replNewColor)
+		unpackSpriteRleRepl(_currSpriteData, _width, _height, dest, destPitch, _replOldColor, _replNewColor, flipX, flipY);
+	else
+		unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY);
 }
 
 bool AnimResource::load(uint32 fileHash) {
@@ -276,8 +278,8 @@ void AnimResource::clear() {
 void AnimResource::clear2() {
 	clear();
 	_replEnabled = true;
-	_replOldByte = 0;
-	_replNewByte = 0;
+	_replOldColor = 0;
+	_replNewColor = 0;
 }
 
 bool AnimResource::loadInternal(uint32 fileHash) {
@@ -301,6 +303,11 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) {
 	return frameIndex;			
 }
 
+void AnimResource::setRepl(byte oldColor, byte newColor) {
+	_replOldColor = oldColor;
+	_replNewColor = newColor;
+}
+
 MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) 
 	: _cursorSprite(vm), _cursorNum(4), _currFileHash(0) {
 
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index b2a98c7..610973c 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -87,6 +87,8 @@ public:
 	uint getFrameCount() const { return _frames.size(); }
 	const AnimFrameInfo& getFrameInfo(int16 index) const { return _frames[index]; }
 	int16 getFrameIndex(uint32 frameHash);
+	void setReplEnabled(bool value) { _replEnabled = value; }
+	void setRepl(byte oldColor, byte newColor);
 protected:
 	NeverhoodEngine *_vm;
 	int _resourceHandle;
@@ -96,8 +98,8 @@ protected:
 	byte *_paletteData;
 	byte *_spriteData;
 	bool _replEnabled;
-	byte _replOldByte;
-	byte _replNewByte;
+	byte _replOldColor;
+	byte _replNewColor;
 	Common::Array<AnimFrameInfo> _frames;
 };
 
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 155d325..78c780b 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -227,9 +227,9 @@ void AnimatedSprite::init() {
 	_newHashListIndex = -1;
 	_fileHash4 = 0;
 	_flag = false;
-	_replOldByte = 0;
-	_replNewByte = 0;
-	// TODO _animResource.replEnabled = 0;
+	_replOldColor = 0;
+	_replNewColor = 0;
+	_animResource.setReplEnabled(false);
 	_playBackwards = false;
 }
 
@@ -255,6 +255,18 @@ void AnimatedSprite::updateDeltaXY() {
 	processDelta();
 }
 
+void AnimatedSprite::setRepl(byte oldColor, byte newColor) {
+	_replOldColor = oldColor;
+	_replNewColor = newColor;
+	_animResource.setReplEnabled(true);
+}
+
+void AnimatedSprite::clearRepl() {
+	_replOldColor = 0;
+	_replNewColor = 0;
+	_animResource.setReplEnabled(false);
+}
+
 void AnimatedSprite::updateAnim() {
 
 	_flag = false;
@@ -280,9 +292,8 @@ void AnimatedSprite::updateAnim() {
 						// TODO _animResource.loadInternal(calcHash("sqDefault"));
 						_fileHash3 = 0;
 					}
-					if (_replNewByte != _replOldByte) {
-						debug("TODO");
-						// TODO _animResource.setRepl(_replOldByte, _replNewByte);
+					if (_replOldColor != _replNewColor) {
+						_animResource.setRepl(_replOldColor, _replNewColor);	
 					}
 					_fileHash2 = 0;
 					if (_animStatus != 0) {
@@ -313,9 +324,8 @@ void AnimatedSprite::updateAnim() {
 					// TODO _animResource.loadInternal(calcHash("sqDefault"));
 					_fileHash3 = 0;
 				}
-				if (_replNewByte != _replOldByte) {
-					debug("TODO");
-					// TODO _animResource.setRepl(_replOldByte, _replNewByte);
+				if (_replOldColor != _replNewColor) {
+					_animResource.setRepl(_replOldColor, _replNewColor);	
 				}
 				_fileHash1 = 0;
 				_frameIndex = _fileHash6 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash6)) : 0;
@@ -328,9 +338,8 @@ void AnimatedSprite::updateAnim() {
 					// TODO _animResource.loadInternal(calcHash("sqDefault"));
 					_fileHash3 = 0;
 				}
-				if (_replNewByte != _replOldByte) {
-					debug("TODO");
-					// TODO _animResource.setRepl(_replOldByte, _replNewByte);
+				if (_replOldColor != _replNewColor) {
+					_animResource.setRepl(_replOldColor, _replNewColor);	
 				}
 				_fileHash1 = 0;
 				_frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1;
@@ -377,7 +386,7 @@ void AnimatedSprite::updatePosition() {
 
 void AnimatedSprite::updateFrameIndex() {
 	if (!_playBackwards) {
-		debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2);
+		//debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2);
 		if (_frameIndex < _frameIndex2) {
 			_frameIndex++;
 		} else {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 996c063..71660ff 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -107,6 +107,8 @@ public:
 	AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y);
 	void update();
 	void updateDeltaXY();
+	void setRepl(byte oldColor, byte newColor);
+	void clearRepl();
 protected:
 	typedef void (AnimatedSprite::*AnimationCb)();
 	AnimResource _animResource;
@@ -125,8 +127,8 @@ protected:
 	int _newHashListIndex;
 	uint32 _fileHash4;
 	int16 _deltaX, _deltaY;
-	byte _replOldByte;
-	byte _replNewByte;
+	byte _replOldColor;
+	byte _replNewColor;
 	bool _playBackwards;
 	bool _flag;
 	/* TODO


Commit: 78365121ea9931eb5973c2dcc0cae278fcc6a58d
    https://github.com/scummvm/scummvm/commit/78365121ea9931eb5973c2dcc0cae278fcc6a58d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Add NavigationLists in create_neverhood

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 84f3f74..25ef676 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -81,6 +81,18 @@ struct MessageItem {
 
 typedef std::vector<MessageItem> MessageItems;
 
+struct NavigationItem {
+	uint32 fileHash;
+	uint32 leftSmackerFileHash;
+	uint32 rightSmackerFileHash;
+	uint32 middleSmackerFileHash;
+	byte interactive;
+	byte middleFlag;
+	uint32 mouseCursorFileHash;
+};
+
+typedef std::vector<NavigationItem> NavigationItems;
+
 struct HitRectList {
 	uint32 id;	
 	HitRects hitRects;
@@ -96,9 +108,15 @@ struct MessageList {
 	MessageItems messageItems;	
 };
 
+struct NavigationList {
+	uint32 id;
+	NavigationItems navigationItems;	
+};
+
 std::vector<HitRectList*> hitRectLists;
 std::vector<RectList*> rectLists;
 std::vector<MessageList*> messageLists;
+std::vector<NavigationList*> navigationLists;
 
 byte *getData(uint32 offset) {
 	return data + offset - dataStart + fileStart;
@@ -125,7 +143,6 @@ void addHitRect(uint32 count, uint32 offset) {
 void addMessage(uint32 count, uint32 offset) {
 	MessageList *messageList = new MessageList();
 	messageList->id = offset;
-	
 	// Special code for message lists which are set at runtime (but otherwise constant)
 	switch (offset) {
 	// Scene 1002 rings
@@ -161,7 +178,6 @@ void addMessage(uint32 count, uint32 offset) {
 			item += 8;
 		}
 	}
-	
 	messageLists.push_back(messageList);	   
 }
 
@@ -199,6 +215,25 @@ void addRect(uint32 count, uint32 offset) {
 	rectLists.push_back(rectList);
 }
 
+void addNavigation(uint32 count, uint32 offset) {
+	NavigationList *navigationList = new NavigationList();
+	navigationList->id = offset;
+	byte *item = getData(offset);
+	for (uint32 i = 0; i < count; i++) {
+		NavigationItem navigationItem;
+		navigationItem.fileHash = READ_LE_UINT32(item + 0); 
+		navigationItem.leftSmackerFileHash = READ_LE_UINT32(item + 4);
+		navigationItem.rightSmackerFileHash = READ_LE_UINT32(item + 8);
+		navigationItem.middleSmackerFileHash = READ_LE_UINT32(item + 12);
+		navigationItem.interactive = item[16];
+		navigationItem.middleFlag = item[17];
+		navigationItem.mouseCursorFileHash = READ_LE_UINT32(item + 20);
+		item += 24;
+		navigationList->navigationItems.push_back(navigationItem);
+	}
+	navigationLists.push_back(navigationList);
+}
+
 int main(int argc, char *argv[]) {
 
 	FILE *datFile;
@@ -217,6 +252,10 @@ int main(int argc, char *argv[]) {
 		addMessage(messageListOffsets[i], messageListOffsets[i + 1]);
 	}
 	
+	for (int i = 0; navigationListOffsets[i] != 0; i += 2) {
+		addNavigation(navigationListOffsets[i], navigationListOffsets[i + 1]);
+	}
+	
 	datFile = fopen("neverhood.dat", "wb");
 
 	writeUint32LE(datFile, 0x11223344); // Some magic
@@ -274,6 +313,24 @@ int main(int argc, char *argv[]) {
 		}
 	}
 		
+	// Write all navigation lists
+	writeUint32LE(datFile, navigationLists.size());
+	for (std::vector<NavigationList*>::iterator it = navigationLists.begin(); it != navigationLists.end(); it++) {
+		NavigationList *navigationList = *it;
+		writeUint32LE(datFile, navigationList->id);
+		writeUint32LE(datFile, navigationList->navigationItems.size());
+		for (uint32 i = 0; i < navigationList->navigationItems.size(); i++) {
+			const NavigationItem &navigationItem = navigationList->navigationItems[i]; 
+			writeUint32LE(datFile, navigationItem.fileHash);
+			writeUint32LE(datFile, navigationItem.leftSmackerFileHash);
+			writeUint32LE(datFile, navigationItem.rightSmackerFileHash);
+			writeUint32LE(datFile, navigationItem.middleSmackerFileHash);
+			writeByte(datFile, navigationItem.interactive);
+			writeByte(datFile, navigationItem.middleFlag);
+			writeUint32LE(datFile, navigationItem.mouseCursorFileHash);
+		}
+	}
+
 	fclose(datFile);
 
 	printf("Done.\n");
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 7aba996..3024197 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -67,3 +67,7 @@ static const uint32 messageListOffsets[] = {
 	0, 0
 };
 
+static const uint32 navigationListOffsets[] = {
+	// Module2300
+	2, 0x004B67B8
+};
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index f02d72c..a9bd4fd 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: db9e45706caa2a4d2eddcb0c63532b3f6429a73e
    https://github.com/scummvm/scummvm/commit/db9e45706caa2a4d2eddcb0c63532b3f6429a73e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: More work on Scene1002

- Implement NavigationMouse and NavigationLists
- Some renaming

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/mouse.cpp
    engines/neverhood/mouse.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 04059ca..bb15998 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -790,17 +790,17 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x4808:
 		setGlobalVar(0x8306F218, 1);
-		SetSpriteCallback(&AsScene1002Door::spriteUpdate447D10);
+		SetSpriteCallback(&AsScene1002Door::suOpenDoor);
 		break;
 	case 0x4809:
 		setGlobalVar(0x8306F218, 0);
-		SetSpriteCallback(&AsScene1002Door::spriteUpdate447D40);
+		SetSpriteCallback(&AsScene1002Door::suCloseDoor);
 		break;
 	}
 	return messageResult;
 }
 
-void AsScene1002Door::spriteUpdate447D10() {
+void AsScene1002Door::suOpenDoor() {
 	if (_y > 49) {
 		_y -= 8;
 		if (_y < 49) {
@@ -811,7 +811,7 @@ void AsScene1002Door::spriteUpdate447D10() {
 	}
 }
 
-void AsScene1002Door::spriteUpdate447D40() {
+void AsScene1002Door::suCloseDoor() {
 	if (_y < 239) {
 		_y += 8;
 		if (_y > 239) {
@@ -1332,6 +1332,36 @@ void Class506::sub4492C0() {
 	setFileHash1();
 }
 
+Class478::Class478(NeverhoodEngine *vm, Klayman *klayman)
+	: AnimatedSprite(vm, 1200), _klayman(klayman) {
+	
+	createSurface(1200, 40, 163);
+	SetUpdateHandler(&Class478::update);
+	SetMessageHandler(&Sprite::handleMessage);
+	_surface->setVisible(false);
+}
+
+void Class478::update() {
+	if (_klayman->getCurrAnimFileHash() == 0x3A292504) {
+		setFileHash(0xBA280522, _frameIndex, -1);
+		_newHashListIndex = _klayman->getFrameIndex();
+		_surface->setVisible(true);
+		_x = _klayman->getX(); 
+		_y = _klayman->getY(); 
+		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
+	} else if (_klayman->getCurrAnimFileHash() == 0x122D1505) {
+		setFileHash(0x1319150C, _frameIndex, -1);
+		_newHashListIndex = _klayman->getFrameIndex();
+		_surface->setVisible(true);
+		_x = _klayman->getX(); 
+		_y = _klayman->getY(); 
+		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
+	} else {
+		_surface->setVisible(false);
+	}
+	AnimatedSprite::update();
+}
+
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
 	_flag1B4(false), _flag1BE(false) {
@@ -1373,36 +1403,39 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_class599 = addSprite(new Class599(_vm, this));
 
+	// DEBUG/HACK!!!!
+	which = 1; setGlobalVar(0x8306F218, 1);
+
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
-			//_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			// TODO			
 			_klayman->setRepl(64, 0);
 		} else {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435);
-			//_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			// TODO			
 		}
 	} else {
 		if (which == 1) {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
-			//_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4478);
 			// TODO			
 			_vm->_gameState.field2 = 1;
 		} else if (which == 2) {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
-			//_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4298);
 			// TODO
 			_vm->_gameState.field2 = 1;
 			_klayman->sendMessage(0x4820, 0, this);
 		} else {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
-			//_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4470);
 			// TODO
 			//_class479 = addSprite(new Class479(_vm, this, _klayman));
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 79a4985..51cb9a4 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -172,8 +172,8 @@ public:
 protected:
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate447D10();
-	void spriteUpdate447D40();
+	void suOpenDoor();
+	void suCloseDoor();
 };
 
 class Class505 : public AnimatedSprite {
@@ -254,6 +254,14 @@ protected:
 	void sub4492C0();
 };
 
+class Class478 : public AnimatedSprite {
+public:
+	Class478(NeverhoodEngine *vm, Klayman *klayman);
+protected:
+	Klayman *_klayman;
+	void update();
+};
+
 class Scene1002 : public Scene {
 public:
 	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 381f4a7..63d9866 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -224,4 +224,159 @@ void Mouse435::updateCursor() {
 
 }
 
+// NavigationMouse
+
+NavigationMouse::NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type)
+	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _type(type), _frameNum(0) {
+
+	_mouseCursorResource.load(fileHash);
+	_mouseCursorResource.setCursorNum(0);
+	_x = _vm->getMouseX();	
+	_y = _vm->getMouseY();
+	createSurface(2000, 32, 32);
+	SetUpdateHandler(&NavigationMouse::update);
+	SetMessageHandler(&NavigationMouse::handleMessage);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = 32;
+	_drawRect.height = 32;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = 32;
+	_deltaRect.height = 32;
+	processDelta();
+	_needRefresh = true;
+	updateCursor();
+}
+
+void NavigationMouse::update() {
+	updateCursor();
+	_frameNum++;
+	if (_frameNum >= 6)
+		_frameNum = 0;
+	_needRefresh = _frameNum % 2 == 0;		
+}
+
+uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x2064:
+		_x = param.asPoint().x;
+		_y = param.asPoint().y;
+		switch (_type) {
+		case 1:
+			if (_x >= 320)
+				messageResult = 1;
+			else				
+				messageResult = 0;
+			break;
+		case 2:
+		default:
+			if (_x < 100)
+				messageResult = 0;
+			else if (_x > 540)				
+				messageResult = 1;
+			else				
+				messageResult = 2;
+			break;
+		case 3:
+			if (_x < 100)
+				messageResult = 0;
+			else if (_x > 540)				
+				messageResult = 1;
+			else				
+				messageResult = 4;
+			break;
+		case 4:
+			if (_x < 100)
+				messageResult = 0;
+			else if (_x > 540)				
+				messageResult = 1;
+			else if (_y >= 150)				
+				messageResult = 2;
+			else				
+				messageResult = 3;
+			break;
+		case 5:
+			if (_y >= 240)
+				messageResult = 4;
+			else				
+				messageResult = 3;
+			break;
+		}
+		break;
+	case 0x4002:
+		_x = param.asPoint().x;
+		_y = param.asPoint().y;
+		switch (_type) {
+		case 1:
+			if (_x >= 320)
+				_mouseCursorResource.setCursorNum(6);
+			else				
+				_mouseCursorResource.setCursorNum(5);
+			break;
+		case 2:
+		default:
+			if (_x < 100)
+				_mouseCursorResource.setCursorNum(6);
+			else if (_x > 540)				
+				_mouseCursorResource.setCursorNum(5);
+			else				
+				_mouseCursorResource.setCursorNum(0);
+			break;
+		case 3:
+			if (_x < 100)
+				_mouseCursorResource.setCursorNum(1);
+			else if (_x > 540)				
+				_mouseCursorResource.setCursorNum(1);
+			break;
+		case 4:
+			if (_x < 100)
+				_mouseCursorResource.setCursorNum(6);
+			else if (_x > 540)				
+				_mouseCursorResource.setCursorNum(5);
+			else if (_y >= 150)				
+				_mouseCursorResource.setCursorNum(0);
+			else				
+				_mouseCursorResource.setCursorNum(3);
+			break;
+		case 5:
+			if (_y >= 240)
+				_mouseCursorResource.setCursorNum(2);
+			else				
+				_mouseCursorResource.setCursorNum(3);
+			break;
+		}
+		_needRefresh = true;
+		processDelta();
+		break;
+	}
+	return messageResult;
+}
+
+void NavigationMouse::updateCursor() {
+
+	if (!_surface)
+		return;
+
+	if (_doDeltaX) {
+		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
+	} else {
+		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
+	}
+
+	if (_doDeltaY) {
+		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
+	} else {
+		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+	}
+
+	if (_needRefresh) {
+		_needRefresh = false;
+		_drawRect = _mouseCursorResource.getRect();
+		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
+	}
+
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index 4bda936..4f27cb4 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -57,6 +57,19 @@ protected:
 	void updateCursor();
 };
 
+class NavigationMouse : public StaticSprite {
+public:
+	NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type);
+	void load(uint32 fileHash);
+protected:
+	MouseCursorResource _mouseCursorResource;
+	int _frameNum;
+	int _type;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void updateCursor();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MOUSE_H */
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 78c780b..4996bdd 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -286,11 +286,11 @@ void AnimatedSprite::updateAnim() {
 				
 				if (_fileHash2 != 0) {
 					if (_animResource.loadInternal(_fileHash2)) {
-						_fileHash3 = _fileHash2;
+						_currAnimFileHash = _fileHash2;
 					} else {
 						debug("TODO");
 						// TODO _animResource.loadInternal(calcHash("sqDefault"));
-						_fileHash3 = 0;
+						_currAnimFileHash = 0;
 					}
 					if (_replOldColor != _replNewColor) {
 						_animResource.setRepl(_replOldColor, _replNewColor);	
@@ -318,11 +318,11 @@ void AnimatedSprite::updateAnim() {
 		} else {
 			if (_animStatus == 1) {
 				if (_animResource.loadInternal(_fileHash1)) {
-					_fileHash3 = _fileHash1;
+					_currAnimFileHash = _fileHash1;
 				} else {
 					debug("TODO");
 					// TODO _animResource.loadInternal(calcHash("sqDefault"));
-					_fileHash3 = 0;
+					_currAnimFileHash = 0;
 				}
 				if (_replOldColor != _replNewColor) {
 					_animResource.setRepl(_replOldColor, _replNewColor);	
@@ -332,11 +332,11 @@ void AnimatedSprite::updateAnim() {
 				_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
 			} else {
 				if (_animResource.loadInternal(_fileHash1)) {
-					_fileHash3 = _fileHash1;
+					_currAnimFileHash = _fileHash1;
 				} else {
 					debug("TODO");
 					// TODO _animResource.loadInternal(calcHash("sqDefault"));
-					_fileHash3 = 0;
+					_currAnimFileHash = 0;
 				}
 				if (_replOldColor != _replNewColor) {
 					_animResource.setRepl(_replOldColor, _replNewColor);	
@@ -386,7 +386,7 @@ void AnimatedSprite::updatePosition() {
 
 void AnimatedSprite::updateFrameIndex() {
 	if (!_playBackwards) {
-		//debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2);
+		//debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _currAnimFileHash, _frameIndex, _frameIndex2);
 		if (_frameIndex < _frameIndex2) {
 			_frameIndex++;
 		} else {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 71660ff..f1d8a87 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -52,6 +52,7 @@ public:
 	bool isDoDeltaX() const { return _doDeltaX; }
 	bool isDoDeltaY() const { return _doDeltaY; }
 	NRect& getRect() { return _rect; }
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	Common::String _spriteUpdateCbName; // For debugging purposes
@@ -70,7 +71,6 @@ protected:
 	//0000004A field4A		dw ? // seems to be unused except in ctor
 	//0000004C rectResource	RectResource ?
 	//void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createSurface(int surfacePriority, int16 width, int16 height);
 	void handleSpriteUpdate() {
 		if (_spriteUpdateCb)
@@ -109,12 +109,14 @@ public:
 	void updateDeltaXY();
 	void setRepl(byte oldColor, byte newColor);
 	void clearRepl();
+	uint32 getCurrAnimFileHash() const { return _currAnimFileHash; }
+	int16 getFrameIndex() const { return _frameIndex; }
 protected:
 	typedef void (AnimatedSprite::*AnimationCb)();
 	AnimResource _animResource;
+	uint32 _currAnimFileHash;
 	uint32 _fileHash1;
 	uint32 _fileHash2;
-	uint32 _fileHash3;
 	int16 _frameIndex;
 	int16 _frameIndex3;
 	int16 _frameIndex2;
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index b9ac232..42af497 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -104,6 +104,27 @@ void StaticData::load(const char *filename) {
 		_hitRectLists[id] = hitRectList;
 	}
 
+	// Load navigation lists
+	uint32 navigationListsCount = fd.readUint32LE();
+	debug("navigationListsCount: %d", navigationListsCount);
+	for (uint32 i = 0; i < navigationListsCount; i++) {
+		NavigationList *navigationList = new NavigationList();
+		uint32 id = fd.readUint32LE();
+		uint32 itemCount = fd.readUint32LE();
+		for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) {
+			NavigationItem navigationItem;
+			navigationItem.fileHash = fd.readUint32LE();
+			navigationItem.leftSmackerFileHash = fd.readUint32LE();
+			navigationItem.rightSmackerFileHash = fd.readUint32LE();
+			navigationItem.middleSmackerFileHash = fd.readUint32LE();
+			navigationItem.interactive = fd.readByte();
+			navigationItem.middleFlag = fd.readByte();
+			navigationItem.mouseCursorFileHash = fd.readUint32LE();
+			navigationList->push_back(navigationItem);
+		}
+		_navigationLists[id] = navigationList;
+	}
+
 }
 
 HitRectList *StaticData::getHitRectList(uint32 id) {
@@ -124,4 +145,10 @@ MessageList *StaticData::getMessageList(uint32 id) {
 	return _messageLists[id];
 }
 
+NavigationList *StaticData::getNavigationList(uint32 id) {
+	if (!_navigationLists[id])
+		error("StaticData::getNavigationList() NavigationList with id %08X not found", id);
+	return _navigationLists[id];
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index a7d8a65..178e5c9 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -56,6 +56,18 @@ struct MessageItem {
 
 typedef Common::Array<MessageItem> MessageList;
 
+struct NavigationItem {
+	uint32 fileHash;
+	uint32 leftSmackerFileHash;
+	uint32 rightSmackerFileHash;
+	uint32 middleSmackerFileHash;
+	byte interactive;
+	byte middleFlag;
+	uint32 mouseCursorFileHash;
+};
+
+typedef Common::Array<NavigationItem> NavigationList;
+
 class StaticData {
 public:
 	StaticData();
@@ -64,10 +76,12 @@ public:
 	HitRectList *getHitRectList(uint32 id);
 	RectList *getRectList(uint32 id);
 	MessageList *getMessageList(uint32 id);
+	NavigationList *getNavigationList(uint32 id);
 protected:
 	Common::HashMap<uint32, HitRectList*> _hitRectLists;
 	Common::HashMap<uint32, RectList*> _rectLists;
 	Common::HashMap<uint32, MessageList*> _messageLists;
+	Common::HashMap<uint32, NavigationList*> _navigationLists;
 };
 
 } // End of namespace Neverhood


Commit: 0bfb52df74ac47a4842c66d40fd0ae5efc5d6af6
    https://github.com/scummvm/scummvm/commit/0bfb52df74ac47a4842c66d40fd0ae5efc5d6af6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Implement NavigationScene

- Work on the SmackerDecoder, create the surface immediately when a file is opened

Changed paths:
  A engines/neverhood/navigationscene.cpp
  A engines/neverhood/navigationscene.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index e39041e..af03c07 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -13,6 +13,7 @@ MODULE_OBJS = \
 	module1000.o \
 	module1500.o \
 	mouse.o \
+	navigationscene.o \
 	neverhood.o \
 	palette.o \
 	resource.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index bb15998..bc89862 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/module1000.h"
+#include "neverhood/navigationscene.h"//###
 
 namespace Neverhood {
 
@@ -77,6 +78,7 @@ void Module1000::createScene1001(int which) {
 void Module1000::createScene1002(int which) {
 	_vm->gameState().sceneNum = 1;
 	_childObject = new Scene1002(_vm, this, which);
+	// DEBUG _childObject = new NavigationScene(_vm, this, 0x004B67B8, 0, NULL);
 	// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
 	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
 	SetUpdateHandler(&Module1000::updateScene1002);
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
new file mode 100644
index 0000000..81af71f
--- /dev/null
+++ b/engines/neverhood/navigationscene.cpp
@@ -0,0 +1,212 @@
+/* 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/navigationscene.h"
+#include "neverhood/mouse.h"
+
+namespace Neverhood {
+
+NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes)
+	: Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false),
+	_soundFlag1(false), _soundFlag2(false), _smackerFileHash(0), _interactive(true), _done(false) {
+
+	_navigationList = _vm->_staticData->getNavigationList(navigationListId);
+	for (NavigationList::iterator it = _navigationList->begin(); it != _navigationList->end(); it++) {
+		debug("%08X %08X %08X %08X %d %d %08X",	(*it).fileHash,	(*it).leftSmackerFileHash, (*it).rightSmackerFileHash,
+		(*it).middleSmackerFileHash, (*it).interactive, (*it).middleFlag, (*it).mouseCursorFileHash);
+	}
+
+	if (_navigationIndex < 0) {
+		_navigationIndex = (int)getGlobalVar(0x4200189E);
+		if (_navigationIndex >= (int)_navigationList->size())
+			_navigationIndex = 0; 
+	}
+	setGlobalVar(0x4200189E, _navigationIndex);
+	
+	SetUpdateHandler(&NavigationScene::update);
+	SetMessageHandler(&NavigationScene::handleMessage);
+	
+	_smackerPlayer = new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true);	
+
+	addEntity(_smackerPlayer);
+	
+	addSurface(_smackerPlayer->getSurface());
+
+	createMouseCursor();
+
+	_vm->_screen->clear();
+
+	_parentModule->sendMessage(0x100A, _navigationIndex, this);
+
+}
+
+NavigationScene::~NavigationScene() {
+	// TODO Sound1ChList_sub_4080B0(0);
+	// TODO Sound1ChList_sub_408110(0);
+}
+
+byte NavigationScene::getNavigationAreaType() {
+	return 0; // TODO
+}
+
+void NavigationScene::update() {
+	if (_smackerFileHash != 0) {
+		_mouseCursor->getSurface()->setVisible(false);
+		_smackerPlayer->open(_smackerFileHash, false);
+		_vm->_screen->clear();
+		_smackerDone = false;
+		_smackerFileHash = 0;
+	} else if (_smackerDone) {
+		if (_done) {
+			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+		} else {
+			const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
+			createMouseCursor();
+			_mouseCursor->getSurface()->setVisible(true);
+			_soundFlag2 = false;
+			_soundFlag1 = false;
+			_interactive = true;
+			// TODO Sound1ChList_sub_4080B0(0);
+			// TODO Sound1ChList_sub_408110(0);
+			_smackerDone = false;
+			_smackerPlayer->open(navigationItem.fileHash, true);
+			_vm->_screen->clear();
+			_parentModule->sendMessage(0x100A, _navigationIndex, this);
+		}
+	} 
+	Scene::update();
+}
+
+uint32 NavigationScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x0000:
+		_mouseCursor->sendMessage(0x4002, param, this);
+		break;
+	case 0x0001:
+		handleNavigation(param.asPoint());
+		break;
+	case 0x0009:
+		if (!_interactive)
+			_smackerDone = true;
+		break;
+	case 0x3002:
+		_smackerDone = true;
+		break;
+	}
+	return 0;
+}
+
+void NavigationScene::createMouseCursor() {
+
+	const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
+	uint32 mouseCursorFileHash;
+	int areaType;
+
+	if (_mouseCursor) {
+		deleteSprite(&_mouseCursor);
+	}
+
+	mouseCursorFileHash = navigationItem.mouseCursorFileHash;
+	// TODO: Check the resource...
+	if (mouseCursorFileHash == 0)
+		mouseCursorFileHash = 0x63A40028;
+		
+	if (_itemsTypes) {
+		areaType = _itemsTypes[_navigationIndex];
+	} else if (navigationItem.middleSmackerFileHash != 0 || navigationItem.middleFlag) {
+		areaType = 0;
+	} else {
+		areaType = 1;
+	}
+
+	_mouseCursor = addSprite(new NavigationMouse(_vm, mouseCursorFileHash, areaType));
+	_mouseCursor->sendPointMessage(0x4002, _vm->getMousePos(), this);
+	
+}
+
+void NavigationScene::handleNavigation(const NPoint &mousePos) {
+
+	const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
+	bool oldSoundFlag1 = _soundFlag1;
+	bool oldSoundFlag2 = _soundFlag2;
+	uint32 direction = _mouseCursor->sendPointMessage(0x2064, mousePos, this);
+	
+	switch (direction) {
+	// TODO: Merge cases 0 and 1?
+	case 0:
+		if (navigationItem.leftSmackerFileHash != 0) {
+			_smackerFileHash = navigationItem.leftSmackerFileHash;
+			_interactive = false;
+			_soundFlag1 = false;
+			_soundFlag2 = true;
+			do {
+				_navigationIndex--;
+				if (_navigationIndex < 0)
+					_navigationIndex = _navigationList->size() - 1;
+			} while (!(*_navigationList)[_navigationIndex].interactive);
+			setGlobalVar(0x4200189E, _navigationIndex);
+		} else {
+			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+		}
+		break;
+	case 1:
+		if (navigationItem.rightSmackerFileHash != 0) {
+			_smackerFileHash = navigationItem.rightSmackerFileHash;
+			_interactive = false;
+			_soundFlag1 = false;
+			_soundFlag2 = true;
+			do {
+				_navigationIndex++;
+				if (_navigationIndex >= (int)_navigationList->size())
+					_navigationIndex = 0;
+			} while (!(*_navigationList)[_navigationIndex].interactive);
+			setGlobalVar(0x4200189E, _navigationIndex);
+		} else {
+			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+		}
+		break;
+	case 2:
+	case 3:
+	case 4:
+		if (navigationItem.middleFlag) {
+			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+		} else if (navigationItem.middleSmackerFileHash != 0) {
+			_smackerFileHash = navigationItem.middleSmackerFileHash;
+			_interactive = false;
+			_soundFlag1 = true;
+			_soundFlag2 = false;
+			_done = true;
+		}
+		break;
+	}
+	
+	if (oldSoundFlag2 != _soundFlag2) {
+		// TODO Sound1ChList_sub_408110(_soundFlag2);
+	}
+
+	if (oldSoundFlag1 != _soundFlag1) {
+		// TODO Sound1ChList_sub_4080B0(_soundFlag1);
+	}
+
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h
new file mode 100644
index 0000000..08aefb7
--- /dev/null
+++ b/engines/neverhood/navigationscene.h
@@ -0,0 +1,56 @@
+/* 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_NAVIGATIONSCENE_H
+#define NEVERHOOD_NAVIGATIONSCENE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/resourceman.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class NavigationScene : public Scene {
+public:
+	NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes);
+	virtual ~NavigationScene();
+	byte getNavigationAreaType();
+protected:
+	SmackerPlayer *_smackerPlayer;
+	bool _smackerDone;
+	NavigationList *_navigationList;
+	int _navigationIndex;
+	uint32 _smackerFileHash;
+	bool _interactive;
+	bool _soundFlag1;
+	bool _soundFlag2;
+	bool _done;
+	byte *_itemsTypes;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createMouseCursor();
+	void handleNavigation(const NPoint &mousePos);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_NAVIGATIONSCENE_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 9e1475f..4440a05 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -208,4 +208,11 @@ Common::Error NeverhoodEngine::run() {
 	return Common::kNoError;
 }
 
+NPoint NeverhoodEngine::getMousePos() {
+	NPoint pt;
+	pt.x = _mouseX;
+	pt.y = _mouseY;
+	return pt;
+}
+	
 } // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 38d773a..86f7a0a 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -45,6 +45,7 @@ class GameVars;
 class ResourceMan;
 class Screen;
 class StaticData;
+struct NPoint;
 
 struct GameState {
 	int sceneNum;
@@ -119,6 +120,7 @@ public:
 	GameState& gameState() { return _gameState; }
 	int16 getMouseX() const { return _mouseX; }
 	int16 getMouseY() const { return _mouseY; }
+	NPoint getMousePos();
 
 public:
 
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index bbb0db1..f0b3008 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -20,6 +20,7 @@
  *
  */
 
+#include "graphics/palette.h"
 #include "neverhood/smackerplayer.h"
 #include "neverhood/palette.h"
 #include "neverhood/resourceman.h"
@@ -68,26 +69,37 @@ void SmackerDoubleSurface::draw() {
 
 SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag)
 	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false),
-	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL) {
+	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true) {
+
+	debug("_smackerSurface = %p", (void*)_smackerSurface);
 
 	SetUpdateHandler(&SmackerPlayer::update);
+
 	open(fileHash, flag);
 }
 
 SmackerPlayer::~SmackerPlayer() {
 	close();
-}
+}   
 
-void SmackerPlayer::open(uint32 fileHash, bool flag1) {
+void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 	debug("SmackerPlayer::open(%08X)", fileHash);
 	
-	_flag1 = flag1;
+	_keepLastFrame = keepLastFrame;
 
 	close();
 
+	if (_doubleSurface) {
+		_smackerSurface = new SmackerDoubleSurface(_vm);
+	} else {
+		_smackerSurface = new SmackerSurface(_vm);
+	}
+
+	_smackerFirst = true;
+
 	_stream = _vm->_res->createStream(fileHash);
 
-	// TODO: _flag1 stuff
+	// TODO: _keepLastFrame stuff
 
 	_smackerDecoder = new Video::SmackerDecoder(_vm->_mixer);
 	_smackerDecoder->loadStream(_stream);
@@ -117,6 +129,8 @@ uint SmackerPlayer::getStatus() {
 
 void SmackerPlayer::update() {
 
+	debug(8, "SmackerPlayer::update()");
+
 	if (!_smackerDecoder)
 		return;
 
@@ -129,20 +143,17 @@ void SmackerPlayer::update() {
 
 		const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
 
-		if (!_smackerSurface) {
+		if (_smackerFirst) {
 			if (_doubleSurface) {
-				// TODO: Use SmackerDoubleSurface
-				_smackerSurface = new SmackerDoubleSurface(_vm);
 				_smackerSurface->getDrawRect().x = 320 - _smackerDecoder->getWidth();
 				_smackerSurface->getDrawRect().y = 240 - _smackerDecoder->getHeight();
-				// TODO DoubleDrawSurface.field_28 = false;
 				_smackerSurface->setSmackerFrame(smackerFrame);
 			} else {
-				_smackerSurface = new SmackerSurface(_vm);
 				_smackerSurface->getDrawRect().x = (640 - _smackerDecoder->getWidth()) / 2;
 				_smackerSurface->getDrawRect().y = (480 - _smackerDecoder->getHeight()) / 2;
 				_smackerSurface->setSmackerFrame(smackerFrame);
 			}
+			_smackerFirst = false;
 		}
 		
 		if (_doubleSurface) {
@@ -153,10 +164,12 @@ void SmackerPlayer::update() {
 		_dirtyFlag = true;
 
 		if (_smackerDecoder->hasDirtyPalette()) {
+			debug("updatePalette()");
 			updatePalette();
 		}
 
-		if (_smackerDecoder->endOfVideo() && !_flag1) {
+		if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
+			// Inform the scene about the end of the video playback
 			if (_scene) {
 				_scene->sendMessage(0x3002, 0, this);
 			}
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index d923bbd..2262277 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -52,7 +52,7 @@ public:
 	SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag);
 	~SmackerPlayer();
 	BaseSurface *getSurface() { return _smackerSurface; }
-	void open(uint32 fileHash, bool flag1);
+	void open(uint32 fileHash, bool keepLastFrame);
 	void close();
 	void gotoFrame(uint frameNumber);
 	uint getStatus();
@@ -61,9 +61,10 @@ protected:
 	Palette *_palette;
 	Video::SmackerDecoder *_smackerDecoder;
 	SmackerSurface *_smackerSurface;
+	bool _smackerFirst;
 	bool _doubleSurface;
 	Common::SeekableReadStream *_stream;
-	bool _flag1;
+	bool _keepLastFrame;
 	bool _flag2;
 	bool _dirtyFlag;
 	void update();
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 1584ac3..ace77f9 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -92,7 +92,6 @@ void SmackerScene::nextVideo() {
 		_parentModule->sendMessage(0x1009, 0, this);
 	}
 
-
 }
 
 void SmackerScene::update() {


Commit: a23b694c94d318b3e06f450189aab82b3908fcc5
    https://github.com/scummvm/scummvm/commit/a23b694c94d318b3e06f450189aab82b3908fcc5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Implement Scene1005

- Add FontSurface
- Add DataResource
- Fix NavigationScene, only accept input when interactive

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/navigationscene.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index b9e2c48..e46d4ea 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -107,6 +107,52 @@ void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResour
 	}
 }
 
+void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent) {
+	// TODO: Clipping
+	byte *source = (byte*)sourceSurface->getBasePtr(sourceRect.x, sourceRect.y);
+	byte *dest = (byte*)_surface->getBasePtr(x, y);
+	int height = sourceRect.height;
+	if (!transparent) {
+		while (height--) {
+			memcpy(dest, source, sourceRect.width);
+			source += sourceSurface->pitch;
+			dest += _surface->pitch;
+		}
+	} else {
+		while (height--) {
+			for (int xc = 0; xc < sourceRect.width; xc++)
+				if (source[xc] != 0)
+					dest[xc] = source[xc];
+			source += sourceSurface->pitch;
+			dest += _surface->pitch;
+		}
+	}
+}
+
+// FontSurface
+
+FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
+	: BaseSurface(vm, 0, charWidth * 16, charHeight * numRows), _tracking(tracking), _numRows(numRows), _firstChar(firstChar),
+	_charWidth(charWidth), _charHeight(charHeight) {
+}
+
+void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) {
+	NDrawRect sourceRect;
+	chr -= _firstChar;
+	sourceRect.x = (chr % 16) * _charWidth;
+	sourceRect.y = (chr / 16) * _charHeight;
+	sourceRect.width = _charWidth;
+	sourceRect.height = _charHeight;
+	destSurface->copyFrom(_surface, x, y, sourceRect, true);
+}
+
+void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string) {
+	for (; *string != 0; string++) {
+		drawChar(destSurface, x, y, *string);
+		x += (*_tracking)[*string - _firstChar].x;
+	}	
+}
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 9ac23a8..8bdf0af 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -34,6 +34,8 @@ struct NPoint {
 	int16 x, y;
 };
 
+typedef Common::Array<NPoint> NPointArray;
+
 struct NDimensions {
 	int16 width, height;
 };
@@ -44,6 +46,8 @@ struct NRect {
 	NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {}
 };
 
+typedef Common::Array<NRect> NRectArray;
+
 struct NDrawRect {
 	int16 x, y, width, height;
 	NDrawRect() : x(0), y(0), width(0), height(0) {}
@@ -67,6 +71,7 @@ public:
 	void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height);
 	void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height);
 	void drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum);
+	void copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent);
 	int getPriority() const { return _priority; }
 	void setPriority(int priority) { _priority = priority; }
 	NDrawRect& getDrawRect() { return _drawRect; }
@@ -87,6 +92,19 @@ protected:
 	bool _transparent;
 };
 
+class FontSurface : public BaseSurface {
+public:
+	FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
+	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
+	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string);
+protected:
+	NPointArray *_tracking;
+	uint16 _numRows;
+	byte _firstChar;
+	uint16 _charWidth;
+	uint16 _charHeight;
+};
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index bc89862..6825f62 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -56,7 +56,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 0) {
 		//createScene1001(0);
 		// DEBUG: Jump to room
-		createScene1002(0);
+		//createScene1002(0);
+		createScene1005(0);
 	} else if (which == 1) {
 		createScene1002(1);
 	}
@@ -95,6 +96,11 @@ void Module1000::createScene1004(int which) {
 }
 
 void Module1000::createScene1005(int which) {
+	_vm->gameState().sceneNum = 4;
+	_childObject = new Scene1005(_vm, this, which);
+	// TODO Music18hList_stop(0x061880C6, 0, 0);
+	// TODO Music18hList_play(_musicFileHash, 0, 0, 1);
+	SetUpdateHandler(&Module1000::updateScene1002);
 }
 
 void Module1000::updateScene1001() {
@@ -196,6 +202,16 @@ void Module1000::updateScene1004() {
 }
 			
 void Module1000::updateScene1005() {
+	_childObject->handleUpdate();
+	if (_done) {
+		debug("SCENE 1005 DONE");
+		// TODO Music18hList_stop(_musicFileHash, 0, 1);
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1004(1);
+		_childObject->handleUpdate();
+	}
 }
 			
 // Scene1001			
@@ -1673,4 +1689,190 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity
 	return 0;
 }
 
+// Scene1005
+
+Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	SetMessageHandler(&Scene1005::handleMessage);
+
+	_surfaceFlag = true;
+	
+	if (getGlobalVar(0xD0A14D10)) {
+		_background = addBackground(new DirtyBackground(_vm, 0x2800E011, 0, 0));
+		_palette = new Palette(_vm, 0x2800E011);
+		_palette->usePalette();
+		addSprite(new StaticSprite(_vm, 0x492D5AD7, 100));
+		_mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620));
+	} else {
+		_background = addBackground(new DirtyBackground(_vm, 0x8870A546, 0, 0));
+		_palette = new Palette(_vm, 0x8870A546);
+		_palette->usePalette();
+		addSprite(new StaticSprite(_vm, 0x40D1E0A9, 100));
+		addSprite(new StaticSprite(_vm, 0x149C00A6, 100));
+		_mouseCursor = addSprite(new Mouse435(_vm, 0x0A54288F, 20, 620));
+	}
+
+	drawTextToBackground();
+	
+}
+
+Scene1005::~Scene1005() {
+}
+
+uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	}
+	return 0;
+}
+
+void Scene1005::drawTextToBackground() {
+	TextResource textResource(_vm);
+	const char *textStart, *textEnd;
+	int16 y = 36;
+	uint32 textIndex = getTextIndex();
+	FontSurface *fontSurface = createFontSurface();
+	textResource.load(0x80283101);
+	textStart = textResource.getString(textIndex, textEnd);
+	while (textStart < textEnd) {
+		fontSurface->drawString(_background->getSurface(), 188, y, (const byte*)textStart);
+		y += 36;
+		textStart += strlen(textStart) + 1;
+	}
+	delete fontSurface;
+}
+
+FontSurface *Scene1005::createFontSurface() {
+	FontSurface *fontSurface;
+	DataResource fontData(_vm);
+	SpriteResource fontSprite(_vm);
+	fontData.load(calcHash("asRecFont"));
+	uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x;
+	uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x;
+	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
+	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
+	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
+	fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight);	
+	if (getGlobalVar(0xD0A14D10)) {
+		fontSprite.load2(0x283CE401);
+	} else {
+		fontSprite.load2(0xC6604282);
+	}
+	fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0);
+	return fontSurface;
+}
+
+uint32 Scene1005::getTextIndex() {
+	uint32 textIndex;
+	textIndex = getTextIndex1();
+	if (getGlobalVar(0xD0A14D10)) {
+		textIndex = getTextIndex2();
+	}
+	if (getGlobalVar(0x8440001F) && getGlobalVar(0x01830201) == textIndex) {
+		textIndex = getTextIndex3();
+	} else {
+		setGlobalVar(0x8440001F, 1);
+		setGlobalVar(0x01830201, textIndex);
+	}
+	return textIndex;
+}
+
+uint32 Scene1005::getTextIndex1() {
+	uint32 textIndex;
+	if (getGlobalVar(0x98109F12)) {
+		if (!getGlobalVar(0x2090590C))
+			textIndex = 18;
+		else if (!getGlobalVar(0x610210B7))
+			textIndex = 19;
+		else if (getGlobalVar(0x0C0288F4)) {
+			if (!getGlobalVar(0xD0A14D10))
+				textIndex = 23;
+			else if (!getSubVar(0x0090EA95, 0) && !getSubVar(0x08D0AB11, 0))
+				textIndex = 24;
+			else if (!getGlobalVar(0xC0780812))			
+				textIndex = 26;
+			else if (!getSubVar(0x0090EA95, 1) && !getSubVar(0x08D0AB11, 1))
+				textIndex = 27;
+			else if (!getGlobalVar(0xC0780812)) 
+				textIndex = 28;
+			else				
+				textIndex = 29;
+		} else if (!getGlobalVar(0xE7498218))
+			textIndex = 20;
+		else if (!getGlobalVar(0x081890D14))
+			textIndex = 21;
+		else			
+			textIndex = 22;
+	} else if (getGlobalVar(0x00040153)) {
+		if (!getGlobalVar(0x10938830))
+			textIndex = 12;
+		else if (!getGlobalVar(0x2050861A))
+			textIndex = 13;
+		else if (!getGlobalVar(0x4DE80AC0))
+			textIndex = 50;
+		else if (!getGlobalVar(0x89C669AA))
+			textIndex = 14;
+		else if (!getGlobalVar(0x1C1B8A9A))
+			textIndex = 15;
+		else if (!getGlobalVar(0xCB45DE03))
+			textIndex = 16;
+		else 
+			textIndex = 17;
+	} else if (!getGlobalVar(0x2B514304)) {
+		textIndex = 0;
+	} else if (getGlobalVar(0x0A18CA33)) {
+		if (!getGlobalVar(0x404290D5))
+			textIndex = 4;
+		else if (!getGlobalVar(0x45080C38))
+			textIndex = 5;
+		else if (!getSubVar(0x14800353, 0x40119852))
+			textIndex = 6;
+		else if (!getGlobalVar(0x4E0BE910))
+			textIndex = 7;
+		else if (!getGlobalVar(0x86615030))
+			textIndex = 8;
+		else if (!getSubVar(0x14800353, 0x304008D2))
+			textIndex = 9;
+		else if (!getSubVar(0x14800353, 0x01180951))
+			textIndex = 10;
+		else 
+			textIndex = 11;
+	} else if (!getGlobalVar(0x0A310817)) {
+		textIndex = 1;
+	} else if (getGlobalVar(0x000CF819)) {
+		textIndex = 3;
+	} else {
+		textIndex = 2;
+	}
+	return textIndex;
+}
+
+uint32 Scene1005::getTextIndex2() {
+	uint32 textIndex = getGlobalVar(0x29408F00);
+	if (textIndex + 1 >= 10) {
+		setGlobalVar(0x29408F00, 0);
+		textIndex = 0;
+	} else {
+		setGlobalVar(0x29408F00, textIndex + 1);
+	}
+	return textIndex + 40;
+}
+
+uint32 Scene1005::getTextIndex3() {
+	uint32 textIndex = getGlobalVar(0x8A140C21);
+	if (textIndex + 1 >= 10) {
+		setGlobalVar(0x8A140C21, 0);
+		textIndex = 0;
+	} else {
+		setGlobalVar(0x8A140C21, textIndex + 1);
+	}
+	return textIndex + 30;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 51cb9a4..4b2121e 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -302,6 +302,22 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+// Scene1005
+
+class Scene1005 : public Scene {
+public:
+	Scene1005(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene1005();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void drawTextToBackground();
+	FontSurface *createFontSurface();
+	uint32 getTextIndex();
+	uint32 getTextIndex1();
+	uint32 getTextIndex2();
+	uint32 getTextIndex3();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1000_H */
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 81af71f..f6be668 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -99,10 +99,12 @@ void NavigationScene::update() {
 uint32 NavigationScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x0000:
-		_mouseCursor->sendMessage(0x4002, param, this);
+		if (_interactive)
+			_mouseCursor->sendMessage(0x4002, param, this);
 		break;
 	case 0x0001:
-		handleNavigation(param.asPoint());
+		if (_interactive)
+			handleNavigation(param.asPoint());
 		break;
 	case 0x0009:
 		if (!_interactive)
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 4440a05..1f253c0 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -146,6 +146,16 @@ Common::Error NeverhoodEngine::run() {
 	}
 #endif
 
+#if 0
+	{ // Create a new scope
+		DataResource dataResource(this);
+		//dataResource.load(0x01801002);
+		//dataResource.load(0x84500132);
+		dataResource.load(0x81120132);
+	}
+#endif
+
+#if 1
 	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
 
@@ -196,7 +206,9 @@ Common::Error NeverhoodEngine::run() {
 	
 	delete _gameModule;
 	delete _collisionMan;
-	
+#endif
+
+
 	delete _res;
 	delete _screen;
 
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 97eae89..1c37610 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -20,11 +20,16 @@
  *
  */
 
+#include "common/memstream.h"
 #include "neverhood/resource.h"
 #include "neverhood/resourceman.h"
 
 namespace Neverhood {
 
+// TODO: Since the load() methods are similar in most cases some of the code therein
+// can probably be copied into another method (e.g. inside the resource manager)
+// to reduce code. 
+
 // SpriteResource
 
 SpriteResource::SpriteResource(NeverhoodEngine *vm)
@@ -360,6 +365,248 @@ void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) {
 	}
 }
 
+// TextResource
+
+TextResource::TextResource(NeverhoodEngine *vm)
+	: _vm(vm), _resourceHandle(-1), _textData(NULL), _count(0) {
+	
+}
+
+TextResource::~TextResource() {
+	unload();
+}
+
+void TextResource::load(uint32 fileHash) {
+	unload();
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	if (_resourceHandle != -1) {
+		if (_vm->_res->getResourceType(_resourceHandle) == 6) {
+			_textData = _vm->_res->loadResource(_resourceHandle, true);
+			_count = READ_LE_UINT32(_textData);
+		} else {
+			_vm->_res->unuseResource(_resourceHandle);
+			_resourceHandle = -1;
+		}
+	}
+}
+
+void TextResource::unload() {
+	if (_resourceHandle != -1) {
+		_vm->_res->unloadResource(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+		_textData = NULL;
+		_count = 0;
+	}
+}
+
+const char *TextResource::getString(uint index, const char *&textEnd) {
+	const char *textStart = (const char*)(_textData + 4 + _count * 4 + READ_LE_UINT32(_textData + (index + 1) * 4));
+	textEnd = (const char*)(_textData + 4 + _count * 4 + READ_LE_UINT32(_textData + (index + 2) * 4));
+	return textStart;
+}
+
+// DataResource
+
+DataResource::DataResource(NeverhoodEngine *vm)
+	: _vm(vm), _resourceHandle(-1) {
+}
+
+DataResource::~DataResource() {
+	unload();
+}
+
+void DataResource::load(uint32 fileHash) {
+	debug("DataResource::load(%08X)", fileHash);
+	byte *data = NULL;
+	uint32 dataSize = 0;
+	unload();
+	_resourceHandle = _vm->_res->useResource(fileHash);
+	if (_resourceHandle != -1) {
+		if (_vm->_res->getResourceType(_resourceHandle) == 5) {
+			data = _vm->_res->loadResource(_resourceHandle, true);
+			dataSize = _vm->_res->getResourceSize(_resourceHandle);
+		} else {
+			_vm->_res->unuseResource(_resourceHandle);
+			_resourceHandle = -1;
+		}
+	}
+	if (data && dataSize) {
+		Common::MemoryReadStream dataS(data, dataSize);
+		uint itemCount = dataS.readUint16LE();
+		uint32 itemStartOffs = 2 + itemCount * 8;
+		debug("itemCount = %d", itemCount);
+		for (uint i = 0; i < itemCount; i++) {
+			dataS.seek(2 + i * 8);
+			DRDirectoryItem drDirectoryItem;
+			drDirectoryItem.nameHash = dataS.readUint32LE();
+			drDirectoryItem.offset = dataS.readUint16LE(); 
+			drDirectoryItem.type = dataS.readUint16LE();
+			debug("%03d nameHash = %08X; offset = %04X; type = %d", i, drDirectoryItem.nameHash, drDirectoryItem.offset, drDirectoryItem.type);
+			dataS.seek(itemStartOffs + drDirectoryItem.offset);
+			switch (drDirectoryItem.type) {
+			case 1:
+				{
+					debug(3, "NPoint");
+					NPoint point;
+					point.x = dataS.readUint16LE();
+					point.y = dataS.readUint16LE();
+					debug(3, "(%d, %d)", point.x, point.y);
+					drDirectoryItem.offset = _points.size();
+					_points.push_back(point);
+					break;
+				}
+			case 2:
+				{
+					uint count = dataS.readUint16LE();
+					NPointArray *pointArray = new NPointArray();
+					debug(3, "NPointArray; count = %d", count);
+					for (uint j = 0; j < count; j++) {
+						NPoint point;
+						point.x = dataS.readUint16LE();
+						point.y = dataS.readUint16LE();
+						debug(3, "(%d, %d)", point.x, point.y);
+						pointArray->push_back(point);
+					}
+					drDirectoryItem.offset = _pointArrays.size();
+					_pointArrays.push_back(pointArray);
+					break;
+				}
+			case 3:
+				{
+					uint count = dataS.readUint16LE();
+					HitRectList *hitRectList = new HitRectList();
+					debug(3, "HitRectList; count = %d", count);
+					for (uint j = 0; j < count; j++) {
+						HitRect hitRect;
+						hitRect.rect.x1 = dataS.readUint16LE();
+						hitRect.rect.y1 = dataS.readUint16LE();
+						hitRect.rect.x2 = dataS.readUint16LE();
+						hitRect.rect.y2 = dataS.readUint16LE();
+						hitRect.type = dataS.readUint16LE(); 
+						debug(3, "(%d, %d, %d, %d) -> %04d", hitRect.rect.x1, hitRect.rect.y1, hitRect.rect.x2, hitRect.rect.y2, hitRect.type);
+						hitRectList->push_back(hitRect);
+					}
+					drDirectoryItem.offset = _hitRectLists.size();
+					_hitRectLists.push_back(hitRectList);
+					break;
+				}
+			case 4:
+				{
+					uint count = dataS.readUint16LE();
+					MessageList *messageList = new MessageList();
+					debug(3, "MessageList; count = %d", count);
+					for (uint j = 0; j < count; j++) {
+						MessageItem messageItem;
+						messageItem.messageNum = dataS.readUint32LE();
+						messageItem.messageValue = dataS.readUint32LE();
+						debug(3, "(%04X, %08X)", messageItem.messageNum, messageItem.messageValue);
+						messageList->push_back(messageItem);
+					}
+					drDirectoryItem.offset = _messageLists.size();
+					_messageLists.push_back(messageList);
+					break;
+				}
+			case 5:
+				{
+					uint count = dataS.readUint16LE();
+					DRSubRectList *drSubRectList = new DRSubRectList();
+					debug(3, "SubRectList; count = %d", count);
+					for (uint j = 0; j < count; j++) {
+						DRSubRect drSubRect;
+						drSubRect.rect.x1 = dataS.readUint16LE();
+						drSubRect.rect.y1 = dataS.readUint16LE();
+						drSubRect.rect.x2 = dataS.readUint16LE();
+						drSubRect.rect.y2 = dataS.readUint16LE();
+						drSubRect.messageListHash = dataS.readUint32LE();
+						drSubRect.messageListItemIndex = dataS.readUint16LE();
+						debug(3, "(%d, %d, %d, %d) -> %08X (%d)", drSubRect.rect.x1, drSubRect.rect.y1, drSubRect.rect.x2, drSubRect.rect.y2, drSubRect.messageListHash, drSubRect.messageListItemIndex);
+						drSubRectList->push_back(drSubRect);
+					}
+					drDirectoryItem.offset = _drSubRectLists.size();
+					_drSubRectLists.push_back(drSubRectList);
+					break;
+				}
+			case 6:
+				{
+					DRRect drRect;
+					drRect.rect.x1 = dataS.readUint16LE();
+					drRect.rect.y1 = dataS.readUint16LE();
+					drRect.rect.x2 = dataS.readUint16LE();
+					drRect.rect.y2 = dataS.readUint16LE();
+					drRect.subRectIndex = dataS.readUint16LE();
+					debug(3, "(%d, %d, %d, %d) -> %d", drRect.rect.x1, drRect.rect.y1, drRect.rect.x2, drRect.rect.y2, drRect.subRectIndex);
+					drDirectoryItem.offset = _drRects.size();
+					_drRects.push_back(drRect);
+					break;
+				}
+			case 7:
+				{
+					uint count = dataS.readUint16LE();
+					NRectArray *rectArray = new NRectArray();
+					debug(3, "NRectArray; count = %d", count);
+					for (uint j = 0; j < count; j++) {
+						NRect rect;
+						rect.x1 = dataS.readUint16LE();
+						rect.y1 = dataS.readUint16LE();
+						rect.x2 = dataS.readUint16LE();
+						rect.y2 = dataS.readUint16LE();
+						debug(3, "(%d, %d, %d, %d)", rect.x1, rect.y1, rect.x2, rect.y2);
+						rectArray->push_back(rect);
+					}
+					drDirectoryItem.offset = _rectArrays.size();
+					_rectArrays.push_back(rectArray);
+					break;
+				}
+			}
+			_directory.push_back(drDirectoryItem); 
+		}
+	}
+}
+
+void DataResource::unload() {
+	if (_resourceHandle != -1) {
+		_vm->_res->unloadResource(_resourceHandle);
+		_vm->_res->unuseResource(_resourceHandle);
+		_resourceHandle = -1;
+		// TODO: Clear arrays
+	}
+}
+
+NPoint DataResource::getPoint(uint32 nameHash) {
+	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 1);
+	if (drDirectoryItem)
+		return _points[drDirectoryItem->offset];
+	return NPoint();
+}
+
+NPointArray *DataResource::getPointArray(uint32 nameHash) {
+	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 2);
+	if (drDirectoryItem)
+		return _pointArrays[drDirectoryItem->offset];
+	return NULL;
+}
+
+HitRectList *DataResource::getHitRectList() {
+	// TODO
+	return NULL;
+}
+
+MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) {
+	// TODO
+	return NULL;
+}
+
+DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash, uint16 type) {
+	for (Common::Array<DRDirectoryItem>::iterator it = _directory.begin(); it != _directory.end(); it++) {
+		if ((*it).nameHash == nameHash && (*it).type == type)
+			return &(*it);
+	}
+	return NULL;
+}
+
+// SoundResource
+
 SoundResource::SoundResource(NeverhoodEngine *vm)
 	: _vm(vm) {
 }
@@ -374,4 +621,20 @@ void SoundResource::play(uint32 fileHash, bool looping) {
 void SoundResource::play() {
 }
 
+uint32 calcHash(const char *value) {
+	uint32 hash = 0, shiftValue = 0;
+	while (*value != 0) {
+		char ch = *value++;
+		if (ch >= 'a' && ch <= 'z')
+			ch -= 32;
+		else if (ch >= '0' && ch <= '9')
+			ch += 22;
+		shiftValue += ch - 64;
+		if (shiftValue >= 32)
+			shiftValue -= 32;
+		hash ^= 1 << shiftValue;
+	}
+	return hash;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 610973c..d273e7c 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -23,8 +23,10 @@
 #ifndef NEVERHOOD_RESOURCE_H
 #define NEVERHOOD_RESOURCE_H
 
+#include "common/str.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/graphics.h"
+#include "neverhood/staticdata.h"
 
 namespace Neverhood {
 
@@ -119,6 +121,74 @@ protected:
 	uint32 _currFileHash;
 };
 
+class TextResource {
+public:
+	TextResource(NeverhoodEngine *vm);
+	~TextResource();
+	void load(uint32 fileHash);
+	void unload();
+	const char *getString(uint index, const char *&textEnd);
+	uint getCount() const { return _count;}
+protected:
+	NeverhoodEngine *_vm;
+	int _resourceHandle;
+	byte *_textData;
+	uint _count;
+};
+
+/* DataResource
+	1	Single NPoint
+	2	Array of NPoints
+	3	Array of NRects
+	4	MessageList
+	5	SubRectList
+	6	RectList
+*/
+
+class DataResource {
+public:
+	DataResource(NeverhoodEngine *vm);
+	~DataResource();
+	void load(uint32 fileHash);
+	void unload();
+	NPoint getPoint(uint32 nameHash);
+	NPointArray *getPointArray(uint32 nameHash);
+	HitRectList *getHitRectList();
+	MessageList *getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY);
+protected:
+
+	struct DRDirectoryItem {
+		uint32 nameHash;
+		uint16 offset; 
+		uint16 type;
+	};
+
+	struct DRRect {
+		NRect rect;
+		uint16 subRectIndex;
+	};
+
+	struct DRSubRect {
+		NRect rect;
+		uint32 messageListHash;
+		uint16 messageListItemIndex;
+	};
+
+	typedef Common::Array<DRSubRect> DRSubRectList;
+
+	NeverhoodEngine *_vm;
+	int _resourceHandle;
+	Common::Array<DRDirectoryItem> _directory;
+	Common::Array<NPoint> _points;
+	Common::Array<NPointArray*> _pointArrays;
+	Common::Array<NRectArray*> _rectArrays;
+	Common::Array<HitRectList*> _hitRectLists;
+	Common::Array<MessageList*> _messageLists;
+	Common::Array<DRRect> _drRects;
+	Common::Array<DRSubRectList*> _drSubRectLists;
+	DataResource::DRDirectoryItem *findDRDirectoryItem(uint32 nameHash, uint16 type); 
+};
+
 // TODO: Dummy class atm
 
 class SoundResource {
@@ -131,6 +201,8 @@ protected:
 	NeverhoodEngine *_vm;	
 };
 
+uint32 calcHash(const char *value);
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_RESOURCE_H */
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 4996bdd..87fd131 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -104,7 +104,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac
 	: Sprite(vm, 0), _spriteResource(vm) {
 
 	_name = "StaticSprite"; 
-	// TODO init(calcHash(filename), surfacePriority, x, y, width, height);
+	init(calcHash(filename), surfacePriority, x, y, width, height);
 
 }
 
@@ -288,8 +288,7 @@ void AnimatedSprite::updateAnim() {
 					if (_animResource.loadInternal(_fileHash2)) {
 						_currAnimFileHash = _fileHash2;
 					} else {
-						debug("TODO");
-						// TODO _animResource.loadInternal(calcHash("sqDefault"));
+						_animResource.loadInternal(calcHash("sqDefault"));
 						_currAnimFileHash = 0;
 					}
 					if (_replOldColor != _replNewColor) {
@@ -320,8 +319,7 @@ void AnimatedSprite::updateAnim() {
 				if (_animResource.loadInternal(_fileHash1)) {
 					_currAnimFileHash = _fileHash1;
 				} else {
-					debug("TODO");
-					// TODO _animResource.loadInternal(calcHash("sqDefault"));
+					_animResource.loadInternal(calcHash("sqDefault"));
 					_currAnimFileHash = 0;
 				}
 				if (_replOldColor != _replNewColor) {
@@ -334,8 +332,7 @@ void AnimatedSprite::updateAnim() {
 				if (_animResource.loadInternal(_fileHash1)) {
 					_currAnimFileHash = _fileHash1;
 				} else {
-					debug("TODO");
-					// TODO _animResource.loadInternal(calcHash("sqDefault"));
+					_animResource.loadInternal(calcHash("sqDefault"));
 					_currAnimFileHash = 0;
 				}
 				if (_replOldColor != _replNewColor) {


Commit: 71da221507182398a1fe905f4cd293a4ed25eacd
    https://github.com/scummvm/scummvm/commit/71da221507182398a1fe905f4cd293a4ed25eacd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Implement Scene1004

- Module1000 is now almost complete

Changed paths:
    engines/neverhood/graphics.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 8bdf0af..36bd95e 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -81,6 +81,7 @@ public:
 	bool getVisible() const { return _visible; }
 	void setVisible(bool value) { _visible = value; }
 	void setTransparent(bool value) { _transparent = value; }
+	Graphics::Surface *getSurface() { return _surface; }
 protected:
 	NeverhoodEngine *_vm;
 	int _priority;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 51dde55..d5c3205 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -1555,7 +1555,6 @@ void Klayman::sub420420() {
 }
 
 uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender) {
-
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1567,6 +1566,33 @@ uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub420ED0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420ED0))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x91540140, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E2F0);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	}
+}
+
+uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC61A0119) {
+			_soundResource1.play(0x402338C2);
+		} else if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -2209,4 +2235,94 @@ void KmScene1002::sub44A4B0() {
 	_attachedSprite->sendMessage(0x482A, 0, this);
 }
 
+// KmScene1004
+
+KmScene1004::KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	_dataResource.load(0x01900A04);	
+}
+
+uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x4818:
+		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&KmScene1004::sub478170));
+		break;
+	case 0x4820:
+		_parentScene->sendMessage(0x2000, 0, this);
+		setCallback2(AnimationCallback(&Klayman::sub420970));
+		break;
+	case 0x4821:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_y4 = param.asInteger();
+		setCallback2(AnimationCallback(&Klayman::sub4209D0));
+		break;
+	case 0x4822:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_y4 = param.asInteger();
+		setCallback2(AnimationCallback(&Klayman::sub420AD0));
+		break;
+	case 0x4823:
+		_parentScene->sendMessage(0x2001, 0, this);
+		setCallback2(AnimationCallback(&Klayman::sub420BC0));
+		break;
+	case 0x4824:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_y4 = _dataResource.getPoint(param.asInteger()).y;
+		setCallback2(AnimationCallback(&Klayman::sub4209D0));
+		break;
+	case 0x4825:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_y4 = _dataResource.getPoint(param.asInteger()).y;
+		setCallback2(AnimationCallback(&Klayman::sub420AD0));
+		break;
+	case 0x4828:
+		setCallback2(AnimationCallback(&Klayman::sub420ED0));
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x04684052) {
+			_flagE5 = true;
+			_parentScene->sendMessage(0x2002, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1004::sub478170() {
+	_status2 = 2;
+	_flagE5 = false;
+	setFileHash(0x123E9C9F, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene1004::handleMessage478110);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 20d0e88..8ec33bc 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -81,6 +81,7 @@ public:
 	void sub4210C0();
 	void sub421070();
 	void sub420420();
+	void sub420ED0();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -204,6 +205,7 @@ protected:
 	uint32 handleMessage41E0D0(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E490(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41E2F0(int messageNum, const MessageParam &param, Entity *sender);
 	
 };
 
@@ -253,6 +255,15 @@ protected:
 	void sub44A4B0();
 };
 
+class KmScene1004 : public Klayman {
+public:
+	KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage478110(int messageNum, const MessageParam &param, Entity *sender);
+	void sub478170();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 6825f62..dc28960 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -56,8 +56,9 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 0) {
 		//createScene1001(0);
 		// DEBUG: Jump to room
-		//createScene1002(0);
-		createScene1005(0);
+		createScene1002(0);
+		//createScene1005(0);
+		//createScene1004(0);
 	} else if (which == 1) {
 		createScene1002(1);
 	}
@@ -93,6 +94,11 @@ void Module1000::createScene1003(int which) {
 }
 
 void Module1000::createScene1004(int which) {
+	_vm->gameState().sceneNum = 3;
+	_childObject = new Scene1004(_vm, this, which);
+	SetUpdateHandler(&Module1000::updateScene1004);
+	// TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1);
+	// TODO Music18hList_stop(0x061880C6, 0, 2);
 }
 
 void Module1000::createScene1005(int which) {
@@ -100,16 +106,13 @@ void Module1000::createScene1005(int which) {
 	_childObject = new Scene1005(_vm, this, which);
 	// TODO Music18hList_stop(0x061880C6, 0, 0);
 	// TODO Music18hList_play(_musicFileHash, 0, 0, 1);
-	SetUpdateHandler(&Module1000::updateScene1002);
+	SetUpdateHandler(&Module1000::updateScene1005);
 }
 
 void Module1000::updateScene1001() {
 	_childObject->handleUpdate();
-
 	if (_done) {
-	
 		debug("SCENE 1001 DONE; _field20 = %d", _field20);
-	
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
@@ -117,11 +120,10 @@ void Module1000::updateScene1001() {
 			createScene1003(0);
 			_childObject->handleUpdate();
 		} else {
-			// TODO createScene1002();
-			// TODO _childObject->handleUpdate();
+			createScene1002(0);
+			_childObject->handleUpdate();
 		}
 	}
-
 	if (_field24 >= 0) {
 		if (_field24 == 2) {
 			// TODO ResourceTable_multiLoad(&_resourceTable2, &_resourceTable1, &_resourceTable3);
@@ -131,36 +133,29 @@ void Module1000::updateScene1001() {
 			_field24 = -1;
 		}
 	}
-
 	if (_field26 >= 0) {
 		// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3);
 		_field26 = -1;
 	}
-
 }
 
 void Module1000::updateScene1002() {
-
 	_childObject->handleUpdate();
-
 	if (_done) {
-	
 		debug("SCENE 1002 DONE; _field20 = %d", _field20);
-	
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
 			_parentModule->sendMessage(0x1009, 0, this);
 		} else if (_field20 == 2) {
-			// TODO createScene1004(0);
-			// TODO _childObject->handleUpdate();
+			createScene1004(0);
+			_childObject->handleUpdate();
 		} else {
 			createScene1001(1);
 			_childObject->handleUpdate();
 		}
 	}
-
 	if (_field24 >= 0) {
 		if (_field24 == 1) {
 			_parentModule->sendMessage(0x100A, 0, this);
@@ -171,7 +166,6 @@ void Module1000::updateScene1002() {
 		}
 		_field24 = -1;
 	}
-
 	if (_field26 >= 0) {
 		if (_field26 == 1) {
 			_parentModule->sendMessage(0x1023, 0, this);
@@ -180,11 +174,9 @@ void Module1000::updateScene1002() {
 		}
 		_field26 = -1;
 	}
-
 	if (_field28 >= 0) {
 		_field28 = -1;
 	}
-
 }
 			
 void Module1000::updateScene1003() {
@@ -199,6 +191,30 @@ void Module1000::updateScene1003() {
 }
 			
 void Module1000::updateScene1004() {
+	_childObject->handleUpdate();
+	if (_done) {
+		debug("SCENE 1004 DONE; _field20 = %d", _field20);
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene1005(0);
+			_childObject->handleUpdate();
+		} else {
+			createScene1002(2);
+			_childObject->handleUpdate();
+		}
+	}
+	if (_field24 >= 0) {
+		if (_field24 == 0) {
+			// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
+		}
+		_field24 = -1;
+	}
+	if (_field26 >= 0) {
+		// TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1);
+		_field26 = -1;
+	}
 }
 			
 void Module1000::updateScene1005() {
@@ -223,11 +239,7 @@ AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
 	_x = 726;
 	_y = 440;
 	callback1();
-#if 0
-	_soundResource2.set(0xED403E03);
-	_soundResource2.load();
-	_soundResource2.createSoundBuffer();
-#endif
+	_soundResource2.load(0xED403E03);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1001Door::handleMessage);
 }
@@ -1421,49 +1433,66 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_class599 = addSprite(new Class599(_vm, this));
 
-	// DEBUG/HACK!!!!
-	which = 1; setGlobalVar(0x8306F218, 1);
-
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
-			// TODO			
+			_klayman->getSurface()->getClipRect().x1 = 31;
+			_klayman->getSurface()->getClipRect().y1 = 0;
+			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height;
+			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435);
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
-			// TODO			
+			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
+			_klayman->getSurface()->getClipRect().y1 = 0;
+			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
+			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		}
 	} else {
 		if (which == 1) {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4478);
-			// TODO			
+			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
+			_klayman->getSurface()->getClipRect().y1 = 0;
+			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
+			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_vm->_gameState.field2 = 1;
 		} else if (which == 2) {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4298);
-			// TODO
+			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
+			_klayman->getSurface()->getClipRect().y1 = 0;
+			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
+			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_vm->_gameState.field2 = 1;
 			_klayman->sendMessage(0x4820, 0, this);
 		} else {
 			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4470);
-			// TODO
-			//_class479 = addSprite(new Class479(_vm, this, _klayman));
-			// TODO
+			_klayman->getSurface()->getClipRect().x1 = 31;
+			_klayman->getSurface()->getClipRect().y1 = 0;
+			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height;
+			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+			// TODO _class479 = addSprite(new Class479(_vm, this, _klayman));
+			// TODO _class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 			_vm->_gameState.field2 = 0;
 		} 
 	}
 
-    addSprite(_klayman);
+	addSprite(_klayman);
 
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL));
 
@@ -1496,11 +1525,8 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 								  
 	setRectList(0x004B43A0);
 
-								  
-#if 0 // TODO
 	_soundResource2.load(0x60755842);
 	_soundResource3.load(0x616D5821);
-#endif
 
 }
 
@@ -1510,7 +1536,11 @@ Scene1002::~Scene1002() {
 void Scene1002::update() {
 	Scene::update();
 	if (!_flag1B4 && _klayman->getY() > 230) {
-		// TODO
+		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
+		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		deleteSprite(&_ssLadderArchPart3);
 		_klayman->clearRepl();
 		_flag1B4 = true;
@@ -1689,6 +1719,144 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity
 	return 0;
 }
 
+// Scene1004
+
+AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100), _soundResource(vm) {
+
+	_x = 330;
+	_y = 327;
+	createSurface(800, 56, 50);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1004TrashCan::handleMessage);
+	_surface->setVisible(false);
+}
+
+uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x225A8587) {
+			_soundResource.play(0x109AFC4C);
+		}
+		break;
+	case 0x2002:
+		setFileHash(0xEB312C11, 0, -1);
+		_surface->setVisible(true);
+		break;
+	case 0x3002:
+		setFileHash1();
+		_surface->setVisible(false);
+		break;
+	}
+	return 0;
+}
+
+Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _paletteAreaStatus(-1) {
+
+	Palette2 *palette2;
+	Sprite *tempSprite;
+	
+	_surfaceFlag = true;
+	
+	SetUpdateHandler(&Scene1004::update);
+	SetMessageHandler(&Scene1004::handleMessage);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x50C03005, 0, 0));
+
+	if (getGlobalVar(0x0D0A14D10)) {
+		palette2 = new Palette2(_vm, 0xA30BA329);
+		palette2->addPalette(0xA30BA329, 0, 256, 0);
+	} else {
+		palette2 = new Palette2(_vm, 0x50C03005);
+		palette2->addPalette(0x50C03005, 0, 256, 0);
+	}
+	_palette = palette2;
+	_palette->usePalette();
+	addEntity(_palette);
+
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x03001504, NULL));
+
+	if (which < 0) {
+		setRectList(0x004B7C70);
+		_klayman = new KmScene1004(_vm, this, 330, 327);
+		setMessageList(0x004B7C18);
+	} else if (which == 1) {
+		setRectList(0x004B7C70);
+		_klayman = new KmScene1004(_vm, this, 330, 327);
+		setMessageList(0x004B7C08);
+	} else {
+		loadDataResource(0x01900A04);
+		_klayman = new KmScene1004(_vm, this, _dataResource.getPoint(0x80052A29).x, 27);
+		setMessageList(0x004B7BF0);
+	}
+	
+	addSprite(_klayman);
+	
+	updatePaletteArea();
+	
+	_class478 = addSprite(new Class478(_vm, _klayman));
+
+	addSprite(new StaticSprite(_vm, 0x800034A0, 1100));
+	addSprite(new StaticSprite(_vm, 0x64402020, 1100));
+	addSprite(new StaticSprite(_vm, 0x3060222E, 1300));
+	tempSprite = addSprite(new StaticSprite(_vm, 0x0E002004, 1300));
+	
+	_klayman->getSurface()->getClipRect().x1 = 0;
+	_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+	_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+
+	_asTrashCan = addSprite(new AsScene1004TrashCan(_vm));
+
+}
+
+void Scene1004::update() {
+	Scene::update();
+	updatePaletteArea();
+}
+
+uint32 Scene1004::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x926500A1) {
+			setMessageList(0x004B7C20);
+			messageResult = 1;
+		}
+		break;
+	case 0x2000:
+		loadDataResource(0x01900A04);
+		break;
+	case 0x2001:
+		setRectList(0x004B7C70);
+		break;
+	case 0x2002:
+		_asTrashCan->sendMessage(0x2002, 0, this);
+		break;
+	}
+	return messageResult;
+} 
+
+void Scene1004::updatePaletteArea() {
+	if (_klayman->getY() < 150) {
+		if (_paletteAreaStatus != 0) {
+			_paletteAreaStatus = 0;
+			((Palette2*)_palette)->addPalette(0x406B0D10, 0, 64, 0);
+			((Palette2*)_palette)->startFadeToPalette(12);
+		}
+	} else {
+		if (_paletteAreaStatus != 1) {
+			_paletteAreaStatus = 1;
+			((Palette2*)_palette)->addPalette(0x24332243, 0, 64, 0);
+			((Palette2*)_palette)->startFadeToPalette(12);
+		}
+	}
+}
+
 // Scene1005
 
 Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1717,9 +1885,6 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 }
 
-Scene1005::~Scene1005() {
-}
-
 uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 4b2121e..0e3f950 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -302,12 +302,33 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+// Scene1004
+
+class AsScene1004TrashCan : public AnimatedSprite {
+public:
+	AsScene1004TrashCan(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1004 : public Scene {
+public:
+	Scene1004(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_class478;
+	Sprite *_asTrashCan;
+	int _paletteAreaStatus;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void updatePaletteArea();
+};
+
 // Scene1005
 
 class Scene1005 : public Scene {
 public:
 	Scene1005(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Scene1005();
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void drawTextToBackground();
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 1c37610..8b2a19c 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -606,6 +606,7 @@ DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash
 }
 
 // SoundResource
+// ALL TODO
 
 SoundResource::SoundResource(NeverhoodEngine *vm)
 	: _vm(vm) {
@@ -615,6 +616,9 @@ bool SoundResource::isPlaying() {
 	return false; 
 }
 
+void SoundResource::load(uint32 fileHash) {
+}
+
 void SoundResource::play(uint32 fileHash, bool looping) {
 }
 
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index d273e7c..5d8d5ca 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -195,6 +195,7 @@ class SoundResource {
 public:
 	SoundResource(NeverhoodEngine *vm);
 	bool isPlaying();
+	void load(uint32 fileHash);
 	void play(uint32 fileHash, bool looping = false);
 	void play();
 protected:
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 2b5c81b..8f49a00 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -26,7 +26,7 @@
 namespace Neverhood {
 
 Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
-	: Entity(vm, 0), _parentModule(parentModule) {
+	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) {
 	
 	_messageListFlag1 = false;
 	_systemCallbackFlag = false;
@@ -94,8 +94,10 @@ void Scene::draw() {
 				(*iter)->addDirtyRect();
 			// TODO g_screen->addDirtyRects();
 		}
-		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
+		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
+			debug(4, "priority = %d", (*iter)->getPriority());
 			(*iter)->draw();
+		}
 	}	
 }
 
@@ -492,4 +494,10 @@ void Scene::setRectList(RectList *rectList) {
 	_rectType = 1;
 }
 
+void Scene::loadDataResource(uint32 fileHash) {
+	_dataResource.load(fileHash);
+	if (_klayman)
+		_klayman->loadDataResource(fileHash);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 0878380..8f0b79a 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -61,7 +61,7 @@ protected:
 	bool _messageListFlag1;
 	NPoint _mouseClickPos;
 	bool _mouseClicked;
-	// TODO RectResource _rectResource;
+	DataResource _dataResource;
 	RectList *_rectList;
 	int _rectType;
 	// rectListCount
@@ -102,6 +102,7 @@ protected:
 	void runMessageList();
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);
+	void loadDataResource(uint32 fileHash);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 87fd131..2c772d7 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -27,10 +27,8 @@ namespace Neverhood {
 // Sprite
 
 Sprite::Sprite(NeverhoodEngine *vm, int objectPriority)
-	: Entity(vm, objectPriority), _x(0), _y(0),
-	_spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
-	_doDeltaX(false), _doDeltaY(false), _needRefresh(false),
-	_flags(0) {
+	: Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
+	_dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0) {
 
 	_name = "Sprite"; 
 	SetMessageHandler(&Sprite::handleMessage);
@@ -87,6 +85,10 @@ uint32 Sprite::handleMessage(int messageNum, const MessageParam &param, Entity *
 	return 0;
 }
 
+void Sprite::loadDataResource(uint32 fileHash) {
+	_dataResource.load(fileHash);
+}
+
 void Sprite::createSurface(int surfacePriority, int16 width, int16 height) {
 	_surface = new BaseSurface(_vm, surfacePriority, width, height);
 }
@@ -138,7 +140,7 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y,
 	_drawRect.x = 0;
 	_drawRect.y = 0;
 	_drawRect.width = width;
-	_drawRect.width = height; 
+	_drawRect.height = height; 
 
 	_needRefresh = true;
 
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index f1d8a87..18c9ae3 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -53,6 +53,7 @@ public:
 	bool isDoDeltaY() const { return _doDeltaY; }
 	NRect& getRect() { return _rect; }
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void loadDataResource(uint32 fileHash);
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	Common::String _spriteUpdateCbName; // For debugging purposes
@@ -69,7 +70,7 @@ protected:
 	NRect _rect;
 	uint16 _flags;
 	//0000004A field4A		dw ? // seems to be unused except in ctor
-	//0000004C rectResource	RectResource ?
+	DataResource _dataResource;
 	//void update();
 	void createSurface(int surfacePriority, int16 width, int16 height);
 	void handleSpriteUpdate() {


Commit: 438b6bb53c03db915f436a95427b6ab2c9504fce
    https://github.com/scummvm/scummvm/commit/438b6bb53c03db915f436a95427b6ab2c9504fce
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Implement Module2300 (just a bunch of NavigationScenes)

- Fix Smacker player by using a SafeSubReadStream
- Fix NavigationMouse (cursors in type 1 were swapped)

Changed paths:
  A engines/neverhood/module2300.cpp
  A engines/neverhood/module2300.h
    engines/neverhood/blbarchive.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module.cpp
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/mouse.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 3138b91..2e29485 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -110,7 +110,8 @@ byte *BlbArchive::getEntryExtData(uint index) {
 
 Common::SeekableReadStream *BlbArchive::createStream(uint index) {
 	const BlbArchiveEntry &entry = _entries[index];
-	return new Common::SeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
+	//debug("entry.offset = %08X; entry.offset + entry.diskSize = %08X", entry.offset, entry.offset + entry.diskSize);
+	return new Common::SafeSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c2d3e6d..4800923 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -25,6 +25,7 @@
 #include "neverhood/graphics.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1500.h"
+#include "neverhood/module2300.h"
 
 namespace Neverhood {
 
@@ -63,7 +64,7 @@ void GameModule::handleMouseMove(int16 x, int16 y) {
 		NPoint mousePos;
 		mousePos.x = x;
 		mousePos.y = y;
-		debug("GameModule::handleMouseMove(%d, %d)", x, y);
+		debug(2, "GameModule::handleMouseMove(%d, %d)", x, y);
 		_childObject->sendPointMessage(0, mousePos, this);
 	}				
 }
@@ -73,7 +74,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 		NPoint mousePos;
 		mousePos.x = x;
 		mousePos.y = y;
-		debug("GameModule::handleMouseDown(%d, %d)", x, y);
+		debug(2, "GameModule::handleMouseDown(%d, %d)", x, y);
 		_childObject->sendPointMessage(1, mousePos, this);
 	}				
 }
@@ -106,9 +107,29 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
-//	createModule1500(0); // Logos and intro video
+//	createModule1500(0); // Logos and intro video //Real
+//	createModule1000(0);
+	createModule2300(0);
+}
+
+void GameModule::createModule1000(int which) {
+	setGlobalVar(0x91080831, 0x03294419);
+	_childObject = new Module1000(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1000);
+}
 
-	createModule1000(0);
+void GameModule::updateModule1000() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		// TODO _resourceTable3.load();
+		delete _childObject;
+		_childObject = NULL;
+		createModule2300(0);
+		_childObject->handleUpdate();
+	}
 }
 
 void GameModule::createModule1500(int which) {
@@ -131,24 +152,47 @@ void GameModule::updateModule1500() {
 	}
 }
 
-void GameModule::createModule1000(int which) {
-	setGlobalVar(0x91080831, 0x03294419);
-	_childObject = new Module1000(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1000);
+void GameModule::createModule2300(int which) {
+	setGlobalVar(0x91080831, 0x1A214010);
+	_childObject = new Module2300(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule2300);
 }
 
-void GameModule::updateModule1000() {
+void GameModule::updateModule2300() {
 	if (!_childObject)
 		return;
 	_childObject->handleUpdate();
 	if (_done) {
 		_done = false;
-		// TODO _resourceTable3.load();
 		delete _childObject;
 		_childObject = NULL;
-		error("Done...");
-		// TODO createModule2300();
-		// TODO _childObject->handleUpdate();
+		if (_field20 == 1) {
+			// TODO createModule2200(0);
+			// TODO _childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			// TODO createModule1200(0);
+			// TODO _childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			// TODO createModule2400(0);
+			// TODO _childObject->handleUpdate();
+		} else if (_field20 == 4) {
+			// TODO createModule3000(0);
+			// TODO _childObject->handleUpdate();
+		} else {
+			createModule1000(1);
+			_childObject->handleUpdate();
+		}
+	}
+	if (_field24 >= 0) {
+		if (_field24 == 2) {
+			// TODO _resourceTable4.load();
+		} else if (_field24 == 0) {
+			// TODO _resourceTable3.load();
+		}
+		_field24 = -1;
+	}
+	if (_field26 >= 0) {
+		_field26 = -1;
 	}
 }
 
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 876506c..7977ea5 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -49,10 +49,12 @@ protected:
 	*/
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void startup();
-	void createModule1500(int which);
-	void updateModule1500();
 	void createModule1000(int which);
 	void updateModule1000();
+	void createModule1500(int which);
+	void updateModule1500();
+	void createModule2300(int which);
+	void updateModule2300();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 03109c0..8f0b556 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -42,7 +42,6 @@ void Module::draw() {
 }
 
 uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-
 	switch (messageNum) {
 	case 0x0008:
 		if (_parentModule)
@@ -68,7 +67,6 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 		if (_childObject && sender == _parentModule)
 			return _childObject->sendMessage(messageNum, param, sender);
 	}
-
 	return 0;
 }
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index af03c07..ed7077e 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -12,6 +12,7 @@ MODULE_OBJS = \
 	module.o \
 	module1000.o \
 	module1500.o \
+	module2300.o \
 	mouse.o \
 	navigationscene.o \
 	neverhood.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index dc28960..8ee5941 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -21,7 +21,6 @@
  */
 
 #include "neverhood/module1000.h"
-#include "neverhood/navigationscene.h"//###
 
 namespace Neverhood {
 
@@ -54,9 +53,10 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 			break;
 		}
 	} else if (which == 0) {
-		//createScene1001(0);
+		//createScene1001(0);//Real
 		// DEBUG: Jump to room
-		createScene1002(0);
+		setGlobalVar(0x8306F218, 1);
+		createScene1002(2);
 		//createScene1005(0);
 		//createScene1004(0);
 	} else if (which == 1) {
@@ -80,7 +80,6 @@ void Module1000::createScene1001(int which) {
 void Module1000::createScene1002(int which) {
 	_vm->gameState().sceneNum = 1;
 	_childObject = new Scene1002(_vm, this, which);
-	// DEBUG _childObject = new NavigationScene(_vm, this, 0x004B67B8, 0, NULL);
 	// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
 	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
 	SetUpdateHandler(&Module1000::updateScene1002);
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
new file mode 100644
index 0000000..32ce2a1
--- /dev/null
+++ b/engines/neverhood/module2300.cpp
@@ -0,0 +1,270 @@
+/* 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/module2300.h"
+#include "neverhood/navigationscene.h"
+#include "neverhood/smackerscene.h"
+
+namespace Neverhood {
+
+Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule), _volume(0) {
+	
+	debug("Create Module2300(%d)", which);
+
+	// TODO Sound1ChList_addSoundResources(0x1A214010, dword_4B6938, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B6938, true, 50, 600, 10, 10, 150);
+
+	_flag = getGlobalVar(0x10938830) == 0;
+	
+	if (_flag) {
+		// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
+		// TODO Sound1ChList_playLooping(0x90F0D1C3);
+	} else {
+		// TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 0, 0, 0, 0);
+	}
+
+	// TODO Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64, 0);
+	// TODO Sound1ChList_sub_407C70(0x1A214010, 0x41861371, 0x43A2507F, 0);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene2301(-1);
+			break;
+		case 1:
+			createScene2302(-1);
+			break;
+		case 2:
+			createScene2303(-1);
+			break;
+		case 3:
+			createScene2304(-1);
+			break;
+		case 4:
+			createScene2305(-1);
+			break;
+		}
+	} else if (which == 1) {
+		createScene2303(0);
+	} else if (which == 2) {
+		createScene2304(0);
+	} else if (which == 3) {
+		createScene2305(-1);
+	} else if (which == 4) {
+		createScene2302(3);
+	} else {
+		createScene2301(1);
+	}
+
+}
+
+Module2300::~Module2300() {
+	// TODO Sound1ChList_sub_407A50(0x1A214010);
+}
+
+void Module2300::createScene2301(int which) {
+	_vm->gameState().sceneNum = 0;
+	_childObject = new NavigationScene(_vm, this, 0x004B67B8, which, NULL);
+	SetUpdateHandler(&Module2300::updateScene2301);
+}
+			
+void Module2300::createScene2302(int which) {
+	_vm->gameState().sceneNum = 1;
+	_childObject = new NavigationScene(_vm, this, 0x004B67E8, which, NULL);
+	SetUpdateHandler(&Module2300::updateScene2302);
+	if (_flag) {
+		_volume = 15;
+		// TODO Sound1ChList_setVolume(0x90F0D1C3, 15);
+	}
+}
+
+void Module2300::createScene2303(int which) {
+	_vm->gameState().sceneNum = 2;
+	_childObject = new NavigationScene(_vm, this, 0x004B6878, which, NULL);
+	SetUpdateHandler(&Module2300::updateScene2303);
+}
+
+void Module2300::createScene2304(int which) {
+	_vm->gameState().sceneNum = 3;
+	if (getGlobalVar(0x10938830)) {
+		_childObject = new NavigationScene(_vm, this, 0x004B68F0, which, NULL);
+	} else {
+		// TODO Sound1ChList_setVolume(0x90F0D1C3, _volume);
+		_childObject = new NavigationScene(_vm, this, 0x004B68A8, which, NULL);
+		if (_flag) {
+			_volume = 87;
+			// TODO Sound1ChList_setVolume(0x90F0D1C3, 87);
+		}
+	}
+	SetUpdateHandler(&Module2300::updateScene2304);
+}
+
+void Module2300::createScene2305(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 4;
+	// TODO Sound1ChList_sub_4080B0(true);
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x20080A0B);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module2300::updateScene2305);
+}
+
+void Module2300::updateScene2301() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2302(4);
+			_childObject->handleUpdate();
+		} else {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+	}
+	if (_field24 >= 0) {
+		if (_field24 == 0) {
+			_parentModule->sendMessage(0x100A, 0, this);
+		}
+		_field24 = -1;
+	}
+	if (_field26 >= 0) {
+		_parentModule->sendMessage(0x1023, 0, this);
+		_field26 = -1;
+	}
+}
+
+void Module2300::updateScene2302() {
+	_childObject->handleUpdate();
+#if 0 // TODO
+	NavigationScene *navigationScene = (NavigationScene*)_childObject; 
+	if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
+		navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
+		_volume++;
+		Sound1ChList_setVolume(0x90F0D1C3, _volume);
+	}
+#endif
+#if 0 // TODO
+	if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
+		navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
+		Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64);
+		Sound1ChList_setVolume(0x48498E46, 70);
+		Sound1ChList_setVolume(0x50399F64, 70);
+	}
+#endif
+	if (_done) {
+		debug("SCENE 2302 DONE; _field20 = %d", _field20);
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2301(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene2303(1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			createScene2302(3);
+			_childObject->handleUpdate();
+		} else if (_field20 == 4) {
+			createScene2304(1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 5) {
+			_parentModule->sendMessage(0x1009, 3, this);
+		} else {
+			_parentModule->sendMessage(0x1009, 4, this);
+		}
+	}
+}
+			
+void Module2300::updateScene2303() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			_parentModule->sendMessage(0x1009, 3, this);
+		} else {
+			createScene2302(5);
+			_childObject->handleUpdate();
+		}
+	}
+	if (_field24 >= 0) {
+		if (_field24 == 1) {
+			// TODO _resourceTable1.setResourceList(ex_sub_479D00(0), true);
+			// TODO _resourceTable2.loadResources();
+		}
+		_field24 = -1;
+	}
+}
+			
+void Module2300::updateScene2304() {
+	_childObject->handleUpdate();
+#if 0 // TODO
+	NavigationScene *navigationScene = (NavigationScene*)_childObject; 
+	if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
+		navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
+		_volume--;
+		Sound1ChList_setVolume(0x90F0D1C3, _volume);
+	}
+#endif
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			_parentModule->sendMessage(0x1009, 2, this);
+		} else {
+			createScene2302(1);
+			_childObject->handleUpdate();
+		}
+	}
+	if (_field24 >= 0) {
+		if (_field24 == 0) {
+			_parentModule->sendMessage(0x100A, 2, this);
+		}
+		_field24 = -1;
+	}
+	if (_field26 >= 0) {
+		if (_field26 == 1) {
+			_parentModule->sendMessage(0x1023, 2, this);
+		}
+		_field26 = -1;
+	}
+}
+			
+void Module2300::updateScene2305() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		// TODO Sound1ChList_sub_4080B0(false);
+		createScene2302(2);
+		_childObject->handleUpdate();
+	}
+}
+			
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h
new file mode 100644
index 0000000..9f705db
--- /dev/null
+++ b/engines/neverhood/module2300.h
@@ -0,0 +1,57 @@
+/* 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_MODULE2300_H
+#define NEVERHOOD_MODULE2300_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module2300
+
+class Module2300 : public Module {
+public:
+	Module2300(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2300();
+protected:
+	// TODO ResourceTable _resourceTable1;
+	// TODO ResourceTable _resourceTable2;
+	bool _flag;
+	int _volume;
+	void createScene2301(int which);			
+	void createScene2302(int which);			
+	void createScene2303(int which);			
+	void createScene2304(int which);			
+	void createScene2305(int which);			
+	void updateScene2301();			
+	void updateScene2302();			
+	void updateScene2303();			
+	void updateScene2304();			
+	void updateScene2305();			
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2300_H */
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 63d9866..1eaf0cb 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -258,6 +258,7 @@ void NavigationMouse::update() {
 }
 
 uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("NavigationMouse: _type = %d", _type);
 	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2064:
@@ -311,9 +312,9 @@ uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam &param,
 		switch (_type) {
 		case 1:
 			if (_x >= 320)
-				_mouseCursorResource.setCursorNum(6);
-			else				
 				_mouseCursorResource.setCursorNum(5);
+			else				
+				_mouseCursorResource.setCursorNum(6);
 			break;
 		case 2:
 		default:
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 8b2a19c..44fef14 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -51,11 +51,11 @@ void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) {
 }
 
 bool SpriteResource::load(uint32 fileHash) {
-	debug("SpriteResource::load(%08X)", fileHash);
+	debug(2, "SpriteResource::load(%08X)", fileHash);
 	// TODO: Later merge with load2 and make the mode a parameter
 	unload();
 	_resourceHandle = _vm->_res->useResource(fileHash);
-	debug("SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle);
+	debug(2, "SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle);
 	if (_resourceHandle != -1) {
 		if (_vm->_res->getResourceType(_resourceHandle) == 2) {
 			byte *spriteData = _vm->_res->loadResource(_resourceHandle, true);
@@ -106,7 +106,7 @@ PaletteResource::~PaletteResource() {
 }
 
 bool PaletteResource::load(uint32 fileHash) {
-	debug("PaletteResource::load(%08X)", fileHash);
+	debug(2, "PaletteResource::load(%08X)", fileHash);
 	unload();
 	_resourceHandle = _vm->_res->useResource(fileHash);
 	if (_resourceHandle != -1) {
@@ -170,7 +170,7 @@ void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX,
 }
 
 bool AnimResource::load(uint32 fileHash) {
-	debug("AnimResource::load(%08X)", fileHash);
+	debug(2, "AnimResource::load(%08X)", fileHash);
 
 	if (fileHash == _fileHash)
 		return true;
@@ -304,7 +304,7 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) {
 			frameIndex = (int16)i;
 			break;
 		}
-	debug("AnimResource::getFrameIndex(%08X) -> %d", frameHash, frameIndex);
+	debug(2, "AnimResource::getFrameIndex(%08X) -> %d", frameHash, frameIndex);
 	return frameIndex;			
 }
 
@@ -324,7 +324,6 @@ void MouseCursorResource::load(uint32 fileHash) {
 	if (_currFileHash != fileHash) {
 		if (_cursorSprite.load(fileHash) && !_cursorSprite.isRle() &&
 			_cursorSprite.getDimensions().width == 96 && _cursorSprite.getDimensions().height == 224) {
-			debug("load ok");
 			_currFileHash = fileHash; 
 		} else {
 			unload();
@@ -417,7 +416,7 @@ DataResource::~DataResource() {
 }
 
 void DataResource::load(uint32 fileHash) {
-	debug("DataResource::load(%08X)", fileHash);
+	debug(2, "DataResource::load(%08X)", fileHash);
 	byte *data = NULL;
 	uint32 dataSize = 0;
 	unload();
@@ -435,14 +434,14 @@ void DataResource::load(uint32 fileHash) {
 		Common::MemoryReadStream dataS(data, dataSize);
 		uint itemCount = dataS.readUint16LE();
 		uint32 itemStartOffs = 2 + itemCount * 8;
-		debug("itemCount = %d", itemCount);
+		debug(2, "itemCount = %d", itemCount);
 		for (uint i = 0; i < itemCount; i++) {
 			dataS.seek(2 + i * 8);
 			DRDirectoryItem drDirectoryItem;
 			drDirectoryItem.nameHash = dataS.readUint32LE();
 			drDirectoryItem.offset = dataS.readUint16LE(); 
 			drDirectoryItem.type = dataS.readUint16LE();
-			debug("%03d nameHash = %08X; offset = %04X; type = %d", i, drDirectoryItem.nameHash, drDirectoryItem.offset, drDirectoryItem.type);
+			debug(2, "%03d nameHash = %08X; offset = %04X; type = %d", i, drDirectoryItem.nameHash, drDirectoryItem.offset, drDirectoryItem.type);
 			dataS.seek(itemStartOffs + drDirectoryItem.offset);
 			switch (drDirectoryItem.type) {
 			case 1:
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 2c772d7..d0a6628 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -385,7 +385,6 @@ void AnimatedSprite::updatePosition() {
 
 void AnimatedSprite::updateFrameIndex() {
 	if (!_playBackwards) {
-		//debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _currAnimFileHash, _frameIndex, _frameIndex2);
 		if (_frameIndex < _frameIndex2) {
 			_frameIndex++;
 		} else {
@@ -437,7 +436,7 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
 }
 
 void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) {
-	debug("AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4);
+	debug(2, "AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4);
 	_fileHash1 = fileHash;
 	_frameIndex3 = frameIndex3;
 	_frameIndex4 = frameIndex4;
@@ -454,7 +453,7 @@ void AnimatedSprite::setFileHash1() {
 }
 
 void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) {
-	debug("AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5);
+	debug(2, "AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5);
 	_fileHash1 = fileHash;
 	_fileHash6 = fileHash6;
 	_fileHash5 = fileHash5;


Commit: b1377ab153399db3fdca784ef03a040090a59706
    https://github.com/scummvm/scummvm/commit/b1377ab153399db3fdca784ef03a040090a59706
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Add entries for Module2300

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 3024197..e6e4d75 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -36,6 +36,8 @@ static const uint32 rectListOffsets[] = {
 	3, 0x004B43A0,
 	1, 0x004B4418,
 	3, 0x004B43A0,
+	// Scene1004
+	1, 0x004B7C70,
 	0, 0
 };
 
@@ -64,10 +66,20 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B4480,
 	2, 0x004B41E0,
 	5, 0x004B4148,
+	// Scene1004
+	3, 0x004B7BF0,
+	2, 0x004B7C08,
+	1, 0x004B7C18,
+	2, 0x004B7C20,
 	0, 0
 };
 
 static const uint32 navigationListOffsets[] = {
 	// Module2300
-	2, 0x004B67B8
+	2, 0x004B67B8,
+	6, 0x004B67E8,
+	2, 0x004B6878,
+	3, 0x004B68F0,
+	3, 0x004B68A8,
+	0, 0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index a9bd4fd..6e7c150 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 720050bec1477b1e7df5bb34bb6ecf992d2a8ca1
    https://github.com/scummvm/scummvm/commit/720050bec1477b1e7df5bb34bb6ecf992d2a8ca1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Start with Module1200/Scene1201 (not complete yet)

- Fix an odd bug with the game variables (index of newly added subvar was sometimes -1)

Changed paths:
  A engines/neverhood/module1200.cpp
  A engines/neverhood/module1200.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 4800923..95a6a5f 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -24,6 +24,7 @@
 
 #include "neverhood/graphics.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module1200.h"
 #include "neverhood/module1500.h"
 #include "neverhood/module2300.h"
 
@@ -108,8 +109,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule1500(0); // Logos and intro video //Real
-//	createModule1000(0);
-	createModule2300(0);
+//	createModule1000(-1);
+//	createModule2300(0);
+	createModule1200(0);
 }
 
 void GameModule::createModule1000(int which) {
@@ -132,6 +134,30 @@ void GameModule::updateModule1000() {
 	}
 }
 
+void GameModule::createModule1200(int which) {
+	setGlobalVar(0x91080831, 0x00478311);
+	_childObject = new Module1200(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1200);
+}
+
+void GameModule::updateModule1200() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			// TODO createModule2600(0);
+			// TODO _childObject->handleUpdate();
+		} else {
+			createModule2300(2);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
 void GameModule::createModule1500(int which) {
 	_someFlag1 = false;
 	setGlobalVar(0x91080831, 0x00F10114);
@@ -170,8 +196,8 @@ void GameModule::updateModule2300() {
 			// TODO createModule2200(0);
 			// TODO _childObject->handleUpdate();
 		} else if (_field20 == 2) {
-			// TODO createModule1200(0);
-			// TODO _childObject->handleUpdate();
+			createModule1200(0);
+			_childObject->handleUpdate();
 		} else if (_field20 == 3) {
 			// TODO createModule2400(0);
 			// TODO _childObject->handleUpdate();
@@ -196,4 +222,14 @@ void GameModule::updateModule2300() {
 	}
 }
 
+void GameModule::createModule2400(int which) {
+	debug("createModule2400");
+	_vm->_system->quit();
+}
+
+void GameModule::createModule3000(int which) {
+	debug("createModule3000");
+	_vm->_system->quit();
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 7977ea5..d95c31e 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -51,10 +51,15 @@ protected:
 	void startup();
 	void createModule1000(int which);
 	void updateModule1000();
+	void createModule1200(int which);
+	void updateModule1200();
 	void createModule1500(int which);
 	void updateModule1500();
+	void createModule2200(int which);
 	void createModule2300(int which);
 	void updateModule2300();
+	void createModule2400(int which);
+	void createModule3000(int which);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index 98ae709..caf79b2 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -57,7 +57,16 @@ uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) {
 
 void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
 	debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value);
-	_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value;
+	
+	int16 varIndex = getSubVarIndex(0, nameHash);
+	debug("  varIndex = %d", varIndex);
+	
+	int16 subVarIndex = getSubVarIndex(varIndex, subNameHash);
+	debug("  subVarIndex = %d", subVarIndex);
+	
+	_vars[subVarIndex].value = value;
+	
+	//_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value;
 }
 
 int16 GameVars::addVar(uint32 nameHash, uint32 value) {
@@ -89,16 +98,19 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
 	} else {
 		while (_vars[nextIndex].nextIndex != -1)
 			nextIndex = _vars[nextIndex].nextIndex;
-		_vars[nextIndex].nextIndex = addVar(subNameHash, value);
-		return _vars[nextIndex].nextIndex;
+		int16 index = addVar(subNameHash, value);	
+		_vars[nextIndex].nextIndex = index;
+		return index;
 	}
 }
 
 int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
 	debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
 	int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
-	if (subVarIndex == -1)
+	if (subVarIndex == -1) {
 		subVarIndex = addSubVar(varIndex, subNameHash, 0);
+		debug("need to create: subVarIndex = %d", subVarIndex);
+	}
 	return subVarIndex;
 }
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index d5c3205..145d645 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -84,8 +84,7 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&Klayman::sub41FC80));
 		break;
 	case 0x4818:
-		debug("TODO sub41C930");
-		// TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false);
+		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	}
 	return 0;
@@ -461,6 +460,7 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 void Klayman::sub41C930(int16 x, bool flag) {
 	debug("Klayman::sub41C930(%d, %d)", x, flag);
 	int16 xdiff = ABS(x - _x);
+	debug("xdiff = %d", xdiff);
 	if (x == _x) {
 		_x4 = x;
 		if (!_flagE1 && !_flagE2 && !_flagE3) {
@@ -485,6 +485,7 @@ void Klayman::sub41C930(int16 x, bool flag) {
 		error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));");
 		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
 	} else {
+	debug("##################################################################");
 		_x4 = x;
 		setCallback2(AnimationCallback(&Klayman::sub41F950));
 	}
@@ -688,6 +689,9 @@ void Klayman::sub41F950() {
 		_status2 = 0;
 		_flagE1 = true;
 		_flagE5 = true;
+		
+		debug("222222222222222222222 x = %d; x4 = %d", _x, _x4);
+		
 		setDoDeltaX(_x4 < _x);
 		setFileHash(0x242C0198, 0, -1);
 		SetUpdateHandler(&Klayman::update);
@@ -821,9 +825,12 @@ void Klayman::spriteUpdate41F320() {
 		sendMessage(0x1019, 0, this);
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		
+		debug("xxxxxxxxxxxxxxxxxxxxxxxxx xdelta = %d", xdelta);
+		
 		_x += xdelta;
 		if (_field114) {
-			debug("_field114");
+			error("_field114");
 			// TODO Klayman_sub_41CF70
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
@@ -980,22 +987,28 @@ void Klayman::sub41CD00(int16 x) {
 void Klayman::sub41CC40(int16 x1, int16 x2) {
 	if (_x > x1) {
 		if (_x == x1 + x2) {
+		debug("sub41CC40 #1");
 			_x4 = x1 + x2;
 			setCallback2(NULL);
 			sub41C7B0();
 		} else if (_x < x1 + x2) {
+		debug("sub41CC40 #2");
 			sub41CAC0(x1 + x2);
 		} else {
+		debug("sub41CC40 #3");
 			sub41C930(x1 + x2, false);
 		}
 	} else {
 		if (_x == x1 - x2) {
+		debug("sub41CC40 #4");
 			_x4 = x1 - x2;
 			setCallback2(NULL);
 			sub41C7B0();
 		} else if (_x > x1 - x2) {
+		debug("sub41CC40 #5");
 			sub41CAC0(x1 - x2);
 		} else {
+		debug("sub41CC40 #6");
 			sub41C930(x1 - x2, false);
 		}
 	}
@@ -1593,6 +1606,26 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub4207A0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub4207A0))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x9B250AD2, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetMessageHandler(&Klayman::handleMessage41EEF0);
+	}
+}
+
+void Klayman::sub4207F0() {
+	_status2 = 2;
+	_flagE5 = false;
+	setFileHash(0x98F88391, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41EEF0);
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -1635,16 +1668,14 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		sub41C7B0();
 		break;		
-
 	case 0x481B:
 		// TODO: It's not really a point but an x1/x2 pair
-		if (param.asPoint().x != 0) {
-			sub41CC40(param.asPoint().x, param.asPoint().y);
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
 		} else {
-			sub41CCE0(param.asPoint().y);
+			sub41CCE0(param.asPoint().x);
 		}
 		break;
-
 	case 0x481F:
 		if (param.asInteger() == 0) {
 			setCallback2(AnimationCallback(&Klayman::sub420870));
@@ -1658,28 +1689,23 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 			setCallback2(AnimationCallback(&Klayman::sub420830));
 		}
 		break;
-
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger());
 		sub41C7B0();
 		break;
-
 	case 0x4836:
 		if (param.asInteger() == 1) {
 			_parentScene->sendMessage(0x2002, 0, this);
 			setCallback2(AnimationCallback(&Klayman::sub4211F0));
 		}
 		break;		
-
 	case 0x483F:
 		sub41CD00(param.asInteger());
 		break;		
-
 	case 0x4840:
 		sub41CD70(param.asInteger());
 		break;
 	}
-
 	return 0;
 }
 
@@ -2325,4 +2351,206 @@ void KmScene1004::sub478170() {
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 }
 
+// KmScene1201
+
+KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) {
+	
+	// TODO setKlaymanTable(dword_4AEF10, 3);
+	_flagF6 = true;
+	
+}
+
+uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x480A:
+		setCallback2(AnimationCallback(&KmScene1201::sub40DF00));
+		break;
+	case 0x4812:
+		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		break;
+	case 0x4813:
+		setCallback2(AnimationCallback(&KmScene1201::sub40DD20));
+		break;
+	case 0x4814:
+		setCallback2(AnimationCallback(&KmScene1201::sub40DFA0));
+		break;
+	case 0x4815:
+		setCallback2(AnimationCallback(&KmScene1201::sub40E040));
+		break;
+	case 0x4816:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x481F:
+		setCallback2(AnimationCallback(&Klayman::sub420830));
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+void KmScene1201::update40DBE0() {
+	if (_x >= 380)
+		sub41C7B0();
+	Klayman::update();		
+}
+
+uint32 KmScene1201::handleMessage40DC00(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x51281850) {
+			setGlobalVar(0x20A0C516, 1);
+		} else if (param.asInteger() == 0x43000538) {
+			_soundResource1.play(0x21043059);
+		} else if (param.asInteger() == 0x02B20220) {
+			_soundResource1.play(0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			_soundResource1.play(0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			_soundResource1.play(0x44051000);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1201::sub40DD20() {
+	if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DD20))) {
+		_status2 = 0;
+		_flagE5 = false;
+		setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+		setFileHash(0x9CAA0218, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(NULL);
+		SetMessageHandler(&KmScene1201::handleMessage40DC00);
+		SetAnimationCallback3(&KmScene1201::sub40DD90);
+	}
+}
+
+void KmScene1201::sub40DD90() {
+	_status2 = 1;
+	_flagE5 = false;
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+	setFileHash(0x1222A513, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1201::handleMessage40DC00);
+}
+
+uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			_soundResource1.play(0x405002D8);
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x480B, 0, this);
+			}
+		} else if (param.asInteger() == 0x02421405) {
+			if (_countdown != 0) {
+				_countdown--;
+				sub40DF60();
+			} else {
+				SetMessageHandler(&Klayman::handleMessage41D480);
+			}
+		}
+		break;
+	}
+	return Klayman::handleMessage41D480(messageNum, param, sender);
+}
+
+uint32 KmScene1201::handleMessage40DEA0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x000F0082) {
+			_soundResource1.play(0x74E2810F);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1201::sub40DF00() {
+	if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DF00))) {
+		_status2 = 2;
+		_flagE5 = false;
+		_countdown = 8;
+		setDoDeltaX(0);
+		setFileHash(0x0C1CA072, 0, -1);
+		SetUpdateHandler(&KmScene1201::update40DBE0);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetMessageHandler(&KmScene1201::handleMessage40DDF0);
+	}
+}
+
+void KmScene1201::sub40DF60() {
+		_flagE5 = false;
+		setFileHash2(0x0C1CA072, 0x01084280, 0);
+		SetUpdateHandler(&KmScene1201::update40DBE0);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetMessageHandler(&KmScene1201::handleMessage40DDF0);
+}
+
+void KmScene1201::sub40DFA0() {
+	if (!sub41CF10(AnimationCallback(&KmScene1201::sub40DFA0))) {
+		_status2 = 1;
+		_flagE5 = false;
+		setDoDeltaX(0);
+		setFileHash(0x2821C590, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetMessageHandler(&KmScene1201::handleMessage40DEA0);
+		SetAnimationCallback3(&Klayman::sub41FC80);
+		_class464->sendMessage(0x2006, 0, this);
+		_soundResource1.play(0x62E0A356);
+	}
+}
+
+void KmScene1201::sub40E040() {
+	if (!sub41CF10(AnimationCallback(&KmScene1201::sub40E040))) {
+		_status2 = 1;
+		_flagE5 = false;		
+		setFileHash(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(NULL);
+		SetMessageHandler(&Klayman::handleMessage41D360);
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 8ec33bc..3c87104 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -82,6 +82,8 @@ public:
 	void sub421070();
 	void sub420420();
 	void sub420ED0();
+	void sub4207A0();
+	void sub4207F0();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -264,6 +266,25 @@ protected:
 	void sub478170();
 };
 
+class KmScene1201 : public Klayman {
+public:
+	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y);
+protected:
+	Entity *_class464;
+	int _countdown;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void update40DBE0();
+	uint32 handleMessage40DC00(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40DD20();
+	void sub40DD90();
+	uint32 handleMessage40DDF0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40DEA0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40DF00();
+	void sub40DF60();
+	void sub40DFA0();
+	void sub40E040();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index ed7077e..1742476 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -11,6 +11,7 @@ MODULE_OBJS = \
 	klayman.o \
 	module.o \
 	module1000.o \
+	module1200.o \
 	module1500.o \
 	module2300.o \
 	mouse.o \
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
new file mode 100644
index 0000000..8075c5c
--- /dev/null
+++ b/engines/neverhood/module1200.cpp
@@ -0,0 +1,772 @@
+/* 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/module1200.h"
+#include "neverhood/smackerscene.h"
+
+namespace Neverhood {
+
+Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule), _moduleDone(false) {
+	
+	// TODO _resourceTable.setResourceList(0x004B3E68);
+	SetMessageHandler(&Module1200::handleMessage);
+	
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene1201(-1);
+			break;
+		case 1:
+			createScene1202(-1);
+			break;
+		case 2:
+			createScene1203(-1);
+			break;
+		}
+	} else if (which == 1) {
+		createScene1201(2);
+	} else {
+		createScene1201(0);
+	}
+
+	// TODO Music18hList_add(0x00478311, 0x62222CAE);
+	// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
+}
+
+Module1200::~Module1200() {
+	// TODO Music18hList_deleteGroup(0x00478311);
+}
+
+uint32 Module1200::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1009:
+		_moduleDone = true;
+		_moduleDoneStatus = param.asInteger();
+		break;
+	}
+	return messageResult;
+}
+
+void Module1200::createScene1201(int which) {
+	_vm->gameState().sceneNum = 0;
+	_childObject = new Scene1201(_vm, this, which);
+	SetUpdateHandler(&Module1200::updateScene1201);
+}
+			
+void Module1200::createScene1202(int which) {
+	_vm->gameState().sceneNum = 1;
+	//_childObject = new Scene1202(_vm, this, which);
+	//SetUpdateHandler(&Module1200::updateScene1202);
+}
+
+void Module1200::createScene1203(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 2;
+	// TODO Music18hList_stop(0x62222CAE, 0, 0);
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x31890001);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	setGlobalVar(0x2A02C07B, 1);
+	SetUpdateHandler(&Module1200::updateScene1203);
+}
+
+void Module1200::updateScene1201() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_moduleDoneStatus == 1) {
+			createScene1202(0);
+			_childObject->handleUpdate();
+		} else if (_moduleDoneStatus == 2) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		} else if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
+			createScene1203(-1);
+		} else {
+			_parentModule->sendMessage(0x1009, 1, this);
+		}
+	}
+}
+
+void Module1200::updateScene1202() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1201(1);
+		_childObject->handleUpdate();
+	}
+}
+			
+void Module1200::updateScene1203() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1201(3);
+		_childObject->handleUpdate();
+		// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
+	}
+}
+
+// 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 kScene1201SsScene1201TntFileHashList1[] = {
+	0x2098212D,   
+	0x1600437E,
+	0x1600437E,
+	0x00A840E3,
+	0x1A1830F6,
+	0x1A1830F6,
+	0x00212062,
+	0x384010B6,
+	0x384010B6,
+	0x07A01080,
+	0xD80C2837,
+	0xD80C2837,
+	0x03A22092,
+	0xD8802CB6,
+	0xD8802CB6,
+	0x03A93831,
+	0xDA460476,
+	0xDA460476
+};
+
+static const uint32 kScene1201SsScene1201TntFileHashList2[] = {
+	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), _field7A(-1) {
+
+	int16 x = kScene1201PointArray[pointIndex].x;
+	int16 y = kScene1201PointArray[pointIndex].y;
+	if (x < 300) {
+		_spriteResource.load2(kScene1201SsScene1201TntFileHashList1[elemIndex]);
+		_x = _spriteResource.getPosition().x;
+		_y = _spriteResource.getPosition().y;
+		_drawRect.x = 0;
+		_drawRect.y = 0;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
+	} else {
+		_spriteResource.load2(kScene1201SsScene1201TntFileHashList2[elemIndex]);
+		_x = x;
+		_y = y;
+		_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+		_drawRect.y = -_spriteResource.getDimensions().height;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
+	
+	}
+	createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_surface->getClipRect().x1 = 0;
+	_surface->getClipRect().y1 = 0;
+	_surface->getClipRect().x2 = 640;
+	_surface->getClipRect().y2 = clipY2;
+	_needRefresh = true;
+	StaticSprite::update();
+}
+	
+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(0x02038314, _nameHash) && !getSubVar(0x02720344, _nameHash)) {
+		SetMessageHandler(&AsScene1201Tape::handleMessage);
+	} else {
+		_surface->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:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setSubVar(0x02038314, _nameHash, 1);
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+Class466::Class466(NeverhoodEngine *vm, bool flag)
+	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class466::handleMessage);
+	createSurface(10, 34, 149);
+	_x = 202;
+	_y = -32;
+	if (flag) {
+		sub40D380();
+	} else {
+		sub40D340();
+	}
+}
+
+uint32 Class466::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02060018) {
+			_soundResource.play(0x47900E06);
+		}
+		break;
+	case 0x2006:
+		sub40D360();
+		break;
+	}
+	return messageResult;
+}
+
+void Class466::sub40D340() {
+	setFileHash(0x928F0C10, 0, -1);
+	_newHashListIndex = 0;
+}
+
+void Class466::sub40D360() {
+	setFileHash(0x928F0C10, 1, -1);
+	_newHashListIndex = -2;
+}
+
+void Class466::sub40D380() {
+	setFileHash(0x928F0C10, 15, -1);
+	_newHashListIndex = -2;
+}
+
+Class468::Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) {
+
+	createSurface1(100, 0xD088AC30);
+	_x = 320;
+	_y = 240;
+	SetUpdateHandler(&Class468::update);
+	SetMessageHandler(&Class468::handleMessage);
+	_newHashListIndex = -2;
+	if (flag) {
+		setFileHash(0xD088AC30, -1, -1);
+		_newHashListIndex = -2;
+		_countdown = 25;
+	} else {
+		setFileHash1();
+		_surface->setVisible(false);
+	}
+}
+
+void Class468::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		sub40D830();
+	}
+	AnimatedSprite::update();
+}
+
+uint32 Class468::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4829:
+		sub40D7E0();
+		break;
+	}
+	return messageResult;
+}
+
+void Class468::sub40D7E0() {
+	setFileHash(0xD088AC30, 0, -1);
+	_newHashListIndex = -2;
+	_surface->setVisible(true);
+	_soundResource.play(calcHash("fxDoorOpen20"));
+}
+
+void Class468::sub40D830() {
+	setFileHash(0xD088AC30, -1, -1);
+	_playBackwards = true;
+	_surface->setVisible(true);
+	_soundResource.play(calcHash("fxDoorClose20"));
+	SetAnimationCallback3(&Class468::sub40D880);
+}
+
+void Class468::sub40D880() {
+	setFileHash1();
+	_surface->setVisible(false);
+}
+		
+Class464::Class464(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200) {
+	
+	createSurface(1200, 69, 98);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class464::handleMessage);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	_surface->setVisible(false);
+}
+
+uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2006:
+		_x = 436;
+		_y = 339;
+		setFileHash(0xA060C599, 0, -1);
+		_surface->setVisible(true);
+		break;
+	case 0x3002:
+		setFileHash1();
+		_surface->setVisible(false);
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+Class463::Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _class466(class466),
+	_flag(false) {
+	
+	//TODO_field_F0 = -1;
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class463::handleMessage);
+	createSurface(990, 106, 181);
+	_x = 201;
+	if (flag) {
+		_y = 297;
+		sub40CD60();
+	} else {
+		_y = 334;
+		sub40CD30();
+	}
+}
+
+Class463::~Class463() {
+	// TODO Sound1ChList_sub_407AF0(0x01D00560);
+}	 
+
+uint32 Class463::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x092870C0) {
+			_class466->sendMessage(0x2006, 0, this);
+		} else if (param.asInteger() == 0x11CA0144) {
+			_soundResource.play(0x51800A04);
+		}
+		break;
+	case 0x1011:
+		_parentScene->sendMessage(0x2002, 0, this);
+		messageResult = 1;
+	case 0x480B:
+		if (!_flag) {
+			_sprite = (Sprite*)sender;
+			sub40CD90();
+		}
+		break;
+	}
+	return messageResult;
+
+}
+
+uint32 Class463::handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Class463::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class463::spriteUpdate40CD10() {
+	_x = _sprite->getX() + 100;
+}
+
+void Class463::sub40CD30() {
+	setFileHash(0x654913D0, 0, -1);
+	SetMessageHandler(&Class463::handleMessage);
+	SetSpriteCallback(NULL);
+}
+
+void Class463::sub40CD60() {
+	setFileHash(0x356803D0, 0, -1);
+	SetMessageHandler(&Class463::handleMessage40CCD0);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetAnimationCallback3(&Class463::sub40CD30);
+}
+
+void Class463::sub40CD90() {
+	// TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true);
+	// TODO Sound1ChList_playLooping(0x4B044624);
+	_flag = true;
+	setFileHash(0x85084190, 0, -1);
+	SetMessageHandler(&Class463::handleMessage);
+	SetSpriteCallback(&Class463::spriteUpdate40CD10);
+	_newHashListIndex = -2;
+}
+
+
+Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _flag(false) {
+
+	int16 topY1, topY2, topY3, topY4;
+	int16 x1, x2;
+	Sprite *tempSprite, *class464;
+
+	// TODO _resourceTable2.setResourceList(ex_sub_41C730(), true);
+	if (getGlobalVar(0x0A18CA33)) {
+		// TODO _resourceTable1.setResourceList(0x004AEA10, true);
+	} else if (getGlobalVar(0x0A310817)) {
+		// TODO _resourceTable1.setResourceList(0x004AEA70, true);
+	} else {
+		// TODO _resourceTable1.setResourceList(0x004AEB18, true);
+	}
+
+	SetUpdateHandler(&Scene1201::update);
+	SetMessageHandler(&Scene1201::handleMessage);
+
+	_vm->_collisionMan->setHitRects(0x004AEBD0);
+	
+	_surfaceFlag = true;
+
+	if (!getSubVar(0x40050052, 0xE8058B52)) {
+		setSubVar(0x40050052, 0xE8058B52, 1);
+		for (uint32 index = 0; index < 18; index++) {
+			setSubVar(0x10055D14, index, kScene1201InitArray[index]);
+		}
+	}
+
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x9A2C0409, NULL));
+	
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011));
+	_vm->_collisionMan->addSprite(_asTape);
+	
+	tempSprite = addSprite(new StaticSprite(_vm, 0x03C82530, 100));
+	topY1 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x88182069, 200));
+	topY2 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x476014E0, 300));
+	topY3 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x04063110, 500));
+	topY4 = tempSprite->getY() + 1; 
+
+	_class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1 ? 1 : 0));
+	_class466->getSurface()->getClipRect().x1 = 0;
+	_class466->getSurface()->getClipRect().y1 = topY4;
+	_class466->getSurface()->getClipRect().x2 = 640;
+	_class466->getSurface()->getClipRect().y2 = 480;
+
+	addSprite(new StaticSprite(_vm, 0x400B04B0, 1200));
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x40295462, 1200));
+	x1 = tempSprite->getX();
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0xA29223FA, 1200));
+	x2 = tempSprite->getX() + tempSprite->getSurface()->getDrawRect().width;
+
+	class464 = addSprite(new Class464(_vm));
+
+	if (which < 0) {
+		_klayman = new KmScene1201(_vm, this, class464, 364, 333);
+		setMessageList(0x004AEC08);
+	} else if (which == 3) {
+		_klayman = new KmScene1201(_vm, this, class464, 400, 329);
+		setMessageList(0x004AEC08);
+	} else if (which == 2) {
+		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+			_klayman = new KmScene1201(_vm, this, class464, 374, 333);
+			setMessageList(0x004AEC08);
+		} else {
+			_klayman = new KmScene1201(_vm, this, class464, 640, 329);
+			setMessageList(0x004AEC20);
+		}
+	} else if (which == 1) {
+		if (getGlobalVar(0xC0418A02)) {
+			_klayman = new KmScene1201(_vm, this, class464, 364, 333);
+			_klayman->setDoDeltaX(1);
+		} else {
+			_klayman = new KmScene1201(_vm, this, class464, 246, 333);
+		}
+		setMessageList(0x004AEC30);
+	} else {
+		_klayman = new KmScene1201(_vm, this, class464, 0, 336);
+		setMessageList(0x004AEC10);
+	}
+
+	_klayman->getSurface()->getClipRect().x1 = x1;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = x2;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setRepl(64, 0);
+	
+	addSprite(_klayman);
+
+	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+		_background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0));
+		_palette = new Palette(_vm, 0x4019A2C4);
+		_palette->usePalette();
+		_class468 = NULL;
+	} else {
+		_background = addBackground(new DirtyBackground(_vm, 0x40206EC5, 0, 0));
+		_palette = new Palette(_vm, 0x40206EC5);
+		_palette->usePalette();
+		_class468 = addSprite(new Class468(_vm, _klayman, which - 2 != 1)); // CHECKME???
+	}
+
+	if (getGlobalVar(0x000CF819)) {
+		addSprite(new StaticSprite(_vm, 0x10002ED8, 500));
+		if (!getGlobalVar(0x0A18CA33)) {
+			Class463 *class463;
+			class463 = new Class463(_vm, this, _class466, which - 1 != 1);
+			class463->getSurface()->getClipRect().x1 = x1;
+			class463->getSurface()->getClipRect().y1 = 0;
+			class463->getSurface()->getClipRect().x2 = x2;
+			class463->getSurface()->getClipRect().y2 = 480;
+			_vm->_collisionMan->addSprite(_class463);
+			_class463 = addSprite(class463);
+#if 0			
+			tempSprite = addSprite(new Class465(_vm, _class463));
+			tempSprite->getSurface()->getClipRect().x1 = x1;
+			tempSprite->getSurface()->getClipRect().y1 = 0;
+			tempSprite->getSurface()->getClipRect().x2 = x2;
+			tempSprite->getSurface()->getClipRect().y2 = 480;
+#endif			
+			class463->setRepl(64, 0);
+		}
+		
+		uint32 tntIndex = 1; 
+		while (tntIndex < 18) {
+			uint32 elemIndex = getSubVar(0x10055D14, tntIndex);
+			int16 clipY2;
+			if (kScene1201PointArray[elemIndex].y < 175)
+				clipY2 = topY1;
+			else if (kScene1201PointArray[elemIndex].y < 230)
+				clipY2 = topY2;
+			else
+				clipY2 = topY3;
+			addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2));
+			elemIndex = getSubVar(0x10055D14, tntIndex + 1);
+			if (kScene1201PointArray[elemIndex].y < 175)
+				clipY2 = topY1;
+			else if (kScene1201PointArray[elemIndex].y < 230)
+				clipY2 = topY2;
+			else
+				clipY2 = topY3;
+			addSprite(new SsScene1201Tnt(_vm, tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2));
+			tntIndex += 3;
+		}
+
+		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+			setRectList(0x004AEE58);
+		} else {
+			setRectList(0x004AEDC8);
+		} 
+		
+	} else {
+	
+		addSprite(new StaticSprite(_vm, 0x8E8A1981, 900));
+
+		uint32 tntIndex = 0;
+		while (tntIndex < 18) {
+			uint32 elemIndex = getSubVar(0x10055D14, tntIndex);
+			int16 clipY2;
+			if (kScene1201PointArray[elemIndex].x < 300) {
+				clipY2 = 480;
+			} else { 
+				if (kScene1201PointArray[elemIndex].y < 175)
+					clipY2 = topY1;
+				else if (kScene1201PointArray[elemIndex].y < 230)
+					clipY2 = topY2;
+				else
+					clipY2 = topY3;
+			}
+			addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2));
+			tntIndex++;
+		}
+
+		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+			setRectList(0x004AEE18);
+		} else {
+			setRectList(0x004AED88);
+		}
+		 
+	}
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x63D400BC, 900));
+
+#if 0
+	_class467 = addSprite(new Class467(_vm, _klayman));
+	_class467->getSurface()->getClipRect().x1 = x1;
+	_class467->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
+	_class467->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
+	_class467->getSurface()->getClipRect().y2 = 480;
+#endif	
+
+	if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) {
+		setGlobalVar(0x0112090A, 1);
+	}
+
+	_class461 = NULL;
+
+#if 0	
+	if (getGlobalVar(0x0112090A) < 3) {
+		_class461 = addSprite(new Class461(_vm, this));
+		_vm->_collisionMan->addSprite(_class461);
+	}
+
+	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+		_class462 = addSprite(new Class462(_vm, this, _klayman));
+		_class462->getSurface()->getClipRect().x1 = x1;
+		_class462->getSurface()->getClipRect().y1 = 0;
+		_class462->getSurface()->getClipRect().x2 = x2;
+		_class462->getSurface()->getClipRect().y2 = 480;
+	}
+#endif
+
+}
+
+Scene1201::~Scene1201() {
+}
+
+void Scene1201::update() {
+	Scene::update();
+	if (_class461 && getGlobalVar(0x0112090A)) {
+		deleteSprite(&_class461);
+	}
+}
+
+uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug("Scene1201::handleMessage(%04X)", messageNum);
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x07053000) {
+			_flag = true;
+			_class462->sendMessage(0x2004, 0, this);
+		} else if (param.asInteger() == 0x140E5744) {
+			_class462->sendMessage(0x2005, 0, this);
+		} else if (param.asInteger() == 0x40253C40) {
+			_messageListFlag = false;
+			_class462->sendMessage(0x2006, 0, this);
+		} else if (param.asInteger() == 0x090EB048) {
+			if (_klayman->getX() < 572) {
+				setMessageList2(0x004AEC90);
+			} else {
+				setMessageList2(0x004AEC20);
+			}
+		}
+		break;
+	case 0x2001:
+		if (!getGlobalVar(0x0112090A)) {
+			setMessageList2(0x004AECB0);
+		} else {
+			_klayman->sendEntityMessage(0x1014, _class461, this);
+			setMessageList2(0x004AECC0);
+		}
+		break;
+	case 0x2002:		
+		if (getGlobalVar(0x20A0C516)) {
+			_klayman->sendEntityMessage(0x1014, _class463, this);
+			setMessageList2(0x004AECF0);
+		} else if (getGlobalVar(0x0112090A) == 3) {
+			_klayman->sendEntityMessage(0x1014, _class463, this);
+			if (_klayman->getX() > _class463->getX()) {
+				setMessageList(0x004AECD0);
+			} else {
+				setMessageList(0x004AECE0);
+			}
+		}
+		break;
+	case 0x4814:
+		messageList402220();
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			setMessageList(0x004AED38);
+		}
+		break;
+	case 0x4829:
+		_class468->sendMessage(0x4829, 0, this);
+		break;		
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
new file mode 100644
index 0000000..bbdfaeb
--- /dev/null
+++ b/engines/neverhood/module1200.h
@@ -0,0 +1,141 @@
+/* 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_MODULE1200_H
+#define NEVERHOOD_MODULE1200_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module1200
+
+class Module1200 : public Module {
+public:
+	Module1200(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1200();
+protected:
+	// TODO ResourceTable _resourceTable;
+	bool _moduleDone;
+	uint32 _moduleDoneStatus; 
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createScene1201(int which);			
+	void createScene1202(int which);			
+	void createScene1203(int which);			
+	void updateScene1201();			
+	void updateScene1202();			
+	void updateScene1203();			
+};
+
+// 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 Class466 : public AnimatedSprite {
+public:
+	Class466(NeverhoodEngine *vm, bool flag);
+protected:
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40D340();
+	void sub40D360();
+	void sub40D380();
+};
+
+class Class468 : public AnimatedSprite {
+public:
+	Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag);
+protected:
+	SoundResource _soundResource;
+	Sprite *_klayman;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40D7E0();
+	void sub40D830();
+	void sub40D880();
+};
+
+class Class464 : public AnimatedSprite {
+public:
+	Class464(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Class463 : public AnimatedSprite {
+public:
+	Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag);
+	virtual ~Class463();
+protected:
+	Scene *_parentScene;
+	Sprite *_class466;
+	Sprite *_sprite;
+	SoundResource _soundResource;
+	bool _flag;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate40CD10();
+	void sub40CD30();
+	void sub40CD60();
+	void sub40CD90();
+};
+
+class SsScene1201Tnt : public StaticSprite {
+public:
+	SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2);
+protected:
+	uint32 _elemIndex;
+	int16 _field7A;	
+};
+
+class Scene1201 : public Scene {
+public:
+	Scene1201(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene1201();
+protected:
+	// TODO ResourceTable _resourceTable1;
+	// TODO ResourceTable _resourceTable2;
+	Sprite *_class461;
+	Sprite *_class463;
+	Sprite *_class462;
+	Sprite *_class466;
+	Sprite *_class467;
+	Sprite *_class468;
+	Sprite *_asTape;
+	bool _flag;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1200_H */
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 8f49a00..43f1ca7 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -485,6 +485,13 @@ void Scene::runMessageList() {
 	
 }
 
+void Scene::messageList402220() {
+	_messageListFlag1 = false;
+	_messageList = NULL;
+	_messageListFlag = true;
+	_klayman->sendMessage(0x4004, 0, this);
+}
+
 void Scene::setRectList(uint32 id) {
 	setRectList(_vm->_staticData->getRectList(id));
 }
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 8f0b79a..4711405 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -102,6 +102,7 @@ protected:
 	void runMessageList();
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);
+	void messageList402220();
 	void loadDataResource(uint32 fileHash);
 };
 


Commit: 0632fc7dda2b0ad97f22105a3fb6fbcd3346feb9
    https://github.com/scummvm/scummvm/commit/0632fc7dda2b0ad97f22105a3fb6fbcd3346feb9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1201

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index e6e4d75..016ac73 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -25,6 +25,8 @@ static const uint32 hitRectListOffsets[] = {
 	1, 0x004B4860,
 	// Scene1002
 	1, 0x004B4138,
+	// Scene1201
+	4, 0x004AEBD0,
 	0, 0
 };
 
@@ -38,6 +40,11 @@ static const uint32 rectListOffsets[] = {
 	3, 0x004B43A0,
 	// Scene1004
 	1, 0x004B7C70,
+	// Scene1201
+	1, 0x004AEE58,
+	1, 0x004AEDC8,
+	1, 0x004AEE18,
+	1, 0x004AED88,
 	0, 0
 };
 
@@ -71,6 +78,18 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B7C08,
 	1, 0x004B7C18,
 	2, 0x004B7C20,
+	// Scene1201
+	1, 0x004AEC08,
+	2, 0x004AEC10,
+	2, 0x004AEC20,
+	2, 0x004AEC30,
+	4, 0x004AEC90,
+	2, 0x004AECB0,
+	2, 0x004AECC0,
+	5, 0x004AECF0,
+	2, 0x004AECD0,
+	2, 0x004AECE0,
+	2, 0x004AED38,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 6e7c150..36a4292 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: f162516f25150cf5ca149986731f7f4e8f7da437
    https://github.com/scummvm/scummvm/commit/f162516f25150cf5ca149986731f7f4e8f7da437
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:38:48-07:00

Commit Message:
NEVERHOOD: More work on Scene1201

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 145d645..91de87d 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -485,7 +485,6 @@ void Klayman::sub41C930(int16 x, bool flag) {
 		error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));");
 		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
 	} else {
-	debug("##################################################################");
 		_x4 = x;
 		setCallback2(AnimationCallback(&Klayman::sub41F950));
 	}
@@ -773,8 +772,7 @@ void Klayman::sub41FA40() {
 	if (_status3 == 2) {
 		sub41C7B0();
 	} else if (_status3 == 3) {
-		error("// TODO sub420F20();");
-		// TODO sub420F20();
+		sub420F20();
 	} else {
 		_flagE2 = true;
 		_flagE5 = true;
@@ -1626,6 +1624,23 @@ void Klayman::sub4207F0() {
 	SetMessageHandler(&Klayman::handleMessage41EEF0);
 }
 
+void Klayman::sub420F20() {
+	_flagF8 = false;
+	_flagE5 = false;
+	setFileHash(0x11A8E012, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F5A0);
+	SetMessageHandler(&Klayman::handleMessage41EC70);
+}
+
+void Klayman::spriteUpdate41F5A0() {
+	if (!_flagF8 && ABS(_x4 - _x) < 80) {
+		_parentScene->sendMessage(0x4829, 0, this);
+		_flagF8 = true;
+	}
+	AnimatedSprite::updateDeltaXY();
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -1758,8 +1773,6 @@ void KmScene1002::xUpdate() {
 uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	//ok
 	debug("KmScene1002::xHandleMessage(%04X)", messageNum);
-	if (messageNum == 0x100D)
-		debug("-> %08X", param.asInteger());
 	switch (messageNum) {
 	case 0x2001:
 		setCallback2(AnimationCallback(&KmScene1002::sub449E90));
@@ -1908,9 +1921,6 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &para
 			_x = ((Sprite*)sender)->getX() + 75;
 		}
 		_y = ((Sprite*)sender)->getY() - 200;
-		
-		debug("&&&&&&&&&&& param.asInteger() = %d", param.asInteger());
-		
 		if (param.asInteger() == 0) {
 			sub449EF0();
 		} else if (param.asInteger() == 1) {
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3c87104..3682d75 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -84,11 +84,13 @@ public:
 	void sub420ED0();
 	void sub4207A0();
 	void sub4207F0();
+	void sub420F20();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
 	void spriteUpdate41F780();
 	void spriteUpdate41F230();
+	void spriteUpdate41F5A0();
 
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 8075c5c..eef5433 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -478,6 +478,69 @@ void Class463::sub40CD90() {
 	_newHashListIndex = -2;
 }
 
+Class465::Class465(NeverhoodEngine *vm, Sprite *class463)
+	: AnimatedSprite(vm, 1200), _class463(class463) {
+
+	createSurface1(995, 0x828C0411);
+	SetUpdateHandler(&Class465::update);
+	SetMessageHandler(&Sprite::handleMessage);
+	SetSpriteCallback(&Class465::spriteUpdate40D150);
+	setFileHash(0x828C0411, 0, -1);
+	_surface->setVisible(false);
+}
+
+Class465::~Class465() {
+	// TODO Sound1ChList_sub_407AF0(0x041080A4);
+}
+
+void Class465::update() {
+	AnimatedSprite::update();
+	if (getGlobalVar(0x20A0C516)) {
+		_surface->setVisible(true);
+		SetUpdateHandler(&AnimatedSprite::update);
+		// TODO Sound1ChList_addSoundResource(0x041080A4, 0x460A1050, true);
+		// TODO Sound1ChList_playLooping(0x460A1050);
+	}
+}
+
+void Class465::spriteUpdate40D150() {
+	_x = _class463->getX() - 18;
+	_y = _class463->getY() - 158;
+}
+
+AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman) {
+
+	_x = 320;
+	_y = 240;
+	createSurface(800, 55, 199);
+	if (_klayman->getX() < 100) {
+		setFileHash(0x508A111B, 0, -1);
+		_newHashListIndex = -2;
+		_soundResource.play(calcHash("fxDoorOpen03"));
+	} else {
+		setFileHash(0x508A111B, -1, -1);
+		_newHashListIndex = -2;
+	}
+	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:
+		sub40D590();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201LeftDoor::sub40D590() {
+	setFileHash(0x508A111B, -1, -1);
+	_playBackwards = true;
+	_newHashListIndex = 0;
+}
 
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _flag(false) {
@@ -600,13 +663,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			class463->getSurface()->getClipRect().y2 = 480;
 			_vm->_collisionMan->addSprite(_class463);
 			_class463 = addSprite(class463);
-#if 0			
 			tempSprite = addSprite(new Class465(_vm, _class463));
 			tempSprite->getSurface()->getClipRect().x1 = x1;
 			tempSprite->getSurface()->getClipRect().y1 = 0;
 			tempSprite->getSurface()->getClipRect().x2 = x2;
 			tempSprite->getSurface()->getClipRect().y2 = 480;
-#endif			
 			class463->setRepl(64, 0);
 		}
 		
@@ -670,13 +731,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	tempSprite = addSprite(new StaticSprite(_vm, 0x63D400BC, 900));
 
-#if 0
-	_class467 = addSprite(new Class467(_vm, _klayman));
-	_class467->getSurface()->getClipRect().x1 = x1;
-	_class467->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
-	_class467->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
-	_class467->getSurface()->getClipRect().y2 = 480;
-#endif	
+	_asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman));
+	_asLeftDoor->getSurface()->getClipRect().x1 = x1;
+	_asLeftDoor->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
+	_asLeftDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
+	_asLeftDoor->getSurface()->getClipRect().y2 = 480;
 
 	if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) {
 		setGlobalVar(0x0112090A, 1);
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index bbdfaeb..2a8a933 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -109,6 +109,26 @@ protected:
 	void sub40CD90();
 };
 
+class Class465 : public AnimatedSprite {
+public:
+	Class465(NeverhoodEngine *vm, Sprite *class463);
+	~Class465();
+protected:
+	Sprite *_class463;
+	void update();
+	void spriteUpdate40D150();
+};
+
+class AsScene1201LeftDoor : public AnimatedSprite {
+public:
+	AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman);
+protected:
+	Sprite *_klayman;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40D590();
+};
+
 class SsScene1201Tnt : public StaticSprite {
 public:
 	SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2);
@@ -128,7 +148,7 @@ protected:
 	Sprite *_class463;
 	Sprite *_class462;
 	Sprite *_class466;
-	Sprite *_class467;
+	Sprite *_asLeftDoor;
 	Sprite *_class468;
 	Sprite *_asTape;
 	bool _flag;


Commit: 04d2b9a4028d1f6ac7c5c5e4a6cc95f8532e9cdf
    https://github.com/scummvm/scummvm/commit/04d2b9a4028d1f6ac7c5c5e4a6cc95f8532e9cdf
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:31-07:00

Commit Message:
NEVERHOOD: Add entries for Scene1401, Scene1402 and Scene1705

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 016ac73..58e48dc 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -27,6 +27,8 @@ static const uint32 hitRectListOffsets[] = {
 	1, 0x004B4138,
 	// Scene1201
 	4, 0x004AEBD0,
+	// Scene1705
+	1, 0x004B69D8,
 	0, 0
 };
 
@@ -45,6 +47,14 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004AEDC8,
 	1, 0x004AEE18,
 	1, 0x004AED88,
+	// Scene1401
+	1, 0x004B6758,
+	// Scene1402
+	1, 0x004B0C48,
+	1, 0x004B0C98,
+	// Scene1705
+	1, 0x004B6B40,
+	1, 0x004B6B30,
 	0, 0
 };
 
@@ -90,10 +100,44 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004AECD0,
 	2, 0x004AECE0,
 	2, 0x004AED38,
+	// Scene1401
+	1, 0x004B65C8,
+	1, 0x004B65D0,
+	1, 0x004B65D8,
+	1, 0x004B65E8,
+	3, 0x004B6670,
+	4, 0x004B6690,
+	1, 0x004B66B0,
+	3, 0x004B6658,
+	2, 0x004B65F0,
+	// Scene1402
+	1, 0x004B0B48,
+	1, 0x004B0B50,
+	1, 0x004B0B58,
+	1, 0x004B0B60,
+	2, 0x004B0B68,
+	3, 0x004B0BB8,
+	3, 0x004B0BD0,
+	// Scene1705
+	1, 0x004B69E8,
+	2, 0x004B6A08,
+	4, 0x004B6AA0,
+	2, 0x004B6A18,
+	1, 0x004B69F0,
+	2, 0x004B6AC0,
 	0, 0
 };
 
 static const uint32 navigationListOffsets[] = {
+	// Module1700
+	2, 0x004AE8B8,
+	3, 0x004AE8E8,
+	// Module1800
+	4, 0x004AFD38,
+	1, 0x004AFD98,
+	2, 0x004AFDB0,
+	4, 0x004AFDE0,
+	2, 0x004AFE40,
 	// Module2300
 	2, 0x004B67B8,
 	6, 0x004B67E8,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 36a4292..a76db0a 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: bfd71cff6e73c0be6b2d66f7f71921094f42ca09
    https://github.com/scummvm/scummvm/commit/bfd71cff6e73c0be6b2d66f7f71921094f42ca09
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: New modules Module1200, Module1400, Module1700 and Module1800

- Implement CollisionMan::removeSprite

Changed paths:
  A engines/neverhood/diskplayerscene.cpp
  A engines/neverhood/diskplayerscene.h
  A engines/neverhood/module1400.cpp
  A engines/neverhood/module1400.h
  A engines/neverhood/module1700.cpp
  A engines/neverhood/module1700.h
  A engines/neverhood/module1800.cpp
  A engines/neverhood/module1800.h
    engines/neverhood/blbarchive.cpp
    engines/neverhood/collisionman.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/graphics.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/navigationscene.cpp
    engines/neverhood/navigationscene.h
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/resourceman.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 2e29485..6a047ca 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -105,12 +105,11 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) {
 
 byte *BlbArchive::getEntryExtData(uint index) {
 	BlbArchiveEntry &entry = _entries[index];
-	return _extData && entry.extDataOfs != 0 ? &_extData[entry.extDataOfs - 1] : NULL;
+	return (_extData && entry.extDataOfs != 0) ? &_extData[entry.extDataOfs - 1] : NULL;
 }
 
 Common::SeekableReadStream *BlbArchive::createStream(uint index) {
 	const BlbArchiveEntry &entry = _entries[index];
-	//debug("entry.offset = %08X; entry.offset + entry.diskSize = %08X", entry.offset, entry.offset + entry.diskSize);
 	return new Common::SafeSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
 }
 
diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index 87ec0cd..4296b91 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -52,7 +52,7 @@ void CollisionMan::setHitRects(HitRectList *hitRects) {
 }
 
 void CollisionMan::clearHitRects() {
-	_hitRects = 0;
+	_hitRects = NULL;
 }
 
 HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) {
@@ -82,7 +82,12 @@ void CollisionMan::addSprite(Sprite *sprite) {
 }
 
 void CollisionMan::removeSprite(Sprite *sprite) {
-	// TODO
+	for (uint index = 0; index < _sprites.size(); index++) {
+		if (_sprites[index] == sprite) {
+			_sprites.remove_at(index);
+			break;
+		}
+	}
 }
 
 void CollisionMan::clearSprites() {
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
new file mode 100644
index 0000000..dd2c837
--- /dev/null
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -0,0 +1,563 @@
+/* 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/diskplayerscene.h"
+#include "neverhood/mouse.h"
+
+namespace Neverhood {
+
+// TODO: Maybe move hash tables into neverhood.dat
+
+static const uint32 kDiskplayerPaletteFileHashes[] = {
+	0x03B78240,
+	0x34B32B08,
+	0x4F2569D4,
+	0x07620590,
+	0x38422401
+};
+
+static const byte kDiskplayerInitArray[] = {
+	2, 1, 4, 5, 3, 11, 8, 6, 7, 9, 10, 17, 16, 18, 19, 20, 15, 14, 13, 12
+};
+
+static const uint32 kDiskplayerSmackerFileHashes[] = {
+	0x010A2810,
+	0x020A2810,
+	0x040A2810,
+	0x080A2810,
+	0x100A2810,
+	0x200A2810,
+	0x400A2810,
+	0x800A2810,
+	0x000A2811,
+	0x010C2810,
+	0x020C2810,
+	0x040C2810,
+	0x080C2810,
+	0x100C2810,
+	0x200C2810,
+	0x400C2810,
+	0x800C2810,
+	0x000C2811,
+	0x000C2812,
+	0x02002810,
+	0x04002810
+};
+
+static const uint32 kDiskplayerSlotFileHashes1[] = { 
+	0x81312280,
+	0x01312281,
+	0x01312282,
+	0x01312284,
+	0x01312288,
+	0x01312290,
+	0x013122A0,
+	0x013122C0,
+	0x01312200,
+	0x82312280,
+	0x02312281,
+	0x02312282,
+	0x02312284,
+	0x02312288,
+	0x02312290,
+	0x023122A0,
+	0x023122C0,
+	0x02312200,
+	0x02312380,
+	0x04312281
+};
+
+static const uint32 kDiskplayerSlotFileHashes2[] = { 
+	0x90443A00,
+	0x90443A18,
+	0x90443A28,
+	0x90443A48,
+	0x90443A88,
+	0x90443B08,
+	0x90443808,
+	0x90443E08,
+	0x90443208,
+	0xA0443A00,
+	0xA0443A18,
+	0xA0443A28,
+	0xA0443A48,
+	0xA0443A88,
+	0xA0443B08,
+	0xA0443808,
+	0xA0443E08,
+	0xA0443208,
+	0xA0442A08,
+	0xC0443A18
+};
+
+static const uint32 kDiskplayerSlotFileHashes3[] = { 
+	0x10357320, 
+	0x10557320,
+	0x10957320,
+	0x11157320,
+	0x12157320,
+	0x14157320,
+	0x18157320,
+	0x00157320,
+	0x30157320,
+	0x1035B320,
+	0x1055B320,
+	0x1095B320,
+	0x1115B320,
+	0x1215B320,
+	0x1415B320,
+	0x1815B320,
+	0x0015B320,
+	0x3015B320,
+	0x5015B320,
+	0x10543320
+};
+
+static const uint32 kDiskplayerSlotFileHashes4[] = { 
+	0xDC8020E4,
+	0xDC802164,
+	0xDC802264,
+	0xDC802464,
+	0xDC802864,
+	0xDC803064,
+	0xDC800064,
+	0xDC806064,
+	0xDC80A064,
+	0xDC8020E7,
+	0xDC802167,
+	0xDC802267,
+	0xDC802467,
+	0xDC802867,
+	0xDC803067,
+	0xDC800067,
+	0xDC806067,
+	0xDC80A067,
+	0xDC812067,
+	0xDC802161
+};
+
+Class494::Class494(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
+	
+	createSurface1(0x100B90B4, 1200);
+	_x = 211;
+	_y = 195;
+	setFileHash(0x100B90B4, 0, -1);
+	_newHashListIndex = 0;
+	_needRefresh = true;
+	updatePosition();
+	_surface->setVisible(false);
+}
+
+uint32 Class494::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class494::sub43BE00() {
+	setFileHash1();
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Sprite::handleMessage);
+	_surface->setVisible(false);
+}
+
+void Class494::sub43BE20() {
+	setFileHash(0x100B90B4, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class494::handleMessage);
+	SetAnimationCallback3(&Class494::sub43BE00);
+	_surface->setVisible(true);
+}
+
+DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene)
+	: StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm),
+	_diskplayerScene(diskplayerScene), _isPlaying(false) {
+	
+	_spriteResource.load2(0x24A4A664);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = _spriteResource.getDimensions().width;
+	_deltaRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_surface->setVisible(false);
+	processDelta();
+	_needRefresh = true;
+	StaticSprite::update();
+	_soundResource1.load(0x44043000);
+	_soundResource2.load(0x44045000);
+	SetMessageHandler(&DiskplayerPlayButton::handleMessage);
+}
+
+uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (!_diskplayerScene->getFlag3()) {
+			if (_isPlaying) {
+				_diskplayerScene->sendMessage(0x2001, 0, this);
+				release();
+			} else {
+				_diskplayerScene->sendMessage(0x2000, 0, this);
+				press();
+			}
+		}
+		StaticSprite::update();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void DiskplayerPlayButton::press() {
+	if (!_isPlaying) {
+		_surface->setVisible(true);
+		StaticSprite::update();
+		_soundResource1.play();
+		_isPlaying = true;
+	}
+}
+
+void DiskplayerPlayButton::release() {
+	if (_isPlaying) {
+		_surface->setVisible(false);
+		StaticSprite::update();
+		_soundResource2.play();
+		_isPlaying = false;
+	}
+}
+
+DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value)
+	: Entity(vm, 0), _diskplayerScene(diskplayerScene), _soundResource(vm), _elementIndex(elementIndex),
+	_value(value), _flag2(false), _flag(false), _countdown(0), _initialCountdown(2),
+	_inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
+
+	if (value != 0 && elementIndex < 20) {
+		_inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100));
+		_appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[_elementIndex], 1000));
+		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[_elementIndex], 1100));
+		_inactiveSlot->getSurface()->setVisible(false);
+		_appearSlot->getSurface()->setVisible(false);
+		_activeSlot->getSurface()->setVisible(false);
+		_soundResource.load(0x46210074);
+		// TODO sound panning stuff
+	} else if (elementIndex != 20) {
+		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100));
+		_activeSlot->getSurface()->setVisible(false);
+	}
+	SetUpdateHandler(&DiskplayerSlot::update);
+}
+
+void DiskplayerSlot::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		if (_flag) {
+			if (_inactiveSlot) {
+				_inactiveSlot->getSurface()->setVisible(true);
+			}
+			if (_activeSlot) {
+				_activeSlot->getSurface()->setVisible(false);
+			}
+			_countdown = _initialCountdown / 2;
+		} else {
+			if (_inactiveSlot) {
+				_inactiveSlot->getSurface()->setVisible(false);
+			}
+			if (_activeSlot) {
+				_activeSlot->getSurface()->setVisible(true);
+			}
+			_countdown = _initialCountdown;
+		}
+		_flag = !_flag;
+	}
+}
+
+void DiskplayerSlot::appear() {
+	if (_inactiveSlot) {
+		_inactiveSlot->getSurface()->setVisible(true);
+	}
+	if (_appearSlot) {
+		_appearSlot->getSurface()->setVisible(true);
+	}
+	if (_inactiveSlot) {
+		_soundResource.play();
+	}
+}
+
+void DiskplayerSlot::play() {
+	if (!_flag2) {
+		if (_inactiveSlot) {
+			_inactiveSlot->getSurface()->setVisible(false);
+		}
+		if (_activeSlot) {
+			_activeSlot->getSurface()->setVisible(true);
+		}
+		_flag = true;
+		_countdown = 0;
+	}
+}
+
+void DiskplayerSlot::activate() {
+	if (!_flag2) {
+		_countdown = _initialCountdown;
+	}
+}
+
+void DiskplayerSlot::stop() {
+	if (!_flag2) {
+		if (_inactiveSlot) {
+			_inactiveSlot->getSurface()->setVisible(true);
+		}
+		if (_activeSlot) {
+			_activeSlot->getSurface()->setVisible(false);
+		}
+		_flag = false;
+		_countdown = 0;
+	}
+}
+
+DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _which(which), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0),
+	_fullFlag(false), _flag3(false), _inputDisabled(true), _updateStatus(0) { 
+
+	int count = 0;
+	
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x8A000044, 0, 0));
+	_palette = new Palette(_vm, kDiskplayerPaletteFileHashes[_which]);
+	_playButton = new DiskplayerPlayButton(_vm, this);
+	addSprite(_playButton);
+	_vm->_collisionMan->addSprite(_playButton);
+	_class494 = new Class494(_vm);
+	addSprite(_class494);
+
+	// DEBUG: Give all disks
+	for (int i = 0; i < 19; i++) {
+		setSubVar(0x02720344, i, 1);
+	}
+
+	for (int i = 0; i < 20; i++) {
+		_diskAvailable[i] = 0;
+		if (getSubVar(0x02720344, i))
+			count++;
+	}
+
+	for (int i = 0; i < count; i++) {
+		_diskAvailable[kDiskplayerInitArray[i] - 1] = 1;
+	}
+
+	for (int i = 0; i < 20; i++) {
+		_diskSlots[i] = new DiskplayerSlot(_vm, this, i, _diskAvailable[i]);
+		addEntity(_diskSlots[i]);
+	}
+
+	_fullFlag = count == 20;
+	
+	if (_fullFlag && !getGlobalVar(0xC0780812))
+		_flag3 = true;
+
+	_flag4 = _flag3;	
+
+	_class650 = new DiskplayerSlot(_vm, this, 20, 0);
+	addEntity(_class650);
+
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x000408A8, 20, 620));
+	_mouseCursor->getSurface()->setVisible(false);
+
+	_smackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true);
+	addEntity(_smackerPlayer);
+	addSurface(_smackerPlayer->getSurface());
+	_smackerPlayer->setDrawPos(154, 86);
+	// TODO _smackerPlayer->gotoFrame(0);
+
+	_palette->usePalette();
+
+	SetMessageHandler(&DiskplayerScene::handleMessage); 
+	SetUpdateHandler(&DiskplayerScene::update); 
+	_appearCountdown = 6;
+
+}
+
+void DiskplayerScene::update() {
+	Scene::update();
+
+	debug("_updateStatus = %d", _updateStatus);
+
+	if (_updateStatus == 1) {
+		if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) {
+			if (_diskAvailable[_diskIndex]) {
+				playDisk();
+			} else {
+				playStatic();
+			}
+		}
+	} else if (_updateStatus == 2) {
+		if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) {
+			_diskSlots[_diskIndex]->stop();
+			_diskIndex++;
+			if (_fullFlag) {
+				if (_diskIndex == 20) {
+					if (_flag3) {
+						playDisk();
+						_updateStatus = 3;
+					} else {
+						_diskIndex = 0;
+						stop();
+					}
+				} else {
+					playDisk();
+				}
+			} else {
+				if (_diskIndex == 20) {
+					_diskIndex = 0;
+					stop();
+				} else {
+					tuneIn();
+				}
+			}
+		}
+	} else if (_updateStatus == 3) {
+		if (_smackerPlayer->getFrameNumber() == 133) {
+			_class494->sub43BE20();
+			setGlobalVar(0xC0780812, 1);
+		} else if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) {
+			for (int i = 0; i < 20; i++) {
+				_diskSlots[i]->setFlag2(false);
+				_diskSlots[i]->stop();
+			}
+			_diskIndex = 0;
+			stop();
+			_mouseCursor->getSurface()->setVisible(true);
+			_flag3 = false;
+		}
+	}
+
+	if (_appearCountdown != 0 && (--_appearCountdown == 0)) {
+		_diskSlots[_diskIndex]->appear();
+		if (_flag3) {
+			_diskSlots[_diskIndex]->activate();
+			_diskSlots[_diskIndex]->setFlag2(true);
+		}
+		_diskIndex++;
+		while (_diskAvailable[_diskIndex] == 0 && _diskIndex < 19)
+			_diskIndex++;					
+		if (_diskIndex < 20) {
+			_appearCountdown = 1;
+		} else {
+			_diskIndex = 0;
+			_inputDisabled = false;
+			if (_flag3) {
+				_playButton->press();
+				_tuneInCountdown = 2;
+			} else {
+				_mouseCursor->getSurface()->setVisible(true);
+				_diskSlots[_diskIndex]->activate();
+			}
+		}
+	}
+
+	if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0)) {
+		playDisk();
+	}
+
+}
+
+uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	if (!_inputDisabled) {
+		switch (messageNum) {
+		case 0x0001:
+			// TODO: Debug/Cheat
+			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+				_parentModule->sendMessage(0x1009, 0, this);
+			} else if (!_flag3 &&
+				param.asPoint().x > 38 && param.asPoint().x < 598 &&
+				param.asPoint().y > 400 && param.asPoint().y < 460) {
+				
+				_diskSlots[_diskIndex]->stop();
+				_diskIndex = (param.asPoint().x - 38) / 28;
+				_diskSlots[_diskIndex]->activate();
+				if (_updateStatus == 2) {
+					if (_diskAvailable[_diskIndex]) {
+						playDisk();
+					} else {
+						playStatic();
+					}
+				}
+			}
+			break;
+		// case 0x000D: TODO: Debug/Cheat
+		case 0x2000:
+			tuneIn();
+			break;			
+		case 0x2001:
+			stop();
+			break;			
+		}
+	}
+	return messageResult;
+}
+
+void DiskplayerScene::stop() {
+	_smackerPlayer->open(0x08288103, true);
+	_palette->usePalette();
+	_playButton->release();
+	_updateStatus = 0;
+	_diskSlots[_diskIndex]->activate();
+}
+
+void DiskplayerScene::tuneIn() {
+	_smackerPlayer->open(0x900001C1, false);
+	_palette->usePalette();
+	_playButton->release();
+	_updateStatus = 1;
+	_diskSlots[_diskIndex]->activate();
+}
+
+void DiskplayerScene::playDisk() {
+	_smackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false);
+	_palette->usePalette();
+	_updateStatus = 2;
+	_diskSlots[_diskIndex]->play();
+}
+
+void DiskplayerScene::playStatic() {
+	_smackerPlayer->open(0x90000101, false);
+	_palette->usePalette();
+	_playButton->release();
+	_updateStatus = 2;
+	_diskSlots[_diskIndex]->activate();
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h
new file mode 100644
index 0000000..7969a7a
--- /dev/null
+++ b/engines/neverhood/diskplayerscene.h
@@ -0,0 +1,110 @@
+/* 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_DISKPLAYERSCENE_H
+#define NEVERHOOD_DISKPLAYERSCENE_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/resourceman.h"
+#include "neverhood/scene.h"
+#include "neverhood/smackerplayer.h"
+
+namespace Neverhood {
+
+class DiskplayerScene;
+
+class Class494 : public AnimatedSprite {
+public:
+	Class494(NeverhoodEngine *vm);
+	void sub43BE20();
+protected:	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub43BE00();
+};
+
+class DiskplayerPlayButton : public StaticSprite {
+public:
+	DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene);
+	void press();
+	void release();
+protected:
+	DiskplayerScene *_diskplayerScene;	
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	bool _isPlaying;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class DiskplayerSlot : public Entity {
+public:
+	DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value);
+	void activate();
+	void stop();
+	void appear();
+	void play();
+	void setFlag2(bool value) { _flag2 = value; }
+protected:
+	DiskplayerScene *_diskplayerScene;
+	SoundResource _soundResource;
+	Sprite *_inactiveSlot;
+	Sprite *_appearSlot;
+	Sprite *_activeSlot;
+	int _elementIndex;
+	int _initialCountdown;
+	int _countdown;
+	bool _flag2;
+	int _value;
+	bool _flag;
+	void update();	
+};
+
+class DiskplayerScene : public Scene {
+public:
+	DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which);
+	bool getFlag3() const { return _flag3; }
+protected:
+	SmackerPlayer *_smackerPlayer;
+	DiskplayerPlayButton *_playButton;
+	Class494 *_class494;
+	DiskplayerSlot *_diskSlots[20];
+	DiskplayerSlot *_class650;
+	int _updateStatus;
+	byte _diskAvailable[20];
+	bool _flag4;
+	int _which;
+	int _diskIndex;
+	int _appearCountdown;
+	int _tuneInCountdown;
+	bool _fullFlag;
+	bool _inputDisabled;
+	bool _flag3;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stop();
+	void tuneIn();
+	void playDisk();
+	void playStatic();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_DISKPLAYERSCENE_H */
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 95a6a5f..02ae2a7 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -25,7 +25,10 @@
 #include "neverhood/graphics.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
+#include "neverhood/module1400.h"
 #include "neverhood/module1500.h"
+#include "neverhood/module1700.h"
+#include "neverhood/module1800.h"
 #include "neverhood/module2300.h"
 
 namespace Neverhood {
@@ -110,8 +113,13 @@ void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule1500(0); // Logos and intro video //Real
 //	createModule1000(-1);
-//	createModule2300(0);
-	createModule1200(0);
+//	createModule2300(2);
+	_vm->gameState().sceneNum = 6;
+	//createModule1200(-1);
+	//createModule1800(-1);
+	//createModule1700(-1);
+	//createModule1700(1);
+	createModule1400(-1);
 }
 
 void GameModule::createModule1000(int which) {
@@ -149,6 +157,7 @@ void GameModule::updateModule1200() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
+			error("// TODO createModule2600(0);");
 			// TODO createModule2600(0);
 			// TODO _childObject->handleUpdate();
 		} else {
@@ -158,6 +167,29 @@ void GameModule::updateModule1200() {
 	}
 }
 
+void GameModule::createModule1400(int which) {
+	setGlobalVar(0x91080831, 0x00AD0012);
+	_childObject = new Module1400(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1400);
+}
+
+void GameModule::updateModule1400() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			error("WEIRD!");
+		} else {
+			// TODO createModule1600(1);
+			// TODO _childObject->handleUpdate();
+		}
+	}
+}
+
 void GameModule::createModule1500(int which) {
 	_someFlag1 = false;
 	setGlobalVar(0x91080831, 0x00F10114);
@@ -178,6 +210,61 @@ void GameModule::updateModule1500() {
 	}
 }
 
+void GameModule::createModule1700(int which) {
+	setGlobalVar(0x91080831, 0x04212331);
+	_childObject = new Module1700(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1700);
+}
+
+void GameModule::updateModule1700() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		debug("Module1700 done; _field20 = %d", _field20);
+		if (_field20 == 1) {
+			// TODO createModule2900(3);
+			// TODO _childObject->handleUpdate();
+		} else {
+			// TODO createModule1600(2);
+			// TODO _childObject->handleUpdate();
+		}
+	}
+}
+
+void GameModule::createModule1800(int which) {
+	setGlobalVar(0x91080831, 0x04A14718);
+	_childObject = new Module1800(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1800);
+}
+
+void GameModule::updateModule1800() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			// TODO GameState_clear();
+			// TODO GameModule_handleKeyEscape();
+		} else if (_field20 == 2) {
+			// TODO createModule2700(0);
+			// TODO _childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			// TODO createModule3000(3);
+			// TODO _childObject->handleUpdate();
+		} else {
+			// TODO createModule2800(0);
+			// TODO _childObject->handleUpdate();
+		}
+	}
+}
+
 void GameModule::createModule2300(int which) {
 	setGlobalVar(0x91080831, 0x1A214010);
 	_childObject = new Module2300(_vm, this, which);
@@ -223,13 +310,11 @@ void GameModule::updateModule2300() {
 }
 
 void GameModule::createModule2400(int which) {
-	debug("createModule2400");
-	_vm->_system->quit();
+	error("createModule2400");
 }
 
 void GameModule::createModule3000(int which) {
-	debug("createModule3000");
-	_vm->_system->quit();
+	error("createModule3000");
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index d95c31e..344a78f 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -53,8 +53,14 @@ protected:
 	void updateModule1000();
 	void createModule1200(int which);
 	void updateModule1200();
+	void createModule1400(int which);
+	void updateModule1400();
 	void createModule1500(int which);
 	void updateModule1500();
+	void createModule1700(int which);
+	void updateModule1700();
+	void createModule1800(int which);
+	void updateModule1800();
 	void createModule2200(int which);
 	void createModule2300(int which);
 	void updateModule2300();
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index e46d4ea..204e386 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -43,7 +43,7 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h
 	_clipRect.x2 = 640;
 	_clipRect.y2 = 480;
 	_surface = new Graphics::Surface();
-	_surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
+	_surface->create(_sysRect.width, _sysRect.height, Graphics::PixelFormat::createFormatCLUT8());
 }
 
 BaseSurface::~BaseSurface() {
@@ -51,7 +51,6 @@ BaseSurface::~BaseSurface() {
 }
 
 void BaseSurface::draw() {
-	debug(8, "BaseSurface::draw()");
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
 		// TODO: _sysRect alternate drawing code (is that used?)
 		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
@@ -223,9 +222,9 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 					skip = READ_LE_UINT16(source);
 					copy = READ_LE_UINT16(source + 2);
 					source += 4;
-					if (!flipX)
+					if (!flipX) {
 						memcpy(dest + skip, source, copy);
-					else {
+					} else {
 						byte *flipDest = dest + width - skip - 1;
 						for (int xc = 0; xc < copy; xc++) {
 							*flipDest-- = source[xc];
@@ -247,8 +246,6 @@ void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int de
 
 	// TODO: Flip Y
 	
-	debug("unpackSpriteRleRepl(%d, %d)", oldColor, newColor);
-
 	int16 rows, chunks;
 	int16 skip, copy;
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 91de87d..b24e3eb 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -266,6 +266,172 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub421350() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x582EC138, 0, -1);
+	_counter = 0;
+	SetSpriteCallback(NULL);
+	SetUpdateHandler(&Klayman::update41D1C0);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	_counter3 = 0;
+	_counterMax = 8;
+	_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+}
+
+void Klayman::update41D1C0() {
+	update();
+	_counter++;
+	if (_counter >= _counterMax) {
+		_counter = 0;
+		if (_table) {
+			int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue);
+			for (int i = 0; i < _tableCount; i++) {
+				if (randomValue < _table[_tableCount].value) {
+					(this->*(_table[_tableCount].callback))();
+					_counterMax = _vm->_rnd->getRandomNumber(128) + 24;
+					break;
+				}
+				randomValue -= _table[_tableCount].value;
+			}
+		}
+	} else {
+		_counter3++;
+		if (_counter3 >= _counter3Max) {
+			_counter3 = 0;
+			_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+			sub4213F0();
+		}
+	}
+}
+
+void Klayman::sub4213F0() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x5C24C018, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Klayman::sub4213B0);
+}
+
+void Klayman::sub4213B0() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0x5C24C018, 0, -1);
+	SetUpdateHandler(&Klayman::update41D1C0);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub420060() {
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420060))) {
+		_status2 = 1;
+		_flagE5 = false;
+		setFileHash(0x1449C169, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41D4C0);
+		SetSpriteCallback(NULL);
+	}
+}
+
+void Klayman::sub41FFF0() {
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub41FFF0))) {
+		_status2 = 1;
+		_flagE5 = false;
+		setFileHash(0x0018C032, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41D640);
+		SetSpriteCallback(NULL);
+	}
+}
+
+uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC1380080) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x4806, 0, this);
+				_soundResource1.play(0xC8004340);
+			}
+		} else if (param.asInteger() == 0x02B20220) {
+			_soundResource1.play(0xC5408620);
+		} else if (param.asInteger() == 0x03020231) {
+			_soundResource1.play(0xD4C08010);
+		} else if (param.asInteger() == 0x67221A03) {
+			_soundResource1.play(0x44051000);
+		} else if (param.asInteger() == 0x925A0C1E) {
+			_soundResource1.play(0x40E5884D);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub4214D0() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0xD229823D, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub421510() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x9A2801E0, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(NULL);
+}
+
+void Klayman::sub421160() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub421160))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x004AA310, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41EC70);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	}
+}
+
+void Klayman::sub4212C0() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub4212C0))) {
+		_status2 = 0;
+		_flagE5 = false;
+		setFileHash(0x392A0330, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41EAB0);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	}
+}
+
+uint32 Klayman::handleMessage41EAB0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x001A2832) {
+			_soundResource1.play(0xC0E4884C);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub421310() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x913AB120, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+}
+
 /////////////////////////////////////////////////////////////////
 
 void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) {
@@ -460,7 +626,6 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 void Klayman::sub41C930(int16 x, bool flag) {
 	debug("Klayman::sub41C930(%d, %d)", x, flag);
 	int16 xdiff = ABS(x - _x);
-	debug("xdiff = %d", xdiff);
 	if (x == _x) {
 		_x4 = x;
 		if (!_flagE1 && !_flagE2 && !_flagE3) {
@@ -623,7 +788,7 @@ void Klayman::sub41FB40() {
 	_status2 = 1;
 	_flagE2 = true;
 	_flagE5 = true;
-	setDoDeltaX(_x4 < _x);
+	setDoDeltaX(_x4 < _x ? 1 : 0);
 	setFileHash(0x5C48C506, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41DD80);
@@ -688,10 +853,7 @@ void Klayman::sub41F950() {
 		_status2 = 0;
 		_flagE1 = true;
 		_flagE5 = true;
-		
-		debug("222222222222222222222 x = %d; x4 = %d", _x, _x4);
-		
-		setDoDeltaX(_x4 < _x);
+		setDoDeltaX(_x4 < _x ? 1 : 0);
 		setFileHash(0x242C0198, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41EC70);
@@ -823,9 +985,6 @@ void Klayman::spriteUpdate41F320() {
 		sendMessage(0x1019, 0, this);
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
-		
-		debug("xxxxxxxxxxxxxxxxxxxxxxxxx xdelta = %d", xdelta);
-		
 		_x += xdelta;
 		if (_field114) {
 			error("_field114");
@@ -876,7 +1035,7 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FF80() {
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x);
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
 	if (!sub41CEB0(AnimationCallback(&Klayman::sub41FF80))) {
 		_status2 = 1;
 		_flagE5 = false;
@@ -985,28 +1144,22 @@ void Klayman::sub41CD00(int16 x) {
 void Klayman::sub41CC40(int16 x1, int16 x2) {
 	if (_x > x1) {
 		if (_x == x1 + x2) {
-		debug("sub41CC40 #1");
 			_x4 = x1 + x2;
 			setCallback2(NULL);
 			sub41C7B0();
 		} else if (_x < x1 + x2) {
-		debug("sub41CC40 #2");
 			sub41CAC0(x1 + x2);
 		} else {
-		debug("sub41CC40 #3");
 			sub41C930(x1 + x2, false);
 		}
 	} else {
 		if (_x == x1 - x2) {
-		debug("sub41CC40 #4");
 			_x4 = x1 - x2;
 			setCallback2(NULL);
 			sub41C7B0();
 		} else if (_x > x1 - x2) {
-		debug("sub41CC40 #5");
 			sub41CAC0(x1 - x2);
 		} else {
-		debug("sub41CC40 #6");
 			sub41C930(x1 - x2, false);
 		}
 	}
@@ -1044,7 +1197,7 @@ void Klayman::sub41FBC0() {
 	_status2 = 2;
 	_flagE3 = true;
 	_flagE5 = true;
-	setDoDeltaX(_x4 >= _x);
+	setDoDeltaX(_x4 >= _x ? 1 : 0);
 	setFileHash(0x08B28116, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41DF10);
@@ -1641,6 +1794,68 @@ void Klayman::spriteUpdate41F5A0() {
 	AnimatedSprite::updateDeltaXY();
 }
 
+void Klayman::sub420600() {
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+	_flagE4 = false;
+	_flagE5 = true;
+	setFileHash2(0x0C1CA072, 0x01084280, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41D970);
+}
+
+void Klayman::sub420660() {
+	_attachedSprite->sendMessage(0x4807, 0, this);
+}
+
+uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			if (_attachedSprite)
+				_attachedSprite->sendMessage(0x480B, _doDeltaX ? 1 : 0, this);
+		} else if (param.asInteger() == 0x02421405) {
+			if (_flagE4 && _attachedSprite->hasMessageHandler() && _attachedSprite->sendMessage(0x480C, _doDeltaX ? 1 : 0, this) != 0) {
+				sub4205C0();
+			} else {
+				setCallback1(AnimationCallback(&Klayman::sub420660));
+				SetMessageHandler(&Klayman::handleMessage41D480);
+			}
+		} else if (param.asInteger() == 0x32180101) {
+			_soundResource1.play(0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			_soundResource1.play(0x0460E2FA);
+		}
+		break;
+	case 0x480A:
+		_flagE4 = true;
+		return 0;		
+	}
+	return handleMessage41D480(messageNum, param, sender);
+}
+
+void Klayman::sub4205C0() {
+	_flagE4 = false;
+	_flagE5 = true;
+	setFileHash2(0x0C1CA072, 0x01084280, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41D970);
+}
+
+void Klayman::sub420550() {
+	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420550))) {
+		_status2 = 2;
+		_flagE4 = false;
+		_flagE5 = true;
+		setFileHash(0x0C1CA072, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetMessageHandler(&Klayman::handleMessage41D970);
+	}
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -1705,7 +1920,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger());
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
 		sub41C7B0();
 		break;
 	case 0x4836:
@@ -2401,7 +2616,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4817:
-		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
+		setDoDeltaX(param.asInteger());
 		sub41C7B0();
 		break;
 	case 0x481B:
@@ -2563,4 +2778,271 @@ void KmScene1201::sub40E040() {
 	}
 }
 
+// KmScene1401
+
+KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	// Empty	
+}
+
+uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;		
+	case 0x480A:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420600));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420550));
+		}	
+		break;		
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;						
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x482E:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub421030));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub421070));
+		}
+		break;
+	}
+	return 0;
+}
+
+// KmScene1402
+
+KmScene1402::KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	SetFilterY(&Sprite::defFilterY);	
+}
+
+uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;		
+	case 0x480A:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420600));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420550));
+		}
+		break;		
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;						
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	}
+	return 0;
+}
+
+// KmScene1705
+
+KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) {
+
+	// Empty	
+}
+
+uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x2000:
+		_flag = param.asInteger() != 0;
+		messageResult = 1;
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_flag) {
+			setCallback2(AnimationCallback(&Klayman::sub421350));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		}
+		break;
+	case 0x4803:
+		setCallback2(AnimationCallback(&KmScene1705::sub468A80));
+		break;				
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		if (_flag) {
+			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+		}
+		break;
+	case 0x481E:
+		if (_flag) {
+			setCallback2(AnimationCallback(&Klayman::sub421510));
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x4835:
+		_parentScene->sendMessage(0x2000, 1, this);
+		_flag = true;
+		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		break;																		
+	case 0x4836:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_flag = false;
+		setCallback2(AnimationCallback(&Klayman::sub421310));
+		break;
+	case 0x483D:
+		sub468AD0();
+		break;																				
+	case 0x483E:
+		sub468B10();
+		break;																				
+	}
+	return messageResult;
+}
+
+uint32 KmScene1705::handleMessage4689A0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			_soundResource1.play(0x85B10BB8);
+		} else if (param.asInteger() == 0x4E6A0CA0) {
+			_soundResource1.play(0xC5B709B0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1705::spriteUpdate468A30() {
+	updateDeltaXY();
+	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
+	if (hitRect->type == 0x5001) {
+		_y = hitRect->rect.y1;
+		processDelta();
+		sendMessage(0x1019, 0, this);
+	}
+}
+
+void KmScene1705::sub468A80() {
+	_status2 = 2;
+	_flagE5 = false;
+	setFileHash2(0xB93AB151, 0x40A100F8, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&KmScene1705::spriteUpdate468A30);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetAnimationCallback3(&Klayman::sub420420);
+}
+
+void KmScene1705::sub468AD0() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x5E0A4905, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1705::handleMessage4689A0);
+}
+
+void KmScene1705::sub468B10() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0xD86E4477, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1705::handleMessage4689A0);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3682d75..5cb11ab 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -85,6 +85,20 @@ public:
 	void sub4207A0();
 	void sub4207F0();
 	void sub420F20();
+	void sub421350();
+	void sub4213F0();
+	void sub4213B0();
+	void sub420060();
+	void sub41FFF0();
+	void sub4214D0();
+	void sub421510();
+	void sub421160();
+	void sub4212C0();
+	void sub421310();
+	void sub420600();
+	void sub420660();
+	void sub4205C0();
+	void sub420550();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -95,6 +109,11 @@ public:
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
 
+	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
+	void setKlaymanTable1();
+	void setKlaymanTable2();
+	void setKlaymanTable3();
+
 protected:
 	Entity *_parentScene;
 	Entity *_attachedSprite;
@@ -129,11 +148,6 @@ protected:
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
-	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
-	void setKlaymanTable1();
-	void setKlaymanTable2();
-	void setKlaymanTable3();
-
 	void sub41FD40();
 	void sub41FD90();
 	uint32 handleMessage41EB10(int messageNum, const MessageParam &param, Entity *sender);
@@ -210,6 +224,11 @@ protected:
 	uint32 handleMessage41E490(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E2F0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41D640(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41EAB0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41D970(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void update41D1C0();
 	
 };
 
@@ -287,6 +306,33 @@ protected:
 	void sub40E040();
 };
 
+class KmScene1401 : public Klayman {
+public:
+	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
+class KmScene1402 : public Klayman {
+public:
+	KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
+class KmScene1705 : public Klayman {
+public:
+	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage4689A0(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate468A30();
+	void sub468A80();
+	void sub468AD0();
+	void sub468B10();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 1742476..0b3b10c 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS = \
 	blbarchive.o \
 	collisionman.o \
 	detection.o \
+	diskplayerscene.o \
 	gamemodule.o \
 	gamevars.o \
 	graphics.o \
@@ -12,7 +13,10 @@ MODULE_OBJS = \
 	module.o \
 	module1000.o \
 	module1200.o \
+	module1400.o \
 	module1500.o \
+	module1700.o \
+	module1800.o \
 	module2300.o \
 	mouse.o \
 	navigationscene.o \
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index eef5433..7a09b5f 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -76,8 +76,8 @@ void Module1200::createScene1201(int which) {
 			
 void Module1200::createScene1202(int which) {
 	_vm->gameState().sceneNum = 1;
-	//_childObject = new Scene1202(_vm, this, which);
-	//SetUpdateHandler(&Module1200::updateScene1202);
+	_childObject = new Scene1202(_vm, this, which);
+	SetUpdateHandler(&Module1200::updateScene1202);
 }
 
 void Module1200::createScene1203(int which) {
@@ -161,7 +161,7 @@ static const NPoint kScene1201PointArray[] = {
 	{493, 174}
 };
 
-static const uint32 kScene1201SsScene1201TntFileHashList1[] = {
+static const uint32 kScene1201TntFileHashList1[] = {
 	0x2098212D,   
 	0x1600437E,
 	0x1600437E,
@@ -182,7 +182,7 @@ static const uint32 kScene1201SsScene1201TntFileHashList1[] = {
 	0xDA460476
 };
 
-static const uint32 kScene1201SsScene1201TntFileHashList2[] = {
+static const uint32 kScene1201TntFileHashList2[] = {
 	0x3040C676,  
 	0x10914448,
 	0x10914448,
@@ -209,7 +209,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 	int16 x = kScene1201PointArray[pointIndex].x;
 	int16 y = kScene1201PointArray[pointIndex].y;
 	if (x < 300) {
-		_spriteResource.load2(kScene1201SsScene1201TntFileHashList1[elemIndex]);
+		_spriteResource.load2(kScene1201TntFileHashList1[elemIndex]);
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_drawRect.x = 0;
@@ -217,7 +217,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 		_drawRect.width = _spriteResource.getDimensions().width;
 		_drawRect.height = _spriteResource.getDimensions().height;
 	} else {
-		_spriteResource.load2(kScene1201SsScene1201TntFileHashList2[elemIndex]);
+		_spriteResource.load2(kScene1201TntFileHashList2[elemIndex]);
 		_x = x;
 		_y = y;
 		_drawRect.x = -(_spriteResource.getDimensions().width / 2);
@@ -307,14 +307,14 @@ void Class466::sub40D380() {
 	_newHashListIndex = -2;
 }
 
-Class468::Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag)
+AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) {
 
-	createSurface1(100, 0xD088AC30);
+	createSurface1(0xD088AC30, 100);
 	_x = 320;
 	_y = 240;
-	SetUpdateHandler(&Class468::update);
-	SetMessageHandler(&Class468::handleMessage);
+	SetUpdateHandler(&AsScene1201RightDoor::update);
+	SetMessageHandler(&AsScene1201RightDoor::handleMessage);
 	_newHashListIndex = -2;
 	if (flag) {
 		setFileHash(0xD088AC30, -1, -1);
@@ -326,14 +326,14 @@ Class468::Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 	}
 }
 
-void Class468::update() {
+void AsScene1201RightDoor::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		sub40D830();
 	}
 	AnimatedSprite::update();
 }
 
-uint32 Class468::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -346,22 +346,22 @@ uint32 Class468::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class468::sub40D7E0() {
+void AsScene1201RightDoor::sub40D7E0() {
 	setFileHash(0xD088AC30, 0, -1);
 	_newHashListIndex = -2;
 	_surface->setVisible(true);
 	_soundResource.play(calcHash("fxDoorOpen20"));
 }
 
-void Class468::sub40D830() {
+void AsScene1201RightDoor::sub40D830() {
 	setFileHash(0xD088AC30, -1, -1);
 	_playBackwards = true;
 	_surface->setVisible(true);
 	_soundResource.play(calcHash("fxDoorClose20"));
-	SetAnimationCallback3(&Class468::sub40D880);
+	SetAnimationCallback3(&AsScene1201RightDoor::sub40D880);
 }
 
-void Class468::sub40D880() {
+void AsScene1201RightDoor::sub40D880() {
 	setFileHash1();
 	_surface->setVisible(false);
 }
@@ -394,14 +394,14 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-Class463::Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag)
+AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag)
 	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _class466(class466),
 	_flag(false) {
-	
-	//TODO_field_F0 = -1;
+
+	flag = false;
 	
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class463::handleMessage);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	createSurface(990, 106, 181);
 	_x = 201;
 	if (flag) {
@@ -413,11 +413,11 @@ Class463::Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bo
 	}
 }
 
-Class463::~Class463() {
+AsScene1201TntMan::~AsScene1201TntMan() {
 	// TODO Sound1ChList_sub_407AF0(0x01D00560);
 }	 
 
-uint32 Class463::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -441,8 +441,8 @@ uint32 Class463::handleMessage(int messageNum, const MessageParam &param, Entity
 
 }
 
-uint32 Class463::handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Class463::handleMessage(messageNum, param, sender);
+uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		removeCallbacks();
@@ -451,37 +451,37 @@ uint32 Class463::handleMessage40CCD0(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-void Class463::spriteUpdate40CD10() {
+void AsScene1201TntMan::spriteUpdate40CD10() {
 	_x = _sprite->getX() + 100;
 }
 
-void Class463::sub40CD30() {
+void AsScene1201TntMan::sub40CD30() {
 	setFileHash(0x654913D0, 0, -1);
-	SetMessageHandler(&Class463::handleMessage);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	SetSpriteCallback(NULL);
 }
 
-void Class463::sub40CD60() {
+void AsScene1201TntMan::sub40CD60() {
 	setFileHash(0x356803D0, 0, -1);
-	SetMessageHandler(&Class463::handleMessage40CCD0);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	SetAnimationCallback3(&Class463::sub40CD30);
+	SetAnimationCallback3(&AsScene1201TntMan::sub40CD30);
 }
 
-void Class463::sub40CD90() {
+void AsScene1201TntMan::sub40CD90() {
 	// TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true);
 	// TODO Sound1ChList_playLooping(0x4B044624);
 	_flag = true;
 	setFileHash(0x85084190, 0, -1);
-	SetMessageHandler(&Class463::handleMessage);
-	SetSpriteCallback(&Class463::spriteUpdate40CD10);
+	SetMessageHandler(&AsScene1201TntMan::handleMessage);
+	SetSpriteCallback(&AsScene1201TntMan::spriteUpdate40CD10);
 	_newHashListIndex = -2;
 }
 
-Class465::Class465(NeverhoodEngine *vm, Sprite *class463)
-	: AnimatedSprite(vm, 1200), _class463(class463) {
+Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
+	: AnimatedSprite(vm, 1200), _asTntMan(asTntMan) {
 
-	createSurface1(995, 0x828C0411);
+	createSurface1(0x828C0411, 995);
 	SetUpdateHandler(&Class465::update);
 	SetMessageHandler(&Sprite::handleMessage);
 	SetSpriteCallback(&Class465::spriteUpdate40D150);
@@ -504,8 +504,251 @@ void Class465::update() {
 }
 
 void Class465::spriteUpdate40D150() {
-	_x = _class463->getX() - 18;
-	_y = _class463->getY() - 158;
+	_x = _asTntMan->getX() - 18;
+	_y = _asTntMan->getY() - 158;
+}
+
+AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	
+	createSurface(1100, 57, 60);
+	SetUpdateHandler(&AsScene1201Match::update);
+	SetMessageHandler(&AsScene1201Match::handleMessage40C2D0);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	
+	switch (getGlobalVar(0x0112090A)) {
+	case 0:
+		_x = 521;
+		_y = 112;
+		_status = 0;
+		sub40C4C0();
+		break;
+	case 1:
+		_x = 521;
+		_y = 112;
+		_status = 2;
+		sub40C470();
+		_soundResource.load(0xD00230CD);
+		break;
+	case 2:
+		setDoDeltaX(1);
+		_x = 403;
+		_y = 337;
+		_status = 0;
+		sub40C4F0();
+		break;
+	}
+}
+
+void AsScene1201Match::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		removeCallbacks();
+	}
+	updateAnim();
+	handleSpriteUpdate();
+	updatePosition();
+}
+
+uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x86668011) {
+			_soundResource.play();
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage40C2D0(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage40C2D0(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x2001, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		_surface->setVisible(false);
+		setGlobalVar(0x0112090A, 3);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201Match::sub40C3E0() {
+	setFileHash(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
+	if (_status == 0) {
+		SetAnimationCallback3(&AsScene1201Match::sub40C420);
+	} else {
+		SetAnimationCallback3(&AsScene1201Match::sub40C470);
+	}
+}
+
+void AsScene1201Match::sub40C420() {
+	setGlobalVar(0x0112090A, 2);
+	_x -= 199;
+	_y += 119;
+	setFileHash(0x018D0240, 0, -1);
+	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
+	SetAnimationCallback3(&AsScene1201Match::sub40C4F0);
+}
+
+void AsScene1201Match::sub40C470() {
+	setFileHash(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::handleMessage40C2D0);
+	_newHashListIndex = 0;
+	if (_status != 0) {
+		_countdown = 36;
+		_status--;
+		SetAnimationCallback3(&AsScene1201Match::sub40C3E0);
+	}
+}
+
+void AsScene1201Match::sub40C4C0() {
+	setFileHash(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::handleMessage40C360);
+	_newHashListIndex = 0;
+}
+
+void AsScene1201Match::sub40C4F0() {
+	setDoDeltaX(1);
+	_x = 403;
+	_y = 337;
+	setFileHash(0x00842374, 0, -1);
+	SetMessageHandler(&AsScene1201Match::handleMessage40C360);
+	_newHashListIndex = 0;
+}
+
+AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman)
+	: AnimatedSprite(vm, 900), _soundResource(vm), _parentScene(parentScene), _klayman(klayman),
+	_flag(false) {
+	
+	createSurface(1100, 203, 199);
+	SetUpdateHandler(&AsScene1201Creature::update);
+	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
+	_x = 540;
+	_y = 320;
+	sub40C8E0();
+	_countdown3 = 2;
+}
+
+void AsScene1201Creature::update() {
+	bool oldFlag = _flag;
+	_flag = _x >= 385;
+	if (_flag != oldFlag)
+		sub40C8E0();
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+		removeCallbacks();
+	}
+	updateAnim();
+	handleSpriteUpdate();
+	updatePosition();
+}
+
+uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02060018) {
+			_soundResource.play(0xCD298116);
+		}
+		break;
+	case 0x2004:
+		setCallback2(AnimationCallback(&AsScene1201Creature::sub40C960));
+		break;
+	case 0x2006:
+		setCallback2(AnimationCallback(&AsScene1201Creature::sub40C9B0));
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage40C710(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02421405) {
+			if (_countdown2 != 0 && (--_countdown2 == 0)) {
+				sub40C990();
+			}
+		}
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02060018) {
+			_soundResource.play(0xCD298116);
+			_parentScene->sendMessage(0x4814, 0, this);
+			_klayman->sendMessage(0x4814, 0, this);
+		}
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1201Creature::sub40C8E0() {
+	_countdown3--;
+	if (_countdown3 == 0)
+		_countdown3 = 3;
+	setFileHash(0x08081513, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
+	SetAnimationCallback3(&AsScene1201Creature::sub40C930);
+	_countdown1 = 36;
+}
+
+void AsScene1201Creature::sub40C930() {
+	if (!_flag) {
+		setFileHash(0xCA287133, 0, -1);
+		SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0);
+		SetAnimationCallback3(&AsScene1201Creature::sub40C8E0);
+	}
+}
+
+void AsScene1201Creature::sub40C960() {
+	setFileHash(0x08081513, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
+	SetAnimationCallback3(&AsScene1201Creature::sub40C9E0);
+	_countdown1 = 48;
+}
+
+void AsScene1201Creature::sub40C990() {
+	setFileHash2(0x0B6E13FB, 0x01084280, 0);
+}
+
+void AsScene1201Creature::sub40C9B0() {
+	setFileHash(0xCA287133, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::handleMessage40C830);
+	SetAnimationCallback3(&AsScene1201Creature::sub40C8E0);
+	_countdown1 = 0;
+}
+
+void AsScene1201Creature::sub40C9E0() {
+	setFileHash(0x5A201453, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
+	_countdown1 = 0;
 }
 
 AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
@@ -543,7 +786,8 @@ void AsScene1201LeftDoor::sub40D590() {
 }
 
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag(false) {
+	: Scene(vm, parentModule, true), _flag(false), _asMatch(NULL), _asTntMan(NULL),
+	_asCreature(NULL), _class466(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) {
 
 	int16 topY1, topY2, topY3, topY4;
 	int16 x1, x2;
@@ -589,12 +833,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = addSprite(new StaticSprite(_vm, 0x04063110, 500));
 	topY4 = tempSprite->getY() + 1; 
 
-	_class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1 ? 1 : 0));
+	_class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1));
 	_class466->getSurface()->getClipRect().x1 = 0;
 	_class466->getSurface()->getClipRect().y1 = topY4;
 	_class466->getSurface()->getClipRect().x2 = 640;
 	_class466->getSurface()->getClipRect().y2 = 480;
-
+	
 	addSprite(new StaticSprite(_vm, 0x400B04B0, 1200));
 
 	tempSprite = addSprite(new StaticSprite(_vm, 0x40295462, 1200));
@@ -644,31 +888,31 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		_background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0));
 		_palette = new Palette(_vm, 0x4019A2C4);
 		_palette->usePalette();
-		_class468 = NULL;
+		_asRightDoor = NULL;
 	} else {
 		_background = addBackground(new DirtyBackground(_vm, 0x40206EC5, 0, 0));
 		_palette = new Palette(_vm, 0x40206EC5);
 		_palette->usePalette();
-		_class468 = addSprite(new Class468(_vm, _klayman, which - 2 != 1)); // CHECKME???
+		_asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2));
 	}
 
 	if (getGlobalVar(0x000CF819)) {
 		addSprite(new StaticSprite(_vm, 0x10002ED8, 500));
 		if (!getGlobalVar(0x0A18CA33)) {
-			Class463 *class463;
-			class463 = new Class463(_vm, this, _class466, which - 1 != 1);
-			class463->getSurface()->getClipRect().x1 = x1;
-			class463->getSurface()->getClipRect().y1 = 0;
-			class463->getSurface()->getClipRect().x2 = x2;
-			class463->getSurface()->getClipRect().y2 = 480;
-			_vm->_collisionMan->addSprite(_class463);
-			_class463 = addSprite(class463);
-			tempSprite = addSprite(new Class465(_vm, _class463));
+			AsScene1201TntMan *asTntMan;
+			asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1);
+			asTntMan->getSurface()->getClipRect().x1 = x1;
+			asTntMan->getSurface()->getClipRect().y1 = 0;
+			asTntMan->getSurface()->getClipRect().x2 = x2;
+			asTntMan->getSurface()->getClipRect().y2 = 480;
+			_vm->_collisionMan->addSprite(asTntMan);
+			_asTntMan = addSprite(asTntMan);
+			tempSprite = addSprite(new Class465(_vm, _asTntMan));
 			tempSprite->getSurface()->getClipRect().x1 = x1;
 			tempSprite->getSurface()->getClipRect().y1 = 0;
 			tempSprite->getSurface()->getClipRect().x2 = x2;
 			tempSprite->getSurface()->getClipRect().y2 = 480;
-			class463->setRepl(64, 0);
+			asTntMan->setRepl(64, 0);
 		}
 		
 		uint32 tntIndex = 1; 
@@ -741,22 +985,20 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		setGlobalVar(0x0112090A, 1);
 	}
 
-	_class461 = NULL;
+	_asMatch = NULL;
 
-#if 0	
 	if (getGlobalVar(0x0112090A) < 3) {
-		_class461 = addSprite(new Class461(_vm, this));
-		_vm->_collisionMan->addSprite(_class461);
+		_asMatch = addSprite(new AsScene1201Match(_vm, this));
+		_vm->_collisionMan->addSprite(_asMatch);
 	}
 
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
-		_class462 = addSprite(new Class462(_vm, this, _klayman));
-		_class462->getSurface()->getClipRect().x1 = x1;
-		_class462->getSurface()->getClipRect().y1 = 0;
-		_class462->getSurface()->getClipRect().x2 = x2;
-		_class462->getSurface()->getClipRect().y2 = 480;
+		_asCreature = addSprite(new AsScene1201Creature(_vm, this, _klayman));
+		_asCreature->getSurface()->getClipRect().x1 = x1;
+		_asCreature->getSurface()->getClipRect().y1 = 0;
+		_asCreature->getSurface()->getClipRect().x2 = x2;
+		_asCreature->getSurface()->getClipRect().y2 = 480;
 	}
-#endif
 
 }
 
@@ -765,8 +1007,8 @@ Scene1201::~Scene1201() {
 
 void Scene1201::update() {
 	Scene::update();
-	if (_class461 && getGlobalVar(0x0112090A)) {
-		deleteSprite(&_class461);
+	if (_asMatch && getGlobalVar(0x0112090A)) {
+		deleteSprite(&_asMatch);
 	}
 }
 
@@ -777,12 +1019,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x07053000) {
 			_flag = true;
-			_class462->sendMessage(0x2004, 0, this);
+			_asCreature->sendMessage(0x2004, 0, this);
 		} else if (param.asInteger() == 0x140E5744) {
-			_class462->sendMessage(0x2005, 0, this);
+			_asCreature->sendMessage(0x2005, 0, this);
 		} else if (param.asInteger() == 0x40253C40) {
 			_messageListFlag = false;
-			_class462->sendMessage(0x2006, 0, this);
+			_asCreature->sendMessage(0x2006, 0, this);
 		} else if (param.asInteger() == 0x090EB048) {
 			if (_klayman->getX() < 572) {
 				setMessageList2(0x004AEC90);
@@ -795,17 +1037,17 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (!getGlobalVar(0x0112090A)) {
 			setMessageList2(0x004AECB0);
 		} else {
-			_klayman->sendEntityMessage(0x1014, _class461, this);
+			_klayman->sendEntityMessage(0x1014, _asMatch, this);
 			setMessageList2(0x004AECC0);
 		}
 		break;
 	case 0x2002:		
 		if (getGlobalVar(0x20A0C516)) {
-			_klayman->sendEntityMessage(0x1014, _class463, this);
+			_klayman->sendEntityMessage(0x1014, _asTntMan, this);
 			setMessageList2(0x004AECF0);
 		} else if (getGlobalVar(0x0112090A) == 3) {
-			_klayman->sendEntityMessage(0x1014, _class463, this);
-			if (_klayman->getX() > _class463->getX()) {
+			_klayman->sendEntityMessage(0x1014, _asTntMan, this);
+			if (_klayman->getX() > _asTntMan->getX()) {
 				setMessageList(0x004AECD0);
 			} else {
 				setMessageList(0x004AECE0);
@@ -822,10 +1064,253 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4829:
-		_class468->sendMessage(0x4829, 0, this);
+		_asRightDoor->sendMessage(0x4829, 0, this);
+		break;		
+	}
+	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 index)
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _index(index) {
+
+	int positionIndex;
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0);
+	positionIndex = getSubVar(0x10055D14, _index);
+	createSurface(900, 37, 67);
+	_x = kScene1202Points[positionIndex].x;
+	_y = kScene1202Points[positionIndex].y;
+	sub4540A0();
+}
+
+uint32 AsScene1202TntItem::handleMessage453FE0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x2000, _index, this);
+		messageResult = 1;
+		break;
+	case 0x2001:
+		_index2 = (int)param.asInteger();
+		sub4540D0();
 		break;		
 	}
 	return messageResult;
 }
 
+uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1202TntItem::sub4540A0() {
+	setFileHash(kScene1202FileHashes[_index], 0, -1);
+	SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0);
+	_newHashListIndex = 0;
+}
+
+void AsScene1202TntItem::sub4540D0() {
+	setFileHash(kScene1202FileHashes[_index], 0, -1);
+	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
+	SetAnimationCallback3(&AsScene1202TntItem::sub454100);
+}
+
+void AsScene1202TntItem::sub454100() {
+	_x = kScene1202Points[_index2].x;
+	_y = kScene1202Points[_index2].y;
+	setFileHash(kScene1202FileHashes[_index], 6, -1);
+	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
+	SetAnimationCallback3(&AsScene1202TntItem::sub454160);
+	_playBackwards = true;
+}
+
+void AsScene1202TntItem::sub454160() {
+	_parentScene->sendMessage(0x2002, _index, this);
+	sub4540A0();
+}
+
+Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _paletteResource(vm), _soundResource1(vm), 
+	_soundResource2(vm), _soundResource3(vm), _soundResource4(vm),
+	_flag(true), _soundFlag(false), _counter(0), _index(-1) {
+
+	Palette2 *palette2;
+
+	SetMessageHandler(&Scene1202::handleMessage453C10);
+	SetUpdateHandler(&Scene1202::update);
+
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x60210ED5, 0, 0));
+
+	palette2 = new Palette2(_vm, 0x60210ED5);
+	palette2->usePalette();
+	_palette = palette2;
+	addEntity(_palette);
+
+	_paletteResource.load(0x60250EB5);
+	_paletteResource.copyPalette(_paletteData);
+
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x10ED160A, 20, 620));
+
+	for (int i = 0; i < 18; i++) {
+		_asTntItems[i] = addSprite(new AsScene1202TntItem(_vm, this, i));
+		_vm->_collisionMan->addSprite(_asTntItems[i]);
+	}
+
+	addSprite(new StaticSprite(_vm, 0x8E8419C1, 1100));
+
+	if (getGlobalVar(0x000CF819)) {
+		SetMessageHandler(&Scene1202::handleMessage453D90);
+	}
+
+	_soundResource1.play(0x40106542);
+	_soundResource2.load(0x40005446);
+	_soundResource2.load(0x40005446);
+	_soundResource2.load(0x68E25540);
+
+}
+
+Scene1202::~Scene1202() {
+	if (isSolved()) {
+		setGlobalVar(0x000CF819, 1);
+	}
+}
+
+void Scene1202::update() {
+	Scene::update();
+	if (_soundFlag) {
+		if (!_soundResource4.isPlaying()) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+	} else if (_counter == 0 && isSolved()) {
+		SetMessageHandler(&Scene1202::handleMessage453D90);
+		setGlobalVar(0x000CF819, 1);
+		doPaletteEffect();
+		_soundResource4.play();
+		_soundFlag = true;
+	} else if (_index >= 0 && _counter == 0) {
+		int index2 = kScene1202Table[_index];
+		_asTntItems[_index]->sendMessage(0x2001, getSubVar(0x10055D14, index2), this);
+		_asTntItems[index2]->sendMessage(0x2001, getSubVar(0x10055D14, _index), this);
+		int temp = getSubVar(0x10055D14, index2);
+		setSubVar(0x10055D14, index2, getSubVar(0x10055D14, _index));
+		setSubVar(0x10055D14, _index, temp);
+		_counter = 2;
+		_index = -1;
+		if (_flag) {
+			_soundResource2.play();
+		} else {
+			_soundResource3.play();
+		}
+		_flag = !_flag;
+	}
+}
+
+uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO: Debug/Cheat stuff
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x000D:
+		if (param.asInteger() == 0x14210006) {
+			// TODO: Debug/Cheat stuff
+			messageResult = 1;
+		}
+		break;
+	case 0x2000:
+		_index = (int)param.asInteger();
+		break;
+	case 0x2002:
+		_counter--;
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	}
+	return 0;
+}
+
+bool Scene1202::isSolved() {
+	return 
+		getSubVar(0x10055D14,  0) ==  0 && getSubVar(0x10055D14,  3) ==  3 && 
+		getSubVar(0x10055D14,  6) ==  6 && getSubVar(0x10055D14,  9) ==  9 &&
+		getSubVar(0x10055D14, 12) == 12 && getSubVar(0x10055D14, 15) == 15;
+}
+
+void Scene1202::doPaletteEffect() {
+#if 0 // TODO
+	Palette2 *palette2 = (Palette2*)_palette;
+	palette2->startFadeToPalette(24);
+#endif
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index 2a8a933..3ffed44 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -70,9 +70,9 @@ protected:
 	void sub40D380();
 };
 
-class Class468 : public AnimatedSprite {
+class AsScene1201RightDoor : public AnimatedSprite {
 public:
-	Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag);
+	AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag);
 protected:
 	SoundResource _soundResource;
 	Sprite *_klayman;
@@ -91,10 +91,10 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class463 : public AnimatedSprite {
+class AsScene1201TntMan : public AnimatedSprite {
 public:
-	Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag);
-	virtual ~Class463();
+	AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag);
+	virtual ~AsScene1201TntMan();
 protected:
 	Scene *_parentScene;
 	Sprite *_class466;
@@ -111,14 +111,56 @@ protected:
 
 class Class465 : public AnimatedSprite {
 public:
-	Class465(NeverhoodEngine *vm, Sprite *class463);
+	Class465(NeverhoodEngine *vm, Sprite *asTntMan);
 	~Class465();
 protected:
-	Sprite *_class463;
+	Sprite *_asTntMan;
 	void update();
 	void spriteUpdate40D150();
 };
 
+class AsScene1201Match : public AnimatedSprite {
+public:
+	AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	int _countdown;
+	int _status;
+	void update();
+	uint32 handleMessage40C2D0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40C320(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40C360(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40C3E0();
+	void sub40C420();
+	void sub40C470();
+	void sub40C4C0();
+	void sub40C4F0();
+};
+
+class AsScene1201Creature : public AnimatedSprite {
+public:
+	AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman);
+protected:
+	Scene *_parentScene;
+	Sprite *_klayman;
+	SoundResource _soundResource;
+	int _countdown1;
+	int _countdown2;
+	int _countdown3;
+	bool _flag;
+	void update();
+	uint32 handleMessage40C710(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40C7B0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40C830(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40C8E0();
+	void sub40C930();
+	void sub40C960();
+	void sub40C990();
+	void sub40C9B0();
+	void sub40C9E0();
+};
+
 class AsScene1201LeftDoor : public AnimatedSprite {
 public:
 	AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman);
@@ -144,18 +186,57 @@ public:
 protected:
 	// TODO ResourceTable _resourceTable1;
 	// TODO ResourceTable _resourceTable2;
-	Sprite *_class461;
-	Sprite *_class463;
-	Sprite *_class462;
+	Sprite *_asMatch;
+	Sprite *_asTntMan;
+	Sprite *_asCreature;
 	Sprite *_class466;
 	Sprite *_asLeftDoor;
-	Sprite *_class468;
+	Sprite *_asRightDoor;
 	Sprite *_asTape;
 	bool _flag;
 	void update();
 	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 _index, _index2;
+	uint32 handleMessage453FE0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage454060(int messageNum, const MessageParam &param, Entity *sender);
+	void sub4540A0();
+	void sub4540D0();
+	void sub454100();
+	void sub454160();
+};
+
+class Scene1202 : public Scene {
+public:
+	Scene1202(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene1202();
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	PaletteResource _paletteResource;
+	Sprite *_asTntItems[18];
+	int _counter;
+	int _index;
+	byte _paletteData[1024];
+	bool _soundFlag;
+	bool _flag;
+	void update();
+	uint32 handleMessage453C10(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage453D90(int messageNum, const MessageParam &param, Entity *sender);
+	bool isSolved();
+	void doPaletteEffect();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1200_H */
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
new file mode 100644
index 0000000..7d618f5
--- /dev/null
+++ b/engines/neverhood/module1400.cpp
@@ -0,0 +1,1439 @@
+/* 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/module1400.h"
+#include "neverhood/module1000.h"
+#include "neverhood/diskplayerscene.h"
+#include "neverhood/navigationscene.h"
+
+namespace Neverhood {
+
+Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	debug("Create Module1400(%d)", which);
+
+	// TODO Music18hList_add(0x00AD0012, 0x06333232);
+	// TODO Music18hList_add(0x00AD0012, 0x624A220E);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 1:
+			createScene1402(-1);
+			break;
+		case 2:
+			createScene1403(-1);
+			break;
+		case 3:
+			createScene1404(-1);
+			break;
+		case 4:
+			createScene1405(-1);
+			break;
+		case 5:
+			createScene1406(-1);
+			break;
+		case 6:
+			createScene1407(-1);
+			break;
+		default:
+			createScene1401(-1);
+		}
+	} else {
+		createScene1401(0);
+	}
+
+}
+
+Module1400::~Module1400() {
+	// TODO Music18hList_deleteGroup(0x00AD0012);
+}
+
+void Module1400::createScene1401(int which) {
+	_vm->gameState().sceneNum = 0;
+	// TODO Music18hList_play(0x06333232, 0, 2, 1);
+	_childObject = new Scene1401(_vm, this, which);
+	SetUpdateHandler(&Module1400::updateScene1401);
+}
+
+void Module1400::createScene1402(int which) {
+	_vm->gameState().sceneNum = 1;
+	// TODO Music18hList_stop(0x06333232, 0, 2);
+	// TODO Music18hList_stop(0x624A220E, 0, 2);
+	_childObject = new Scene1402(_vm, this, which);
+	SetUpdateHandler(&Module1400::updateScene1402);
+}
+
+void Module1400::createScene1403(int which) {
+	_vm->gameState().sceneNum = 2;
+	// TODO Music18hList_stop(0x06333232, 0, 2);
+	// TODO Music18hList_play(0x624A220E, 0, 2, 1);
+	// TODO _childObject = new Scene1403(_vm, this, which);
+	SetUpdateHandler(&Module1400::updateScene1403);
+}
+
+void Module1400::createScene1404(int which) {
+	_vm->gameState().sceneNum = 3;
+	// TODO Music18hList_play(0x06333232, 0, 2, 1);
+	// TODO _childObject = new Scene1404(_vm, this, which);
+	SetUpdateHandler(&Module1400::updateScene1404);
+}
+
+void Module1400::createScene1405(int which) {
+	_vm->gameState().sceneNum = 4;
+	// TODO Music18hList_play(0x06333232, 0, 2, 1);
+	// TODO _childObject = new Scene1405(_vm, this, which);
+	SetUpdateHandler(&Module1400::updateScene1405);
+}
+
+void Module1400::createScene1406(int which) {
+	_vm->gameState().sceneNum = 5;
+	// TODO Music18hList_stop(0x06333232, 0, 2);
+	_childObject = new DiskplayerScene(_vm, this, 2);
+	SetUpdateHandler(&Module1400::updateScene1405);
+}
+
+void Module1400::createScene1407(int which) {
+	_vm->gameState().sceneNum = 6;
+	// TODO Music18hList_stop(0x06333232, 0, 2);
+	_childObject = new Scene1407(_vm, this, which);
+	SetUpdateHandler(&Module1400::updateScene1407);
+}
+
+void Module1400::updateScene1401() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene1402(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene1404(0);
+			_childObject->handleUpdate();
+		} else {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+	}
+}
+
+void Module1400::updateScene1402() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		
+		debug("Scene1402: _field20 = %d", _field20);
+		
+		if (_field20 == 1) {
+			createScene1403(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene1407(-1);
+			_childObject->handleUpdate();
+		} else {
+			createScene1401(1);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1400::updateScene1403() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1402(1);
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1400::updateScene1404() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene1405(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene1406(-1);
+			_childObject->handleUpdate();
+		} else {
+			createScene1401(2);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1400::updateScene1405() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1404(1);
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1400::updateScene1406() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1404(2);
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1400::updateScene1407() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1402(2);
+		_childObject->handleUpdate();
+	}
+}
+
+// Scene1401
+
+Class525::Class525(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm),
+	_countdown1(0), _countdown2(0) {
+	
+	// TODO createSurface3(900, dword_4B6768);
+	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
+	_x = 454;
+	_y = 217;
+	SetUpdateHandler(&Class525::update4662A0);
+	SetMessageHandler(&Class525::handleMessage466320);
+	setFileHash(0x4C210500, 0, -1);
+}
+
+Class525::~Class525() {
+	// TODO Sound1ChList_sub_407AF0(0x01104C08);
+}
+
+void Class525::update4662A0() {
+	AnimatedSprite::update();
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+		sub466460();
+	}
+	if (_countdown2 != 0 && (--_countdown2 == 0)) {
+		// TODO Sound1ChList_addSoundResource(0x01104C08, 0x4A116437, true);
+		// TODO Sound1ChList_playLooping(0x4A116437);
+	}
+}
+
+void Class525::update466300() {
+	AnimatedSprite::update();
+	if (_countdown1 != 0) {
+		_countdown1--;
+	}
+}
+
+uint32 Class525::handleMessage466320(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0A8A1490) {
+			_soundResource2.play(0x6AB6666F);
+		}
+		break;
+	case 0x2000:
+		_countdown1 = 70;
+		_countdown2 = 8;
+		sub466420();
+		break;		
+	case 0x483A:
+		sub4664B0();
+		break;		
+	}
+	return messageResult;
+}
+
+uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		if (_countdown1 != 0) {
+			sub466420();
+		} else {
+			sub466460();
+		}
+		SetMessageHandler(&Class525::handleMessage466320);
+		SetUpdateHandler(&Class525::update4662A0);
+		break;
+	}
+	return messageResult;
+}
+
+void Class525::sub466420() {
+	setFileHash(0x4C240100, 0, -1);
+	_soundResource1.play(0x4A30063F);
+}
+
+void Class525::sub466460() {
+	// TODO Sound1ChList_deleteSoundByHash(0x4A116437);
+	_soundResource1.play(0x4A120435);
+	setFileHash(0x4C210500, 0, -1);
+}
+
+void Class525::sub4664B0() {
+	setFileHash(0x6C210810, 0, -1);
+		SetMessageHandler(&Class525::handleMessage4663C0);
+		SetUpdateHandler(&Class525::update466300);
+}
+
+Class526::Class526(NeverhoodEngine *vm, Sprite *class525)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _class525(class525) {
+	
+	// TODO createSurface3(100, dword_4B6778);
+	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
+	_x = 478;
+	_y = 433;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class526::handleMessage);
+	setFileHash(0xA282C472, 0, -1);
+}
+
+uint32 Class526::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x66382026) {
+			_soundResource.play(0x0CD84468);
+		} else if (param.asInteger() == 0x6E28061C) {
+			_soundResource.play(0x78C8402C);
+		} else if (param.asInteger() == 0x462F0410) {
+			_soundResource.play(0x60984E28);
+		}
+		break;
+	case 0x4839:
+		sub466770();
+		break;		
+	}
+	return messageResult;
+}
+
+void Class526::spriteUpdate466720() {
+	AnimatedSprite::updateDeltaXY();
+	if (_rect.y1 <= 150) {
+		_soundResource.play(0x0E32247F);
+		setFileHash1();
+		SetSpriteCallback(NULL);
+		SetMessageHandler(NULL);
+		_surface->setVisible(false);
+	}
+}
+
+void Class526::sub466770() {
+	setFileHash(0x34880040, 0, -1);
+	SetSpriteCallback(&Class526::spriteUpdate466720);
+}
+
+Class527::Class527(NeverhoodEngine *vm, Sprite *class526)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _class526(class526) {
+
+	// TODO createSurface3(200, dword_4B6768);
+	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
+	_x = 427;
+	_y = 433;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class527::handleMessage);
+	setFileHash(0x461A1490, 0, -1);
+}
+
+uint32 Class527::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4839:
+		sub466970();
+		break;		
+	}
+	return messageResult;
+}
+
+void Class527::spriteUpdate466920() {
+	AnimatedSprite::updateDeltaXY();
+	if (_rect.y1 <= 150) {
+		_soundResource.play(0x18020439);
+		setFileHash1();
+		SetSpriteCallback(NULL);
+		SetMessageHandler(NULL);
+		_surface->setVisible(false);
+	}
+}
+
+void Class527::sub466970() {
+	setFileHash(0x103B8020, 0, -1);
+	SetSpriteCallback(&Class527::spriteUpdate466920);
+}
+
+Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(100, 0x04551900);
+	SetUpdateHandler(&Class528::update);
+	SetMessageHandler(&Class528::handleMessage);
+	_newHashListIndex = -2;
+	if (flag) {
+		_flag = true;
+		setFileHash(0x04551900, -1,- 1);
+		_countdown = 48;
+	} else {
+		_flag = false;
+		setFileHash1();
+		_surface->setVisible(false);
+	}
+}
+
+void Class528::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		sub466C50();
+	}
+	AnimatedSprite::update();
+}
+
+
+uint32 Class528::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		if (_flag)
+			_countdown = 168;
+		messageResult = _flag ? 1 : 0;			
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		_countdown = 168;
+		if (_flag)
+			sub466BF0();
+		break;						
+	}
+	return messageResult;
+}
+
+void Class528::sub466BF0() {
+	_flag = true;
+	_surface->setVisible(true);
+	setFileHash(0x04551900, 0, -1);
+	_newHashListIndex = -2;
+	_soundResource.play(calcHash("fxDoorOpen24"));
+}
+
+void Class528::sub466C50() {
+	_flag = false;
+	_surface->setVisible(true);
+	setFileHash(0x04551900, -1, -1);
+	_soundResource.play(calcHash("fxDoorClose24"));
+	_playBackwards = true;
+	SetAnimationCallback3(&Class528::sub466CB0);
+}
+
+void Class528::sub466CB0() {
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+static const Class489Item kClass489Items[] = {
+	{{154, 453}, 4,  2,  0, -1, 0, 1},
+	{{104, 391}, 4, -1, -1, -1, 1, 1},
+	{{ 22, 447}, 6, -1, -1, -1, 1, 1},
+	{{112, 406}, 2, -1, -1, -1, 1, 0},
+	{{262, 433}, 1,  1,  0, -1, 0, 0}
+};
+
+Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525),
+	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm) {
+
+	_class489Item = &kClass489Items[getGlobalVar(0x04A105B3)];
+	// TODO createSurface3(990, dword_4B26D8);
+	createSurface(990, 640, 480); //TODO: Remeove once the line above is done
+	setFileHash(0x10E3042B, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class489::handleMessage);
+	_x = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
+	_flag = true;
+	sub434C80();
+	setDoDeltaX(1);
+	if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) {
+		sub434E90();
+	}
+	_soundResource3.load(0xC8C2507C);
+}
+
+Class489::~Class489() {
+	// TODO Sound1ChList_sub_407AF0(0x05331081);
+}
+
+uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4807:
+		setGlobalVar(0x04A10F33, (_x - _class489Item->point.x) / 108);
+		if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) {
+			sub434E60();
+		} else {
+			sub434DD0();
+		}
+		break;
+	case 0x480B:
+		if (param.asInteger() != 1) {
+			if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) {
+				incGlobalVar(0x04A10F33, 1);
+			}
+		} else if (getGlobalVar(0x04A10F33) > 0) {
+			incGlobalVar(0x04A10F33, -1);
+		}
+		sub434DF0();
+		break;
+	case 0x480C:
+		if (param.asInteger() != 1) {
+			messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0;
+		} else {
+			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
+		}
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	case 0x4828:
+		sub435040();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Class489::handleMessage4348E0(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) {
+			_parentScene->sendMessage(0x4826, 1, this);
+		} else {
+			_parentScene->sendMessage(0x4826, 0, this);
+		}
+		messageResult = 1;
+		break;
+	case 0x4807:
+		_parentScene->sendMessage(0x4807, 0, this);
+		sub434F80();
+		break;
+	case 0x480B:
+		if (param.asInteger() != 1) {
+			if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) {
+				incGlobalVar(0x04A10F33, 1);
+			}
+		} else if (getGlobalVar(0x04A10F33) > 0) {
+			incGlobalVar(0x04A10F33, -1);
+		}
+		sub434FF0();
+		break;
+	case 0x480C:
+		if (param.asInteger() != 1) {
+			messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0;
+		} else {
+			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
+		}
+		break;
+	case 0x480F:
+		sub434EC0();
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Class489::handleMessage434B20(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class489::spriteUpdate434B60() {
+	if (_x <= _klayman->getX())
+		_x = _klayman->getX() - 100;
+	else
+		_x = _klayman->getX() + 100;
+	sub434C80();
+	if (_remX == _x) {
+		if (getGlobalVar(0x04A10F33) == 0 && _class489Item->flag4 != 0) {
+			_parentScene->sendMessage(0x1019, 0, this);
+			incGlobalVar(0x04A105B3, -1);
+			setGlobalVar(0x04A10F33, kClass489Items[getGlobalVar(0x04A105B3)].varIndex1);
+		} else if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex1 && _class489Item->flag != 0) {
+			_parentScene->sendMessage(0x1019, 1, this);
+			incGlobalVar(0x04A105B3, +1);
+			setGlobalVar(0x04A10F33, 0);
+		}
+	}
+	Sprite::processDelta();
+}
+
+void Class489::sub434C80() {
+
+	bool soundFlag = false;
+
+	_y = _class489Item->point.y;
+
+	if (_class489Item->index1 != -1) {
+		int16 elX = _class489Item->index1 * 108 + _class489Item->point.x;
+		if (elX - 20 < _x && elX + 20 > _x) {
+			soundFlag = true;
+			_y = _class489Item->point.y + 10;
+		}
+	}
+
+	if (_class489Item->flag2 != -1) {
+		int16 elX = _class489Item->index1 * 108 + _class489Item->point.x;
+		if (elX - 20 < _x && elX + 20 > _x) {
+			soundFlag = true;
+			_y = _class489Item->point.y + 10;
+		}
+	}
+
+	if (_class489Item->varIndex2 != -1) {
+		int16 elX = _class489Item->varIndex2 * 108 + _class489Item->point.x;
+		if (elX - 20 < _x && elX + 20 > _x) {
+			soundFlag = true;
+			_y = _class489Item->point.y + 10;
+		}
+	}
+
+	if (_flag) {
+		if (!soundFlag) {
+			_flag = false;
+		}
+	} else if (soundFlag) {
+		_soundResource2.play(0x5440E474);
+		_flag = true;
+	}
+	
+}
+
+void Class489::sub434D80() {
+	AnimatedSprite::updateDeltaXY();
+	if (_rect.y1 <= 150) {
+		_class525->sendMessage(0x483A, 0, this);
+		setFileHash1();
+		SetMessageHandler(&Sprite::handleMessage);
+		SetSpriteCallback(NULL);
+		_surface->setVisible(false);
+	}
+}
+
+void Class489::sub434DD0() {
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Class489::handleMessage);
+	setFileHash(0x10E3042B, 0, -1);
+}
+
+void Class489::sub434DF0() {
+	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
+	setFileHash(0x14A10137, 0, -1);
+	SetSpriteCallback(&Class489::spriteUpdate434B60);
+	SetMessageHandler(&Class489::handleMessage);
+	_soundResource2.play(0xEC008474);
+}
+
+void Class489::sub434E60() {
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Class489::handleMessage434B20);
+	setFileHash(0x80C32213, 0, -1);
+	SetAnimationCallback3(&Class489::sub434E90);
+}
+
+void Class489::sub434E90() {
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Class489::handleMessage4348E0);
+	setFileHash(0xD23B207F, 0, -1);
+}
+
+void Class489::sub434EC0() {
+	setFileHash(0x50A80517, 0, -1);
+	SetMessageHandler(&Class489::handleMessage434B20);
+	SetSpriteCallback(NULL);
+	SetAnimationCallback3(&Class489::sub434F40);
+	setGlobalVar(0x12A10DB3, 1);
+	_soundResource1.play(0xCC4A8456);
+	// TODO Sound1ChList_addSoundResource(0x05331081, 0xCE428854, true);
+	// TODO Sound1ChList_playLooping(0xCE428854);
+}
+
+void Class489::sub434F40() {
+	_parentScene->sendMessage(0x480F, 0, this);
+	setFileHash(0xD833207F, 0, -1);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Class489::handleMessage4348E0);
+}
+
+void Class489::sub434F80() {
+	setFileHash(0x50A94417, 0, -1);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Class489::handleMessage434B20);
+	SetAnimationCallback3(&Class489::sub434E90);
+	setGlobalVar(0x12A10DB3, 0);
+	_soundResource1.play(0xCC4A8456);
+	// TODO Sound1ChList_deleteSoundByHash(0xCE428854);
+}
+
+void Class489::sub434FF0() {
+	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
+	setFileHash(0x22CB4A33, 0, -1);
+	SetSpriteCallback(&Class489::spriteUpdate434B60);
+	SetMessageHandler(&Class489::handleMessage434B20);
+	SetAnimationCallback3(&Class489::sub434DF0);
+}
+
+void Class489::sub435040() {
+	setGlobalVar(0x04A105B3, 4);
+	setGlobalVar(0x04A10F33, 0);
+	SetSpriteCallback(&Class489::sub434D80);
+	SetMessageHandler(&Sprite::handleMessage);
+	setFileHash(0x708D4712, 0, -1);
+	_soundResource3.play();
+}
+
+Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _flag(false), _class427(NULL), _class489(NULL), 
+	_class525(NULL), _class526(NULL), _class527(NULL), _class528(NULL), 
+	_sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) {
+
+	SetMessageHandler(&Scene1401::handleMessage);
+	SetUpdateHandler(&Scene1401::update);
+	setRectList(0x004B6758);
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x08221FA5, 0, 0));
+	_palette = new Palette(_vm, 0x08221FA5);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x21FA108A, NULL));
+	
+	// TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0));
+	_class525 = addSprite(new Class525(_vm));
+
+	if (!getGlobalVar(0x01023818)) {
+		_class526 = addSprite(new Class526(_vm, _class525));
+		_class527 = addSprite(new Class527(_vm, _class525));
+	}
+
+	_sprite3 = addSprite(new StaticSprite(_vm, 0xA82BA811, 1100));
+	addSprite(new StaticSprite(_vm, 0x0A116C60, 1100));
+	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0));
+	_sprite1 = addSprite(new StaticSprite(_vm, 0x38EA100C, 1005));
+	_sprite2 = addSprite(new StaticSprite(_vm, 0x98D0223C, 1200));
+	_sprite2->getSurface()->setVisible(false);
+
+	if (which < 0) {
+		_klayman = new KmScene1401(_vm, this, 380, 447);
+		setMessageList(0x004B65C8);
+		_sprite1->getSurface()->setVisible(false);
+	} else if (which == 1) {
+		_klayman = new KmScene1401(_vm, this, 0, 447);
+		setMessageList(0x004B65D0);
+		_sprite1->getSurface()->setVisible(false);
+	} else if (which == 2) {
+		_klayman = new KmScene1401(_vm, this, 660, 447);
+		setMessageList(0x004B65D8);
+		_sprite1->getSurface()->setVisible(false);
+	} else {
+		_klayman = new KmScene1401(_vm, this, 290, 413);
+		setMessageList(0x004B65E8);
+		_sprite1->getSurface()->setVisible(false);
+	}
+	addSprite(_klayman);
+
+	if (getGlobalVar(0x04A105B3) == 2) {
+		_class489 = addSprite(new Class489(_vm, this, _klayman, _class525));
+		_vm->_collisionMan->addSprite(_class489);
+		if (getGlobalVar(0x04A10F33) == 6) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			_klayman->setX(_class489->getX() + 100);
+			_klayman->processDelta();
+			setMessageList(0x004B6670);
+		} else if (getGlobalVar(0x04A10F33) == 0) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			_klayman->setX(_class489->getX() - 100);
+			_klayman->processDelta();
+			setMessageList(0x004B6670);
+		}
+		_class489->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x;
+		_class489->getSurface()->getClipRect().y1 = _sprite2->getSurface()->getDrawRect().y;
+		_class489->getSurface()->getClipRect().x2 = 640;
+		_class489->getSurface()->getClipRect().y2 = 480;
+	}
+	
+	_klayman->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+
+	if (which == 0 && _class489 && _class489->hasMessageHandler()) {
+		_class489->sendMessage(0x482B, 0, this);
+	}
+
+	_class528 = addSprite(new Class528(_vm, _klayman, which == 1));
+
+}
+
+void Scene1401::update() {
+	Scene::update();
+	if (_class489 && !_flag && _class489->getY() < 360) {
+		_sprite2->getSurface()->setVisible(true);
+		_flag = true;
+	} else {
+		_sprite2->getSurface()->setVisible(false);
+	}
+}
+
+uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02144CB1) {
+			_klayman->sendEntityMessage(0x1014, _class427, this);
+		} else if (param.asInteger() == 0x402064D8) {
+			_klayman->sendEntityMessage(0x1014, _ssButton, this);
+		} else if (param.asInteger() == 0x01C66840) {
+			if (_class528->hasMessageHandler() && _class528->sendMessage(0x2001, 0, this) != 0) {
+				setMessageList(0x004B6690);
+			} else {
+				setMessageList(0x004B66B0);
+			}
+		}
+		break;
+	case 0x1019:
+		if (param.asInteger() != 0) {
+			_parentModule->sendMessage(0x1009, 2, this);
+		} else {
+			_parentModule->sendMessage(0x1009, 1, this);
+		}			
+		break;
+	case 0x480B:
+		if (sender == _class427) {
+			_class525->sendMessage(0x2000, 0, this);
+			if (!getGlobalVar(0x01023818)) {
+				_class526->sendMessage(0x4839, 0, this);
+				_class527->sendMessage(0x4839, 0, this);
+				setGlobalVar(0x01023818, 1);
+			}
+			if (_class489 && _class489->getX() > 404 && _class489->getX() < 504) {
+				_class489 ->sendMessage(0x4839, 0, this);
+			}
+		} else if (sender == _ssButton) {
+			_ssButton->sendMessage(0x4808, 0, this);
+		}
+		break;
+	case 0x4826:
+		if (sender == _class489) {
+			if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
+				_klayman->sendEntityMessage(0x1014, _class489, this);
+				setMessageList2(0x004B6658);
+			} else {
+				setMessageList2(0x004B65F0);
+			}
+		}						
+		break;
+	case 0x482A:
+		_sprite1->getSurface()->setVisible(true);
+		if (_class489) {
+			_class489->sendMessage(0x482B, 0, this);
+		}
+		break;
+	case 0x482B:
+		_sprite1->getSurface()->setVisible(false);
+		if (_class489) {
+			_class489->sendMessage(0x482A, 0, this);
+		}
+		break;
+	}
+	return 0;
+}
+
+// Scene1402
+
+Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
+	: StaticSprite(vm, fileHash, surfacePriority) {
+	
+	SetFilterY(&Sprite::defFilterY);
+	SetUpdateHandler(&StaticSprite::update);
+	
+}
+
+Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource1(vm),
+	_soundResource2(vm) {
+
+	// TODO createSurface3(900, dword_4B6768);
+	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
+
+	SetFilterY(&Sprite::defFilterY);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class482::handleMessage);
+	_x = 279;
+	_y = 270;
+	if (which == 2) {
+		setFileHash(0x20060259, 0, -1);
+		_soundResource1.play(0x419014AC);
+		_soundResource2.load(0x61901C29);
+	} else if (which == 1) {
+		setFileHash(0x210A0213, 0, -1);
+		_soundResource1.play(0x41809C6C);
+	} else {
+		setFileHash(0x20060259, 0, -1);
+		_soundResource2.load(0x61901C29);
+		_newHashListIndex = -2;
+	}
+}
+
+uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		_soundResource2.play();
+		setFileHash(0x20060259, -1, -1);
+		_playBackwards = true;
+		SetAnimationCallback3(&Class482::sub428530);
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class482::sub428500() {
+	_parentScene->sendMessage(0x2000, 0, this);
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+void Class482::sub428530() {
+	_parentScene->sendMessage(0x2001, 0, this);
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+void Class482::sub428560() {
+	_parentScene->sendMessage(0x2003, 0, this);
+	setFileHash1();
+}
+
+Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _flag(false), _class482(NULL), _class489(NULL) {
+
+	SetMessageHandler(&Scene1402::handleMessage);
+
+	_background = addBackground(new Background(_vm, 0x231482F0, 0, 0));
+	_background->getSurface()->getDrawRect().y = -10;
+	// TODO g_screen->field_26 = 0;
+	_palette = new Palette(_vm, 0x231482F0);
+	_palette->addPalette(0x91D3A391, 0, 64, 0);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x482F4239, NULL));
+
+	_class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100));
+	_class454_2 = addSprite(new Class454(_vm, 0x10A02120, 1100));
+	_class454_3 = addSprite(new Class454(_vm, 0x60882BE0, 1100));
+
+	if (getGlobalVar(0x70A1189C))
+		setRectList(0x004B0C48);
+	else
+		setRectList(0x004B0C98);
+
+	if (which < 0) {
+		_klayman = new KmScene1402(_vm, this, 377, 391);
+		setMessageList(0x004B0B48);
+		if (!getGlobalVar(0x70A1189C)) {
+			_class482 = addSprite(new Class482(_vm, this, 0));
+		}
+	} else if (which == 1) {
+		_klayman = new KmScene1402(_vm, this, 42, 391);
+		setMessageList(0x004B0B50);
+	} else if (which == 2) {
+		_klayman = new KmScene1402(_vm, this, 377, 391);
+		setMessageList(0x004B0B60);
+		_klayman->setDoDeltaX(1);
+		if (getGlobalVar(0x70A1189C)) {
+			_class482 = addSprite(new Class482(_vm, this, 1));
+			clearRectList();
+			_mouseCursor->getSurface()->setVisible(false);
+			sub428220();
+		} else {
+			_class482 = addSprite(new Class482(_vm, this, 0));
+		}
+	} else {
+		_klayman = new KmScene1402(_vm, this, 513, 391);
+		setMessageList(0x004B0B58);
+		if (!getGlobalVar(0x70A1189C)) {
+			_class482 = addSprite(new Class482(_vm, this, 2));
+			sub428220();
+		}
+	}
+	addSprite(_klayman);
+
+	if (_class482) {
+		_class482->getSurface()->getClipRect().x1 = 0;
+		_class482->getSurface()->getClipRect().y1 = 0;
+		_class482->getSurface()->getClipRect().x2 = 640;
+		_class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+	}
+
+	if (getGlobalVar(0x4A105B3) == 1) {
+		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
+		_vm->_collisionMan->addSprite(_class489);
+		if (getGlobalVar(0x4A10F33) == 4) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			_klayman->setX(_class489->getX() + 100);
+			_klayman->processDelta();
+			setMessageList(0x004B0BD0);
+		} else if (getGlobalVar(0x4A10F33) == 0) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			_klayman->setX(_class489->getX() - 100);
+			_klayman->processDelta();
+			setMessageList(0x004B0BD0);
+		}
+		_class489->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x;
+		_class489->getSurface()->getClipRect().y1 = 0;
+		_class489->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x;
+		_class489->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+	}
+
+	_klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; 
+	_klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+	
+}
+
+void Scene1402::update() {
+	if (_flag) {
+		_background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10) - 10;
+		// TODO g_screen->field_26 = -10 - _background->getSurface()->getDrawRect().y;
+	} else {
+		_background->getSurface()->getDrawRect().y = -10;
+		// TODO g_screen->field_26 = 0;
+		SetUpdateHandler(&Scene::update);
+	}
+	Scene::update();
+	if (_class482) {
+		_class482->getSurface()->getClipRect().x1 = 0;
+		_class482->getSurface()->getClipRect().y1 = 0;
+		_class482->getSurface()->getClipRect().x2 = 640;
+		_class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+	}
+	_klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; 
+	_klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+}
+
+uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x00F43389) {
+			if (getGlobalVar(0x70A1189C)) {
+				_parentModule->sendMessage(0x1009, 0, this);
+			} else {
+				clearRectList();
+				_klayman->getSurface()->setVisible(false);
+				_mouseCursor->getSurface()->setVisible(false);
+				_class482->sendMessage(0x2002, 0, this);
+				sub428220();
+			}
+		}
+		break;
+	case 0x1019:
+		if (param.asInteger()) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		} else {
+			_parentModule->sendMessage(0x1009, 1, this);
+		}
+		break;
+	case 0x2000:
+		sub428230();
+		_mouseCursor->getSurface()->setVisible(true);
+		setRectList(0x004B0C48);
+		break;
+	case 0x2001:
+		sub428230();
+		_parentModule->sendMessage(0x1009, 0, this);
+		break;
+	case 0x2003:
+		sub428230();
+		break;
+	case 0x4826:
+		if (sender == _class489) {
+			if (_class489->sendMessage(0x408C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
+				_klayman->sendEntityMessage(0x1014, _class489, this);
+				setMessageList2(0x004B0BB8);
+			} else {
+				setMessageList2(0x004B0B68);
+			}
+		}
+	}
+	return 0;
+}
+
+void Scene1402::sub428220() {
+	_flag = true;
+	SetUpdateHandler(&Scene1402::update);
+}
+
+void Scene1402::sub428230() {
+	_flag = 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) {
+	
+	// TODO createSurface3(100, dword_4B05B0);
+	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	_x = 108;
+	_y = 106;
+	stIdleLookAtGoodHole();
+}
+
+void AsScene1407Mouse::suWalkTo() {
+	int16 xdelta = _walkDestX - _x;
+	if (xdelta > _deltaX)
+		xdelta = _deltaX;
+	else if (xdelta < -_deltaX)
+		xdelta = -_deltaX;
+	_deltaX = 0;		
+	if (_walkDestX == _x) {
+		sendMessage(0x1019, 0, this);
+	} else {
+		_x += xdelta;
+		processDelta();
+	}
+}
+
+void AsScene1407Mouse::upGoThroughHole() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		SetUpdateHandler(&AnimatedSprite::update);
+		removeCallbacks();
+	}
+	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:
+		removeCallbacks();
+		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) {
+					if (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);
+	setFileHash(0x72215194, 0, -1);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&AsScene1407Mouse::handleMessage);
+}
+
+void AsScene1407Mouse::stWalkToDest() {
+	if (_walkDestX != _x) {
+		setDoDeltaX(_walkDestX < _x ? 1 : 0);
+		setFileHash(0x22291510, 0, -1);
+		SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
+		SetMessageHandler(&AsScene1407Mouse::handleMessage);
+		SetAnimationCallback3(&AsScene1407Mouse::stIdleLookAtGoodHole);
+	}
+}
+
+void AsScene1407Mouse::stWalkToHole() {
+	setDoDeltaX(_walkDestX < _x ? 1 : 0);
+	setFileHash(0x22291510, 0, -1);
+	SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
+	SetMessageHandler(&AsScene1407Mouse::handleMessage);
+	SetAnimationCallback3(&AsScene1407Mouse::stGoThroughHole);
+}
+
+void AsScene1407Mouse::stGoThroughHole() {
+	setFileHash(0x72215194, 0, -1);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(NULL);
+	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
+	SetAnimationCallback3(&AsScene1407Mouse::stArriveAtHole);
+	_surface->setVisible(false);
+	_countdown = 12;
+}
+
+void AsScene1407Mouse::stArriveAtHole() {
+	_currSectionIndex = kScene1407MouseHoles[_nextHoleIndex].sectionIndex;
+	_x = kScene1407MouseHoles[_nextHoleIndex].x;
+	_y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex];
+	if (_nextHoleIndex == 1) {
+		_parentScene->sendMessage(0x2000, 0, this);
+		_walkDestX = 512;
+		stWalkToDest();
+		_surface->setVisible(true);
+	} else {
+		_walkDestX = _x + 14;
+		stWalkToDest();
+		_surface->setVisible(true);
+	}
+}
+
+Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm), _puzzleSolvedCountdown(0),
+	_resetButtonCountdown(0) {
+
+	_surfaceFlag = true;
+
+	SetMessageHandler(&Scene1407::handleMessage);
+	SetUpdateHandler(&Scene1407::update);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x00442225, 0, 0));
+	_palette = new Palette(_vm, 0x00442225);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620));
+
+	_asMouse = addSprite(new AsScene1407Mouse(_vm, this));
+	_ssResetButton = addSprite(new StaticSprite(_vm, 0x12006600, 100));
+	_ssResetButton->getSurface()->setVisible(false); 
+
+}
+
+void Scene1407::update() {
+	Scene::update();
+	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) {
+		_parentModule->sendMessage(0x1009, 1, this);
+	} else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) {
+		_ssResetButton->getSurface()->setVisible(false);
+	}
+}
+
+uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (_puzzleSolvedCountdown == 0) {
+			// TODO: Debug/Cheat stuff
+			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+				// Exit scene
+				_parentModule->sendMessage(0x1009, 0, this);
+			} else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 &&
+				param.asPoint().y >= 62 && param.asPoint().y <= 90) {
+				// The reset button was clicked
+				_asMouse->sendMessage(0x2001, 0, this);
+				_ssResetButton->getSurface()->setVisible(true);
+				_soundResource.play(0x44045000);
+				_resetButtonCountdown = 12;
+			} else {
+				// Handle the mouse
+				_asMouse->sendMessage(messageNum, param, this);
+			}
+		}
+		break;
+	case 0x000D:
+		// TODO: Debug/Cheat stuff
+		break;
+	case 0x2000:
+		// The mouse got the cheese (nomnom)
+		setGlobalVar(0x70A1189C, 1);
+		_soundResource.play(0x68E25540);
+		_mouseCursor->getSurface()->setVisible(false);
+		_puzzleSolvedCountdown = 72;
+		break;
+	}
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
new file mode 100644
index 0000000..433dc41
--- /dev/null
+++ b/engines/neverhood/module1400.h
@@ -0,0 +1,242 @@
+/* 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_MODULE1400_H
+#define NEVERHOOD_MODULE1400_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class Module1400 : public Module {
+public:
+	Module1400(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1400();
+protected:
+	void createScene1401(int which);
+	void createScene1402(int which);
+	void createScene1403(int which);
+	void createScene1404(int which);
+	void createScene1405(int which);
+	void createScene1406(int which);
+	void createScene1407(int which);
+	void updateScene1401();			
+	void updateScene1402();			
+	void updateScene1403();			
+	void updateScene1404();			
+	void updateScene1405();			
+	void updateScene1406();			
+	void updateScene1407();			
+};
+
+// Scene1401
+
+class Class525 : public AnimatedSprite {
+public:
+	Class525(NeverhoodEngine *vm);
+	virtual ~Class525();
+protected:
+	int _countdown1;
+	int _countdown2;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	void update4662A0();
+	void update466300();
+	uint32 handleMessage466320(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage4663C0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub466420();
+	void sub466460();
+	void sub4664B0();
+};
+
+class Class526 : public AnimatedSprite {
+public:
+	Class526(NeverhoodEngine *vm, Sprite *class525);
+protected:
+	Sprite *_class525;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate466720();
+	void sub466770();
+};
+
+class Class527 : public AnimatedSprite {
+public:
+	Class527(NeverhoodEngine *vm, Sprite *class526);
+protected:
+	Sprite *_class526;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate466920();
+	void sub466970();
+};
+
+class Class528 : public AnimatedSprite {
+public:
+	Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag);
+protected:
+	Sprite *_klayman;
+	SoundResource _soundResource;
+	int _countdown;
+	bool _flag;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub466BF0();
+	void sub466C50();
+	void sub466CB0();
+};
+
+struct Class489Item {
+	NPoint point;
+	int8 varIndex1;
+	int8 varIndex2;
+	int8 index1;
+	int8 flag2;
+	int8 flag4;
+	int8 flag;
+};
+
+class Class489 : public AnimatedSprite {
+public:
+	Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525);
+	virtual ~Class489();
+protected:
+	Scene *_parentScene;
+	Sprite *_klayman;
+	Sprite *_class525;
+	const Class489Item *_class489Item;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	int16 _remX;
+	bool _flag;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage4348E0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage434B20(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate434B60();
+	void sub434C80();
+	void sub434D80();
+	void sub434DD0();
+	void sub434DF0();
+	void sub434E60();
+	void sub434E90();
+	void sub434EC0();
+	void sub434F40();
+	void sub434F80();
+	void sub434FF0();
+	void sub435040();
+};
+
+class Scene1401 : public Scene {
+public:
+	Scene1401(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	bool _flag;
+	Sprite *_class427;
+	Sprite *_class489;
+	Sprite *_class525;
+	Sprite *_class526;
+	Sprite *_class527;
+	Sprite *_class528;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_ssButton;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+// Scene1402
+
+class Class454 : public StaticSprite {
+public:
+	Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority);
+};
+
+class Class482 : public AnimatedSprite {
+public:
+	Class482(NeverhoodEngine *vm, Scene *parentScene, int which);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub428500();
+	void sub428530();
+	void sub428560();
+};
+
+class Scene1402 : public Scene {
+public:
+	Scene1402(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_class454_1;
+	Sprite *_class454_2;
+	Sprite *_class454_3;
+	Sprite *_class482;
+	Sprite *_class489;
+	bool _flag;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub428220();
+	void sub428230();
+};
+
+// 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, int which);
+protected:
+	SoundResource _soundResource;
+	Sprite *_asMouse;
+	Sprite *_ssResetButton;
+	int _puzzleSolvedCountdown;
+	int _resetButtonCountdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1400_H */
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
new file mode 100644
index 0000000..3289173
--- /dev/null
+++ b/engines/neverhood/module1700.cpp
@@ -0,0 +1,359 @@
+/* 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/module1700.h"
+#include "neverhood/navigationscene.h"
+
+namespace Neverhood {
+
+Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule), _soundResource(vm) {
+	
+	debug("Create Module1700(%d)", which);
+
+	// TODO Music18hList_add(0x04212331);
+	// TODO Sound1ChList_addSoundResources(0x04212331, dword_4AE930, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 50, 600, 5, 150);
+	// TODO Sound1ChList_sub_407C70(0x04212331, 0x41861371, 0x43A2507F, 0);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene1701(-1);
+			break;
+		case 1:
+			createScene1702(-1);
+			break;
+		case 2:
+			createScene1703(-1);
+			break;
+		case 3:
+			createScene1704(-1);
+			break;
+		default:
+			createScene1705(-1);
+		}
+	} else if (which == 0) {
+		createScene1701(-1);
+	} else if (which == 1) {
+		createScene1705(1);
+	} else {
+		createScene1705(3);
+	}
+
+}
+
+Module1700::~Module1700() {
+	// TODO Sound1ChList_sub_407A50(0x04212331);
+}
+
+void Module1700::createScene1701(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 0;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x3028A005);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1700::updateScene1701);
+}
+
+void Module1700::createScene1702(int which) {
+	_vm->gameState().sceneNum = 1;
+	_childObject = new NavigationScene(_vm, this, 0x004AE8B8, which, NULL);
+	SetUpdateHandler(&Module1700::updateScene1702);
+}
+
+void Module1700::createScene1703(int which) {
+	_vm->gameState().sceneNum = 2;
+	_childObject = new NavigationScene(_vm, this, 0x004AE8E8, which, NULL);
+	SetUpdateHandler(&Module1700::updateScene1703);
+}
+
+void Module1700::createScene1704(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 3;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x01190041);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1700::updateScene1701);
+}
+
+void Module1700::createScene1705(int which) {
+	_vm->gameState().sceneNum = 4;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+	// TODO Music18hList_play(0x31114225, 0, 2, 1);
+	_childObject = new Scene1705(_vm, this, which);
+	SetUpdateHandler(&Module1700::updateScene1705);
+}
+
+void Module1700::updateScene1701() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_vm->gameState().sceneNum == 3) {
+			createScene1705(0);
+			_childObject->handleUpdate();
+		} else {
+			// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0);
+			createScene1702(0);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1700::updateScene1702() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1703(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 1) {
+			createScene1702(1);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1700::updateScene1703() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1704(-1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 1) {
+			createScene1702(1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			if (!_soundResource.isPlaying()) {
+				// TODO _soundResource.setVolume(60);
+				_soundResource.play(0x58B45E58);
+			}
+			createScene1703(2);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1700::updateScene1705() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		_parentModule->sendMessage(0x1009, 1, this);
+	}
+}
+
+// Scene1705
+
+static const uint32 kScene1705FileHashes[] = {
+	0x910EA801,
+	0x920EA801,
+	0x940EA801,
+	0x980EA801,
+	0x800EA801,
+	0xB00EA801,
+	0xD00EA801,
+	0x100EA801,
+	0x900EA800,
+	0xD10EA801,
+	0x110EA801,
+	0x910EA800
+};
+
+Class602::Class602(NeverhoodEngine *vm, uint32 fileHash, int index)
+	: StaticSprite(vm, fileHash, 100) {
+	
+	_x = _spriteResource.getPosition().x + index * 30;
+	_y = _spriteResource.getPosition().y + 160;
+	StaticSprite::update();
+}
+
+Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash)
+	: StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _index(index) {
+
+	if (!getSubVar(0x02038314, _index) && !getSubVar(0x02720344, _index)) {
+		SetMessageHandler(&Class606::handleMessage);
+	} else {
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+	}
+	_deltaRect = _drawRect;
+	_deltaRect.x -= 4;
+	_deltaRect.y -= 8;
+	_deltaRect.width += 8;
+	_deltaRect.height += 16;
+	Sprite::processDelta();
+}
+
+uint32 Class606::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setSubVar(0x02038314, _index, 1);
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+		break;		
+	}
+	return messageResult;
+}
+
+Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _paletteArea(1) {
+
+	Palette2 *palette2;
+	Sprite *tempSprite;
+	
+	setGlobalVar(0xE7498218, 1);
+	// TODO _vm->initVarsScene1705();
+
+	SetMessageHandler(&Scene1705::handleMessage);
+	SetUpdateHandler(&Scene1705::update);
+
+	_vm->_collisionMan->setHitRects(0x004B69D8);
+
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x03118226, 0, 0));
+
+	palette2 = new Palette2(_vm, 0x03118226);
+	palette2->addPalette(0x91D3A391, 0, 64, 0);
+	palette2->copyBasePalette(0, 256, 0);
+	palette2->usePalette();
+	_palette = palette2;
+	addEntity(_palette);
+
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x18222039, NULL));
+
+	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0));
+	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1));
+	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2));
+
+	_sprite = addSprite(new StaticSprite(_vm, 0x31313A22, 1100));
+
+	_class606 = addSprite(new Class606(_vm, this, 15, 1100, 238, 439, 0x02363852));
+	_vm->_collisionMan->addSprite(_class606);
+
+	which = 4;
+
+	if (which < 0) {
+		_klayman = new KmScene1705(_vm, this, 231, 434);
+		setMessageList(0x004B69E8);
+		sendMessage(0x2000, 0, this);
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	} else if (which == 1) {
+		_klayman = new KmScene1705(_vm, this, 431, 434);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004B6A08);
+		sendMessage(0x2000, 1, this);
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	} else if (which == 2) {
+		_klayman = new KmScene1705(_vm, this, 431, 434);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004B6AA0);
+		sendMessage(0x2000, 1, this);
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	} else if (which == 3) {
+		_klayman = new KmScene1705(_vm, this, 431, 434);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004B6A18);
+		sendMessage(0x2000, 1, this);
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	} else {
+		_klayman = new KmScene1705(_vm, this, 231, 74);
+		_klayman->sendMessage(0x2000, 0, this);
+		setMessageList(0x004B69F0);
+		sendMessage(0x2000, 0, this);
+		tempSprite = addSprite(new StaticSprite(_vm, 0x30303822, 1100));
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
+		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	}
+
+	addSprite(_klayman);
+	
+}
+
+void Scene1705::update() {
+	Scene::update();
+	if (_klayman->getX() < 224 && _paletteArea != 0) {
+		((Palette2*)_palette)->addPalette(0xF2210C15, 0, 64, 0);
+		((Palette2*)_palette)->startFadeToPalette(12);
+		_paletteArea = 0;
+	} else if (_klayman->getX() >= 224 && _paletteArea == 0) {
+		((Palette2*)_palette)->addPalette(0x91D3A391, 0, 64, 0);
+		((Palette2*)_palette)->startFadeToPalette(12);
+		_paletteArea = 1;
+	}
+}
+
+uint32 Scene1705::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (param.asInteger()) {
+			setRectList(0x004B6B40);
+			_klayman->setKlaymanTable3();
+		} else {
+			setRectList(0x004B6B30);
+			_klayman->setKlaymanTable1();
+		}
+		break;
+	case 0x4826:
+		if (sender == _class606 && _klayman->getX() <= 318) {
+			_klayman->sendEntityMessage(0x1014, sender, this);
+			setMessageList(0x004B6AC0);
+		}
+		break;		
+	}
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h
new file mode 100644
index 0000000..0fefa72
--- /dev/null
+++ b/engines/neverhood/module1700.h
@@ -0,0 +1,80 @@
+/* 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_MODULE1700_H
+#define NEVERHOOD_MODULE1700_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/smackerscene.h"
+
+namespace Neverhood {
+
+class Module1700 : public Module {
+public:
+	Module1700(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1700();
+protected:
+	SoundResource _soundResource;
+	void update();
+	void createScene1701(int which);
+	void createScene1702(int which);
+	void createScene1703(int which);
+	void createScene1704(int which);
+	void createScene1705(int which);
+	void updateScene1701();			
+	void updateScene1702();			
+	void updateScene1703();			
+	void updateScene1705();			
+};
+
+// Scene1705
+
+class Class602 : public StaticSprite {
+public:
+	Class602(NeverhoodEngine *vm, uint32 fileHash, int index);
+};
+
+class Class606 : public StaticSprite {
+public:
+	Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash);
+protected:	
+	Scene *_parentScene;
+	int _index;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1705 : public Scene {
+public:
+	Scene1705(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite;
+	Sprite *_class606;
+	int _paletteArea;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1700_H */
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
new file mode 100644
index 0000000..2a4d89c
--- /dev/null
+++ b/engines/neverhood/module1800.cpp
@@ -0,0 +1,300 @@
+/* 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/module1800.h"
+#include "neverhood/navigationscene.h"
+#include "neverhood/smackerscene.h"
+
+#include "neverhood/diskplayerscene.h"
+
+namespace Neverhood {
+
+Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	debug("Create Module1800(%d)", which);
+
+	// TODO Sound1ChList_addSoundResources(0x04A14718, dword_4AFE70);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 1, 50, 600, 10, 150);
+	// TODO Sound1ChList_sub_407C70(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene1801(-1);
+			break;
+		case 1:
+			createScene1802(-1);
+			break;
+		case 2:
+			createScene1803(-1);
+			break;
+		default:
+		case 3:
+			createScene1804(-1);
+			break;
+		case 4:
+			createScene1805(-1);
+			break;
+		case 5:
+			createScene1806(-1);
+			break;
+		case 6:
+			createScene1807(-1);
+			break;
+		case 7:
+			createScene1808(-1);
+			break;
+		case 8:
+			createScene1809(-1);
+			break;
+		}
+	} else if (which == 2) {
+		createScene1806(0);
+	} else if (which == 3) {
+		createScene1801(0);
+	} else {
+		createScene1804(1);
+	} 
+
+}
+
+Module1800::~Module1800() {
+	// TODO Sound1ChList_sub_407A50(0x04A14718);
+}
+
+void Module1800::createScene1801(int which) {
+	static const byte kNavigationTypes[] = {1, 0, 2, 0};
+	_vm->gameState().sceneNum = 0;
+#if 0	
+	_childObject = new NavigationScene(_vm, this, 0x004AFD38, which, kNavigationTypes);
+#endif
+	_childObject = new DiskplayerScene(_vm, this, 3);	
+	SetUpdateHandler(&Module1800::updateScene1801);
+}
+			
+void Module1800::createScene1802(int which) {
+	static const byte kNavigationTypes[] = {5};
+	_vm->gameState().sceneNum = 1;
+	_childObject = new NavigationScene(_vm, this, 0x004AFD98, which, kNavigationTypes);
+	SetUpdateHandler(&Module1800::updateScene1802);
+}
+
+void Module1800::createScene1803(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 2;
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x006C0085);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1800::updateScene1803);
+}
+			
+void Module1800::createScene1804(int which) {
+	_vm->gameState().sceneNum = 3;
+	_childObject = new NavigationScene(_vm, this, 0x004AFDB0, which, NULL);
+	SetUpdateHandler(&Module1800::updateScene1804);
+}
+
+void Module1800::createScene1804b(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 3;
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x0A840C01);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1800::updateScene1803);
+}
+			
+void Module1800::createScene1805(int which) {
+	_vm->gameState().sceneNum = 4;
+	_childObject = new NavigationScene(_vm, this, 0x004AFDE0, which, NULL);
+	SetUpdateHandler(&Module1800::updateScene1805);
+}
+
+void Module1800::createScene1806(int which) {
+	_vm->gameState().sceneNum = 5;
+	_childObject = new NavigationScene(_vm, this, 0x004AFE40, which, NULL);
+	SetUpdateHandler(&Module1800::updateScene1806);
+}
+
+void Module1800::createScene1807(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 6;
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x08D84010);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1800::updateScene1803);
+	// TODO Sound1ChList_sub_407A50(0x04A14718);
+}
+			
+void Module1800::createScene1808(int which) {
+	SmackerScene *smackerScene;
+	_vm->gameState().sceneNum = 7;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0);
+	smackerScene = new SmackerScene(_vm, this, true, true, false);
+	smackerScene->setFileHash(0x0168B121);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+	SetUpdateHandler(&Module1800::updateScene1803);
+}
+			
+void Module1800::createScene1809(int which) {
+#if 0 // TODO
+	_vm->gameState().sceneNum = 8;
+	_childObject = new CreditsScene(_vm, this, 0);
+	SetUpdateHandler(&Module1800::updateScene1809);
+#endif	
+}
+
+void Module1800::updateScene1801() {
+	_childObject->handleUpdate();
+#if 0 // TODO
+	NavigationScene *navigationScene = (NavigationScene*)_childObject;
+	if (navigationScene->soundFlag1 && navigationScene->index == 2) {
+		// TODO Sound1ChList_sub_4080B0(false);
+	}
+#endif	
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene1805(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene1802(-1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			createScene1804(0);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1800::updateScene1802() {
+	_childObject->handleUpdate();
+	if (_done) {
+		int areaType = ((NavigationScene*)_childObject)->getNavigationAreaType();
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (areaType == 3) {
+			createScene1808(-1);
+		} else {
+			createScene1803(-1);
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1800::updateScene1803() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 2) {
+			createScene1801(2);
+			_childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		} else if (_field20 == 6) {
+			createScene1809(-1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 7) {
+			_parentModule->sendMessage(0x1009, 3, this);
+		}
+	}
+}
+
+void Module1800::updateScene1804() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1804b(-1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 1) {
+			createScene1801(1);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1800::updateScene1805() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1807(-1);
+			_childObject->handleUpdate();
+		} else if (_field20 == 1) {
+			createScene1806(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene1801(3);
+			_childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			createScene1805(3);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module1800::updateScene1806() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			_parentModule->sendMessage(0x1009, 2, this);
+		} else if (_field20 == 1) {
+			createScene1805(3);
+			_childObject->handleUpdate();
+		}
+	}
+	if (_field24 >= 0) {
+		if (_field24 == 1) {
+			// TODO _resourceTable.setResourceList(ex_sub_42EDA0(0), true);
+		}
+		_field24 = -1;
+	}
+}
+
+void Module1800::updateScene1809() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		_parentModule->sendMessage(0x1009, 1, this);
+		// TODO GameState stuff
+	}
+}
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h
new file mode 100644
index 0000000..13d4790
--- /dev/null
+++ b/engines/neverhood/module1800.h
@@ -0,0 +1,63 @@
+/* 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_MODULE1800_H
+#define NEVERHOOD_MODULE1800_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module1800
+
+class Module1800 : public Module {
+public:
+	Module1800(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1800();
+protected:
+	// TODO ResourceTable _resourceTable;
+	void createScene1801(int which);			
+	void createScene1802(int which);			
+	void createScene1803(int which);			
+	void createScene1804(int which);
+	void createScene1804b(int which);			
+	void createScene1805(int which);			
+	void createScene1806(int which);			
+	void createScene1807(int which);			
+	void createScene1808(int which);			
+	void createScene1809(int which);			
+	void updateScene1801();			
+	void updateScene1802();			
+	void updateScene1803();			
+	void updateScene1804();			
+	void updateScene1805();			
+	void updateScene1806();			
+	void updateScene1807();			
+	void updateScene1808();			
+	void updateScene1809();			
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1800_H */
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index f6be668..7bc1551 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -25,7 +25,7 @@
 
 namespace Neverhood {
 
-NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes)
+NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes)
 	: Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false),
 	_soundFlag1(false), _soundFlag2(false), _smackerFileHash(0), _interactive(true), _done(false) {
 
@@ -64,8 +64,11 @@ NavigationScene::~NavigationScene() {
 	// TODO Sound1ChList_sub_408110(0);
 }
 
-byte NavigationScene::getNavigationAreaType() {
-	return 0; // TODO
+int NavigationScene::getNavigationAreaType() {
+	NPoint mousePos;
+	mousePos.x = _mouseCursor->getX();
+	mousePos.y = _mouseCursor->getY();
+	return _mouseCursor->sendPointMessage(0x2064, mousePos, this);
 }
 
 void NavigationScene::update() {
diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h
index 08aefb7..c37a7fc 100644
--- a/engines/neverhood/navigationscene.h
+++ b/engines/neverhood/navigationscene.h
@@ -31,9 +31,9 @@ namespace Neverhood {
 
 class NavigationScene : public Scene {
 public:
-	NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes);
+	NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes);
 	virtual ~NavigationScene();
-	byte getNavigationAreaType();
+	int getNavigationAreaType();
 protected:
 	SmackerPlayer *_smackerPlayer;
 	bool _smackerDone;
@@ -44,7 +44,7 @@ protected:
 	bool _soundFlag1;
 	bool _soundFlag2;
 	bool _done;
-	byte *_itemsTypes;
+	const byte *_itemsTypes;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createMouseCursor();
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index e186d38..28fa81b 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -160,7 +160,6 @@ void Palette2::update() {
 	if (_status == 1) {
 		Palette::update();
 	} else if (_status == 2) {
-	debug("... _palCounter = %d", _palCounter);
 		if (_palCounter > 1) {
 			for (int i = 0; i < 256; i++) {
 				fadeColor(_palette + i * 4, _basePalette[i * 4 + 0], _basePalette[i * 4 + 1], _basePalette[i * 4 + 2]);
@@ -174,6 +173,12 @@ void Palette2::update() {
 	}
 }
 
+void Palette2::copyBasePalette(int toIndex, int count, int fromIndex) {
+	if (toIndex + count > 256)
+		count = 256 - toIndex;
+	memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4);		
+}
+
 void Palette2::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
 	PaletteResource paletteResource(_vm);
 	if (toIndex + count > 256)
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index e3d95aa..01f63e8 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -38,7 +38,7 @@ public:
 	Palette(NeverhoodEngine *vm, const char *filename);
 	// Create from resource with fileHash
 	Palette(NeverhoodEngine *vm, uint32 fileHash);
-	~Palette();
+	virtual ~Palette();
 	void usePalette();
 	void addPalette(const char *filename, int toIndex, int count, int fromIndex);
 	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
@@ -60,7 +60,8 @@ public:
 	Palette2(NeverhoodEngine *vm);
 	// TODO: Other ctors
 	Palette2(NeverhoodEngine *vm, uint32 fileHash);
-	~Palette2();
+	virtual ~Palette2();
+	void copyBasePalette(int toIndex, int count, int fromIndex);
 	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
 	void startFadeToPalette(int counter);
 public:
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 44fef14..39824de 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -313,6 +313,21 @@ void AnimResource::setRepl(byte oldColor, byte newColor) {
 	_replNewColor = newColor;
 }
 
+NDimensions AnimResource::loadSpriteDimensions(uint32 fileHash) {
+	NDimensions dimensions;
+	byte *resDimensions = _vm->_res->getResourceExtDataByHash(fileHash);
+	if (resDimensions) {
+		dimensions.width = READ_LE_UINT16(resDimensions + 0);
+		dimensions.height = READ_LE_UINT16(resDimensions + 2);
+	} else {
+		dimensions.width = 0;
+		dimensions.height = 0;
+	}
+	return dimensions;
+}
+
+// MouseCursorResource
+
 MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) 
 	: _cursorSprite(vm), _cursorNum(4), _currFileHash(0) {
 
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 5d8d5ca..a7d5e6c 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -91,6 +91,7 @@ public:
 	int16 getFrameIndex(uint32 frameHash);
 	void setReplEnabled(bool value) { _replEnabled = value; }
 	void setRepl(byte oldColor, byte newColor);
+	NDimensions loadSpriteDimensions(uint32 fileHash);
 protected:
 	NeverhoodEngine *_vm;
 	int _resourceHandle;
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 28f0994..0538f58 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -135,8 +135,8 @@ byte *ResourceMan::getResourceExtData(int resourceHandle) {
 }
 
 byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) {
-	ResourceFileEntry *entry = findEntry(fileHash);
-	return _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex);
+	ResourceFileEntry *entry = findEntrySimple(fileHash);
+	return entry ? _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex) : NULL;
 }
 
 byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) {
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 43f1ca7..d725ced 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -88,14 +88,16 @@ void Scene::draw() {
 		if (_smackerPlayer->getSurface())
 			_smackerPlayer->getSurface()->draw();
 	} else {
+#if 0	
 		if (_surfaceFlag) {
 			// TODO g_screen->copyDirtyRects();
 			for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
 				(*iter)->addDirtyRect();
 			// TODO g_screen->addDirtyRects();
 		}
+#endif		
 		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
-			debug(4, "priority = %d", (*iter)->getPriority());
+			//debug(4, "priority = %d", (*iter)->getPriority());
 			(*iter)->draw();
 		}
 	}	
@@ -501,6 +503,11 @@ void Scene::setRectList(RectList *rectList) {
 	_rectType = 1;
 }
 
+void Scene::clearRectList() {
+	_rectList = NULL;
+	_rectType = 1;
+}
+
 void Scene::loadDataResource(uint32 fileHash) {
 	_dataResource.load(fileHash);
 	if (_klayman)
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 4711405..65326c3 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -50,6 +50,7 @@ public:
 	void setSurfacePriority(BaseSurface *surface, int priority);
 	void deleteSprite(Sprite **sprite);
 	Background *addBackground(Background *background);
+	void update();
 protected:
 	Module *_parentModule;
 	Common::Array<Entity*> _entities;
@@ -89,7 +90,6 @@ protected:
 	bool _prevVisible;
 	int _messageValue;
 	// TODO 000000CF field_CF		db ?
-	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void smackerUpdate();
 	uint32 smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -102,6 +102,7 @@ protected:
 	void runMessageList();
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);
+	void clearRectList();
 	void messageList402220();
 	void loadDataResource(uint32 fileHash);
 };
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index f0b3008..66e7a58 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -69,12 +69,10 @@ void SmackerDoubleSurface::draw() {
 
 SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag)
 	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false),
-	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true) {
-
-	debug("_smackerSurface = %p", (void*)_smackerSurface);
+	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true),
+	_drawX(-1), _drawY(-1) {
 
 	SetUpdateHandler(&SmackerPlayer::update);
-
 	open(fileHash, flag);
 }
 
@@ -121,14 +119,31 @@ void SmackerPlayer::close() {
 }
 
 void SmackerPlayer::gotoFrame(uint frameNumber) {
+	// TODO?
+}
+
+uint32 SmackerPlayer::getFrameCount() {
+	return _smackerDecoder ? _smackerDecoder->getFrameCount() : 0;
+}
+
+uint32 SmackerPlayer::getFrameNumber() {
+	return _smackerDecoder ? _smackerDecoder->getCurFrame() : 0;
 }
 
 uint SmackerPlayer::getStatus() {
 	return 0;
 }
 
-void SmackerPlayer::update() {
+void SmackerPlayer::setDrawPos(int16 x, int16 y) {
+	_drawX = x;
+	_drawY = y;
+	if (_smackerSurface) {
+		_smackerSurface->getDrawRect().x = _drawX;
+		_smackerSurface->getDrawRect().y = _drawY;
+	}
+}
 
+void SmackerPlayer::update() {
 	debug(8, "SmackerPlayer::update()");
 
 	if (!_smackerDecoder)
@@ -144,15 +159,18 @@ void SmackerPlayer::update() {
 		const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
 
 		if (_smackerFirst) {
-			if (_doubleSurface) {
-				_smackerSurface->getDrawRect().x = 320 - _smackerDecoder->getWidth();
-				_smackerSurface->getDrawRect().y = 240 - _smackerDecoder->getHeight();
-				_smackerSurface->setSmackerFrame(smackerFrame);
-			} else {
-				_smackerSurface->getDrawRect().x = (640 - _smackerDecoder->getWidth()) / 2;
-				_smackerSurface->getDrawRect().y = (480 - _smackerDecoder->getHeight()) / 2;
-				_smackerSurface->setSmackerFrame(smackerFrame);
+			_smackerSurface->setSmackerFrame(smackerFrame);
+			if (_drawX < 0 || _drawY < 0) {
+				if (_doubleSurface) {
+					_drawX = 320 - _smackerDecoder->getWidth();
+					_drawY = 240 - _smackerDecoder->getHeight();
+				} else {
+					_drawX = (640 - _smackerDecoder->getWidth()) / 2;
+					_drawY = (480 - _smackerDecoder->getHeight()) / 2;
+				}
 			}
+			_smackerSurface->getDrawRect().x = _drawX;
+			_smackerSurface->getDrawRect().y = _drawY;
 			_smackerFirst = false;
 		}
 		
@@ -164,7 +182,6 @@ void SmackerPlayer::update() {
 		_dirtyFlag = true;
 
 		if (_smackerDecoder->hasDirtyPalette()) {
-			debug("updatePalette()");
 			updatePalette();
 		}
 
@@ -179,7 +196,6 @@ void SmackerPlayer::update() {
 		}
 		
 	}
-
 }
 
 void SmackerPlayer::updatePalette() {
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 2262277..6579bb4 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -55,7 +55,10 @@ public:
 	void open(uint32 fileHash, bool keepLastFrame);
 	void close();
 	void gotoFrame(uint frameNumber);
+	uint32 getFrameCount();
+	uint32 getFrameNumber(); 
 	uint getStatus();
+	void setDrawPos(int16 x, int16 y);
 protected:
 	Scene *_scene;
 	Palette *_palette;
@@ -67,6 +70,7 @@ protected:
 	bool _keepLastFrame;
 	bool _flag2;
 	bool _dirtyFlag;
+	int _drawX, _drawY;
 	void update();
 	void updatePalette();
 };
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index d0a6628..ee6e7aa 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -93,6 +93,11 @@ void Sprite::createSurface(int surfacePriority, int16 width, int16 height) {
 	_surface = new BaseSurface(_vm, surfacePriority, width, height);
 }
 
+int16 Sprite::defFilterY(int16 y) {
+	// TODO return y - g_screen->field_26;
+	return y;
+}
+
 // StaticSprite
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
@@ -209,7 +214,6 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface
 	_x = x;
 	_y = y;
 	setFileHash(fileHash, 0, -1);
-	
 }
 
 void AnimatedSprite::init() {
@@ -428,10 +432,7 @@ void AnimatedSprite::updateFrameInfo() {
 }
 
 void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
-	NDimensions dimensions;
-	// TODO dimensions = getAnimatedSpriteDimensions(fileHash);
-	dimensions.width = 640;
-	dimensions.height = 480;
+	NDimensions dimensions = _animResource.loadSpriteDimensions(fileHash);
 	_surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height);
 }
 
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 18c9ae3..86165f3 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -48,12 +48,15 @@ public:
 	bool checkCollision(NRect &rect);
 	int16 getX() const { return _x; }
 	int16 getY() const { return _y; }
+	void setX(int16 value) { _x = value; }
+	void setY(int16 value) { _y = value; }
 	uint16 getFlags() const { return _flags; }
 	bool isDoDeltaX() const { return _doDeltaX; }
 	bool isDoDeltaY() const { return _doDeltaY; }
 	NRect& getRect() { return _rect; }
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void loadDataResource(uint32 fileHash);
+	int16 defFilterY(int16 y);
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	Common::String _spriteUpdateCbName; // For debugging purposes
@@ -71,7 +74,6 @@ protected:
 	uint16 _flags;
 	//0000004A field4A		dw ? // seems to be unused except in ctor
 	DataResource _dataResource;
-	//void update();
 	void createSurface(int surfacePriority, int16 width, int16 height);
 	void handleSpriteUpdate() {
 		if (_spriteUpdateCb)
@@ -91,10 +93,10 @@ public:
 	StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 	StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 	void load(uint32 fileHash, bool dimensions, bool position);
+	void update();
 protected:
 	SpriteResource _spriteResource;
 	void init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
-	void update();
 };
 
 #define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback


Commit: d7dd4b43563b3d0ad5b16ff1fb384ab1382b3848
    https://github.com/scummvm/scummvm/commit/d7dd4b43563b3d0ad5b16ff1fb384ab1382b3848
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Implement Scene1403, Scene1404 and Scene1405 (memory minigame)

- Move GameModule::startup call into engine instead of the game module constructor
- Reduce debug output

Changed paths:
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/scene.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 18c6b7e..e49aa94 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -74,8 +74,8 @@ protected:
 
 // TODO: Disable heavy debug stuff in release mode
 
-#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler); debug("SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler
-#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug("SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
+#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler
+#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
 
 class Entity {
 public:
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 02ae2a7..d4b1e7b 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -44,7 +44,7 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	SetMessageHandler(&GameModule::handleMessage);
 
-	startup();
+	//startup();
 	
 }
 
@@ -83,6 +83,105 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 	}				
 }
 
+void GameModule::initScene1405Vars() {
+
+	// TODO: Give better names
+
+	byte array44[3];
+	byte array3C[10];
+	byte array30[48];
+	uint32 index3 = 48;
+	uint32 index2 = 9;
+	uint32 index1 = 2;
+	uint32 rndIndex;
+
+	// Exit if it's already initialized
+	if (getSubVar(0x40050052, 0xC8606803))
+		return;
+
+	for (uint32 i = 0; i < 3; i++)
+		setSubVar(0x61084036, i, 1);
+
+	for (byte i = 0; i < 3; i++)
+		array44[i] = i;
+
+	for (byte i = 0; i < 10; i++)
+		array3C[i] = i;
+
+	for (byte i = 0; i < 48; i++)
+		array30[i] = i;
+
+	rndIndex = _vm->_rnd->getRandomNumber(3 - 1);
+
+	setSubVar(0x13100631, array44[rndIndex], 5);
+
+	for (byte i = 5; i < 9; i++)
+		array3C[i] = array3C[i + 1];
+
+	while (rndIndex < 2) {
+		array44[rndIndex] = array44[rndIndex + 1];
+		rndIndex++;
+	}
+
+	for (int i = 0; i < 2; i++) {
+		uint32 rndIndex1 = _vm->_rnd->getRandomNumber(index2 - 1); // si
+		uint32 rndIndex2 = _vm->_rnd->getRandomNumber(index1 - 1); // di
+		setSubVar(0x13100631, array44[rndIndex2], array3C[rndIndex1]);
+		index2--;
+		while (rndIndex1 < index2) {
+			array3C[rndIndex1] = array3C[rndIndex1 + 1];
+			rndIndex1++;
+		}
+		index1--;
+		while (rndIndex2 < index1) {
+			array44[rndIndex2] = array44[rndIndex2 + 1];
+			rndIndex2++;
+		}
+	}
+
+	for (uint32 i = 0; i < 3; i++) {
+		uint32 rndValue = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2;
+		uint32 index4 = 0;
+		setSubVar(0x7500993A, i, rndValue);
+		while (index4 < rndValue) {
+			uint32 rndIndex3 = _vm->_rnd->getRandomNumber(index3 - 1);
+			setSubVar(0x0C65F80B, array30[rndIndex3], getSubVar(0x13100631, i));
+			index3--;
+			while (rndIndex3 < index3) {
+				array30[rndIndex3] = array30[rndIndex3 + 1];
+				rndIndex3++;
+			}
+			index4++;
+		}
+	}
+
+	uint32 index5 = 0;
+	while (index3 != 0) {
+		uint32 rndIndex4 = _vm->_rnd->getRandomNumber(index3 - 1);
+		index1 = array3C[index5];
+		setSubVar(0x0C65F80B, array30[rndIndex4], index1);
+		index3--;
+		while (rndIndex4 < index3) {
+			array30[rndIndex4] = array30[rndIndex4 + 1];
+			rndIndex4++;
+		}
+		uint32 rndIndex5 = _vm->_rnd->getRandomNumber(index3 - 1);
+		setSubVar(0x0C65F80B, array30[rndIndex5], index1);
+		index3--;
+		while (rndIndex5 < index3) {
+			array30[rndIndex5] = array30[rndIndex5 + 1];
+			rndIndex5++;
+		}
+		index5++;
+		if (index5 >= index2)
+			index5 = 0;
+
+	}
+
+	setSubVar(0x40050052, 0xC8606803, 1);
+	
+}
+
 uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -114,7 +213,7 @@ void GameModule::startup() {
 //	createModule1500(0); // Logos and intro video //Real
 //	createModule1000(-1);
 //	createModule2300(2);
-	_vm->gameState().sceneNum = 6;
+	_vm->gameState().sceneNum = 4;
 	//createModule1200(-1);
 	//createModule1800(-1);
 	//createModule1700(-1);
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 344a78f..d93a799 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -34,8 +34,10 @@ class GameModule : public Module {
 public:
 	GameModule(NeverhoodEngine *vm);
 	virtual ~GameModule();
+	void startup();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
+	void initScene1405Vars();
 protected:
 	Entity *_prevChildObject;
 	bool _someFlag1;
@@ -48,7 +50,6 @@ protected:
 	ResourceTable _resourceTable4;
 	*/
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void startup();
 	void createModule1000(int which);
 	void updateModule1000();
 	void createModule1200(int which);
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index caf79b2..e0cae80 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -32,18 +32,18 @@ GameVars::~GameVars() {
 }
 
 uint32 GameVars::getGlobalVar(uint32 nameHash) {
-	debug("GameVars::getGlobalVar(%08X)", nameHash);
+	//debug("GameVars::getGlobalVar(%08X)", nameHash);
 	int16 varIndex = findSubVarIndex(0, nameHash);
 	return varIndex != -1 ? _vars[varIndex].value : 0;
 }
 
 void GameVars::setGlobalVar(uint32 nameHash, uint32 value) {
-	debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value);
+	//debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value);
 	_vars[getSubVarIndex(0, nameHash)].value = value;
 }
 
 uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) {
-	debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash);
+	//debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash);
 	uint32 value = 0;
 	int16 varIndex = findSubVarIndex(0, nameHash);
 	if (varIndex != -1) {
@@ -56,21 +56,17 @@ uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) {
 }
 
 void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
-	debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value);
-	
+	//debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value);
 	int16 varIndex = getSubVarIndex(0, nameHash);
-	debug("  varIndex = %d", varIndex);
-	
+	//debug("  varIndex = %d", varIndex);
 	int16 subVarIndex = getSubVarIndex(varIndex, subNameHash);
-	debug("  subVarIndex = %d", subVarIndex);
-	
+	//debug("  subVarIndex = %d", subVarIndex);
 	_vars[subVarIndex].value = value;
-	
 	//_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value;
 }
 
 int16 GameVars::addVar(uint32 nameHash, uint32 value) {
-	debug("GameVars::addVar(%08X, %d)", nameHash, value);
+	//debug("GameVars::addVar(%08X, %d)", nameHash, value);
 	GameVar gameVar;
 	gameVar.nameHash = nameHash;
 	gameVar.value = value;
@@ -81,7 +77,7 @@ int16 GameVars::addVar(uint32 nameHash, uint32 value) {
 }
 
 int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) {
-	debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash);
+	//debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash);
 	for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) {
 		if (_vars[nextIndex].nameHash == subNameHash)
 			return nextIndex;
@@ -90,18 +86,19 @@ int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) {
 }
 
 int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
-	debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value);
+	//debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value);
 	int16 nextIndex = _vars[varIndex].firstIndex;
+	int16 subVarIndex;
 	if (nextIndex == -1) {
-		_vars[varIndex].firstIndex = addVar(subNameHash, value);
-		return _vars[varIndex].firstIndex;
+		subVarIndex = addVar(subNameHash, value);
+		_vars[varIndex].firstIndex = subVarIndex;
 	} else {
 		while (_vars[nextIndex].nextIndex != -1)
 			nextIndex = _vars[nextIndex].nextIndex;
-		int16 index = addVar(subNameHash, value);	
-		_vars[nextIndex].nextIndex = index;
-		return index;
+		subVarIndex = addVar(subNameHash, value);
+		_vars[nextIndex].nextIndex = subVarIndex;
 	}
+	return subVarIndex;
 }
 
 int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index b24e3eb..3aaab36 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -49,6 +49,12 @@ static const KlaymanTableItem klaymanTable3[] = {
 }; 
 #endif
 
+static const KlaymanTableItem klaymanTable4[] = {
+	{1, &Klayman::sub41FDA0},
+	{1, &Klayman::sub41FE60},
+	{1, &Klayman::sub41FEB0},
+};
+
 // Klayman
 
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority)
@@ -471,7 +477,7 @@ bool Klayman::sub41CF10(AnimationCb callback) {
 }
 
 void Klayman::sub41C7B0() {
-	debug("Klayman::sub41C7B0()");
+	//debug("Klayman::sub41C7B0()");
 	if (_callback1Cb) {
 		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
@@ -541,7 +547,7 @@ void Klayman::update41D0F0() {
 }
 
 uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41D360(%04X)", messageNum);
+	//debug("Klayman::handleMessage41D360(%04X)", messageNum);
 	Sprite::handleMessage(messageNum, param, sender);
 	uint32 messageResult = xHandleMessage(messageNum, param);
 	switch (messageNum) {
@@ -587,7 +593,7 @@ void Klayman::sub41FF00() {
 }
 
 uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41D480(%04X)", messageNum);
+	//debug("Klayman::handleMessage41D480(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -608,7 +614,7 @@ void Klayman::sub41FCF0() {
 }
 
 uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41F140(%04X)", messageNum);
+	//debug("Klayman::handleMessage41F140(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -624,7 +630,7 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 
 
 void Klayman::sub41C930(int16 x, bool flag) {
-	debug("Klayman::sub41C930(%d, %d)", x, flag);
+	//debug("Klayman::sub41C930(%d, %d)", x, flag);
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
 		_x4 = x;
@@ -675,7 +681,7 @@ void Klayman::sub4211B0() {
 
 uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
 	//ok
-	debug("Klayman::handleMessage41E920(%04X)", messageNum);
+	//debug("Klayman::handleMessage41E920(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -704,7 +710,7 @@ bool Klayman::sub41CEB0(AnimationCb callback3) {
 }
 
 void Klayman::spriteUpdate41F250() {
-	debug("Klayman::spriteUpdate41F250()");
+	//debug("Klayman::spriteUpdate41F250()");
 
 	int16 xdiff = _x4 - _x;
 
@@ -736,7 +742,7 @@ void Klayman::spriteUpdate41F250() {
 }
 
 void Klayman::spriteUpdate41F5F0() {
-	debug("Klayman::spriteUpdate41F5F0()");
+	//debug("Klayman::spriteUpdate41F5F0()");
 	
 	int16 xdiff = _x4 - _x;
 	
@@ -801,7 +807,7 @@ void Klayman::sub41FBB0() {
 }
 
 uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41DD80(%04X)", messageNum);
+	//debug("Klayman::handleMessage41DD80(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -832,7 +838,7 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41CD70(int16 x) {
-	debug("Klayman::sub41CD70(%d)", x);
+	//debug("Klayman::sub41CD70(%d)", x);
 	if (x > _x) {
 		if (ABS(x - _x) <= 105) {
 			sub41CAC0(x);
@@ -868,7 +874,7 @@ void Klayman::sub41FB30() {
 }
 
 uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41EC70(%04X)", messageNum);
+	//debug("Klayman::handleMessage41EC70(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -908,7 +914,7 @@ void Klayman::spriteUpdate41F300() {
 }
 
 uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41EB70(%04X)", messageNum);
+	//debug("Klayman::handleMessage41EB70(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1047,7 +1053,7 @@ void Klayman::sub41FF80() {
 }
 
 uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41D4C0(%04X)", messageNum);
+	//debug("Klayman::handleMessage41D4C0(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1085,7 +1091,7 @@ void Klayman::sub420120() {
 }
 
 uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41DAD0(%04X)", messageNum);
+	//debug("Klayman::handleMessage41DAD0(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1166,7 +1172,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 }
 
 void Klayman::sub41CAC0(int16 x) {
-	debug("Klayman::sub41CAC0(%d)", x);
+	//debug("Klayman::sub41CAC0(%d)", x);
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
 		_x4 = x;
@@ -1256,7 +1262,7 @@ void Klayman::spriteUpdate41F780() {
 }
 
 uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41DF10(%04X)", messageNum);
+	//debug("Klayman::handleMessage41DF10(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1302,7 +1308,7 @@ void Klayman::sub4208F0() {
 }
 
 uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Klayman::handleMessage41EEF0(%04X)", messageNum);
+	//debug("Klayman::handleMessage41EEF0(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1856,6 +1862,139 @@ void Klayman::sub420550() {
 	}
 }
 
+void Klayman::sub420C50() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420C50))) {
+		_status2 = 0;
+		if (_flagF7) {
+			sub420D50();
+		} else {
+			_attachedSprite->sendMessage(0x482B, 0, this);
+			setFileHash(0x0C303040, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+			SetMessageHandler(&Klayman::handleMessage41E210);
+			SetAnimationCallback3(&Klayman::sub420CD0);
+			_flagE5 = false;
+		}
+	}
+}
+
+void Klayman::sub420CD0() {
+	setFileHash(0x0D318140, 0, -1);
+	_attachedSprite->sendMessage(0x480F, 0, this);
+	SetAnimationCallback3(&Klayman::sub420D10);
+}
+
+void Klayman::sub420D10() {
+	setFileHash(0x4464A440, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	_flagF7 = true;
+	_flagE5 = true;
+}
+
+void Klayman::sub420D50() {
+	setFileHash(0x09018068, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41E210);
+	_attachedSprite->sendMessage(0x4807, 0, this);
+	SetAnimationCallback3(&Klayman::sub420DA0);
+	_flagE5 = false;
+}
+
+void Klayman::sub420DA0() {
+	setFileHash(0x0D318140, 0, -1);
+	_attachedSprite->sendMessage(0x480F, 0, this);
+	SetAnimationCallback3(&Klayman::sub420DE0);
+}
+
+void Klayman::sub420DE0() {
+	setFileHash(0x4464A440, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	_flagF7 = true;
+	_flagE5 = true;
+}
+
+void Klayman::sub420E20() {
+	if (_flagF7) {
+		_status2 = 2;
+		setFileHash(0x09018068, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetMessageHandler(&Klayman::handleMessage41E210);
+		_attachedSprite->sendMessage(0x4807, 0, this);
+		SetAnimationCallback3(&Klayman::sub420E90);
+		_flagE5 = false;
+		_flagF7 = false;
+	} else {
+		sub41C7B0();
+	}
+}
+
+void Klayman::sub420E90() {
+	setFileHash(0x0928C048, 0, -1);
+	setCallback1(AnimationCallback(&Klayman::sub420EB0));
+}
+
+void Klayman::sub420EB0() {
+	_attachedSprite->sendMessage(0x482A, 0, this);
+}
+
+void Klayman::sub420680() {
+	if (!sub41CF10(AnimationCallback(&Klayman::sub420680))) {
+		_status2 = 2;
+		_counter2 = 0;
+		for (uint32 i = 0; i < 20; i++) {
+			if (getSubVar(0x02038314, i)) {
+				setSubVar(0x02720344, i, 1);
+				setSubVar(0x02038314, i, 0);
+				_counter2++;
+			}
+		}
+		if (_counter2 == 0) {
+			setCallback2(NULL);
+			sub41C7B0();
+		} else {
+			setFileHash(0xD8C8D100, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetSpriteCallback(&Klayman::spriteUpdate41F250);
+			SetMessageHandler(&Klayman::handleMessage41DB90);
+			_flagE5 = false;
+			_counter2--;
+		}
+	}
+}
+
+uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x06040580) {
+			if (_counter2 == 0) {
+				// TODO: Calc calcHash value somewhere else 
+				setFileHash3(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
+			}
+		} else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
+			_counter2--;
+			setFileHash2(0xD8C8D100, 0x01084280, 0);
+		} else if (param.asInteger() == 0x062A1510) {
+			_soundResource1.play(0x41688704);
+		} else if (param.asInteger() == 0x02B20220) {
+			_soundResource1.play(0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			_soundResource1.play(0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			_soundResource1.play(0x44051000);
+		} else if (param.asInteger() == 0x0E040501) {
+			_soundResource1.play(0xC6A129C1);
+		}
+	}
+	return handleMessage41D480(messageNum, param, sender);
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -1865,7 +2004,7 @@ KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
-	debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
+	//debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
@@ -1951,7 +2090,7 @@ void KmScene1001::sub44FA50() {
 }
 
 uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
+	//debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
 	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1987,7 +2126,7 @@ void KmScene1002::xUpdate() {
 	
 uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	//ok
-	debug("KmScene1002::xHandleMessage(%04X)", messageNum);
+	//debug("KmScene1002::xHandleMessage(%04X)", messageNum);
 	switch (messageNum) {
 	case 0x2001:
 		setCallback2(AnimationCallback(&KmScene1002::sub449E90));
@@ -2089,7 +2228,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene1002::update4497D0() {
-	debug("KmScene1002::update4497D0()");
+	//debug("KmScene1002::update4497D0()");
 	Klayman::update();
 	if (_counter1 != 0 && (--_counter1 == 0)) {
 		_surface->setVisible(true);
@@ -2259,10 +2398,10 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &para
 }
 
 void KmScene1002::spriteUpdate449DC0() {
-	debug("KmScene1002::spriteUpdate449DC0()");
+	//debug("KmScene1002::spriteUpdate449DC0()");
 	AnimatedSprite::updateDeltaXY();
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
-	debug("$$$ hitRect->type = %04X", hitRect->type);
+	//debug("$$$ hitRect->type = %04X", hitRect->type);
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
 		processDelta();
@@ -2272,7 +2411,7 @@ void KmScene1002::spriteUpdate449DC0() {
 }
 
 void KmScene1002::sub449E20() {
-	debug("KmScene1002::sub449E20()");
+	//debug("KmScene1002::sub449E20()");
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) {
 		_status2 = 2;
 		_flagE5 = false;
@@ -2286,7 +2425,7 @@ void KmScene1002::sub449E20() {
 }
 
 void KmScene1002::sub449E90() {
-	debug("KmScene1002::sub449E90()");
+	//debug("KmScene1002::sub449E90()");
 	_soundResource1.play(0x56548280);
 	_status2 = 0;
 	_flagE5 = false;
@@ -2299,7 +2438,7 @@ void KmScene1002::sub449E90() {
 
 void KmScene1002::sub449EF0() {
 	//ok
-	debug("KmScene1002::sub449EF0()");
+	//debug("KmScene1002::sub449EF0()");
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
@@ -2318,7 +2457,7 @@ void KmScene1002::sub449EF0() {
 
 void KmScene1002::sub449F70() {
 	//ok
-	debug("KmScene1002::sub449F70()");
+	//debug("KmScene1002::sub449F70()");
 	_parentScene->sendMessage(0x1024, 1, this);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
@@ -2338,7 +2477,7 @@ void KmScene1002::sub449F70() {
 
 void KmScene1002::sub44A050() {
 	//ok
-	debug("KmScene1002::sub44A050()");
+	//debug("KmScene1002::sub44A050()");
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
@@ -2353,7 +2492,7 @@ void KmScene1002::sub44A050() {
 
 void KmScene1002::sub44A0D0() {
 	//ok
-	debug("KmScene1002::sub44A0D0()");
+	//debug("KmScene1002::sub44A0D0()");
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
@@ -2368,7 +2507,7 @@ void KmScene1002::sub44A0D0() {
 
 void KmScene1002::sub44A150() {
 	//ok
-	debug("KmScene1002::sub44A150()");
+	//debug("KmScene1002::sub44A150()");
 	_parentScene->sendMessage(0x1024, 1, this);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
@@ -2388,14 +2527,14 @@ void KmScene1002::sub44A150() {
 
 void KmScene1002::sub44A230() {
 	//ok
-	debug("KmScene1002::sub44A230()");
+	//debug("KmScene1002::sub44A230()");
 	setDoDeltaX(2);
 	sub41FC80();
 }
 
 void KmScene1002::sub44A250() {
 	//ok
-	debug("KmScene1002::sub44A250()");
+	//debug("KmScene1002::sub44A250()");
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) {
 		_parentScene->sendMessage(0x1024, 3, this);
 		_status2 = 2;
@@ -2410,7 +2549,7 @@ void KmScene1002::sub44A250() {
 
 void KmScene1002::sub44A2C0() {
 	//ok
-	debug("KmScene1002::sub44A2C0()");
+	//debug("KmScene1002::sub44A2C0()");
 	if (_attachedSprite) {
 		_x = ((Sprite*)_attachedSprite)->getX();
 		_attachedSprite->sendMessage(0x4807, 0, this);
@@ -2427,7 +2566,7 @@ void KmScene1002::sub44A2C0() {
 
 void KmScene1002::sub44A330() {
 	//ok
-	debug("KmScene1002::sub44A330()");
+	//debug("KmScene1002::sub44A330()");
 	_status2 = 2;
 	_flagE5 = true;
 	setDoDeltaX(0);
@@ -2439,7 +2578,7 @@ void KmScene1002::sub44A330() {
 
 void KmScene1002::sub44A370() {
 	//ok
-	debug("KmScene1002::sub44A370()");
+	//debug("KmScene1002::sub44A370()");
 	_status2 = 1;
 	_flagE5 = false;
 	setFileHash(0x35AA8059, 0, -1);
@@ -2450,13 +2589,13 @@ void KmScene1002::sub44A370() {
 }
 
 void KmScene1002::sub44A3C0() {
-	debug("KmScene1002::sub44A3C0()");
+	//debug("KmScene1002::sub44A3C0()");
 	_parentScene->sendMessage(0x1024, 1, this);
 }
 
 void KmScene1002::sub44A3E0() {
 	//ok
-	debug("KmScene1002::sub44A3E0()");
+	//debug("KmScene1002::sub44A3E0()");
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) {
 		_status2 = 2;
 		_flagE4 = false;
@@ -2472,7 +2611,7 @@ void KmScene1002::sub44A3E0() {
 
 void KmScene1002::sub44A460() {
 	//ok
-	debug("KmScene1002::sub44A460()");
+	//debug("KmScene1002::sub44A460()");
 	_flagE4 = false;
 	_flagE5 = true;
 	setFileHash2(0x5C01A870, 0x01084280, 0);
@@ -2898,6 +3037,146 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+// KmScene1403
+
+KmScene1403::KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+
+	setKlaymanTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
+}
+
+uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x480A:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420600));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420550));
+		}
+		break;		
+	case 0x480D:
+		setCallback2(AnimationCallback(&KmScene1001::sub420C50));
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x4827:
+		setCallback2(AnimationCallback(&Klayman::sub420E20));
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+// KmScene1404
+
+KmScene1404::KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	// Empty	
+}
+
+uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x480A:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420600));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420550));
+		}
+		break;		
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481A:
+		setCallback2(AnimationCallback(&Klayman::sub420680));		
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 // KmScene1705
 
 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 5cb11ab..d7c351e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -99,6 +99,16 @@ public:
 	void sub420660();
 	void sub4205C0();
 	void sub420550();
+	void sub420C50();
+	void sub420CD0();
+	void sub420D10();
+	void sub420D50();
+	void sub420DA0();
+	void sub420DE0();
+	void sub420E20();
+	void sub420E90();
+	void sub420EB0();
+	void sub420680();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -230,6 +240,8 @@ protected:
 	
 	void update41D1C0();
 	
+	uint32 handleMessage41DB90(int messageNum, const MessageParam &param, Entity *sender);
+	
 };
 
 class KmScene1001 : public Klayman {
@@ -320,6 +332,20 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene1403 : public Klayman {
+public:
+	KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
+class KmScene1404 : public Klayman {
+public:
+	KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene1705 : public Klayman {
 public:
 	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 7d618f5..4da5faa 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -23,6 +23,7 @@
 #include "neverhood/module1400.h"
 #include "neverhood/module1000.h"
 #include "neverhood/diskplayerscene.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/navigationscene.h"
 
 namespace Neverhood {
@@ -87,21 +88,21 @@ void Module1400::createScene1403(int which) {
 	_vm->gameState().sceneNum = 2;
 	// TODO Music18hList_stop(0x06333232, 0, 2);
 	// TODO Music18hList_play(0x624A220E, 0, 2, 1);
-	// TODO _childObject = new Scene1403(_vm, this, which);
+	_childObject = new Scene1403(_vm, this, which);
 	SetUpdateHandler(&Module1400::updateScene1403);
 }
 
 void Module1400::createScene1404(int which) {
 	_vm->gameState().sceneNum = 3;
 	// TODO Music18hList_play(0x06333232, 0, 2, 1);
-	// TODO _childObject = new Scene1404(_vm, this, which);
+	_childObject = new Scene1404(_vm, this, which);
 	SetUpdateHandler(&Module1400::updateScene1404);
 }
 
 void Module1400::createScene1405(int which) {
 	_vm->gameState().sceneNum = 4;
 	// TODO Music18hList_play(0x06333232, 0, 2, 1);
-	// TODO _childObject = new Scene1405(_vm, this, which);
+	_childObject = new Scene1405(_vm, this, which);
 	SetUpdateHandler(&Module1400::updateScene1405);
 }
 
@@ -109,7 +110,7 @@ void Module1400::createScene1406(int which) {
 	_vm->gameState().sceneNum = 5;
 	// TODO Music18hList_stop(0x06333232, 0, 2);
 	_childObject = new DiskplayerScene(_vm, this, 2);
-	SetUpdateHandler(&Module1400::updateScene1405);
+	SetUpdateHandler(&Module1400::updateScene1406);
 }
 
 void Module1400::createScene1407(int which) {
@@ -176,6 +177,7 @@ void Module1400::updateScene1404() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
+		debug("Scene1404; _field20 = %d", _field20);
 		if (_field20 == 1) {
 			createScene1405(0);
 			_childObject->handleUpdate();
@@ -402,7 +404,7 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 
 	_x = 320;
 	_y = 240;
-	createSurface1(100, 0x04551900);
+	createSurface1(0x04551900, 100);
 	SetUpdateHandler(&Class528::update);
 	SetMessageHandler(&Class528::handleMessage);
 	_newHashListIndex = -2;
@@ -1058,7 +1060,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene1402::update() {
 	if (_flag) {
-		_background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10) - 10;
+		_background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10 - 1) - 10;
 		// TODO g_screen->field_26 = -10 - _background->getSurface()->getDrawRect().y;
 	} else {
 		_background->getSurface()->getDrawRect().y = -10;
@@ -1436,4 +1438,438 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+// Scene1403
+
+Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _class489(NULL), _flag(false) {
+	
+	SetMessageHandler(&Scene1403::handleMessage);
+	
+	setRectList(0x004B1FF8);
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x2110A234, 0, 0));
+	_palette = new Palette(_vm, 0x2110A234);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL));
+
+	_class401_1 = addSprite(new StaticSprite(_vm, 0x01102A33, 100));
+	_class401_1->getSurface()->setVisible(false);
+
+	_class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995));
+	    
+	_class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995));
+
+	_asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011);
+	addSprite(_asTape1);
+	_vm->_collisionMan->addSprite(_asTape1);
+	_asTape1->setRepl(64, 0);
+
+	_asTape2 = new AsScene1201Tape(_vm, this, 16, 1100, 498, 468, 0x9048A093);
+	addSprite(_asTape2);
+	_vm->_collisionMan->addSprite(_asTape2);
+	_asTape2->setRepl(64, 0);
+
+	if (which < 0) {
+		_klayman = new KmScene1403(_vm, this, 380, 463);
+		setMessageList(0x004B1F18);
+	} else {
+		_klayman = new KmScene1403(_vm, this, 640, 463);
+		setMessageList(0x004B1F20);
+	}
+	addSprite(_klayman);
+	_klayman->setRepl(64, 0);
+
+	if (getGlobalVar(0x04A105B3) == 4) {
+		Class489 *class489;
+		class489 = new Class489(_vm, this, _klayman, 0);
+		_class489 = class489;
+		addSprite(_class489);
+		_vm->_collisionMan->addSprite(_class489);
+		if (getGlobalVar(0x04A10F33) == 4) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			_klayman->setX(_class489->getX() + 100);
+			_klayman->processDelta();
+			setMessageList(0x004B1F70);
+		}
+		_class489->getSurface()->getClipRect().x1 = 0;
+		_class489->getSurface()->getClipRect().y1 = 0;
+		_class489->getSurface()->getClipRect().x2 = 640;
+		_class489->getSurface()->getClipRect().y2 = _class401_2->getSurface()->getDrawRect().y + _class401_2->getSurface()->getDrawRect().height;
+		class489->setRepl(64, 0);
+	}
+
+}
+
+uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x88C11390) {
+			setRectList(0x004B2008);
+			_flag = true;
+		} else if (param.asInteger() == 0x08821382) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			setRectList(0x004B1FF8);
+			_flag = false;
+		}
+		break;
+	case 0x1019:
+		_parentModule->sendMessage(0x1009, 0, this);
+		break;
+	case 0x1022:
+		if (sender == _class489) {
+			if (param.asInteger() >= 1000) {
+				setSurfacePriority(_class401_3->getSurface(), 1100);
+			} else {
+				setSurfacePriority(_class401_3->getSurface(), 995);
+			}
+		}
+		break;
+	case 0x4807:
+		_class401_1->getSurface()->setVisible(false);
+		break;
+	case 0x480F:
+		_class401_1->getSurface()->setVisible(true);
+		break;
+	case 0x4826:
+		if (sender == _class489) {
+			if (_flag) {
+				setMessageList2(0x004B1FA8);
+			} else if (param.asInteger() == 1) {
+				_klayman->sendEntityMessage(0x1014, _class489, this);
+				setMessageList2(0x004B1F88);
+			} else if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
+				_klayman->sendEntityMessage(0x1014, _class489, this);
+				setMessageList2(0x004B1F58);
+			} else {
+				setMessageList2(0x004B1F28);
+			}
+		} else if (sender == _asTape1 || sender == _asTape2) {
+			if (_flag) {
+				setMessageList2(0x004B1FA8);
+			} else if (_messageListStatus != 2) {
+				_klayman->sendEntityMessage(0x1014, sender, this);
+				setMessageList2(0x004B1FB8);
+			}
+		}
+		break;
+	}
+	return 0;
+}
+
+// Scene1404
+
+Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _class489(NULL), _class545(NULL) {
+	
+	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) {
+		setGlobalVar(0x13382860, 5);
+	}
+	
+	SetMessageHandler(&Scene1404::handleMessage);
+	_surfaceFlag = true;
+
+	setRectList(0x004B8D80);
+
+	_background = addBackground(new DirtyBackground(_vm, 0xAC0B006F, 0, 0));
+	_palette = new Palette(_vm, 0xAC0B006F);
+	_palette->addPalette(0x00801510, 0, 65, 0);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL));
+
+	if (getGlobalVar(0x13382860) == 5) {
+		// TODO _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411));
+		// TODO _vm->_collisionMan->addSprite(_class545);
+	}
+
+	_sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100));
+
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 14, 1100, 281, 411, 0x9148A011));
+	_vm->_collisionMan->addSprite(_asTape);
+
+	if (which < 0) {
+		_klayman = new KmScene1404(_vm, this, 376, 406);
+		setMessageList(0x004B8C28);
+	} else if (which == 1) {
+		_klayman = new KmScene1404(_vm, this, 376, 406);
+		setMessageList(0x004B8C30);
+	} else if (which == 2) {
+		if (getGlobalVar(0xC0418A02)) {
+			_klayman = new KmScene1404(_vm, this, 347, 406);
+			_klayman->setDoDeltaX(1);
+		} else {
+			_klayman = new KmScene1404(_vm, this, 187, 406);
+		}
+		setMessageList(0x004B8D28);
+	} else {
+		_klayman = new KmScene1404(_vm, this, 30, 406);
+		setMessageList(0x004B8C38);
+	}
+	addSprite(_klayman);
+
+	if (getGlobalVar(0x04A105B3) == 3) {
+		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
+		_vm->_collisionMan->addSprite(_class489);
+		if (getGlobalVar(0x04A10F33) == 0) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			_klayman->setX(_class489->getX() - 100);
+			_klayman->processDelta();
+			setMessageList(0x004B8CB8);
+		}
+		_class489->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
+		_class489->getSurface()->getClipRect().y1 = 0;
+		_class489->getSurface()->getClipRect().x2 = 640;
+		_class489->getSurface()->getClipRect().y2 = 480;
+	}
+
+	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+
+}
+
+Scene1404::~Scene1404() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x410650C2) {
+			if (_class489 && _class489->getX() == 220) {
+				setMessageList(0x004B8C40);
+			} else {
+				setMessageList(0x004B8CE8);
+			}
+		}
+		break;
+	case 0x1019:
+		_parentModule->sendMessage(0x1009, 0, this);
+		break;
+	case 0x4826:
+		if (sender == _class489) {
+			if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
+				_klayman->sendEntityMessage(0x1014, _class489, this);
+				setMessageList2(0x004B8CA0);
+			} else {
+				setMessageList2(0x004B8C40);
+			}
+		} else if (sender == _asTape && _messageListStatus != 2) {
+			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			setMessageList(0x004B8CD0);
+		} else if (sender == _class545 && _messageListStatus != 2) {
+			_klayman->sendEntityMessage(0x1014, _class545, this);
+			setMessageList(0x004B8D18);
+		}
+		break;
+	}
+	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 index)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm),
+	_index(index), _countdown(0), _flag(false) {
+
+	_soundResource.load(0x05308101);
+	// TODO _soundResource.setPan
+	_x = kAsScene1405TileItemPositions[_index].x;
+	_y = kAsScene1405TileItemPositions[_index].y;
+	createSurface1(0x844B805C, 1100);
+	_surface->setVisible(false);
+	if (getSubVar(0xCCE0280F, _index))
+		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
+	SetUpdateHandler(&AsScene1405Tile::update);
+	SetMessageHandler(&AsScene1405Tile::handleMessage);
+	
+	debug("getSubVar(0x0C65F80B, _index) = %d", getSubVar(0x0C65F80B, _index));
+	
+	setFileHash(0x844B805C, getSubVar(0x0C65F80B, _index), -1);
+	_newHashListIndex = (int16)getSubVar(0x0C65F80B, _index);
+}
+
+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(0xCCE0280F, _index) == 0 && _parentScene->getCountdown() == 0) {
+			show();
+			_parentScene->sendMessage(0x2000, _index, this);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1405Tile::show() {
+	if (!_flag) {
+		_flag = true;
+		_soundResource.play();
+		_surface->setVisible(true);
+	}
+}
+
+void AsScene1405Tile::hide() {
+	if (_flag) {
+		_flag = false;
+		_soundResource.play();
+		_surface->setVisible(false);
+	}
+}
+
+Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm), _selectFirstTile(true),
+	_tilesLeft(48), _countdown(0) {
+
+	_vm->gameModule()->initScene1405Vars();
+	_surfaceFlag = true;
+	
+	_background = addBackground(new DirtyBackground(_vm, 0x0C0C007D, 0, 0));
+	_palette = new Palette(_vm, 0x0C0C007D);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse435(_vm, 0xC00790C8, 20, 620));
+	
+	// TODO: Some debug code: Leave two matching tiles open
+	for (int i = 0; i < 48; i++)
+		setSubVar(0xCCE0280F, i, 1);
+	int debugIndex = 0;
+	setSubVar(0xCCE0280F, debugIndex, 0);
+	for (int i = 0; i < 48; i++) {
+		if (i != debugIndex && getSubVar(0x0C65F80B, i) == getSubVar(0x0C65F80B, debugIndex)) {
+			setSubVar(0xCCE0280F, i, 0);
+			break;
+		}
+	}
+	
+	for (uint32 index = 0; index < 48; index++) {
+		_tiles[index] = new AsScene1405Tile(_vm, this, index);
+		addSprite(_tiles[index]);
+		_vm->_collisionMan->addSprite(_tiles[index]);
+		if (getSubVar(0xCCE0280F, index))
+			_tilesLeft--;
+	}
+	
+	_soundResource.load(0x68E25540);
+	
+	SetMessageHandler(&Scene1405::handleMessage);
+	SetUpdateHandler(&Scene1405::update);
+
+}
+
+void Scene1405::update() {
+	Scene::update();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		_tilesLeft = 48;
+		_tiles[_firstTileIndex]->hide();
+		_tiles[_secondTileIndex]->hide();
+		for (uint32 i = 0; i < 48; i++) {
+			if (getSubVar(0xCCE0280F, i)) {
+				_tiles[i]->hide();
+				setSubVar(0xCCE0280F, i, 0);
+			}
+		}
+	}
+}
+
+uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO: Debug/Cheat stuff
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x000D:
+		// TODO: Debug/Cheat stuff
+		break;
+	case 0x2000:
+		if (_selectFirstTile) {
+			_firstTileIndex = param.asInteger();
+			_selectFirstTile = false;
+		} else {
+			_secondTileIndex = param.asInteger();
+			if (_firstTileIndex != _secondTileIndex) {
+				_selectFirstTile = true;
+				if (getSubVar(0x0C65F80B, _secondTileIndex) == getSubVar(0x0C65F80B, _firstTileIndex)) {
+					setSubVar(0xCCE0280F, _firstTileIndex, 1);
+					setSubVar(0xCCE0280F, _secondTileIndex, 1);
+					_tilesLeft -= 2;
+					if (_tilesLeft == 0) {
+						_soundResource.play();
+					}
+				} else {
+					_countdown = 10;
+				}
+			}
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 433dc41..72afb4f 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -26,6 +26,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/module1200.h"
 
 namespace Neverhood {
 
@@ -237,6 +238,71 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+// Scene1403
+
+class Scene1403 : public Scene {
+public:
+	Scene1403(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_class401_1;
+	Sprite *_class401_2;
+	Sprite *_class401_3;
+	AsScene1201Tape *_asTape1;
+	AsScene1201Tape *_asTape2;
+	Sprite *_class489;
+	bool _flag;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+// Scene1404
+
+class Scene1404 : public Scene {
+public:
+	Scene1404(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene1404();
+protected:
+	Sprite *_sprite1;
+	Sprite *_asTape;
+	Sprite *_class489;
+	Sprite *_class545;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+// Scene1405
+
+class Scene1405;
+
+class AsScene1405Tile : public AnimatedSprite {
+public:
+	AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index);
+	void show();
+	void hide();
+protected:
+	Scene1405 *_parentScene;
+	SoundResource _soundResource;
+	bool _flag;
+	uint32 _index;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1405 : public Scene {
+public:
+	Scene1405(NeverhoodEngine *vm, Module *parentModule, int which);
+	int getCountdown() const { return _countdown; }
+protected:
+	SoundResource _soundResource;
+	bool _selectFirstTile;
+	int _firstTileIndex;
+	int _secondTileIndex;
+	int _tilesLeft;
+	int _countdown;
+	AsScene1405Tile *_tiles[48];
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1400_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 1f253c0..0db5d62 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -156,8 +156,11 @@ Common::Error NeverhoodEngine::run() {
 #endif
 
 #if 1
+
 	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
+	
+	_gameModule->startup();
 
 	// Preliminary main loop, needs some more work but works for testing
 	while (!shouldQuit()) {
@@ -181,14 +184,9 @@ Common::Error NeverhoodEngine::run() {
 			case Common::EVENT_RBUTTONDOWN:
 				_gameModule->handleMouseDown(event.mouse.x, event.mouse.y);
 				break;
-			/*			
-			case Common::EVENT_LBUTTONUP:
-			case Common::EVENT_RBUTTONUP:
-				break;
 			case Common::EVENT_QUIT:
 				_system->quit();
 				break;
-			*/			
 			default:
 				break;
 			}
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 86f7a0a..edb204c 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -118,6 +118,7 @@ public:
 #endif
 
 	GameState& gameState() { return _gameState; }
+	GameModule *gameModule() { return _gameModule; }
 	int16 getMouseX() const { return _mouseX; }
 	int16 getMouseY() const { return _mouseY; }
 	NPoint getMousePos();
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index d725ced..b9a464c 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -505,7 +505,7 @@ void Scene::setRectList(RectList *rectList) {
 
 void Scene::clearRectList() {
 	_rectList = NULL;
-	_rectType = 1;
+	_rectType = 0;
 }
 
 void Scene::loadDataResource(uint32 fileHash) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 86165f3..a518c39 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -30,7 +30,7 @@
 
 namespace Neverhood {
 
-#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback); debug("SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback
+#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback); debug(2, "SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback
 #define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug("SetFilterX(" #callback ")")
 #define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug("SetFilterY(" #callback ")")
 


Commit: ad7c50d593594247f1669177eccb37e3ab8394ed
    https://github.com/scummvm/scummvm/commit/ad7c50d593594247f1669177eccb37e3ab8394ed
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Add more tables

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 58e48dc..aa70279 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -52,6 +52,11 @@ static const uint32 rectListOffsets[] = {
 	// Scene1402
 	1, 0x004B0C48,
 	1, 0x004B0C98,
+	// Scene1403
+	1, 0x004B1FF8,
+	1, 0x004B2008,
+	// Scene1404
+	1, 0x004B8D80,
 	// Scene1705
 	1, 0x004B6B40,
 	1, 0x004B6B30,
@@ -118,6 +123,26 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B0B68,
 	3, 0x004B0BB8,
 	3, 0x004B0BD0,
+	// Scene1403
+	1, 0x004B1F18,
+	1, 0x004B1F20,
+	3, 0x004B1F70,
+	2, 0x004B1FA8,
+	4, 0x004B1F88,
+	3, 0x004B1F58,
+	2, 0x004B1F28,
+	2, 0x004B1FB8,
+	// Scene1404
+	1, 0x004B8C28,
+	1, 0x004B8C30,
+	1, 0x004B8C38,
+	1, 0x004B8D28,
+	3, 0x004B8CB8,
+	2, 0x004B8C40,
+	6, 0x004B8CE8,
+	3, 0x004B8CA0,
+	2, 0x004B8CD0,
+	2, 0x004B8D18,
 	// Scene1705
 	1, 0x004B69E8,
 	2, 0x004B6A08,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index a76db0a..f120857 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 08be9cde7b6d5dbd8632e73cc5e07820fca61bda
    https://github.com/scummvm/scummvm/commit/08be9cde7b6d5dbd8632e73cc5e07820fca61bda
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Implement Scene3010 (door lock)

Changed paths:
  A engines/neverhood/module3000.cpp
  A engines/neverhood/module3000.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.mk



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d4b1e7b..6d9c577 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -30,6 +30,7 @@
 #include "neverhood/module1700.h"
 #include "neverhood/module1800.h"
 #include "neverhood/module2300.h"
+#include "neverhood/module3000.h"
 
 namespace Neverhood {
 
@@ -268,7 +269,11 @@ void GameModule::updateModule1200() {
 
 void GameModule::createModule1400(int which) {
 	setGlobalVar(0x91080831, 0x00AD0012);
-	_childObject = new Module1400(_vm, this, which);
+	//_childObject = new Module1400(_vm, this, which);
+	
+	_vm->gameState().sceneNum = 9;
+	_childObject = new Module3000(_vm, this, -1);
+	
 	SetUpdateHandler(&GameModule::updateModule1400);
 }
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 0b3b10c..20e0bbb 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -18,6 +18,7 @@ MODULE_OBJS = \
 	module1700.o \
 	module1800.o \
 	module2300.o \
+	module3000.o \
 	mouse.o \
 	navigationscene.o \
 	neverhood.o \
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
new file mode 100644
index 0000000..b2fd80f
--- /dev/null
+++ b/engines/neverhood/module3000.cpp
@@ -0,0 +1,525 @@
+/* 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/module3000.h"
+
+namespace Neverhood {
+
+Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule), _moduleDone(false), _soundVolume(0) {
+	
+	debug("Create Module3000(%d)", which);
+
+	// TODO Sound1ChList_addSoundResources(0x81293110, dword_4B7FC8, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 1, 50, 600, 5, 150);
+	// TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
+	// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+	// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+	// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+
+    _flag = getGlobalVar(0x10938830) != 0;
+
+	if (_flag) {
+		// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
+		// TODO Sound1ChList_playLooping(0x90F0D1C3);
+	}
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		default:
+		case 1:
+			createScene3002(-1);
+			break;
+		case 2:
+			createScene3003(-1);
+			break;
+		case 3:
+			createScene3004(-1);
+			break;
+		case 4:
+			createScene3005(-1);
+			break;
+		case 5:
+			createScene3006(-1);
+			break;
+		case 6:
+			createScene3007(-1);
+			break;
+		case 7:
+			createScene3008(-1);
+			break;
+		case 8:
+			createScene3009(-1);
+			break;
+		case 9:
+			createScene3010(-1);
+			break;
+		case 10:
+			createScene3011(-1);
+			break;
+		case 11:
+			createScene3012(-1);
+			break;
+		case 12:
+			createScene3013(-1);
+			break;
+		}
+	} else if (which == 0) {
+		createScene3002(0);
+	} else if (which == 1) {
+		createScene3005(2);
+	} else if (which == 2) {
+		createScene3005(1);
+	} else if (which == 3) {
+		createScene3006(1);
+	}
+
+	SetMessageHandler(&Module3000::handleMessage);
+
+}
+
+Module3000::~Module3000() {
+	// TODO Sound1ChList_sub_407A50(0x81293110);
+}
+
+void Module3000::createScene3002(int which) {
+	// TODO
+}
+
+void Module3000::createScene3003(int which) {
+	// TODO
+}
+
+void Module3000::createScene3004(int which) {
+	// TODO
+}
+
+void Module3000::createScene3005(int which) {
+	// TODO
+}
+
+void Module3000::createScene3006(int which) {
+	// TODO
+}
+
+void Module3000::createScene3007(int which) {
+	// TODO
+}
+
+void Module3000::createScene3008(int which) {
+	// TODO
+}
+
+void Module3000::createScene3009(int which) {
+	// TODO
+}
+
+void Module3000::createScene3010(int which) {
+	_vm->gameState().sceneNum = 9;
+	_childObject = new Scene3010(_vm, this, 0);
+	SetUpdateHandler(&Module3000::updateScene3010);
+}
+
+void Module3000::createScene3011(int which) {
+	// TODO
+}
+
+void Module3000::createScene3012(int which) {
+	// TODO
+}
+
+void Module3000::createScene3013(int which) {
+	// TODO
+}
+
+void Module3000::updateScene3010() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+	}
+}
+
+// Scene3010
+
+static const uint32 kScene3010VarNameHashes[] = {
+	0x304008D2,
+	0x40119852,
+	0x01180951
+};
+
+static const uint32 kScene3010DeadBoltButtonFileHashes1[] = {
+	0x301024C2,
+	0x20280580,
+	0x30200452
+};
+
+static const uint32 kScene3010DeadBoltButtonFileHashes2[] = {
+	0x50C025A8,
+	0x1020A0A0,
+	0x5000A7E8
+};
+
+static const NPoint kAsScene3010DeadBoltPoints[] = {
+	{550, 307},
+	{564, 415},
+	{560, 514}
+};
+
+static const uint32 kAsScene3010DeadBoltFileHashes2[] = {
+	0x181A0042,
+	0x580A08F2,
+	0x18420076
+};
+
+static const uint32 kAsScene3010DeadBoltFileHashes1[] = {
+	0x300E105A,
+	0x804E0052,
+	0x040E485A
+};
+
+SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _soundResource1(vm),
+	_soundResource2(vm), _soundResource3(vm), _buttonLocked(false), _countdown1(0), 
+	_countdown2(0), _buttonIndex(buttonIndex) {
+
+	NDimensions dimensions1, dimensions2;
+	 
+	_buttonEnabled = getSubVar(0x14800353, kScene3010VarNameHashes[_buttonIndex]) != 0;
+	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
+	dimensions1 = _spriteResource.getDimensions();
+	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
+	dimensions2 = _spriteResource.getDimensions();
+	createSurface(400, 
+		MAX(dimensions1.width, dimensions2.width),
+		MAX(dimensions1.height, dimensions2.height));
+	setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
+	if (initDisabled) {
+		disableButton();
+	} else if (_buttonEnabled) {
+		_countdown1 = initCountdown * 12 + 1;
+	}
+	_soundResource1.load(0xF4217243);
+	_soundResource2.load(0x44049000);
+	_soundResource3.load(0x6408107E);
+	SetUpdateHandler(&SsScene3010DeadBoltButton::update);
+	SetMessageHandler(&SsScene3010DeadBoltButton::handleMessage);
+}
+
+void SsScene3010DeadBoltButton::update() {
+
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+		_soundResource1.play();
+		_surface->setVisible(false);
+		setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
+	}
+
+	if (_countdown2 != 0 && (--_countdown2 == 0)) {
+		_surface->setVisible(true);
+		setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
+	}
+
+}
+
+uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (!_buttonLocked && _countdown1 == 0) {
+			if (_buttonEnabled) {
+				_soundResource2.play();
+				_soundResource3.play();
+				_surface->setVisible(true);
+				_buttonLocked = true;
+				_parentScene->sendMessage(0x2000, _buttonIndex, this);
+			} else {
+				_parentScene->sendMessage(0x2002, _buttonIndex, this);
+			}
+			_needRefresh = true;
+			StaticSprite::update();
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void SsScene3010DeadBoltButton::disableButton() {
+	_buttonLocked = true;
+	setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
+	_surface->setVisible(true);
+}
+
+void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
+	_spriteResource.load(fileHash);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = _spriteResource.getDimensions().width;
+	_deltaRect.height = _spriteResource.getDimensions().height;
+	processDelta();
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
+void SsScene3010DeadBoltButton::setCountdown(int count) {
+	_countdown2 = count * 18 + 1;
+}
+
+AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked)
+	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
+	_parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false),
+	_countdown(0) {
+
+    _x = kAsScene3010DeadBoltPoints[_boltIndex].x;
+    _y = kAsScene3010DeadBoltPoints[_boltIndex].y;
+
+	if (getSubVar(0x14800353, kScene3010VarNameHashes[_boltIndex])) {
+		createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200);
+		setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
+		_soundResource1.load(0x46005BC4);
+	} else {
+		createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200);
+		setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
+		_soundResource1.load(0x420073DC);
+		_soundResource2.load(0x420073DC);
+	}
+	
+	_surface->setVisible(false);
+	stIdle();
+	if (initUnlocked)
+		unlock(true);
+
+	_needRefresh = true;
+	AnimatedSprite::updatePosition();
+	
+}
+
+void AsScene3010DeadBolt::update() {
+	updateAnim();
+	updatePosition();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		stDisabled();
+	}
+}
+
+uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene3010DeadBolt::stIdle() {
+	setFileHash1();
+	SetUpdateHandler(&AsScene3010DeadBolt::update);
+	SetMessageHandler(&Sprite::handleMessage);
+	_locked = false;
+}
+
+void AsScene3010DeadBolt::unlock(bool skipAnim) {
+	if (!_unlocked) {
+		_surface->setVisible(true);
+		if (skipAnim) {
+			setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0);
+			_newHashListIndex = -2;
+		} else {
+			setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
+			SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
+			setCallback1(AnimationCallback(&AsScene3010DeadBolt::stIdleMessage));
+			SetAnimationCallback3(&AsScene3010DeadBolt::stIdle);
+			_soundResource1.play();
+		}
+		_unlocked = true;
+		_soundResource3.load(0x4010C345);
+	}
+}
+
+void AsScene3010DeadBolt::stIdleMessage() {
+	setFileHash1();
+	SetMessageHandler(&Sprite::handleMessage);
+	_parentScene->sendMessage(0x2001, _boltIndex, this);
+}
+
+void AsScene3010DeadBolt::lock() {
+	if (!_locked) {
+		_locked = true;
+		_surface->setVisible(true);
+		setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
+		SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
+		setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage));
+		SetAnimationCallback3(&AsScene3010DeadBolt::stIdle);
+		if (_soundToggle) {
+			_soundResource1.play();
+		} else {
+			_soundResource2.play();
+		}
+		_soundToggle = !_soundToggle;
+	}
+}
+
+void AsScene3010DeadBolt::setCountdown(int count) {
+	_countdown = count * 18 + 1;
+}
+
+void AsScene3010DeadBolt::stDisabled() {
+	_surface->setVisible(true);
+	setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
+	SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
+	setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage));
+	SetAnimationCallback3(&AsScene3010DeadBolt::stIdle);
+	_playBackwards = true;
+	_soundResource3.play();
+}
+
+void AsScene3010DeadBolt::stDisabledMessage() {
+	_surface->setVisible(false);
+	_parentScene->sendMessage(0x2003, _boltIndex, this);
+}
+
+Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm), _countdown(0),
+	_doorUnlocked(false), _checkUnlocked(false) {
+	
+	int initCountdown = 0;
+
+	// DEBUG: Enable all buttons
+    setSubVar(0x14800353, kScene3010VarNameHashes[0], 1);
+    setSubVar(0x14800353, kScene3010VarNameHashes[1], 1);
+    setSubVar(0x14800353, kScene3010VarNameHashes[2], 1);
+
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x80802626, 0, 0));
+	_palette = new Palette(_vm, 0x80802626);
+	_palette->usePalette();
+
+	for (int i = 0; i < 3; i++) {
+		_asDeadBolts[i] = new AsScene3010DeadBolt(_vm, this, i, which == 1);//CHECKME
+		addSprite(_asDeadBolts[i]);
+		_ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME
+		addSprite(_ssDeadBoltButtons[i]);
+		_vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]);
+		if (getSubVar(0x14800353, kScene3010VarNameHashes[i]))
+			initCountdown++;
+		_boltUnlocking[i] = false;
+		_boltUnlocked[i] = false;
+	}
+
+	if (which == 0) {
+		_mouseCursor = addSprite(new Mouse435(_vm, 0x02622800, 20, 620));
+	}
+
+	_soundResource.load(0x68E25540);
+
+	SetMessageHandler(&Scene3010::handleMessage);
+	SetUpdateHandler(&Scene3010::update);
+
+	if (which == 1) {
+		_checkUnlocked = true;
+		for (int i = 0; i < 3; i++) {
+			_boltUnlocked[i] = true;
+			_ssDeadBoltButtons[i]->setCountdown(i + 1);
+			_asDeadBolts[i]->setCountdown(i + 1);
+		}
+	}
+
+}
+
+void Scene3010::update() {
+	Scene::update();
+	if (_checkUnlocked && !_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) {
+		_countdown = 24;
+		_checkUnlocked = false;
+	}
+	if (_countdown != 0 && (--_countdown == 0)) {
+		_parentModule->sendMessage(0x1009, _doorUnlocked ? 1 : 0, this);
+	}
+}
+
+uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO: Debug stuff
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) {
+			if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) {
+				_mouseCursor->getSurface()->setVisible(false);
+				if (!_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) {
+					_countdown = 1;
+				} else {
+					_checkUnlocked = true;
+					for (int i = 0; i < 3; i++) {
+						_ssDeadBoltButtons[i]->setCountdown(i);
+						if (_boltUnlocked[i]) {
+							_asDeadBolts[i]->setCountdown(i);
+						}
+					}
+				}
+			}
+		}
+		break;
+	case 0x000D:
+		// TODO: Debug stuff
+		break;
+	case 0x2000:
+		if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) {
+			_asDeadBolts[param.asInteger()]->unlock(false);
+			_boltUnlocking[param.asInteger()] = true;
+		}
+		break;
+	case 0x2001:
+		_boltUnlocked[param.asInteger()] = true;
+		_boltUnlocking[param.asInteger()] = false;
+		if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) {
+			if (!getGlobalVar(0x00040153)) {
+				setGlobalVar(0x00040153, 1);
+				_soundResource.play();
+				_countdown = 60;
+			} else {
+				_countdown = 48;
+			}
+			_doorUnlocked = true;
+		}
+		break;
+	case 0x2002:
+		if (!_checkUnlocked && _countdown == 0) {
+			_asDeadBolts[param.asInteger()]->lock();
+		}
+		break;
+	case 0x2003:
+		_boltUnlocked[param.asInteger()] = false;
+		break;
+	}
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
new file mode 100644
index 0000000..b2375fc
--- /dev/null
+++ b/engines/neverhood/module3000.h
@@ -0,0 +1,121 @@
+/* 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_MODULE3000_H
+#define NEVERHOOD_MODULE3000_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/module1200.h"
+
+namespace Neverhood {
+
+class Module3000 : public Module {
+public:
+	Module3000(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module3000();
+protected:
+	bool _moduleDone;
+	int _moduleDoneStatus;
+	int _soundVolume;
+	bool _flag;
+	void createScene3002(int which);
+	void createScene3003(int which);
+	void createScene3004(int which);
+	void createScene3005(int which);
+	void createScene3006(int which);
+	void createScene3007(int which);
+	void createScene3008(int which);
+	void createScene3009(int which);
+	void createScene3010(int which);
+	void createScene3011(int which);
+	void createScene3012(int which);
+	void createScene3013(int which);
+	void updateScene3010();			
+};
+
+// Scene3010
+
+class SsScene3010DeadBoltButton : public StaticSprite {
+public:
+	SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled);
+	void setCountdown(int count);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	int _buttonIndex;
+	bool _buttonEnabled;
+	bool _buttonLocked;
+	int _countdown1;
+	int _countdown2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void disableButton();
+	void setSprite(uint32 fileHash);
+};
+
+class AsScene3010DeadBolt : public AnimatedSprite {
+public:
+	AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked);
+	void setCountdown(int count);
+	void lock();
+	void unlock(bool skipAnim);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	int _boltIndex;
+	int _countdown;
+	bool _soundToggle;
+	bool _unlocked;
+	bool _locked;
+	void update();
+	uint32 hmAnimation(int messageNum, const MessageParam &param, Entity *sender);
+	void stIdle();
+	void stIdleMessage();
+	void stDisabled();
+	void stDisabledMessage();
+};
+
+class Scene3010 : public Scene {
+public:
+	Scene3010(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	SoundResource _soundResource;
+	int _countdown;
+	bool _doorUnlocked;
+	bool _checkUnlocked;
+	SsScene3010DeadBoltButton *_ssDeadBoltButtons[3];
+	AsScene3010DeadBolt *_asDeadBolts[3];
+	bool _boltUnlocked[3];
+	bool _boltUnlocking[3];
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE3000_H */


Commit: 63fe7bd18a10e2799d6c6d4566aa6655636ad637
    https://github.com/scummvm/scummvm/commit/63fe7bd18a10e2799d6c6d4566aa6655636ad637
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Introduce and use Module::createNavigationScene and Module::createSmackerScene

Changed paths:
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1200.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2300.cpp



diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 8f0b556..15960e8 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -21,6 +21,8 @@
  */
 
 #include "neverhood/module.h"
+#include "neverhood/navigationscene.h"
+#include "neverhood/smackerscene.h"
 
 namespace Neverhood {
 
@@ -70,4 +72,16 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 	return 0;
 }
 
+void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes) {
+	_childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes);
+}
+
+void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort) {
+	SmackerScene *smackerScene;
+	smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort);
+	smackerScene->setFileHash(fileHash);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 790130a..fd35f0d 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -48,6 +48,8 @@ protected:
 	int16 _field24, _field26, _field28;
 	uint32 _field20;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
+	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 7a09b5f..ff494e7 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -21,7 +21,6 @@
  */
 
 #include "neverhood/module1200.h"
-#include "neverhood/smackerscene.h"
 
 namespace Neverhood {
 
@@ -81,13 +80,9 @@ void Module1200::createScene1202(int which) {
 }
 
 void Module1200::createScene1203(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 2;
 	// TODO Music18hList_stop(0x62222CAE, 0, 0);
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x31890001);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x31890001, true, true, false);
 	setGlobalVar(0x2A02C07B, 1);
 	SetUpdateHandler(&Module1200::updateScene1203);
 }
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 4da5faa..52e5ae7 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -24,7 +24,6 @@
 #include "neverhood/module1000.h"
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/gamemodule.h"
-#include "neverhood/navigationscene.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 95b3925..9506f80 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -91,19 +91,13 @@ void Module1500::createScene1502() {
 }
 
 void Module1500::createScene1503() {
-	debug("createScene1503");
-	SmackerScene *smackerScene;
 	_parentModule->sendMessage(0x0800, 0, this);
 	_vm->gameState().sceneNum = 2;
-	smackerScene = new SmackerScene(_vm, this, true, true, true);
-	smackerScene->setFileHash(0x001A0005);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x001A0005, true, true, true);
 	SetUpdateHandler(&Module1500::update);
 }
 
 void Module1500::createScene1504() {
-	debug("createScene1504");
 	_vm->gameState().sceneNum = 3;
 	_childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48);
 	SetUpdateHandler(&Module1500::update);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 3289173..e6cbe62 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -21,7 +21,6 @@
  */
 
 #include "neverhood/module1700.h"
-#include "neverhood/navigationscene.h"
 
 namespace Neverhood {
 
@@ -67,36 +66,28 @@ Module1700::~Module1700() {
 }
 
 void Module1700::createScene1701(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 0;
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x3028A005);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x3028A005, true, true, false);
 	SetUpdateHandler(&Module1700::updateScene1701);
 }
 
 void Module1700::createScene1702(int which) {
 	_vm->gameState().sceneNum = 1;
-	_childObject = new NavigationScene(_vm, this, 0x004AE8B8, which, NULL);
+	createNavigationScene(0x004AE8B8, which);
 	SetUpdateHandler(&Module1700::updateScene1702);
 }
 
 void Module1700::createScene1703(int which) {
 	_vm->gameState().sceneNum = 2;
-	_childObject = new NavigationScene(_vm, this, 0x004AE8E8, which, NULL);
+	createNavigationScene(0x004AE8E8, which);
 	SetUpdateHandler(&Module1700::updateScene1703);
 }
 
 void Module1700::createScene1704(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 3;
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x01190041);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x01190041, true, true, false);
 	SetUpdateHandler(&Module1700::updateScene1701);
 }
 
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 2a4d89c..1ce2d0f 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -22,9 +22,6 @@
 
 #include "neverhood/module1800.h"
 #include "neverhood/navigationscene.h"
-#include "neverhood/smackerscene.h"
-
-#include "neverhood/diskplayerscene.h"
 
 namespace Neverhood {
 
@@ -85,77 +82,58 @@ Module1800::~Module1800() {
 void Module1800::createScene1801(int which) {
 	static const byte kNavigationTypes[] = {1, 0, 2, 0};
 	_vm->gameState().sceneNum = 0;
-#if 0	
-	_childObject = new NavigationScene(_vm, this, 0x004AFD38, which, kNavigationTypes);
-#endif
-	_childObject = new DiskplayerScene(_vm, this, 3);	
+	createNavigationScene(0x004AFD38, which, kNavigationTypes);
 	SetUpdateHandler(&Module1800::updateScene1801);
 }
 			
 void Module1800::createScene1802(int which) {
 	static const byte kNavigationTypes[] = {5};
 	_vm->gameState().sceneNum = 1;
-	_childObject = new NavigationScene(_vm, this, 0x004AFD98, which, kNavigationTypes);
+	createNavigationScene(0x004AFD98, which, kNavigationTypes);
 	SetUpdateHandler(&Module1800::updateScene1802);
 }
 
 void Module1800::createScene1803(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 2;
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x006C0085);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x006C0085, true, true, false);
 	SetUpdateHandler(&Module1800::updateScene1803);
 }
 			
 void Module1800::createScene1804(int which) {
 	_vm->gameState().sceneNum = 3;
-	_childObject = new NavigationScene(_vm, this, 0x004AFDB0, which, NULL);
+	createNavigationScene(0x004AFDB0, which);
 	SetUpdateHandler(&Module1800::updateScene1804);
 }
 
 void Module1800::createScene1804b(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 3;
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x0A840C01);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x0A840C01, true, true, false);
 	SetUpdateHandler(&Module1800::updateScene1803);
 }
 			
 void Module1800::createScene1805(int which) {
 	_vm->gameState().sceneNum = 4;
-	_childObject = new NavigationScene(_vm, this, 0x004AFDE0, which, NULL);
+	createNavigationScene(0x004AFDE0, which);
 	SetUpdateHandler(&Module1800::updateScene1805);
 }
 
 void Module1800::createScene1806(int which) {
 	_vm->gameState().sceneNum = 5;
-	_childObject = new NavigationScene(_vm, this, 0x004AFE40, which, NULL);
+	createNavigationScene(0x004AFE40, which);
 	SetUpdateHandler(&Module1800::updateScene1806);
 }
 
 void Module1800::createScene1807(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 6;
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x08D84010);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x08D84010, true, true, false);
 	SetUpdateHandler(&Module1800::updateScene1803);
 	// TODO Sound1ChList_sub_407A50(0x04A14718);
 }
 			
 void Module1800::createScene1808(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 7;
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0);
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x0168B121);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x0168B121, true, true, false);
 	SetUpdateHandler(&Module1800::updateScene1803);
 }
 			
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 32ce2a1..6bd10bb 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -21,8 +21,6 @@
  */
 
 #include "neverhood/module2300.h"
-#include "neverhood/navigationscene.h"
-#include "neverhood/smackerscene.h"
 
 namespace Neverhood {
 
@@ -84,13 +82,13 @@ Module2300::~Module2300() {
 
 void Module2300::createScene2301(int which) {
 	_vm->gameState().sceneNum = 0;
-	_childObject = new NavigationScene(_vm, this, 0x004B67B8, which, NULL);
+	createNavigationScene(0x004B67B8, which);
 	SetUpdateHandler(&Module2300::updateScene2301);
 }
 			
 void Module2300::createScene2302(int which) {
 	_vm->gameState().sceneNum = 1;
-	_childObject = new NavigationScene(_vm, this, 0x004B67E8, which, NULL);
+	createNavigationScene(0x004B67E8, which);
 	SetUpdateHandler(&Module2300::updateScene2302);
 	if (_flag) {
 		_volume = 15;
@@ -100,17 +98,17 @@ void Module2300::createScene2302(int which) {
 
 void Module2300::createScene2303(int which) {
 	_vm->gameState().sceneNum = 2;
-	_childObject = new NavigationScene(_vm, this, 0x004B6878, which, NULL);
+	createNavigationScene(0x004B6878, which);
 	SetUpdateHandler(&Module2300::updateScene2303);
 }
 
 void Module2300::createScene2304(int which) {
 	_vm->gameState().sceneNum = 3;
 	if (getGlobalVar(0x10938830)) {
-		_childObject = new NavigationScene(_vm, this, 0x004B68F0, which, NULL);
+		createNavigationScene(0x004B68F0, which);
 	} else {
 		// TODO Sound1ChList_setVolume(0x90F0D1C3, _volume);
-		_childObject = new NavigationScene(_vm, this, 0x004B68A8, which, NULL);
+		createNavigationScene(0x004B68A8, which);
 		if (_flag) {
 			_volume = 87;
 			// TODO Sound1ChList_setVolume(0x90F0D1C3, 87);
@@ -120,13 +118,9 @@ void Module2300::createScene2304(int which) {
 }
 
 void Module2300::createScene2305(int which) {
-	SmackerScene *smackerScene;
 	_vm->gameState().sceneNum = 4;
 	// TODO Sound1ChList_sub_4080B0(true);
-	smackerScene = new SmackerScene(_vm, this, true, true, false);
-	smackerScene->setFileHash(0x20080A0B);
-	smackerScene->nextVideo();
-	_childObject = smackerScene;
+	createSmackerScene(0x20080A0B, true, true, false);
 	SetUpdateHandler(&Module2300::updateScene2305);
 }
 


Commit: d88836596d4c12763332d300c0da2282e24f535d
    https://github.com/scummvm/scummvm/commit/d88836596d4c12763332d300c0da2282e24f535d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: More work on Module3000 and Scene3009 (incomplete)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6d9c577..f280399 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -214,12 +214,13 @@ void GameModule::startup() {
 //	createModule1500(0); // Logos and intro video //Real
 //	createModule1000(-1);
 //	createModule2300(2);
-	_vm->gameState().sceneNum = 4;
+	_vm->gameState().sceneNum = 8;
 	//createModule1200(-1);
 	//createModule1800(-1);
 	//createModule1700(-1);
 	//createModule1700(1);
-	createModule1400(-1);
+	//createModule1400(-1);
+	createModule3000(-1);
 }
 
 void GameModule::createModule1000(int which) {
@@ -418,7 +419,35 @@ void GameModule::createModule2400(int which) {
 }
 
 void GameModule::createModule3000(int which) {
-	error("createModule3000");
+	setGlobalVar(0x91080831, 0x81293110);
+	_childObject = new Module3000(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule3000);
+}
+
+void GameModule::updateModule3000() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			// TODO createModule1900(0);
+			// TODO _childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			// WEIRD: Sets the errorFlag
+		} else if (_field20 == 3) {
+			createModule1800(3);
+			_childObject->handleUpdate();
+		} else if (_field20 == 4) {
+			// TODO createModule3000(0);
+			// TODO _childObject->handleUpdate();
+		} else {
+			createModule2300(4);
+			_childObject->handleUpdate();
+		}
+	}
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index d93a799..8d5aace 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -67,6 +67,7 @@ protected:
 	void updateModule2300();
 	void createModule2400(int which);
 	void createModule3000(int which);
+	void updateModule3000();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 15960e8..edf67c7 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -72,6 +72,11 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 	return 0;
 }
 
+NavigationScene *Module::navigationScene() {
+	// Not so nice
+	return (NavigationScene*)_childObject;
+}
+
 void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes) {
 	_childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes);
 }
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index fd35f0d..470fe36 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -36,6 +36,8 @@
 
 namespace Neverhood {
 
+class NavigationScene;
+
 class Module : public Entity {
 public:
 	Module(NeverhoodEngine *vm, Module *parentModule);
@@ -48,6 +50,7 @@ protected:
 	int16 _field24, _field26, _field28;
 	uint32 _field20;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	NavigationScene *navigationScene();
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
 	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
 };
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 1ce2d0f..e2c88dc 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -173,7 +173,7 @@ void Module1800::updateScene1801() {
 void Module1800::updateScene1802() {
 	_childObject->handleUpdate();
 	if (_done) {
-		int areaType = ((NavigationScene*)_childObject)->getNavigationAreaType();
+		int areaType = navigationScene()->getNavigationAreaType();
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index b2fd80f..c82c111 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/module3000.h"
+#include "neverhood/navigationscene.h"
 
 namespace Neverhood {
 
@@ -101,36 +102,115 @@ Module3000::~Module3000() {
 	// TODO Sound1ChList_sub_407A50(0x81293110);
 }
 
+uint32 Module3000::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1009:
+		_moduleDone = true;
+		_moduleDoneStatus = param.asInteger();
+		break;
+	}
+	return messageResult;
+}
+
 void Module3000::createScene3002(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 1;
+	if (!getGlobalVar(0x01BA1A52)) {
+		createNavigationScene(0x004B7C80, which);
+	} else if (getGlobalVar(0x10938830)) {
+		createNavigationScene(0x004B7CE0, which);
+	} else {
+		createNavigationScene(0x004B7CB0, which);
+	}
+	SetUpdateHandler(&Module3000::updateScene3002);
+}
+
+void Module3000::createScene3002b(int which) {
+	_vm->gameState().sceneNum = 1;
+	if (!getGlobalVar(0x01BA1A52)) {
+		if (getGlobalVar(0x10938830)) {
+			createSmackerScene(0x00940021, true, true, false);
+		} else {
+			createSmackerScene(0x01140021, true, true, false);
+		}
+	} else {
+		if (getGlobalVar(0x10938830)) {
+			createSmackerScene(0x001011B1, true, true, false);
+		} else {
+			createSmackerScene(0x001021B1, true, true, false);
+		}
+	}
+	SetUpdateHandler(&Module3000::updateScene3002b);
+	setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1);
 }
 
 void Module3000::createScene3003(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 2;
+	// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+	if (_flag) {
+		_soundVolume = 90;
+		// TODO Sound1ChList_setVolume(0x90F0D1C3, 90);
+	}
+	if (getGlobalVar(0x10938830)) {
+		createNavigationScene(0x004B7D58, which);
+	} else {
+		createNavigationScene(0x004B7D10, which);
+	}
+	SetUpdateHandler(&Module3000::updateScene3003);
 }
 
 void Module3000::createScene3004(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 3;
+	if (getGlobalVar(0x09221A62)) {
+		createNavigationScene(0x004B7E60, which);
+	} else if (getGlobalVar(0x10938830)) {
+		createNavigationScene(0x004B7DA0, which);
+	} else {
+		createNavigationScene(0x004B7E00, which);
+	}
+	SetUpdateHandler(&Module3000::updateScene3004);
 }
 
 void Module3000::createScene3005(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 4;
+	if (getGlobalVar(0x09221A62)) {
+		createNavigationScene(0x004B7F20, which);
+	} else {
+		createNavigationScene(0x004B7EC0, which);
+	}
+	SetUpdateHandler(&Module3000::updateScene3005);
 }
 
 void Module3000::createScene3006(int which) {
-	// TODO
+	static const byte kNavigationTypes[] = {3, 0};
+	_vm->gameState().sceneNum = 5;
+	createNavigationScene(0x004B7F80, which, kNavigationTypes);
+	SetUpdateHandler(&Module3000::updateScene3006);
 }
 
 void Module3000::createScene3007(int which) {
-	// TODO
+	static const byte kNavigationTypes[] = {5};
+	_vm->gameState().sceneNum = 6;
+	createNavigationScene(0x004B7FB0, which, kNavigationTypes);
+	SetUpdateHandler(&Module3000::updateScene3007);
 }
 
 void Module3000::createScene3008(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 6;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
+	if (!getSubVar(0x40050052, 0x089809C2)) {
+		setSubVar(0x40050052, 0x089809C2, 1);
+		createSmackerScene(0x90022001, true, true, false);
+	} else {
+		createSmackerScene(0x98022001, true, true, false);
+	}
+	SetUpdateHandler(&Module3000::updateScene3002b);
 }
 
 void Module3000::createScene3009(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 7;
+	_childObject = new Scene3009(_vm, this, which);
+	SetUpdateHandler(&Module3000::updateScene3009);
 }
 
 void Module3000::createScene3010(int which) {
@@ -144,11 +224,260 @@ void Module3000::createScene3011(int which) {
 }
 
 void Module3000::createScene3012(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 11;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
+	if (!getSubVar(0x40050052, 0x10130993)) {
+		setSubVar(0x40050052, 0x10130993, 1);
+		createSmackerScene(0x31093019, true, true, false);
+	} else {
+		createSmackerScene(0x20093019, true, true, false);
+	}
+	SetUpdateHandler(&Module3000::updateScene3002b);
 }
 
 void Module3000::createScene3013(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 12;
+	_childObject = new Scene3010(_vm, this, 1);
+	SetUpdateHandler(&Module3000::updateScene3002b);
+}
+
+void Module3000::updateScene3002() {
+	_childObject->handleUpdate();
+#if 0 // ALL TODO
+	if (navigationScene()->getSoundFlag1()) {
+		uint32 frameNumber = navigationScene()->getFrameNumber();
+		int navigationIndex = navigationScene()->getIndex();
+		if (navigationIndex == 1) {
+			if (frameNumber == 0) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+				// TODO Sound1ChList_setVolume(0x48498E46, 70);
+				// TODO Sound1ChList_setVolume(0x50399F64, 70);
+			} else if (frameNumber == 100) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+			}
+		} else if (navigationIndex == 0) {
+			if (frameNumber == 0) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+				// TODO Sound1ChList_setVolume(0x48498E46, 70);
+				// TODO Sound1ChList_setVolume(0x50399F64, 70);
+			} else if (frameNumber == 10) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+			}
+			if (_flag && _soundVolume < 90 && frameNumber % 2) {
+				if (frameNumber == 0)
+					_soundVolume = 40;
+				else
+					_soundVolume++;
+				// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+			}
+		}
+	}
+#endif
+	if (_moduleDone) {
+		int areaType = navigationScene()->getNavigationAreaType();
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (!getGlobalVar(0x01BA1A52)) {
+			if (_moduleDoneStatus == 0) {
+				createScene3010(-1);
+				_childObject->handleUpdate();
+			} else if (_moduleDoneStatus == 1) {
+				_parentModule->sendMessage(0x1009, 0, this);
+			}
+		} else {
+			if (_moduleDoneStatus == 0) {
+				if (areaType == 2) {
+					createScene3003(0);
+					_childObject->handleUpdate();
+				} else {
+					//createScene3002b(-1);
+					_childObject->handleUpdate();
+				}
+			} else if (_moduleDoneStatus == 1) {
+				_parentModule->sendMessage(0x1009, 0, this);
+			}
+		}
+	}
+}
+
+void Module3000::updateScene3002b() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		switch (_vm->gameState().sceneNum) {
+		case 1:
+			if (getGlobalVar(0x01BA1A52)) {
+				createScene3002(0);
+				_childObject->handleUpdate();
+			} else {
+				createScene3013(-1);
+				_childObject->handleUpdate();
+			}
+			break;
+		case 7:
+		case 8:
+			createScene3009(-1);
+			break;
+		case 11:
+			_parentModule->sendMessage(0x1009, 3, this);
+			break;
+		case 12:
+			createScene3002(0);
+			_childObject->handleUpdate();
+			break;
+		default:
+			createScene3006(0);
+			break;
+		}
+	}
+}
+
+void Module3000::updateScene3003() {
+	_childObject->handleUpdate();
+#if 0 // ALL TODO
+	if (navigationScene()->getSoundFlag1()) {
+		uint32 frameNumber = navigationScene()->getFrameNumber();
+		int navigationIndex = navigationScene()->getIndex();
+		if (_flag && _soundVolume > 1 && frameNumber % 2) {
+			_soundVolume--;
+			// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+		}
+		if (navigationIndex == 0) {
+			if (frameNumber == 35) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+			}
+		} else if (navigationIndex == 1) {
+			if (frameNumber == 55) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+				// TODO Sound1ChList_setVolume(0x48498E46, 70);
+				// TODO Sound1ChList_setVolume(0x50399F64, 70);
+			}
+		}
+	}
+#endif
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+		if (_flag) {
+			_soundVolume = 0;
+			// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
+		}
+		if (_moduleDoneStatus == 0) {
+			createScene3004(0);
+			_childObject->handleUpdate();
+		} else if (_moduleDoneStatus == 1) {
+			setGlobalVar(0x01BA1A52, 0);
+			createScene3002(1);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module3000::updateScene3004() {
+	_childObject->handleUpdate();
+#if 0 // ALL TODO
+	if (navigationScene()->getSoundFlag1()) {
+		uint32 frameNumber = navigationScene()->getFrameNumber();
+		int navigationIndex = navigationScene()->getIndex();
+		if (navigationIndex == 2) {
+			if (frameNumber == 40) {
+				// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+			}
+			if (_flag && _soundVolume < 90 && frameNumber % 2) {
+				if (frameNumber == 0)
+					_soundVolume = 40;
+				else
+					_soundVolume++;
+				// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+			}
+		}
+	}
+#endif
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_moduleDoneStatus == 1) {
+			createScene3005(0);
+			_childObject->handleUpdate();
+		} else if (_moduleDoneStatus == 3) {
+			createScene3011(-1);
+			_childObject->handleUpdate();
+		} else if (getGlobalVar(0x09221A62)) {
+			createScene3006(0);
+			_childObject->handleUpdate();
+		} else {
+			createScene3003(1);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module3000::updateScene3005() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_moduleDoneStatus == 0) {
+			_parentModule->sendMessage(0x1009, 1, this);
+		} else if (_moduleDoneStatus == 1) {
+			createScene3008(-1);
+			_childObject->handleUpdate();
+		} else if (_moduleDoneStatus == 2) {
+			createScene3004(3);
+			_childObject->handleUpdate();
+		}
+	}
+	// NOTE: Skipped resource preloading stuff
+}
+
+void Module3000::updateScene3006() {
+	_childObject->handleUpdate();
+#if 0 // ALL TODO
+	if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
+		// TODO Sound1ChList_sub_4080B0(false);
+	}
+#endif
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_moduleDoneStatus == 0) {
+			createScene3007(0);
+			_childObject->handleUpdate();
+		} else if (_moduleDoneStatus == 1) {
+			createScene3004(0);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
+void Module3000::updateScene3007() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		int areaType = navigationScene()->getNavigationAreaType();
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (areaType == 4) {
+			createScene3012(-1);
+			_childObject->handleUpdate();
+		} else {
+			createSmackerScene(0x080810C5, true, true, false);
+			SetUpdateHandler(&Module3000::updateScene3002b);
+		}
+	}
+}
+
+void Module3000::updateScene3009() {
+	_childObject->handleUpdate();
+	// TODO...
 }
 
 void Module3000::updateScene3010() {
@@ -157,9 +486,517 @@ void Module3000::updateScene3010() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
+		if (_moduleDoneStatus == 0 || _moduleDoneStatus == 2) {
+			createScene3002(0);
+			_childObject->handleUpdate();
+		} else if (_moduleDoneStatus == 1) {
+			createScene3002b(-1);
+			_childObject->handleUpdate();
+		}
 	}
 }
 
+// Scene3009
+
+static const uint32 kScene3009SmackerFileHashes[] = {
+	0x1010000D,
+	0x340A0049,
+	0x340A0049,
+	0x0282081D,
+	0x0082080D,
+	0x0882080D,
+	0x0882080D,
+	0x0282081D,
+	0x004B000B,
+	0x014B000B,
+	0x044B000B,
+	0x0282081D,
+	0x0282081D,
+	0x0282081D,
+	0x340A0049
+};
+
+static const uint32 kScene3009VarValues[] = {
+	0x00000000,
+	0x8004001B,
+	0x0004001A,
+	0x1048404B,
+	0x50200109,
+	0x12032109,
+	0x10201109,
+	0x000A2030,
+	0x000A0028,
+	0x000A0028,
+	0x000A0028,
+	0x040A1069,
+	0x040A1069,
+	0x040A1069,
+	0x240A1101
+};
+
+static const uint32 kClass439FileHashes[] = {
+	0x618827A0,
+	0xB1A92322
+};
+
+static const uint32 kClass440FileHashes[] = {
+	0x4011018C,
+	0x15086623
+};
+
+static const NPoint kClass524Points[] = {
+	{289, 338},
+	{285, 375},
+	{284, 419},
+	{456, 372},
+	{498, 372},
+	{541, 372}
+};
+
+static const uint32 kClass524FileHashes[] = {
+	0x24542582,
+	0x1CD61D96
+};
+
+static const uint32 kClass441FileHashes1[] = {
+	0x24016060,  
+	0x21216221,
+	0x486160A0,
+	0x42216422,
+	0x90A16120,
+	0x84216824,
+	0x08017029,
+	0x08217029,
+	0x10014032,
+	0x10214032,
+	0x20012004,
+	0x20212004
+};
+
+static const uint32 kClass441FileHashes2[] = {
+	0x40092024, 
+	0x01636002,
+	0x8071E028,
+	0x02A56064,
+	0x00806031,
+	0x052960A8,
+	0x0A116130,
+	0x0A316130,
+	0x14216200,
+	0x14016200,
+	0x28416460,
+	0x28616460
+};
+
+Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene)
+	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene),
+	_flag1(false) {
+	
+	_spriteResource.load2(0x120B24B0);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = _spriteResource.getDimensions().width;
+	_deltaRect.height = _spriteResource.getDimensions().height;
+	_surface->setVisible(false);
+	processDelta();
+	_needRefresh = true;
+	SetUpdateHandler(&Class438::update);
+	SetMessageHandler(&Class438::handleMessage);
+	_soundResource.load(0x3901B44F);
+}
+
+void Class438::update() {
+	StaticSprite::update();
+	if (_flag1 && !_soundResource.isPlaying()) {
+		_parentScene->sendMessage(0x2000, 0, this);
+		_surface->setVisible(false);
+	}
+}
+
+uint32 Class438::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (!_flag1 && !_parentScene->sub462E90()) {
+			_flag1 = true;
+			_surface->setVisible(true);
+			_soundResource.play();
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+Class439::Class439(NeverhoodEngine *vm, int index)
+	: StaticSprite(vm, 1400), _blinkCountdown(0) {
+
+	_spriteResource.load2(kClass439FileHashes[index]);
+	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_needRefresh = true;
+	if (getGlobalVar(0x0C0288F4)) {
+		hide();
+	} else {
+		startBlinking();
+	}
+	SetUpdateHandler(&Class439::update);
+}
+
+void Class439::update() {
+	if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) {
+		if (_blinkToggle) {
+			_surface->setVisible(true);
+		} else {
+			_surface->setVisible(false);
+		}
+		StaticSprite::update();
+		_blinkCountdown = 3;
+		_blinkToggle = !_blinkToggle;
+	}
+}
+
+void Class439::show() {
+	_surface->setVisible(true);
+	StaticSprite::update();
+	_blinkCountdown = 0;
+}
+
+void Class439::hide() {
+	_surface->setVisible(false);
+	StaticSprite::update();
+	_blinkCountdown = 0;
+}
+
+void Class439::startBlinking() {
+	_surface->setVisible(true);
+	StaticSprite::update();
+	_blinkCountdown = 3;
+	_blinkToggle = true;
+}
+
+Class440::Class440(NeverhoodEngine *vm, int index)
+	: StaticSprite(vm, 1400) {
+
+	_spriteResource.load2(kClass440FileHashes[index]);
+	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_surface->setVisible(false);
+	_needRefresh = true;
+}
+
+Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
+	: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
+
+	_x = 300;
+	_y = getGlobalVar(0x000809C2) ? 52 : 266;
+	createSurface1(0xC2463913, 1200);
+	_needRefresh = true;
+	updatePosition();
+	_surface->setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class522::handleMessage);
+}
+
+void Class522::show() {
+	setFileHash(0xC2463913, 0, -1);
+	_surface->setVisible(true);
+	updatePosition();
+	_enabled = true;
+}
+
+uint32 Class522::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_enabled) {
+			_parentScene->sendMessage(0x2002, 0, this);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _flag1(false), _flag2(false), 
+	_flag3(false), _flag4(false), _countdown1(1), _countdown2(1) {
+	
+	_varValue = getGlobalVar(0x20580A86);
+	
+	// TODO _vm->gameModule()->initScene3009Vars();
+	
+	setGlobalVar(0xF0402B0A, 0);
+	_surfaceFlag = true;
+	
+	_vm->_screen->clear();
+	
+	_background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0));
+	_palette = new Palette(_vm, 0xD000420C);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620));
+
+    _class438 = addSprite(new Class438(_vm, this));
+    _vm->_collisionMan->addSprite(_class438);
+
+    _class522 = new Class522(_vm, this, _varValue);
+    addSprite(_class522);
+    _vm->_collisionMan->addSprite(_class522);
+
+#if 0
+    _class523 = new Class523(_vm, this, _varValue);
+    addSprite(_class523);
+    _vm->_collisionMan->addSprite(_class523);
+#endif
+
+	if (_varValue != 0 && _varValue != 8 && _varValue != 9 && _varValue != 9) {
+		_flag1 = true;
+	} else {
+		_flag1 = false;
+		if (_varValue == 0) {
+#if 0		
+			_class523->stMoveUp();
+#endif			
+			_flag4 = true;
+		}
+	}
+
+	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_varValue], false, _flag1));
+	_smackerPlayer->setDrawPos(89, 37);
+
+	addSprite(new StaticSprite(_vm, 0x8540252C, 400));
+
+	for (int i = 0; i < 2; i++) {
+		_class439Array[i] = new Class439(_vm, i);
+		addSprite(_class439Array[i]);
+		_class440Array[i] = new Class440(_vm, i);
+		addSprite(_class440Array[i]);
+	}
+
+
+#if 0
+	for (int i = 0; i < 6; i++) {
+		_class524Array[i] = new Class524(_vm, this, i);
+		addSprite(_class524Array[i]);
+		if (i < 3)
+			_varValueArray[i] = getSubVar(0x00504B86, i);
+		else
+			_varValueArray[i] = getSubVar(0x0A4C0A9A, i - 3);
+	}
+#endif
+
+	SetMessageHandler(&Scene3009::handleMessage);
+	SetUpdateHandler(&Scene3009::update);
+}
+
+void Scene3009::update() {
+	Scene::update();
+	if (!_flag1 && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _varValue <= 14) {
+		switch (_varValue) {
+		case 0:
+		case 14:
+			_smackerPlayer->open(0x340A0049, true);
+			_palette->usePalette();
+			_flag1 = true;
+			break;
+		case 8:
+			_smackerPlayer->open(0x0082080D, true);
+			_palette->usePalette();
+			_flag1 = true;
+			_flag4 = false;
+			break;
+		case 9:
+			_smackerPlayer->open(0x0282080D, true);
+			_palette->usePalette();
+			_flag1 = true;
+			_flag4 = false;
+			break;
+		case 10:
+			_smackerPlayer->open(0x0882080D, true);
+			_palette->usePalette();
+			_flag1 = true;
+			_flag4 = false;
+			break;
+		case 11:
+		case 12:
+		case 13:
+			if (_flag2) {
+				if (_varValue == 11)
+					_smackerPlayer->open(0x110A000F, false);
+				else if (_varValue == 12)				
+					_smackerPlayer->open(0x500B004F, false);
+				else if (_varValue == 13)				
+					_smackerPlayer->open(0x100B010E, false);
+				_palette->usePalette();
+				_flag2 = false;
+#if 0				
+				_class523->stMoveDown();
+#endif				
+			} else {
+				sub462DC0();
+			}
+			break;
+		}
+	}
+
+	if (_countdown1 != 0 && (--_countdown1 == 0) && sub462E10()) {
+#if 0
+		for (int i = 0; i < 3; i++)
+			_class524Array[i]->hide();
+#endif
+		if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
+			_class439Array[0]->show();
+			_class440Array[0]->getSurface()->setVisible(true);
+			// TODO _class440Array->StaticSprite_update
+			_class522->show();
+		}
+	}
+
+	if (_countdown2 != 0 && (--_countdown2 == 0) && sub462E50()) {
+#if 0
+		for (int i = 0; i < 6; i++)
+			_class524Array[i]->hide();
+#endif
+		if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
+			_class439Array[1]->show();
+			_class440Array[1]->getSurface()->setVisible(true);
+#if 0
+			// TODO _class440Array[1]->StaticSprite_update
+			_class523->show();
+#endif
+		}
+	}
+
+}
+
+uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO: Debug stuff
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) {
+			setGlobalVar(0x20580A86, 0);
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x000D:
+		// TODO: Debug stuff
+		break;
+	case 0x2000:
+		if (!getGlobalVar(0x000809C2)) {
+			if (!getGlobalVar(0x10938830)) {
+				_varValue = 1;
+				setGlobalVar(0x10938830, 1);
+			} else {
+				_varValue = 2;
+			}
+		} else if (!getGlobalVar(0x9040018A)) {
+			_varValue = 3;
+		} else if (!getGlobalVar(0x610210B7)) {
+			_varValue = 4;
+		} else if (!getGlobalVar(0x0C0288F4)) {
+			setGlobalVar(0x0C0288F4, 1);
+			_varValue = 5;
+		} else {
+			_varValue = 6;
+		}
+		sub462DC0();
+		break;
+	case 0x2001:
+		_countdown1 = 24;
+		break;
+	case 0x2002:
+		if (!getGlobalVar(0x9040018A) && !_flag4) {
+			if (getGlobalVar(0x000809C2)) {
+				_varValue = 14;
+				setGlobalVar(0x000809C2, 0);
+			} else {
+				_varValue = 7;
+				setGlobalVar(0x000809C2, 1);
+			}
+			sub462DC0();
+		}
+		break;
+	case 0x2003:
+		_countdown2 = 24;
+		break;
+	case 0x2004:
+		if (getGlobalVar(0x000809C2)) {
+			if (!getGlobalVar(0x9040018A)) {
+				if (!getGlobalVar(0x610210B7)) {
+					_varValue = 8;
+				} else {
+					if (!getGlobalVar(0x0C0288F4)) {
+						_varValue = 9;
+					} else {
+						_varValue = 10;
+					}
+				}
+				setGlobalVar(0x9040018A, 1);
+				_flag4 = true;
+				sub462DC0();
+			} else if (!getGlobalVar(0x610210B7)) {
+				_varValue = 11;
+				_smackerPlayer->open(0x108A000F, false);
+			} else if (!getGlobalVar(0x0C0288F4)) {
+				_varValue = 12;
+				_smackerPlayer->open(0x500B002F, false);
+			} else {
+				_varValue = 13;
+				_smackerPlayer->open(0x100B008E, false);
+			}
+			_palette->usePalette();
+			_flag2 = true;
+			_flag4 = true;
+			_flag1 = false;
+			setGlobalVar(0x9040018A, 0);
+		}
+		break;
+	}
+	return 0;
+}
+
+void Scene3009::sub462DC0() {
+	setGlobalVar(0x20580A86, _varValue);
+	setGlobalVar(0xF0402B0A, kScene3009VarValues[_varValue]);
+	_parentModule->sendMessage(0x1009, 1, this);
+}
+
+bool Scene3009::sub462E10() {
+	for (int i = 0; i < 3; i++)
+		if (_varValueArray[i] != getSubVar(0x00000914, i))
+			return false;
+	return true;
+}
+
+bool Scene3009::sub462E50() {
+	for (int i = 0; i < 6; i++)
+		if (_varValueArray[i] != getSubVar(0x00000914, i))
+			return false;
+	return true;
+}
+
+bool Scene3009::sub462E90() {
+	return _flag3 || _flag4;
+}
+
 // Scene3010
 
 static const uint32 kScene3010VarNameHashes[] = {
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index b2375fc..9bda5db 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -39,7 +39,9 @@ protected:
 	int _moduleDoneStatus;
 	int _soundVolume;
 	bool _flag;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createScene3002(int which);
+	void createScene3002b(int which);
 	void createScene3003(int which);
 	void createScene3004(int which);
 	void createScene3005(int which);
@@ -51,9 +53,89 @@ protected:
 	void createScene3011(int which);
 	void createScene3012(int which);
 	void createScene3013(int which);
+	void updateScene3002();			
+	void updateScene3002b();			
+	void updateScene3003();			
+	void updateScene3004();			
+	void updateScene3005();			
+	void updateScene3006();			
+	void updateScene3007();			
+	void updateScene3009();			
 	void updateScene3010();			
 };
 
+// Scene3009
+
+class Scene3009;
+
+class Class438 : public StaticSprite {
+public:
+	Class438(NeverhoodEngine *vm, Scene3009 *parentScene);
+protected:
+	Scene3009 *_parentScene;
+	SoundResource _soundResource;
+	bool _flag1;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Class439 : public StaticSprite {
+public:
+	Class439(NeverhoodEngine *vm, int index);
+	void show();
+	void hide();
+	void startBlinking();
+protected:
+	int _blinkCountdown;
+	bool _blinkToggle;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Class440 : public StaticSprite {
+public:
+	Class440(NeverhoodEngine *vm, int index);
+};
+
+class Class522 : public AnimatedSprite {
+public:
+	Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
+	void show();
+protected:
+	Scene3009 *_parentScene;
+	bool _enabled;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene3009 : public Scene {
+public:
+	Scene3009(NeverhoodEngine *vm, Module *parentModule, int which);
+	bool sub462E90();
+protected:
+	int _countdown1;
+	int _countdown2;
+	SmackerPlayer *_smackerPlayer;
+	Sprite *_class438;
+	Class439 *_class439Array[2];
+	Class440 *_class440Array[2];
+	Class522 *_class522;
+#if 0	
+	Class523 *_class523;
+	Class524 *_class524Array[6];
+#endif	
+	uint32 _varValue;
+	uint32 _varValueArray[6];
+	bool _flag1;
+	bool _flag2;
+	bool _flag3;
+	bool _flag4;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub462DC0();
+	bool sub462E10();
+	bool sub462E50();
+};
+
 // Scene3010
 
 class SsScene3010DeadBoltButton : public StaticSprite {
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index b9a464c..2c6b10e 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -179,6 +179,12 @@ Background *Scene::addBackground(Background *background) {
 	return background;
 }
 
+SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) {
+	addEntity(smackerPlayer);
+	addSurface(smackerPlayer->getSurface());
+	return smackerPlayer;
+}
+
 void Scene::update() {
 
 	if (_smkFileHash != 0) {
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 65326c3..ab5cf9f 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -50,6 +50,7 @@ public:
 	void setSurfacePriority(BaseSurface *surface, int priority);
 	void deleteSprite(Sprite **sprite);
 	Background *addBackground(Background *background);
+	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
 protected:
 	Module *_parentModule;
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index ee6e7aa..deb54af 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -140,8 +140,6 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y,
 	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
 	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
 	
-	debug("StaticSprite::init() final: x = %d; y = %d", _x, _y);
-
 	_drawRect.x = 0;
 	_drawRect.y = 0;
 	_drawRect.width = width;
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index a518c39..7ec5d91 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -96,7 +96,7 @@ public:
 	void update();
 protected:
 	SpriteResource _spriteResource;
-	void init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height);
+	void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 };
 
 #define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback


Commit: 87d1f79f311f25ea434680caff508614a5c892d9
    https://github.com/scummvm/scummvm/commit/87d1f79f311f25ea434680caff508614a5c892d9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: More work on Scene3009

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f280399..c1ee6dd 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -45,8 +45,6 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	SetMessageHandler(&GameModule::handleMessage);
 
-	//startup();
-	
 }
 
 GameModule::~GameModule() {
@@ -183,6 +181,16 @@ void GameModule::initScene1405Vars() {
 	
 }
 
+void GameModule::initScene3009Vars() {
+	if (!getSubVar(0x40050052, 0x8C9819C2)) {
+		for (int i = 0; i < 3; i++) {
+			setSubVar(0x00504B86, i, _vm->_rnd->getRandomNumber(12 - 1));
+			setSubVar(0x0A4C0A9A, i, _vm->_rnd->getRandomNumber(12 - 1));
+		}
+		setSubVar(0x40050052, 0x8C9819C2, 1);
+	}
+}
+
 uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -214,13 +222,19 @@ void GameModule::startup() {
 //	createModule1500(0); // Logos and intro video //Real
 //	createModule1000(-1);
 //	createModule2300(2);
-	_vm->gameState().sceneNum = 8;
 	//createModule1200(-1);
 	//createModule1800(-1);
 	//createModule1700(-1);
 	//createModule1700(1);
 	//createModule1400(-1);
+#if 1
+	_vm->gameState().sceneNum = 8;
 	createModule3000(-1);
+#endif
+#if 0
+	_vm->gameState().sceneNum = 0;
+	createModule1800(-1);
+#endif
 }
 
 void GameModule::createModule1000(int which) {
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 8d5aace..6290a85 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -38,6 +38,7 @@ public:
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
 	void initScene1405Vars();
+	void initScene3009Vars();
 protected:
 	Entity *_prevChildObject;
 	bool _someFlag1;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index c82c111..45db8ad 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/module3000.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/navigationscene.h"
 
 namespace Neverhood {
@@ -37,7 +38,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
 	// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
 
-    _flag = getGlobalVar(0x10938830) != 0;
+	_flag = getGlobalVar(0x10938830) != 0;
 
 	if (_flag) {
 		// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
@@ -196,7 +197,7 @@ void Module3000::createScene3007(int which) {
 }
 
 void Module3000::createScene3008(int which) {
-	_vm->gameState().sceneNum = 6;
+	_vm->gameState().sceneNum = 7;
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
 	if (!getSubVar(0x40050052, 0x089809C2)) {
 		setSubVar(0x40050052, 0x089809C2, 1);
@@ -208,7 +209,7 @@ void Module3000::createScene3008(int which) {
 }
 
 void Module3000::createScene3009(int which) {
-	_vm->gameState().sceneNum = 7;
+	_vm->gameState().sceneNum = 8;
 	_childObject = new Scene3009(_vm, this, which);
 	SetUpdateHandler(&Module3000::updateScene3009);
 }
@@ -478,6 +479,24 @@ void Module3000::updateScene3007() {
 void Module3000::updateScene3009() {
 	_childObject->handleUpdate();
 	// TODO...
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		_flag = getGlobalVar(0x10938830); // CHECKME
+		if (_moduleDoneStatus != 1) {
+			// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
+			createScene3005(1);
+			_childObject->handleUpdate();
+		} else if (getGlobalVar(0xF0402B0A)) {
+			createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false);
+			SetUpdateHandler(&Module3000::updateScene3002b);
+		} else {
+			// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0);
+			createScene3005(1);
+			_childObject->handleUpdate();
+		}
+	}
 }
 
 void Module3000::updateScene3010() {
@@ -516,7 +535,7 @@ static const uint32 kScene3009SmackerFileHashes[] = {
 	0x340A0049
 };
 
-static const uint32 kScene3009VarValues[] = {
+static const uint32 kScene3009CannonLocationFileHashes[] = {
 	0x00000000,
 	0x8004001B,
 	0x0004001A,
@@ -534,17 +553,17 @@ static const uint32 kScene3009VarValues[] = {
 	0x240A1101
 };
 
-static const uint32 kClass439FileHashes[] = {
+static const uint32 kSsScene3009SymbolEdgesFileHashes[] = {
 	0x618827A0,
 	0xB1A92322
 };
 
-static const uint32 kClass440FileHashes[] = {
+static const uint32 kSsScene3009TargetLineFileHashes[] = {
 	0x4011018C,
 	0x15086623
 };
 
-static const NPoint kClass524Points[] = {
+static const NPoint kAsScene3009SymbolPoints[] = {
 	{289, 338},
 	{285, 375},
 	{284, 419},
@@ -553,12 +572,12 @@ static const NPoint kClass524Points[] = {
 	{541, 372}
 };
 
-static const uint32 kClass524FileHashes[] = {
+static const uint32 kAsScene3009SymbolFileHashes[] = {
 	0x24542582,
 	0x1CD61D96
 };
 
-static const uint32 kClass441FileHashes1[] = {
+static const uint32 kSsScene3009SymbolArrowFileHashes1[] = {
 	0x24016060,  
 	0x21216221,
 	0x486160A0,
@@ -573,7 +592,7 @@ static const uint32 kClass441FileHashes1[] = {
 	0x20212004
 };
 
-static const uint32 kClass441FileHashes2[] = {
+static const uint32 kSsScene3009SymbolArrowFileHashes2[] = {
 	0x40092024, 
 	0x01636002,
 	0x8071E028,
@@ -588,7 +607,7 @@ static const uint32 kClass441FileHashes2[] = {
 	0x28616460
 };
 
-Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene)
+SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene)
 	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene),
 	_flag1(false) {
 	
@@ -607,12 +626,12 @@ Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene)
 	_surface->setVisible(false);
 	processDelta();
 	_needRefresh = true;
-	SetUpdateHandler(&Class438::update);
-	SetMessageHandler(&Class438::handleMessage);
+	SetUpdateHandler(&SsScene3009FireCannonButton::update);
+	SetMessageHandler(&SsScene3009FireCannonButton::handleMessage);
 	_soundResource.load(0x3901B44F);
 }
 
-void Class438::update() {
+void SsScene3009FireCannonButton::update() {
 	StaticSprite::update();
 	if (_flag1 && !_soundResource.isPlaying()) {
 		_parentScene->sendMessage(0x2000, 0, this);
@@ -620,7 +639,7 @@ void Class438::update() {
 	}
 }
 
-uint32 Class438::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -635,10 +654,10 @@ uint32 Class438::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-Class439::Class439(NeverhoodEngine *vm, int index)
+SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
 	: StaticSprite(vm, 1400), _blinkCountdown(0) {
 
-	_spriteResource.load2(kClass439FileHashes[index]);
+	_spriteResource.load2(kSsScene3009SymbolEdgesFileHashes[index]);
 	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
@@ -652,10 +671,10 @@ Class439::Class439(NeverhoodEngine *vm, int index)
 	} else {
 		startBlinking();
 	}
-	SetUpdateHandler(&Class439::update);
+	SetUpdateHandler(&SsScene3009SymbolEdges::update);
 }
 
-void Class439::update() {
+void SsScene3009SymbolEdges::update() {
 	if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) {
 		if (_blinkToggle) {
 			_surface->setVisible(true);
@@ -668,29 +687,29 @@ void Class439::update() {
 	}
 }
 
-void Class439::show() {
+void SsScene3009SymbolEdges::show() {
 	_surface->setVisible(true);
 	StaticSprite::update();
 	_blinkCountdown = 0;
 }
 
-void Class439::hide() {
+void SsScene3009SymbolEdges::hide() {
 	_surface->setVisible(false);
 	StaticSprite::update();
 	_blinkCountdown = 0;
 }
 
-void Class439::startBlinking() {
+void SsScene3009SymbolEdges::startBlinking() {
 	_surface->setVisible(true);
 	StaticSprite::update();
 	_blinkCountdown = 3;
 	_blinkToggle = true;
 }
 
-Class440::Class440(NeverhoodEngine *vm, int index)
+SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
 	: StaticSprite(vm, 1400) {
 
-	_spriteResource.load2(kClass440FileHashes[index]);
+	_spriteResource.load2(kSsScene3009TargetLineFileHashes[index]);
 	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
@@ -702,7 +721,72 @@ Class440::Class440(NeverhoodEngine *vm, int index)
 	_needRefresh = true;
 }
 
-Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
+void SsScene3009TargetLine::show() {
+	_surface->setVisible(true);
+	StaticSprite::update();
+}
+
+SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index)
+	: StaticSprite(vm, 1400), _soundResource(vm), _asSymbol(asSymbol), 
+	_index(index), _enabled(true), _countdown(0) {
+
+	_incrDecr = _index % 2;
+
+	_spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
+	createSurface(1200, 33, 31);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = 33;
+	_drawRect.height = 31;
+	_deltaRect = _drawRect;
+	processDelta();
+	_needRefresh = true;
+	SetUpdateHandler(&SsScene3009SymbolArrow::update);
+	SetMessageHandler(&SsScene3009SymbolArrow::handleMessage);
+	_soundResource.load(0x2C852206);
+}
+
+void SsScene3009SymbolArrow::hide() {
+	_enabled = false;
+	_surface->setVisible(false);
+}
+
+void SsScene3009SymbolArrow::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		_spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
+		_needRefresh = true;
+		_drawRect.x = 0;
+		_drawRect.y = 0;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
+	}
+}
+
+uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_enabled && _countdown == 0) {
+			_countdown = 2;
+			_spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]);
+			_needRefresh = true;
+			_drawRect.x = 0;
+			_drawRect.y = 0;
+			_drawRect.width = _spriteResource.getDimensions().width;
+			_drawRect.height = _spriteResource.getDimensions().height;
+			_soundResource.play();
+			_asSymbol->sendMessage(0x2005, _incrDecr, this);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
 	: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
 
 	_x = 300;
@@ -712,17 +796,17 @@ Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
 	updatePosition();
 	_surface->setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class522::handleMessage);
+	SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage);
 }
 
-void Class522::show() {
+void AsScene3009VerticalIndicator::show() {
 	setFileHash(0xC2463913, 0, -1);
 	_surface->setVisible(true);
 	updatePosition();
 	_enabled = true;
 }
 
-uint32 Class522::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -735,13 +819,136 @@ uint32 Class522::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag1(false), _flag2(false), 
-	_flag3(false), _flag4(false), _countdown1(1), _countdown2(1) {
+AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue)
+	: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
+	
+	_x = getGlobalVar(0x9040018A) ? 533 : 92;
+	_y = 150;
+	createSurface1(0xC0C12954, 1200);
+	_needRefresh = true;
+	updatePosition();
+	_surface->setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage);
+	if (varValue == 8 || varValue == 9 || varValue == 10) {
+		SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight);
+		_x = 280;
+	}
+}
+
+uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_enabled) {
+			_parentScene->sendMessage(0x2004, 0, this);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene3009HorizontalIndicator::suMoveLeft() {
+	_x -= 6;
+	if (_x < 92) {
+		SetSpriteCallback(NULL);
+		_x = 92;
+	}
+}
+
+void AsScene3009HorizontalIndicator::suMoveRight() {
+	_x += 6;
+	if (_x > 533) {
+		SetSpriteCallback(NULL);
+		_x = 533;
+	}
+}
+
+void AsScene3009HorizontalIndicator::show() {
+	setFileHash(0xC0C12954, 0, -1);
+	_surface->setVisible(true);
+	updatePosition();
+	_enabled = true;
+}
+
+void AsScene3009HorizontalIndicator::stMoveLeft() {
+	_x = 533;
+	SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveLeft);
+}
+
+void AsScene3009HorizontalIndicator::stMoveRight() {
+	_x = 330;
+	SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight);
+}
+
+AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) {
+
+	_symbolIndex = getSubVar(0x00000914, _index);
 	
-	_varValue = getGlobalVar(0x20580A86);
+	_x = kAsScene3009SymbolPoints[_index].x;
+	_y = kAsScene3009SymbolPoints[_index].y;
+	createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200);
+	setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+	_newHashListIndex = _symbolIndex;
+	_needRefresh = true;
+	updatePosition();
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene3009Symbol::handleMessage);
+
+	_ssArrowPrev = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 0);
+	_parentScene->addSprite(_ssArrowPrev);
+	_vm->_collisionMan->addSprite(_ssArrowPrev);
+
+	_ssArrowNext = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 1);
+	_parentScene->addSprite(_ssArrowNext);
+	_vm->_collisionMan->addSprite(_ssArrowNext);
+
+}
+
+uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2005:
+		if (param.asInteger()) {
+			if (_symbolIndex == 11)
+				_symbolIndex = 0;
+			else
+				_symbolIndex++;
+		} else {
+			if (_symbolIndex == 0)
+				_symbolIndex = 11;
+			else
+				_symbolIndex--;
+		}
+		setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+		_newHashListIndex = _symbolIndex;
+		setSubVar(0x00000914, _index, _symbolIndex);
+		if (_index / 3 == 0) {
+			_parentScene->sendMessage(0x2001, 0, this);
+		} else {
+			_parentScene->sendMessage(0x2003, 0, this);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene3009Symbol::hide() {
+	_ssArrowPrev->hide();
+	_ssArrowNext->hide();
+}
+
+Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _keepVideo(false), _flag2(false), 
+	/*_flag3(false), */_flag4(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
+
+	_cannonLocation = getGlobalVar(0x20580A86);
+	debug("_cannonLocation = %d", _cannonLocation);
 	
-	// TODO _vm->gameModule()->initScene3009Vars();
+	_vm->gameModule()->initScene3009Vars();
 	
 	setGlobalVar(0xF0402B0A, 0);
 	_surfaceFlag = true;
@@ -750,137 +957,129 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0));
 	_palette = new Palette(_vm, 0xD000420C);
-	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620));
 
-    _class438 = addSprite(new Class438(_vm, this));
-    _vm->_collisionMan->addSprite(_class438);
+	_ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this));
+	_vm->_collisionMan->addSprite(_ssFireCannonButton);
 
-    _class522 = new Class522(_vm, this, _varValue);
-    addSprite(_class522);
-    _vm->_collisionMan->addSprite(_class522);
+	_asVerticalIndicator = new AsScene3009VerticalIndicator(_vm, this, _cannonLocation);
+	addSprite(_asVerticalIndicator);
+	_vm->_collisionMan->addSprite(_asVerticalIndicator);
 
-#if 0
-    _class523 = new Class523(_vm, this, _varValue);
-    addSprite(_class523);
-    _vm->_collisionMan->addSprite(_class523);
-#endif
+	_asHorizontalIndicator = new AsScene3009HorizontalIndicator(_vm, this, _cannonLocation);
+	addSprite(_asHorizontalIndicator);
+	_vm->_collisionMan->addSprite(_asHorizontalIndicator);
 
-	if (_varValue != 0 && _varValue != 8 && _varValue != 9 && _varValue != 9) {
-		_flag1 = true;
+	if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) {
+		_keepVideo = true;
 	} else {
-		_flag1 = false;
-		if (_varValue == 0) {
-#if 0		
-			_class523->stMoveUp();
-#endif			
+		_keepVideo = false;
+		if (_cannonLocation != 0) {
+			_asHorizontalIndicator->stMoveRight();
 			_flag4 = true;
 		}
 	}
 
-	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_varValue], false, _flag1));
+	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo));
 	_smackerPlayer->setDrawPos(89, 37);
+	_palette->usePalette();
 
 	addSprite(new StaticSprite(_vm, 0x8540252C, 400));
 
 	for (int i = 0; i < 2; i++) {
-		_class439Array[i] = new Class439(_vm, i);
-		addSprite(_class439Array[i]);
-		_class440Array[i] = new Class440(_vm, i);
-		addSprite(_class440Array[i]);
+		_ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i);
+		addSprite(_ssSymbolEdges[i]);
+		_ssTargetLines[i] = new SsScene3009TargetLine(_vm, i);
+		addSprite(_ssTargetLines[i]);
 	}
 
 
-#if 0
 	for (int i = 0; i < 6; i++) {
-		_class524Array[i] = new Class524(_vm, this, i);
-		addSprite(_class524Array[i]);
+		_asSymbols[i] = new AsScene3009Symbol(_vm, this, i);
+		addSprite(_asSymbols[i]);
 		if (i < 3)
-			_varValueArray[i] = getSubVar(0x00504B86, i);
+			_correctSymbols[i] = getSubVar(0x00504B86, i);
 		else
-			_varValueArray[i] = getSubVar(0x0A4C0A9A, i - 3);
+			_correctSymbols[i] = getSubVar(0x0A4C0A9A, i - 3);
 	}
-#endif
 
 	SetMessageHandler(&Scene3009::handleMessage);
 	SetUpdateHandler(&Scene3009::update);
+
+	// DEBUG: Set the correct code
+	for (int i = 0; i < 6; i++)
+		setSubVar(0x00000914, i, _correctSymbols[i]);
+	sendMessage(0x2003, 0, this);
+	//setGlobalVar(0x610210B7, 1);   
+
 }
 
 void Scene3009::update() {
 	Scene::update();
-	if (!_flag1 && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _varValue <= 14) {
-		switch (_varValue) {
+	
+	if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonLocation <= 14) {
+		switch (_cannonLocation) {
 		case 0:
 		case 14:
 			_smackerPlayer->open(0x340A0049, true);
 			_palette->usePalette();
-			_flag1 = true;
+			_keepVideo = true;
 			break;
 		case 8:
 			_smackerPlayer->open(0x0082080D, true);
 			_palette->usePalette();
-			_flag1 = true;
+			_keepVideo = true;
 			_flag4 = false;
 			break;
 		case 9:
 			_smackerPlayer->open(0x0282080D, true);
 			_palette->usePalette();
-			_flag1 = true;
+			_keepVideo = true;
 			_flag4 = false;
 			break;
 		case 10:
 			_smackerPlayer->open(0x0882080D, true);
 			_palette->usePalette();
-			_flag1 = true;
+			_keepVideo = true;
 			_flag4 = false;
 			break;
 		case 11:
 		case 12:
 		case 13:
 			if (_flag2) {
-				if (_varValue == 11)
+				if (_cannonLocation == 11)
 					_smackerPlayer->open(0x110A000F, false);
-				else if (_varValue == 12)				
+				else if (_cannonLocation == 12)				
 					_smackerPlayer->open(0x500B004F, false);
-				else if (_varValue == 13)				
+				else if (_cannonLocation == 13)				
 					_smackerPlayer->open(0x100B010E, false);
 				_palette->usePalette();
 				_flag2 = false;
-#if 0				
-				_class523->stMoveDown();
-#endif				
+				_asHorizontalIndicator->stMoveLeft();
 			} else {
-				sub462DC0();
+				playExtVideo();
 			}
 			break;
 		}
 	}
 
-	if (_countdown1 != 0 && (--_countdown1 == 0) && sub462E10()) {
-#if 0
+	if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) {
 		for (int i = 0; i < 3; i++)
-			_class524Array[i]->hide();
-#endif
+			_asSymbols[i]->hide();
 		if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
-			_class439Array[0]->show();
-			_class440Array[0]->getSurface()->setVisible(true);
-			// TODO _class440Array->StaticSprite_update
-			_class522->show();
+			_ssSymbolEdges[0]->show();
+			_ssTargetLines[0]->show();
+			_asVerticalIndicator->show();
 		}
 	}
 
-	if (_countdown2 != 0 && (--_countdown2 == 0) && sub462E50()) {
-#if 0
-		for (int i = 0; i < 6; i++)
-			_class524Array[i]->hide();
-#endif
+	if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) {
+		for (int i = 3; i < 6; i++)
+			_asSymbols[i]->hide();
 		if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
-			_class439Array[1]->show();
-			_class440Array[1]->getSurface()->setVisible(true);
-#if 0
-			// TODO _class440Array[1]->StaticSprite_update
-			_class523->show();
-#endif
+			_ssSymbolEdges[1]->show();
+			_ssTargetLines[1]->show();
+			_asHorizontalIndicator->show();
 		}
 	}
 
@@ -902,104 +1101,104 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (!getGlobalVar(0x000809C2)) {
 			if (!getGlobalVar(0x10938830)) {
-				_varValue = 1;
+				_cannonLocation = 1;
 				setGlobalVar(0x10938830, 1);
 			} else {
-				_varValue = 2;
+				_cannonLocation = 2;
 			}
 		} else if (!getGlobalVar(0x9040018A)) {
-			_varValue = 3;
+			_cannonLocation = 3;
 		} else if (!getGlobalVar(0x610210B7)) {
-			_varValue = 4;
+			_cannonLocation = 4;
 		} else if (!getGlobalVar(0x0C0288F4)) {
 			setGlobalVar(0x0C0288F4, 1);
-			_varValue = 5;
+			_cannonLocation = 5;
 		} else {
-			_varValue = 6;
+			_cannonLocation = 6;
 		}
-		sub462DC0();
+		playExtVideo();
 		break;
 	case 0x2001:
-		_countdown1 = 24;
+		_lockSymbolsPart1Countdown = 24;
 		break;
 	case 0x2002:
 		if (!getGlobalVar(0x9040018A) && !_flag4) {
 			if (getGlobalVar(0x000809C2)) {
-				_varValue = 14;
+				_cannonLocation = 14;
 				setGlobalVar(0x000809C2, 0);
 			} else {
-				_varValue = 7;
+				_cannonLocation = 7;
 				setGlobalVar(0x000809C2, 1);
 			}
-			sub462DC0();
+			playExtVideo();
 		}
 		break;
 	case 0x2003:
-		_countdown2 = 24;
+		_lockSymbolsPart2Countdown = 24;
 		break;
 	case 0x2004:
 		if (getGlobalVar(0x000809C2)) {
 			if (!getGlobalVar(0x9040018A)) {
 				if (!getGlobalVar(0x610210B7)) {
-					_varValue = 8;
+					_cannonLocation = 8;
+				} else if (!getGlobalVar(0x0C0288F4)) {
+					_cannonLocation = 9;
 				} else {
-					if (!getGlobalVar(0x0C0288F4)) {
-						_varValue = 9;
-					} else {
-						_varValue = 10;
-					}
+					_cannonLocation = 10;
 				}
 				setGlobalVar(0x9040018A, 1);
 				_flag4 = true;
-				sub462DC0();
-			} else if (!getGlobalVar(0x610210B7)) {
-				_varValue = 11;
-				_smackerPlayer->open(0x108A000F, false);
-			} else if (!getGlobalVar(0x0C0288F4)) {
-				_varValue = 12;
-				_smackerPlayer->open(0x500B002F, false);
+				playExtVideo();
 			} else {
-				_varValue = 13;
-				_smackerPlayer->open(0x100B008E, false);
+				if (!getGlobalVar(0x610210B7)) {
+					_cannonLocation = 11;
+					_smackerPlayer->open(0x108A000F, false);
+				} else if (!getGlobalVar(0x0C0288F4)) {
+					_cannonLocation = 12;
+					_smackerPlayer->open(0x500B002F, false);
+				} else {
+					_cannonLocation = 13;
+					_smackerPlayer->open(0x100B008E, false);
+				}
+				_palette->usePalette();
+				_flag2 = true;
+				_flag4 = true;
+				_keepVideo = false;
+				setGlobalVar(0x9040018A, 0);
 			}
-			_palette->usePalette();
-			_flag2 = true;
-			_flag4 = true;
-			_flag1 = false;
-			setGlobalVar(0x9040018A, 0);
 		}
 		break;
 	}
 	return 0;
 }
 
-void Scene3009::sub462DC0() {
-	setGlobalVar(0x20580A86, _varValue);
-	setGlobalVar(0xF0402B0A, kScene3009VarValues[_varValue]);
+void Scene3009::playExtVideo() {
+	setGlobalVar(0x20580A86, _cannonLocation);
+	setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]);
 	_parentModule->sendMessage(0x1009, 1, this);
 }
 
-bool Scene3009::sub462E10() {
+bool Scene3009::isSymbolsPart1Solved() {
 	for (int i = 0; i < 3; i++)
-		if (_varValueArray[i] != getSubVar(0x00000914, i))
+		if (_correctSymbols[i] != getSubVar(0x00000914, i))
 			return false;
 	return true;
 }
 
-bool Scene3009::sub462E50() {
-	for (int i = 0; i < 6; i++)
-		if (_varValueArray[i] != getSubVar(0x00000914, i))
+bool Scene3009::isSymbolsPart2Solved() {
+	for (int i = 3; i < 6; i++)
+		if (_correctSymbols[i] != getSubVar(0x00000914, i))
 			return false;
 	return true;
 }
 
 bool Scene3009::sub462E90() {
-	return _flag3 || _flag4;
+	return /*_flag3 || */_flag4;
 }
 
 // Scene3010
 
-static const uint32 kScene3010VarNameHashes[] = {
+static const uint32 kScene3010ButtonNameHashes[] = {
 	0x304008D2,
 	0x40119852,
 	0x01180951
@@ -1042,7 +1241,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene
 
 	NDimensions dimensions1, dimensions2;
 	 
-	_buttonEnabled = getSubVar(0x14800353, kScene3010VarNameHashes[_buttonIndex]) != 0;
+	_buttonEnabled = getSubVar(0x14800353, kScene3010ButtonNameHashes[_buttonIndex]) != 0;
 	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
 	dimensions1 = _spriteResource.getDimensions();
 	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
@@ -1133,10 +1332,10 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene
 	_parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false),
 	_countdown(0) {
 
-    _x = kAsScene3010DeadBoltPoints[_boltIndex].x;
-    _y = kAsScene3010DeadBoltPoints[_boltIndex].y;
+	_x = kAsScene3010DeadBoltPoints[_boltIndex].x;
+	_y = kAsScene3010DeadBoltPoints[_boltIndex].y;
 
-	if (getSubVar(0x14800353, kScene3010VarNameHashes[_boltIndex])) {
+	if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) {
 		createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200);
 		setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 		_soundResource1.load(0x46005BC4);
@@ -1249,9 +1448,9 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	int initCountdown = 0;
 
 	// DEBUG: Enable all buttons
-    setSubVar(0x14800353, kScene3010VarNameHashes[0], 1);
-    setSubVar(0x14800353, kScene3010VarNameHashes[1], 1);
-    setSubVar(0x14800353, kScene3010VarNameHashes[2], 1);
+	setSubVar(0x14800353, kScene3010ButtonNameHashes[0], 1);
+	setSubVar(0x14800353, kScene3010ButtonNameHashes[1], 1);
+	setSubVar(0x14800353, kScene3010ButtonNameHashes[2], 1);
 
 	_surfaceFlag = true;
 
@@ -1265,7 +1464,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 		_ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME
 		addSprite(_ssDeadBoltButtons[i]);
 		_vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]);
-		if (getSubVar(0x14800353, kScene3010VarNameHashes[i]))
+		if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i]))
 			initCountdown++;
 		_boltUnlocking[i] = false;
 		_boltUnlocked[i] = false;
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 9bda5db..499741d 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -68,9 +68,9 @@ protected:
 
 class Scene3009;
 
-class Class438 : public StaticSprite {
+class SsScene3009FireCannonButton : public StaticSprite {
 public:
-	Class438(NeverhoodEngine *vm, Scene3009 *parentScene);
+	SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene);
 protected:
 	Scene3009 *_parentScene;
 	SoundResource _soundResource;
@@ -79,9 +79,9 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class439 : public StaticSprite {
+class SsScene3009SymbolEdges : public StaticSprite {
 public:
-	Class439(NeverhoodEngine *vm, int index);
+	SsScene3009SymbolEdges(NeverhoodEngine *vm, int index);
 	void show();
 	void hide();
 	void startBlinking();
@@ -92,14 +92,30 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class440 : public StaticSprite {
+class SsScene3009TargetLine : public StaticSprite {
 public:
-	Class440(NeverhoodEngine *vm, int index);
+	SsScene3009TargetLine(NeverhoodEngine *vm, int index);
+	void show();
 };
 
-class Class522 : public AnimatedSprite {
+class SsScene3009SymbolArrow : public StaticSprite {
 public:
-	Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
+	SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index);
+	void hide();
+protected:
+	SoundResource _soundResource;
+	Sprite *_asSymbol;
+	int _index;
+	int _incrDecr;
+	bool _enabled;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene3009VerticalIndicator : public AnimatedSprite {
+public:
+	AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
 	void show();
 protected:
 	Scene3009 *_parentScene;
@@ -107,33 +123,58 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class AsScene3009HorizontalIndicator : public AnimatedSprite {
+public:
+	AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue);
+	void show();
+	void stMoveLeft();
+	void stMoveRight();
+protected:
+	Scene3009 *_parentScene;
+	bool _enabled;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoveLeft();
+	void suMoveRight();
+};
+
+class AsScene3009Symbol : public AnimatedSprite {
+public:
+	AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
+	void hide();
+protected:
+	Scene3009 *_parentScene;
+	int _index;
+	uint32 _symbolIndex;
+	SsScene3009SymbolArrow *_ssArrowPrev;
+	SsScene3009SymbolArrow *_ssArrowNext;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene3009 : public Scene {
 public:
 	Scene3009(NeverhoodEngine *vm, Module *parentModule, int which);
 	bool sub462E90();
 protected:
-	int _countdown1;
-	int _countdown2;
+	int _lockSymbolsPart1Countdown;
+	int _lockSymbolsPart2Countdown;
 	SmackerPlayer *_smackerPlayer;
-	Sprite *_class438;
-	Class439 *_class439Array[2];
-	Class440 *_class440Array[2];
-	Class522 *_class522;
-#if 0	
-	Class523 *_class523;
-	Class524 *_class524Array[6];
-#endif	
-	uint32 _varValue;
-	uint32 _varValueArray[6];
-	bool _flag1;
+	Sprite *_ssFireCannonButton;
+	SsScene3009SymbolEdges *_ssSymbolEdges[2];
+	SsScene3009TargetLine *_ssTargetLines[2];
+	AsScene3009VerticalIndicator *_asVerticalIndicator;
+	AsScene3009HorizontalIndicator *_asHorizontalIndicator;
+	AsScene3009Symbol *_asSymbols[6];
+	uint32 _cannonLocation;
+	uint32 _correctSymbols[6];
+	bool _keepVideo;
 	bool _flag2;
-	bool _flag3;
+	// UNUSED? bool _flag3;
 	bool _flag4;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub462DC0();
-	bool sub462E10();
-	bool sub462E50();
+	void playExtVideo();
+	bool isSymbolsPart1Solved();
+	bool isSymbolsPart2Solved();
 };
 
 // Scene3010
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 0db5d62..c6a7e5a 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -198,7 +198,7 @@ Common::Error NeverhoodEngine::run() {
 		_screen->wait();
 		_screen->update();
 		
-		debug("---------------------------------------");
+		debug(0, "---------------------------------------");
 	
 	}
 	
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 66e7a58..39f49cb 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -83,6 +83,7 @@ SmackerPlayer::~SmackerPlayer() {
 void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 	debug("SmackerPlayer::open(%08X)", fileHash);
 	
+	_fileHash = fileHash;
 	_keepLastFrame = keepLastFrame;
 
 	close();
@@ -143,6 +144,21 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) {
 	}
 }
 
+void SmackerPlayer::rewind() {
+
+	delete _smackerDecoder;
+	_smackerDecoder = NULL;
+	_stream = NULL;
+
+	_smackerFirst = true;
+
+	_stream = _vm->_res->createStream(_fileHash);
+
+	_smackerDecoder = new Video::SmackerDecoder(_vm->_mixer);
+	_smackerDecoder->loadStream(_stream);
+	
+}
+
 void SmackerPlayer::update() {
 	debug(8, "SmackerPlayer::update()");
 
@@ -156,34 +172,7 @@ void SmackerPlayer::update() {
 
 	if (!_smackerDecoder->endOfVideo()) {
 
-		const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
-
-		if (_smackerFirst) {
-			_smackerSurface->setSmackerFrame(smackerFrame);
-			if (_drawX < 0 || _drawY < 0) {
-				if (_doubleSurface) {
-					_drawX = 320 - _smackerDecoder->getWidth();
-					_drawY = 240 - _smackerDecoder->getHeight();
-				} else {
-					_drawX = (640 - _smackerDecoder->getWidth()) / 2;
-					_drawY = (480 - _smackerDecoder->getHeight()) / 2;
-				}
-			}
-			_smackerSurface->getDrawRect().x = _drawX;
-			_smackerSurface->getDrawRect().y = _drawY;
-			_smackerFirst = false;
-		}
-		
-		if (_doubleSurface) {
-			// TODO
-		}
-
-		// TODO _vm->_screen->_skipUpdate = true;
-		_dirtyFlag = true;
-
-		if (_smackerDecoder->hasDirtyPalette()) {
-			updatePalette();
-		}
+		updateFrame();
 
 		if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
 			// Inform the scene about the end of the video playback
@@ -192,12 +181,47 @@ void SmackerPlayer::update() {
 			}
 			_flag2 = true;
 		} else {
+			if (_smackerDecoder->endOfVideo()) {
+				rewind();
+				updateFrame();
+			}
 			_flag2 = false;
 		}
 		
 	}
 }
 
+void SmackerPlayer::updateFrame() {
+	const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
+
+	if (_smackerFirst) {
+		_smackerSurface->setSmackerFrame(smackerFrame);
+		if (_drawX < 0 || _drawY < 0) {
+			if (_doubleSurface) {
+				_drawX = 320 - _smackerDecoder->getWidth();
+				_drawY = 240 - _smackerDecoder->getHeight();
+			} else {
+				_drawX = (640 - _smackerDecoder->getWidth()) / 2;
+				_drawY = (480 - _smackerDecoder->getHeight()) / 2;
+			}
+		}
+		_smackerSurface->getDrawRect().x = _drawX;
+		_smackerSurface->getDrawRect().y = _drawY;
+		_smackerFirst = false;
+	}
+	
+	if (_doubleSurface) {
+		// TODO
+	}
+
+	// TODO _vm->_screen->_skipUpdate = true;
+	_dirtyFlag = true;
+
+	if (_smackerDecoder->hasDirtyPalette()) {
+		updatePalette();
+	}
+}
+
 void SmackerPlayer::updatePalette() {
 	byte tempPalette[1024];
 	const byte *smackerPalette = _smackerDecoder->getPalette();
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 6579bb4..fb7f6da 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -64,6 +64,7 @@ protected:
 	Palette *_palette;
 	Video::SmackerDecoder *_smackerDecoder;
 	SmackerSurface *_smackerSurface;
+	uint32 _fileHash;
 	bool _smackerFirst;
 	bool _doubleSurface;
 	Common::SeekableReadStream *_stream;
@@ -71,7 +72,9 @@ protected:
 	bool _flag2;
 	bool _dirtyFlag;
 	int _drawX, _drawY;
+	void rewind();
 	void update();
+	void updateFrame();
 	void updatePalette();
 };
 


Commit: 9d12661537db2229fe08102a8c2491e0647826a4
    https://github.com/scummvm/scummvm/commit/9d12661537db2229fe08102a8c2491e0647826a4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Implement Scene3011

- And use _moduleDone instead of _done in Module3000

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h
    engines/neverhood/resource.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c1ee6dd..16824e9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -228,7 +228,7 @@ void GameModule::startup() {
 	//createModule1700(1);
 	//createModule1400(-1);
 #if 1
-	_vm->gameState().sceneNum = 8;
+	_vm->gameState().sceneNum = 10;
 	createModule3000(-1);
 #endif
 #if 0
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 45db8ad..51940ba 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -221,7 +221,9 @@ void Module3000::createScene3010(int which) {
 }
 
 void Module3000::createScene3011(int which) {
-	// TODO
+	_vm->gameState().sceneNum = 10;
+	_childObject = new Scene3011(_vm, this, 0);
+	SetUpdateHandler(&Module3000::updateScene3011);
 }
 
 void Module3000::createScene3012(int which) {
@@ -403,6 +405,9 @@ void Module3000::updateScene3004() {
 		_moduleDone = false;
 		delete _childObject;
 		_childObject = NULL;
+		
+		debug("_moduleDoneStatus = %d", _moduleDoneStatus);
+		
 		if (_moduleDoneStatus == 1) {
 			createScene3005(0);
 			_childObject->handleUpdate();
@@ -501,8 +506,8 @@ void Module3000::updateScene3009() {
 
 void Module3000::updateScene3010() {
 	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
+	if (_moduleDone) {
+		_moduleDone = false;
 		delete _childObject;
 		_childObject = NULL;
 		if (_moduleDoneStatus == 0 || _moduleDoneStatus == 2) {
@@ -515,6 +520,17 @@ void Module3000::updateScene3010() {
 	}
 }
 
+void Module3000::updateScene3011() {
+	_childObject->handleUpdate();
+	if (_moduleDone) {
+		_moduleDone = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene3004(3);
+		_childObject->handleUpdate();
+	}
+}
+
 // Scene3009
 
 static const uint32 kScene3009SmackerFileHashes[] = {
@@ -1558,4 +1574,251 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+// Scene3011
+
+static const uint32 kAsScene3011SymbolFileHashes[] = {
+	0x00C88050,
+	0x01488050,
+	0x02488050,
+	0x04488050,
+	0x08488050,
+	0x10488050,
+	0x20488050,
+	0x40488050,
+	0x80488050,
+	0x00488051,
+	0x00488052,
+	0x00488054,
+	0x008B0000,
+	0x008D0000,
+	0x00810000,
+	0x00990000,
+	0x00A90000,
+	0x00C90000,
+	0x00090000,
+	0x01890000,
+	0x02890000,
+	0x04890000,
+	0x08890000,
+	0x10890000
+};
+
+SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag)
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _soundResource(vm),
+	_countdown(0) {
+	
+	if (flag) {
+		_spriteResource.load2(0x11282020);
+	} else {
+		_spriteResource.load2(0x994D0433);
+	}
+	_soundResource.load(0x44061000);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_deltaRect.x = 0;
+	_deltaRect.y = 0;
+	_deltaRect.width = _spriteResource.getDimensions().width;
+	_deltaRect.height = _spriteResource.getDimensions().height;
+	_surface->setVisible(false);
+	processDelta();
+	_needRefresh = true;
+	SetUpdateHandler(&SsScene3011Button::update);
+	SetMessageHandler(&SsScene3011Button::handleMessage);
+}
+
+void SsScene3011Button::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		_surface->setVisible(false);
+	}
+}
+
+uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	StaticSprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0) {
+			_surface->setVisible(true);
+			_countdown = 4;
+			_parentScene->sendMessage(0x2000, 0, this);
+			_soundResource.play();
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
+	: AnimatedSprite(vm, 1000), _soundResource1(vm), _soundResource2(vm),
+	_index(index), _flag1(flag), _flag2(false) {
+
+	if (flag) {
+		_x = 310;
+		_y = 200;
+		createSurface1(kAsScene3011SymbolFileHashes[_index], 1200);
+		_soundResource1.load(0x6052C60F);
+		_soundResource2.load(0x6890433B);
+	} else {
+		_index = 12;
+		_x = index * 39 + 96;
+		_y = 225;
+		createSurface(1200, 41, 48);
+		_soundResource1.load(0x64428609);
+		_soundResource2.load(0x7080023B);
+	}
+	_surface->setVisible(false);
+	_needRefresh = true;
+	SetUpdateHandler(&AnimatedSprite::update);
+}
+
+void AsScene3011Symbol::show(bool flag) {
+	_flag2 = flag;
+	setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1);
+	_surface->setVisible(true);
+	if (flag) {
+		_soundResource2.play();
+	} else {
+		_soundResource1.play();
+	}
+}
+
+void AsScene3011Symbol::hide() {
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+void AsScene3011Symbol::stopSound() {
+	if (_flag2) {
+		_soundResource2.stop();
+	} else {
+		_soundResource2.stop();
+	}
+}
+
+void AsScene3011Symbol::change(int index, bool flag) {
+	_index = index;
+	_flag2 = flag;
+	setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1);
+	_surface->setVisible(true);
+	if (flag) {
+		_soundResource2.play();
+	} else {
+		_soundResource1.play();
+	}
+}
+
+Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) {
+
+	Palette2 *palette2;
+	
+	_surfaceFlag = true;
+
+	// TODO _vm->gameModule()->initScene3011Vars();
+	_index1 = getGlobalVar(0x2414C2F2);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x92124A04, 0, 0));
+
+	palette2 = new Palette2(_vm, 0xA4070114);
+	addEntity(palette2);
+	palette2->usePalette();
+	_palette = palette2;
+
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x24A00929, 20, 620));
+
+	for (int i = 0; i < 12; i++) {
+		_asSymbols[i] = new AsScene3011Symbol(_vm, i, true);
+		addSprite(_asSymbols[i]);
+	}
+
+	_ssButton = addSprite(new SsScene3011Button(_vm, this, true));
+	_vm->_collisionMan->addSprite(_ssButton);
+	
+	SetUpdateHandler(&Scene3011::update);
+	SetMessageHandler(&Scene3011::handleMessage);
+	
+}
+
+void Scene3011::update() {
+	Scene::update();
+	
+	if (_countdown != 0 && (--_countdown == 0)) {
+		switch (_updateStatus) {
+		case 0:
+			if (_buttonClicked) {
+				if (_index1 == _index2) {
+					do {
+						_index3 = _vm->_rnd->getRandomNumber(12 - 1);
+					} while (_index1 == _index3);
+					_asSymbols[getSubVar(0x04909A50, _index3)]->show(true);
+				} else {
+					_asSymbols[getSubVar(0x04909A50, _index2)]->show(false);
+				}
+				_updateStatus = 1;
+				_countdown = 24;
+				fadeIn();
+				_buttonClicked = false;
+			}
+			break;
+		case 1:
+			_updateStatus = 2;
+			_countdown = 24;
+			break;
+		case 2:
+			fadeOut();
+			_updateStatus = 3;
+			_countdown = 24;
+			break;
+		case 3:
+			_updateStatus = 0;
+			_countdown = 1;
+			if (_index1 == _index2) {
+				_asSymbols[getSubVar(0x04909A50, _index3)]->hide();
+			} else {
+				_asSymbols[getSubVar(0x04909A50, _index2)]->hide();
+			}
+			_index2++;
+			if (_index2 >= 12)
+				_index2 = 0;
+			break;
+		}
+	}
+}
+
+uint32 Scene3011::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x2000:
+		_buttonClicked = true;
+		if (_countdown == 0)
+			_countdown = 1;
+		break;
+	}
+	return 0;
+}
+
+void Scene3011::fadeIn() {
+	Palette2 *palette2 = (Palette2*)_palette;
+	palette2->addPalette(0x92124A04, 0, 256, 0);
+	palette2->startFadeToPalette(24);
+}
+
+void Scene3011::fadeOut() {
+	Palette2 *palette2 = (Palette2*)_palette;
+	palette2->addPalette(0xA4070114, 0, 256, 0);
+	palette2->startFadeToPalette(24);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 499741d..64a4b76 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -62,6 +62,7 @@ protected:
 	void updateScene3007();			
 	void updateScene3009();			
 	void updateScene3010();			
+	void updateScene3011();			
 };
 
 // Scene3009
@@ -239,6 +240,52 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+// Scene3011
+
+class SsScene3011Button : public StaticSprite {
+public:
+	SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene3011Symbol : public AnimatedSprite {
+public:
+	AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag);
+	void show(bool flag);
+	void hide();
+	void stopSound();
+	void change(int index, bool flag);
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	bool _flag1;
+	bool _flag2;
+	int _index;
+};
+
+class Scene3011 : public Scene {
+public:
+	Scene3011(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_ssButton;
+	AsScene3011Symbol *_asSymbols[12];
+	int _updateStatus;
+	bool _buttonClicked;
+	int _countdown;
+	int _index1;
+	int _index2;   
+	int _index3;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void fadeIn();
+	void fadeOut();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE3000_H */
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index a7d5e6c..f8d282c 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -199,6 +199,7 @@ public:
 	void load(uint32 fileHash);
 	void play(uint32 fileHash, bool looping = false);
 	void play();
+	void stop() { /*DUMMY*/ }
 protected:
 	NeverhoodEngine *_vm;	
 };


Commit: 5fcc3af23bc0838283693e34ac9e073aca773821
    https://github.com/scummvm/scummvm/commit/5fcc3af23bc0838283693e34ac9e073aca773821
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Implement Module2000

Changed paths:
  A engines/neverhood/module2000.cpp
  A engines/neverhood/module2000.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 16824e9..7408c25 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -29,6 +29,7 @@
 #include "neverhood/module1500.h"
 #include "neverhood/module1700.h"
 #include "neverhood/module1800.h"
+#include "neverhood/module2000.h"
 #include "neverhood/module2300.h"
 #include "neverhood/module3000.h"
 
@@ -227,7 +228,7 @@ void GameModule::startup() {
 	//createModule1700(-1);
 	//createModule1700(1);
 	//createModule1400(-1);
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 10;
 	createModule3000(-1);
 #endif
@@ -235,6 +236,10 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule1800(-1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 0;
+	createModule2000(-1);
+#endif
 }
 
 void GameModule::createModule1000(int which) {
@@ -284,11 +289,7 @@ void GameModule::updateModule1200() {
 
 void GameModule::createModule1400(int which) {
 	setGlobalVar(0x91080831, 0x00AD0012);
-	//_childObject = new Module1400(_vm, this, which);
-	
-	_vm->gameState().sceneNum = 9;
-	_childObject = new Module3000(_vm, this, -1);
-	
+	_childObject = new Module1400(_vm, this, which);
 	SetUpdateHandler(&GameModule::updateModule1400);
 }
 
@@ -384,6 +385,25 @@ void GameModule::updateModule1800() {
 	}
 }
 
+void GameModule::createModule2000(int which) {
+	setGlobalVar(0x91080831, 0x08250000);
+	_childObject = new Module2000(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule2000);
+}
+
+void GameModule::updateModule2000() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		// TODO createModule2900(4);
+		_childObject->handleUpdate();
+	}
+}
+
 void GameModule::createModule2300(int which) {
 	setGlobalVar(0x91080831, 0x1A214010);
 	_childObject = new Module2300(_vm, this, which);
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 6290a85..6de3893 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -63,6 +63,8 @@ protected:
 	void updateModule1700();
 	void createModule1800(int which);
 	void updateModule1800();
+	void createModule2000(int which);
+	void updateModule2000();
 	void createModule2200(int which);
 	void createModule2300(int which);
 	void updateModule2300();
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 3aaab36..d74f94b 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3324,4 +3324,102 @@ void KmScene1705::sub468B10() {
 	SetMessageHandler(&KmScene1705::handleMessage4689A0);
 }
 
+KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) {
+
+	// Empty	
+}
+
+uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x2000:
+		_flag = param.asInteger() != 0;
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_flag) {
+			setCallback2(AnimationCallback(&Klayman::sub421350));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		}
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&Klayman::sub41F9E0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481D:
+		if (_flag) {
+			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+		}
+		break;
+	case 0x481E:
+		if (_flag) {
+			setCallback2(AnimationCallback(&Klayman::sub421510));
+		}
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x4835:
+		_parentScene->sendMessage(0x2000, 1, this);
+		_flag = true;
+		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		break;
+	case 0x4836:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_flag = false;
+		setCallback2(AnimationCallback(&Klayman::sub421310));
+		break;
+	case 0x483D:
+		sub440230();
+		break;
+	case 0x483E:
+		sub440270();
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			_soundResource1.play(0x85B10BB8);
+		} if (param.asInteger() == 0x4E6A0CA0) {
+			_soundResource1.play(0xC5B709B0);
+		}
+		break;
+	}
+}
+
+void KmScene2001::sub440230() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0xBE68CC54, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene2001::handleMessage4401A0);
+}
+
+void KmScene2001::sub440270() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x18AB4ED4, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene2001::handleMessage4401A0);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index d7c351e..8585689 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -109,6 +109,7 @@ public:
 	void sub420E90();
 	void sub420EB0();
 	void sub420680();
+	void sub41F9E0();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -204,7 +205,6 @@ protected:
 	void sub41F950();
 	void sub41FB30();
 	uint32 handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender);
-	void sub41F9E0();
 	void spriteUpdate41F300();
 	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
 	void sub41FA40();
@@ -359,6 +359,17 @@ protected:
 	void sub468B10();
 };
 
+class KmScene2001 : public Klayman {
+public:
+	KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage4401A0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub440230();
+	void sub440270();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 20e0bbb..5dcdc41 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -17,6 +17,7 @@ MODULE_OBJS = \
 	module1500.o \
 	module1700.o \
 	module1800.o \
+	module2000.o \
 	module2300.o \
 	module3000.o \
 	mouse.o \
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
new file mode 100644
index 0000000..9f45db2
--- /dev/null
+++ b/engines/neverhood/module2000.cpp
@@ -0,0 +1,193 @@
+/* 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/module2000.h"
+#include "neverhood/gamemodule.h"
+#include "neverhood/navigationscene.h"
+
+namespace Neverhood {
+
+Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	debug("Create Module2000(%d)", which);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			createScene2001(-1);
+			break;
+		case 2:
+			createScene2003(-1);
+			break;
+		default:
+			createScene2002(-1);
+			break;
+		}
+	} else if (which == 0) {
+		createScene2001(3);
+	} else if (which == 1) {
+		createScene2001(1);
+	}
+
+}
+
+Module2000::~Module2000() {
+	// TODO Sound1ChList_sub_407A50(0x81293110);
+}
+
+void Module2000::createScene2001(int which) {
+	_vm->gameState().sceneNum = 0;
+	_childObject = new Scene2001(_vm, this, which);
+	SetUpdateHandler(&Module2000::updateScene2001);
+	_childObject->handleUpdate();
+}
+
+void Module2000::createScene2002(int which) {
+	_vm->gameState().sceneNum = 1;
+	if (getGlobalVar(0x98109F12)) {
+		createNavigationScene(0x004B7B48, which);
+	} else {
+		createNavigationScene(0x004B7B00, which);
+	}
+	SetUpdateHandler(&Module2000::updateScene2002);
+	_childObject->handleUpdate();
+}
+
+void Module2000::createScene2003(int which) {
+	_vm->gameState().sceneNum = 2;
+	setGlobalVar(0x98109F12, 1);
+	setSubVar(0x2C145A98, 1, 1);
+	createSmackerScene(0x204B2031, true, true, false);
+	SetUpdateHandler(&Module2000::updateScene2003);
+	_childObject->handleUpdate();
+}
+
+void Module2000::updateScene2001() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		} else {
+			createScene2002(0);
+		}
+	}
+}
+
+void Module2000::updateScene2002() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			if (getGlobalVar(0x98109F12)) {
+				createScene2002(0);
+			} else {
+				createScene2003(-1);
+			}
+		} else if (_field20 == 1) {
+			createScene2002(1);
+		} else if (_field20 == 2) {
+			createScene2001(0);
+		}
+	}
+}
+
+void Module2000::updateScene2003() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene2002(0);
+	}
+}
+
+// Scene2001
+
+Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2001::handleMessage);
+
+	_background = addBackground(new DirtyBackground(_vm, 0xA6417244, 0, 0));
+	_palette = new Palette(_vm, 0xA6417244);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL));
+
+	_class401 = addSprite(new StaticSprite(_vm, 0x0D641724, 1100));
+
+	if (which < 0) {
+		_klayman = new KmScene2001(_vm, this, 300, 345);
+		setMessageList(0x004B3538);
+		sendMessage(0x2000, 0, this);
+	} else if (which == 1) {
+		_klayman = new KmScene2001(_vm, this, 116, 345);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004B3540);
+		sendMessage(0x2000, 1, this);
+	} else if (which == 2) {
+		_klayman = new KmScene2001(_vm, this, 116, 345);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004B35F0);
+		sendMessage(0x2000, 1, this);
+	} else if (which == 3) {
+		_klayman = new KmScene2001(_vm, this, 116, 345);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004B3550);
+		sendMessage(0x2000, 1, this);
+	} else {
+		_klayman = new KmScene2001(_vm, this, 390, 345);
+		setMessageList(0x004B3530);
+		sendMessage(0x2000, 0, this);
+		_klayman->setDoDeltaX(1);
+	}
+	addSprite(_klayman);
+	
+	_klayman->getSurface()->getClipRect().x1 = _class401->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+	
+}
+
+uint32 Scene2001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (param.asInteger()) {
+			setRectList(0x004B3680);
+			_klayman->setKlaymanTable3();
+		} else {
+			setRectList(0x004B3670);
+			_klayman->setKlaymanTable1();
+		}
+	}	
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h
new file mode 100644
index 0000000..23ac8a8
--- /dev/null
+++ b/engines/neverhood/module2000.h
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_MODULE2000_H
+#define NEVERHOOD_MODULE2000_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/module1200.h"
+
+namespace Neverhood {
+
+class Module2000 : public Module {
+public:
+	Module2000(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2000();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createScene2001(int which);
+	void createScene2002(int which);
+	void createScene2003(int which);
+	void updateScene2001();			
+	void updateScene2002();			
+	void updateScene2003();			
+};
+
+// Scene2001
+
+class Scene2001 : public Scene {
+public:
+	Scene2001(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_class401;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2000_H */


Commit: 828629018567b3ff4e3f3311420168ff83bf62a7
    https://github.com/scummvm/scummvm/commit/828629018567b3ff4e3f3311420168ff83bf62a7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:34-07:00

Commit Message:
NEVERHOOD: Add tables for Module2000

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index aa70279..b2d5bc5 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -60,6 +60,9 @@ static const uint32 rectListOffsets[] = {
 	// Scene1705
 	1, 0x004B6B40,
 	1, 0x004B6B30,
+	// Scene2001
+	1, 0x004B3680,
+	1, 0x004B3670,
 	0, 0
 };
 
@@ -150,6 +153,12 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B6A18,
 	1, 0x004B69F0,
 	2, 0x004B6AC0,
+	// Scene2001
+	1, 0x004B3538,
+	2, 0x004B3540,
+	4, 0x004B35F0,
+	2, 0x004B3550,
+	1, 0x004B3530,
 	0, 0
 };
 
@@ -169,5 +178,21 @@ static const uint32 navigationListOffsets[] = {
 	2, 0x004B6878,
 	3, 0x004B68F0,
 	3, 0x004B68A8,
+	// Module2000
+	3, 0x004B7B48,
+	3, 0x004B7B00,
+	// Module3000
+	2, 0x004B7C80,
+	2, 0x004B7CE0,
+	2, 0x004B7CB0,
+	3, 0x004B7D58,
+	3, 0x004B7D10,
+	4, 0x004B7E60,
+	4, 0x004B7DA0,
+	4, 0x004B7E00,
+	4, 0x004B7F20,
+	4, 0x004B7EC0,
+	2, 0x004B7F80,
+	1, 0x004B7FB0,
 	0, 0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index f120857..84a6425 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: bc239b3fb17a359151b8486f1e13c577817adef1
    https://github.com/scummvm/scummvm/commit/bc239b3fb17a359151b8486f1e13c577817adef1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Restructure/redesign create_neverhood tool and made it more extensible for future game structures

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 25ef676..14dd32d 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -41,6 +41,13 @@ byte *data;
 uint32 dataStart = 0x004AE000;
 uint32 fileStart = 0x000AC600;
 
+class HitRectList;
+class RectList;
+class MessageList;
+class NavigationList;
+
+void addMessageList(uint32 messageListCount, uint32 messageListOffset);
+
 void loadExe(const char *filename) {
 	FILE *exe = fopen(filename, "rb");
 	dataSize = fileSize(exe);
@@ -49,38 +56,131 @@ void loadExe(const char *filename) {
 	fclose(exe);
 }
 
+byte *getData(uint32 offset) {
+	return data + offset - dataStart + fileStart;
+}
+
 struct HitRect {
 	int16 x1, y1, x2, y2;
 	uint16 messageNum;
+	
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		x1 = READ_LE_UINT16(item + 0);
+		y1 = READ_LE_UINT16(item + 2);
+		x2 = READ_LE_UINT16(item + 4);
+		y2 = READ_LE_UINT16(item + 6);
+		messageNum = READ_LE_UINT16(item + 8);
+	}	
+
+	void save(FILE *fd) {
+		writeUint16LE(fd, x1);
+		writeUint16LE(fd, y1);
+		writeUint16LE(fd, x2);
+		writeUint16LE(fd, y2);
+		writeUint16LE(fd, messageNum);
+	}
+	
+	int getItemSize() const {
+		return 10;
+	}
+	
 };
 
-typedef std::vector<HitRect> HitRects;
+struct MessageItem {
+	uint16 messageNum;
+	uint32 messageParam;
+	MessageItem() {}
+	MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {}
+	
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		messageNum = READ_LE_UINT16(item + 0);
+		messageParam = READ_LE_UINT32(item + 4);
+	}	
+
+	void save(FILE *fd) {
+		writeUint16LE(fd, messageNum);
+		writeUint32LE(fd, messageParam);
+	}
+	
+	int getItemSize() const {
+		return 8;
+	}
+	
+};
 
 struct SubRectItem {
 	int16 x1, y1, x2, y2;
 	uint32 messageListCount;
 	uint32 messageListOffset;
-};
 
-typedef std::vector<SubRectItem> SubRectItems;
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		x1 = READ_LE_UINT16(item + 0);
+		y1 = READ_LE_UINT16(item + 2);
+		x2 = READ_LE_UINT16(item + 4);
+		y2 = READ_LE_UINT16(item + 6);
+		messageListCount = READ_LE_UINT32(item + 8);
+		messageListOffset = READ_LE_UINT32(item + 12);
+		// Add the message to the message list
+		addMessageList(messageListCount, messageListOffset);
+	}
+	
+	void save(FILE *fd) {
+		writeUint16LE(fd, x1);
+		writeUint16LE(fd, y1);
+		writeUint16LE(fd, x2);
+		writeUint16LE(fd, y2);
+		writeUint32LE(fd, messageListOffset);
+	}
+	
+	int getItemSize() const {
+		return 16;
+	}
+	
+};
 
 struct RectItem {
 	int16 x1, y1, x2, y2;
 	uint32 subRectListCount;
 	uint32 subRectListOffset;
-	SubRectItems subRectItems;
-};
+	std::vector<SubRectItem> subRectItems;
 
-typedef std::vector<RectItem> RectItems;
-
-struct MessageItem {
-	uint16 messageNum;
-	uint32 messageParam;
-	MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {}
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		uint32 subItemOffset;
+		x1 = READ_LE_UINT16(item + 0);
+		y1 = READ_LE_UINT16(item + 2);
+		x2 = READ_LE_UINT16(item + 4);
+		y2 = READ_LE_UINT16(item + 6);
+		subRectListCount = READ_LE_UINT32(item + 8);
+		subRectListOffset = READ_LE_UINT32(item + 12);
+		subItemOffset = subRectListOffset;
+		for (uint32 j = 0; j < subRectListCount; j++) {
+			SubRectItem subRectItem;
+			subRectItem.load(subItemOffset);
+			subItemOffset += 16;
+			subRectItems.push_back(subRectItem);
+		}
+	}	
+
+	void save(FILE *fd) {
+		writeUint16LE(fd, x1);
+		writeUint16LE(fd, y1);
+		writeUint16LE(fd, x2);
+		writeUint16LE(fd, y2);
+		writeUint32LE(fd, subRectItems.size());
+		for (uint32 j = 0; j < subRectItems.size(); j++)
+			subRectItems[j].save(fd);
+	}
+	
+	int getItemSize() const {
+		return 16;
+	}
+	
 };
 
-typedef std::vector<MessageItem> MessageItems;
-
 struct NavigationItem {
 	uint32 fileHash;
 	uint32 leftSmackerFileHash;
@@ -89,149 +189,172 @@ struct NavigationItem {
 	byte interactive;
 	byte middleFlag;
 	uint32 mouseCursorFileHash;
-};
+	
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		fileHash = READ_LE_UINT32(item + 0); 
+		leftSmackerFileHash = READ_LE_UINT32(item + 4);
+		rightSmackerFileHash = READ_LE_UINT32(item + 8);
+		middleSmackerFileHash = READ_LE_UINT32(item + 12);
+		interactive = item[16];
+		middleFlag = item[17];
+		mouseCursorFileHash = READ_LE_UINT32(item + 20);
+	}
 
-typedef std::vector<NavigationItem> NavigationItems;
+	void save(FILE *fd) {
+		writeUint32LE(fd, fileHash);
+		writeUint32LE(fd, leftSmackerFileHash);
+		writeUint32LE(fd, rightSmackerFileHash);
+		writeUint32LE(fd, middleSmackerFileHash);
+		writeByte(fd, interactive);
+		writeByte(fd, middleFlag);
+		writeUint32LE(fd, mouseCursorFileHash);
+	}
 
-struct HitRectList {
-	uint32 id;	
-	HitRects hitRects;
+	int getItemSize() const {
+		return 24;
+	}
+	
 };
 
-struct RectList {
+template<class ITEMCLASS>
+class StaticDataList {
+public:
 	uint32 id;	
-	RectItems rectItems;
+	std::vector<ITEMCLASS> items;
+	
+	virtual ~StaticDataList() {
+	}
+	
+	void add(ITEMCLASS item) {
+		items.push_back(item);
+	}
+	
+	int getCount() const {
+		return items.size();
+	}
+	
+	ITEMCLASS *getListItem(int index) {
+		return &items[index];
+	}
+		
+	virtual bool specialLoadList(uint32 count, uint32 offset) {
+		return false;
+	}
+
+	void loadList(uint32 count, uint32 offset) {
+		id = offset;
+		if (!specialLoadList(count, offset)) {
+			for (uint32 i = 0; i < count; i++) {
+				ITEMCLASS listItem;
+				listItem.load(offset);
+				offset += listItem.getItemSize();
+				add(listItem);
+			}
+		}
+	}
+
+	void saveList(FILE *fd) {
+		writeUint32LE(fd, id);
+		writeUint32LE(fd, getCount());
+		for (int i = 0; i < getCount(); i++) {
+			items[i].save(fd);
+		}
+	}
+
+};
+
+class HitRectList : public StaticDataList<HitRect> {
 };
 
-struct MessageList {
-	uint32 id;
-	MessageItems messageItems;	
+class RectList : public StaticDataList<RectItem> {
 };
 
-struct NavigationList {
-	uint32 id;
-	NavigationItems navigationItems;	
+class MessageList : public StaticDataList<MessageItem> {
+public:	
+
+	virtual bool specialLoadList(uint32 count, uint32 offset) {
+		// Special code for message lists which are set at runtime (but otherwise constant)
+		switch (offset) {
+		// Scene 1002 rings
+		case 0x004B4200:
+			add(MessageItem(0x4800, 258));
+			add(MessageItem(0x100D, 0x4A845A00));
+			add(MessageItem(0x4805, 1));
+			return true;
+		case 0x004B4218:
+			add(MessageItem(0x4800, 297));
+			add(MessageItem(0x100D, 0x43807801));
+			add(MessageItem(0x4805, 2));
+			return true;
+		case 0x004B4230:
+			add(MessageItem(0x4800, 370));
+			add(MessageItem(0x100D, 0x46C26A01));
+			return true;
+		case 0x004B4240:
+			add(MessageItem(0x4800, 334));
+			add(MessageItem(0x100D, 0x468C7B11));
+			add(MessageItem(0x4805, 1));
+			return true;
+		case 0x004B4258:
+			add(MessageItem(0x4800, 425));
+			add(MessageItem(0x100D, 0x42845B19));
+			add(MessageItem(0x4805, 1));
+			return true;
+		}
+		return false;
+	}
+		
 };
 
-std::vector<HitRectList*> hitRectLists;
-std::vector<RectList*> rectLists;
-std::vector<MessageList*> messageLists;
-std::vector<NavigationList*> navigationLists;
+class NavigationList : public StaticDataList<NavigationItem> {
 
-byte *getData(uint32 offset) {
-	return data + offset - dataStart + fileStart;
-}
+};
 
-void addHitRect(uint32 count, uint32 offset) {
-	HitRectList *hitRectList = new HitRectList();
-	hitRectList->id = offset;
-	byte *item = getData(offset);
-	for (uint32 i = 0; i < count; i++) {
-		HitRect hitRect;
-		hitRect.x1 = READ_LE_UINT16(item + 0);
-		hitRect.y1 = READ_LE_UINT16(item + 2);
-		hitRect.x2 = READ_LE_UINT16(item + 4);
-		hitRect.y2 = READ_LE_UINT16(item + 6);
-		hitRect.messageNum = READ_LE_UINT16(item + 8);
-		item += 10;
-		//printf("(%d, %d, %d, %d) -> %04X\n", hitRect.x1, hitRect.y1, hitRect.x2, hitRect.y2, hitRect.messageNum);
-		hitRectList->hitRects.push_back(hitRect);
+template<class LISTCLASS>
+class StaticDataListVector {
+public:
+	std::vector<LISTCLASS*> lists;
+	
+	void add(LISTCLASS *list) {
+		lists.push_back(list);
 	}
-	hitRectLists.push_back(hitRectList);
-}
-
-void addMessage(uint32 count, uint32 offset) {
-	MessageList *messageList = new MessageList();
-	messageList->id = offset;
-	// Special code for message lists which are set at runtime (but otherwise constant)
-	switch (offset) {
-	// Scene 1002 rings
-	case 0x004B4200:
-		messageList->messageItems.push_back(MessageItem(0x4800, 258));
-		messageList->messageItems.push_back(MessageItem(0x100D, 0x4A845A00));
-		messageList->messageItems.push_back(MessageItem(0x4805, 1));
-		break;
-	case 0x004B4218:
-		messageList->messageItems.push_back(MessageItem(0x4800, 297));
-		messageList->messageItems.push_back(MessageItem(0x100D, 0x43807801));
-		messageList->messageItems.push_back(MessageItem(0x4805, 2));
-		break;
-	case 0x004B4230:
-		messageList->messageItems.push_back(MessageItem(0x4800, 370));
-		messageList->messageItems.push_back(MessageItem(0x100D, 0x46C26A01));
-		break;
-	case 0x004B4240:
-		messageList->messageItems.push_back(MessageItem(0x4800, 334));
-		messageList->messageItems.push_back(MessageItem(0x100D, 0x468C7B11));
-		messageList->messageItems.push_back(MessageItem(0x4805, 1));
-		break;
-	case 0x004B4258:
-		messageList->messageItems.push_back(MessageItem(0x4800, 425));
-		messageList->messageItems.push_back(MessageItem(0x100D, 0x42845B19));
-		messageList->messageItems.push_back(MessageItem(0x4805, 1));
-		break;
-	default:
-		// Read message list from the exe
-		byte *item = getData(offset);
-		for (uint32 i = 0; i < count; i++) {
-			messageList->messageItems.push_back(MessageItem(READ_LE_UINT16(item + 0), READ_LE_UINT32(item + 4)));
-			item += 8;
+	
+	void loadListVector(const uint32 *offsets) {
+		for (int i = 0; offsets[i] != 0; i += 2) {
+			LISTCLASS *list = new LISTCLASS();
+			list->loadList(offsets[i], offsets[i + 1]);
+			bool doAppend = true;
+			// Bad
+			for (typename std::vector<LISTCLASS*>::iterator it = lists.begin(); it != lists.end(); it++) {
+				if ((*it)->id == list->id) {
+					doAppend = false;
+					break;
+				}
+			}
+			if (doAppend)
+				lists.push_back(list);
 		}
 	}
-	messageLists.push_back(messageList);	   
-}
-
-void addRect(uint32 count, uint32 offset) {
-	RectList *rectList = new RectList();
-	rectList->id = offset;
-	byte *item = getData(offset);
-	for (uint32 i = 0; i < count; i++) {
-		RectItem rectItem;
-		byte *subItem;
-		rectItem.x1 = READ_LE_UINT16(item + 0);
-		rectItem.y1 = READ_LE_UINT16(item + 2);
-		rectItem.x2 = READ_LE_UINT16(item + 4);
-		rectItem.y2 = READ_LE_UINT16(item + 6);
-		rectItem.subRectListCount = READ_LE_UINT32(item + 8);
-		rectItem.subRectListOffset = READ_LE_UINT32(item + 12);
-		//printf("(%d, %d, %d, %d), %d, %08X\n", rectItem.x1, rectItem.y1, rectItem.x2, rectItem.y2, rectItem.subRectListCount, rectItem.subRectListOffset);
-		subItem = getData(rectItem.subRectListOffset);
-		for (uint32 j = 0; j < rectItem.subRectListCount; j++) {
-			SubRectItem subRectItem;
-			subRectItem.x1 = READ_LE_UINT16(subItem + 0);
-			subRectItem.y1 = READ_LE_UINT16(subItem + 2);
-			subRectItem.x2 = READ_LE_UINT16(subItem + 4);
-			subRectItem.y2 = READ_LE_UINT16(subItem + 6);
-			subRectItem.messageListCount = READ_LE_UINT32(subItem + 8);
-			subRectItem.messageListOffset = READ_LE_UINT32(subItem + 12);
-			subItem += 16;
-			//printf("(%d, %d, %d, %d), %d, %08X\n", subRectItem.x1, subRectItem.y1, subRectItem.x2, subRectItem.y2, subRectItem.messageListCount, subRectItem.messageListOffset);
-			addMessage(subRectItem.messageListCount, subRectItem.messageListOffset);
-			rectItem.subRectItems.push_back(subRectItem);
+	
+	void saveListVector(FILE *fd) {
+		writeUint32LE(fd, lists.size());
+		for (typename std::vector<LISTCLASS*>::iterator it = lists.begin(); it != lists.end(); it++) {
+			(*it)->saveList(fd);
 		}
-		item += 16;
-		rectList->rectItems.push_back(rectItem);
 	}
-	rectLists.push_back(rectList);
-}
 
-void addNavigation(uint32 count, uint32 offset) {
-	NavigationList *navigationList = new NavigationList();
-	navigationList->id = offset;
-	byte *item = getData(offset);
-	for (uint32 i = 0; i < count; i++) {
-		NavigationItem navigationItem;
-		navigationItem.fileHash = READ_LE_UINT32(item + 0); 
-		navigationItem.leftSmackerFileHash = READ_LE_UINT32(item + 4);
-		navigationItem.rightSmackerFileHash = READ_LE_UINT32(item + 8);
-		navigationItem.middleSmackerFileHash = READ_LE_UINT32(item + 12);
-		navigationItem.interactive = item[16];
-		navigationItem.middleFlag = item[17];
-		navigationItem.mouseCursorFileHash = READ_LE_UINT32(item + 20);
-		item += 24;
-		navigationList->navigationItems.push_back(navigationItem);
-	}
-	navigationLists.push_back(navigationList);
+};
+
+StaticDataListVector<HitRectList> hitRectLists;
+StaticDataListVector<RectList> rectLists;
+StaticDataListVector<MessageList> messageLists;
+StaticDataListVector<NavigationList> navigationLists;
+
+void addMessageList(uint32 messageListCount, uint32 messageListOffset) {
+	MessageList *messageList = new MessageList();
+	messageList->loadList(messageListCount, messageListOffset);
+	messageLists.add(messageList);
 }
 
 int main(int argc, char *argv[]) {
@@ -240,96 +363,24 @@ int main(int argc, char *argv[]) {
 
 	loadExe("nhc.exe");
 
-	for (int i = 0; hitRectListOffsets[i] != 0; i += 2) {
-		addHitRect(hitRectListOffsets[i], hitRectListOffsets[i + 1]);
-	}
-
-	for (int i = 0; rectListOffsets[i] != 0; i += 2) {
-		addRect(rectListOffsets[i], rectListOffsets[i + 1]);
-	}
-	
-	for (int i = 0; messageListOffsets[i] != 0; i += 2) {
-		addMessage(messageListOffsets[i], messageListOffsets[i + 1]);
-	}
-	
-	for (int i = 0; navigationListOffsets[i] != 0; i += 2) {
-		addNavigation(navigationListOffsets[i], navigationListOffsets[i + 1]);
-	}
-	
+    hitRectLists.loadListVector(hitRectListOffsets);
+    rectLists.loadListVector(rectListOffsets);
+    messageLists.loadListVector(messageListOffsets);
+    navigationLists.loadListVector(navigationListOffsets);
+    
 	datFile = fopen("neverhood.dat", "wb");
 
 	writeUint32LE(datFile, 0x11223344); // Some magic
 	writeUint32LE(datFile, DAT_VERSION);
 		
 	// Write all message lists
-	writeUint32LE(datFile, messageLists.size());
-	for (std::vector<MessageList*>::iterator it = messageLists.begin(); it != messageLists.end(); it++) {
-		MessageList *messageList = *it;
-		writeUint32LE(datFile, messageList->id);
-		writeUint32LE(datFile, messageList->messageItems.size());
-		for (uint32 i = 0; i < messageList->messageItems.size(); i++) {
-			writeUint16LE(datFile, messageList->messageItems[i].messageNum);
-			writeUint32LE(datFile, messageList->messageItems[i].messageParam);
-		}
-	}
-
+    messageLists.saveListVector(datFile);
 	// Write all rect lists
-	writeUint32LE(datFile, rectLists.size());
-	for (std::vector<RectList*>::iterator it = rectLists.begin(); it != rectLists.end(); it++) {
-		RectList *rectList = *it;
-		writeUint32LE(datFile, rectList->id);
-		writeUint32LE(datFile, rectList->rectItems.size());
-		for (uint32 i = 0; i < rectList->rectItems.size(); i++) {
-			const RectItem &rectItem = rectList->rectItems[i]; 
-			writeUint16LE(datFile, rectItem.x1);
-			writeUint16LE(datFile, rectItem.y1);
-			writeUint16LE(datFile, rectItem.x2);
-			writeUint16LE(datFile, rectItem.y2);
-			writeUint32LE(datFile, rectItem.subRectItems.size());
-			for (uint32 j = 0; j < rectItem.subRectItems.size(); j++) {
-				const SubRectItem &subRectItem = rectItem.subRectItems[j]; 
-				writeUint16LE(datFile, subRectItem.x1);
-				writeUint16LE(datFile, subRectItem.y1);
-				writeUint16LE(datFile, subRectItem.x2);
-				writeUint16LE(datFile, subRectItem.y2);
-				writeUint32LE(datFile, subRectItem.messageListOffset);
-			}
-		}
-	}
-		
+    rectLists.saveListVector(datFile);
 	// Write all hit rect lists
-	writeUint32LE(datFile, hitRectLists.size());
-	for (std::vector<HitRectList*>::iterator it = hitRectLists.begin(); it != hitRectLists.end(); it++) {
-		HitRectList *hitRectList = *it;
-		writeUint32LE(datFile, hitRectList->id);
-		writeUint32LE(datFile, hitRectList->hitRects.size());
-		for (uint32 i = 0; i < hitRectList->hitRects.size(); i++) {
-			const HitRect &hitRect  = hitRectList->hitRects[i]; 
-			writeUint16LE(datFile, hitRect.x1);
-			writeUint16LE(datFile, hitRect.y1);
-			writeUint16LE(datFile, hitRect.x2);
-			writeUint16LE(datFile, hitRect.y2);
-			writeUint16LE(datFile, hitRect.messageNum);
-		}
-	}
-		
+    hitRectLists.saveListVector(datFile);
 	// Write all navigation lists
-	writeUint32LE(datFile, navigationLists.size());
-	for (std::vector<NavigationList*>::iterator it = navigationLists.begin(); it != navigationLists.end(); it++) {
-		NavigationList *navigationList = *it;
-		writeUint32LE(datFile, navigationList->id);
-		writeUint32LE(datFile, navigationList->navigationItems.size());
-		for (uint32 i = 0; i < navigationList->navigationItems.size(); i++) {
-			const NavigationItem &navigationItem = navigationList->navigationItems[i]; 
-			writeUint32LE(datFile, navigationItem.fileHash);
-			writeUint32LE(datFile, navigationItem.leftSmackerFileHash);
-			writeUint32LE(datFile, navigationItem.rightSmackerFileHash);
-			writeUint32LE(datFile, navigationItem.middleSmackerFileHash);
-			writeByte(datFile, navigationItem.interactive);
-			writeByte(datFile, navigationItem.middleFlag);
-			writeUint32LE(datFile, navigationItem.mouseCursorFileHash);
-		}
-	}
+    navigationLists.saveListVector(datFile);
 
 	fclose(datFile);
 


Commit: bec86c7c2ee49a1428b5fac88b08e427805970a8
    https://github.com/scummvm/scummvm/commit/bec86c7c2ee49a1428b5fac88b08e427805970a8
Author: digitall (digitall at scummvm.org)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Switch to initGraphics() call, rather than separate calls. Default to 1xScalar.

Changed paths:
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index c6a7e5a..d94d3db 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -57,11 +57,7 @@ NeverhoodEngine::~NeverhoodEngine() {
 }
 
 Common::Error NeverhoodEngine::run() {
-	// Initialize backend
-	_system->beginGFXTransaction();
-		initCommonGFX(false);
-	_system->initSize(640, 480);
-	_system->endGFXTransaction();
+	initGraphics(640, 480, true);
 
 	_isSaveAllowed = false;
 


Commit: eb8c44b54c846d30d9ce246b786fd46e1218b586
    https://github.com/scummvm/scummvm/commit/eb8c44b54c846d30d9ce246b786fd46e1218b586
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Implement Scene2201

- Implement DataResource::getHitRectList, DataResource::getMessageListAtPos and related stuff in scene.cpp

Changed paths:
  A engines/neverhood/module2200.cpp
  A engines/neverhood/module2200.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk
    engines/neverhood/resource.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7408c25..a118e4f 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -30,6 +30,7 @@
 #include "neverhood/module1700.h"
 #include "neverhood/module1800.h"
 #include "neverhood/module2000.h"
+#include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
 #include "neverhood/module3000.h"
 
@@ -236,10 +237,14 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule1800(-1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 0;
 	createModule2000(-1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 0;
+	createModule2200(-1);
+#endif
 }
 
 void GameModule::createModule1000(int which) {
@@ -404,6 +409,25 @@ void GameModule::updateModule2000() {
 	}
 }
 
+void GameModule::createModule2200(int which) {
+	setGlobalVar(0x91080831, 0x11391412);
+	_childObject = new Module2200(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule2200);
+}
+
+void GameModule::updateModule2200() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createModule2300(1);
+		_childObject->handleUpdate();
+	}
+}
+
 void GameModule::createModule2300(int which) {
 	setGlobalVar(0x91080831, 0x1A214010);
 	_childObject = new Module2300(_vm, this, which);
@@ -419,7 +443,7 @@ void GameModule::updateModule2300() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
-			// TODO createModule2200(0);
+			createModule2200(0);
 			// TODO _childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createModule1200(0);
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 6de3893..9ef1b92 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -66,6 +66,7 @@ protected:
 	void createModule2000(int which);
 	void updateModule2000();
 	void createModule2200(int which);
+	void updateModule2200();
 	void createModule2300(int which);
 	void updateModule2300();
 	void createModule2400(int which);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index d74f94b..50dd231 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -573,8 +573,10 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		break;
 	case 0x482C:
 		if (param.asInteger() != 0) {
+		debug("#################################################");
 			// TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,);
 		} else {
+		debug("#################################################");
 			// TODO _field114 = 0;
 		}
 		break;
@@ -3402,6 +3404,7 @@ uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam &para
 		}
 		break;
 	}
+	return messageResult;
 }
 
 void KmScene2001::sub440230() {
@@ -3422,4 +3425,77 @@ void KmScene2001::sub440270() {
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
+KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk)
+	// TODO: NRect *rect1, int16 unk in Klayman ctor
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+
+	_dataResource.load(0x04104242);
+	_flagF6 = false;
+}
+
+uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4812:
+		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		break;
+	case 0x4816:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x4818:
+		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub421030));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub421070));
+		}
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;	
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 8585689..1c02f1e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -370,6 +370,13 @@ protected:
 	void sub440270();
 };
 
+class KmScene2201 : public Klayman {
+public:
+	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 5dcdc41..9122eaf 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -18,6 +18,7 @@ MODULE_OBJS = \
 	module1700.o \
 	module1800.o \
 	module2000.o \
+	module2200.o \
 	module2300.o \
 	module3000.o \
 	mouse.o \
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
new file mode 100644
index 0000000..9e4d083
--- /dev/null
+++ b/engines/neverhood/module2200.cpp
@@ -0,0 +1,730 @@
+/* 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/module2200.h"
+#include "neverhood/module1000.h"
+#include "neverhood/module1200.h"
+
+namespace Neverhood {
+
+Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	debug("Create Module2200(%d)", which);
+
+	// TODO: Music18hList_add(0x11391412, 0x601C908C); 
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		default:
+			createScene2201(-1);
+			break;
+		case 1:
+			createScene2202(-1);
+			break;
+		case 2:
+			createScene2203(-1);
+			break;
+		case 3:
+			createScene2204(-1);
+			break;
+		case 4:
+			createScene2205(-1);
+			break;
+		case 5:
+			createScene2206(-1);
+			break;
+		case 6:
+			createScene2207(-1);
+			break;
+		case 7:
+			createScene2208(-1);
+			break;
+		case 8:
+			createScene2209(-1);
+			break;
+		case 9:
+			createScene2210(-1);
+			break;
+		case 10:
+			createScene2211(-1);
+			break;
+		case 11:
+			createScene2212(-1);
+			break;
+		case 12:
+			createScene2213(-1);
+			break;
+		case 13:
+			createScene2214(-1);
+			break;
+		case 14:
+			createScene2215(-1);
+			break;
+		case 15:
+			createScene2216(-1);
+			break;
+		case 16:
+			createScene2217(-1);
+			break;
+		case 17:
+			createScene2218(-1);
+			break;
+		case 18:
+			createScene2219(-1);
+			break;
+		case 19:
+			createScene2220(-1);
+			break;
+		case 20:
+			createScene2221(-1);
+			break;
+		case 21:
+			createScene2222(-1);
+			break;
+		case 22:
+			createScene2223(-1);
+			break;
+		case 23:
+			createScene2224(-1);
+			break;
+		case 24:
+			createScene2225(-1);
+			break;
+		case 25:
+			createScene2226(-1);
+			break;
+		case 26:
+			createScene2227(-1);
+			break;
+		case 27:
+			createScene2228(-1);
+			break;
+		case 28:
+			createScene2229(-1);
+			break;
+		case 29:
+			createScene2230(-1);
+			break;
+		case 30:
+			createScene2231(-1);
+			break;
+		case 31:
+			createScene2232(-1);
+			break;
+		case 32:
+			createScene2233(-1);
+			break;
+		case 33:
+			createScene2234(-1);
+			break;
+		case 34:
+			createScene2235(-1);
+			break;
+		case 35:
+			createScene2236(-1);
+			break;
+		case 36:
+			createScene2237(-1);
+			break;
+		case 37:
+			createScene2238(-1);
+			break;
+		case 38:
+			createScene2239(-1);
+			break;
+		case 39:
+			createScene2240(-1);
+			break;
+		case 40:
+			createScene2241(-1);
+			break;
+		case 41:
+			createScene2242(-1);
+			break;
+		case 42:
+			createScene2243(-1);
+			break;
+		case 43:
+			createScene2244(-1);
+			break;
+		case 44:
+			createScene2245(-1);
+			break;
+		case 45:
+			createScene2246(-1);
+			break;
+		case 46:
+			createScene2247(-1);
+			break;
+		case 47:
+			createScene2248(-1);
+			break;
+		}
+	} else {
+		createScene2201(0);
+	}
+
+}
+
+Module2200::~Module2200() {
+	// TODO Sound1ChList_sub_407A50(0x11391412);
+}
+
+void Module2200::createScene2201(int which) {
+	_vm->gameState().sceneNum = 0;
+	_childObject = new Scene2201(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2201);
+}
+
+void Module2200::createScene2202(int which) {
+}
+
+void Module2200::createScene2203(int which) {
+}
+
+void Module2200::createScene2204(int which) {
+}
+			
+void Module2200::createScene2205(int which) {
+}
+			
+void Module2200::createScene2206(int which) {
+}
+			
+void Module2200::createScene2207(int which) {
+}
+			
+void Module2200::createScene2208(int which) {
+}
+			
+void Module2200::createScene2209(int which) {
+}
+			
+void Module2200::createScene2210(int which) {
+}
+			
+void Module2200::createScene2211(int which) {
+}
+			
+void Module2200::createScene2212(int which) {
+}
+			
+void Module2200::createScene2213(int which) {
+}
+			
+void Module2200::createScene2214(int which) {
+}
+			
+void Module2200::createScene2215(int which) {
+}
+			
+void Module2200::createScene2216(int which) {
+}
+			
+void Module2200::createScene2217(int which) {
+}
+			
+void Module2200::createScene2218(int which) {
+}
+			
+void Module2200::createScene2219(int which) {
+}
+			
+void Module2200::createScene2220(int which) {
+}
+			
+void Module2200::createScene2221(int which) {
+}
+			
+void Module2200::createScene2222(int which) {
+}
+			
+void Module2200::createScene2223(int which) {
+}
+			
+void Module2200::createScene2224(int which) {
+}
+			
+void Module2200::createScene2225(int which) {
+}
+			
+void Module2200::createScene2226(int which) {
+}
+			
+void Module2200::createScene2227(int which) {
+}
+			
+void Module2200::createScene2228(int which) {
+}
+			
+void Module2200::createScene2229(int which) {
+}
+			
+void Module2200::createScene2230(int which) {
+}
+			
+void Module2200::createScene2231(int which) {
+}
+			
+void Module2200::createScene2232(int which) {
+}
+			
+void Module2200::createScene2233(int which) {
+}
+			
+void Module2200::createScene2234(int which) {
+}
+			
+void Module2200::createScene2235(int which) {
+}
+			
+void Module2200::createScene2236(int which) {
+}
+			
+void Module2200::createScene2237(int which) {
+}
+			
+void Module2200::createScene2238(int which) {
+}
+			
+void Module2200::createScene2239(int which) {
+}
+			
+void Module2200::createScene2240(int which) {
+}
+			
+void Module2200::createScene2241(int which) {
+}
+			
+void Module2200::createScene2242(int which) {
+}
+			
+void Module2200::createScene2243(int which) {
+}
+			
+void Module2200::createScene2244(int which) {
+}
+			
+void Module2200::createScene2245(int which) {
+}
+			
+void Module2200::createScene2246(int which) {
+}
+			
+void Module2200::createScene2247(int which) {
+}
+			
+void Module2200::createScene2248(int which) {
+}
+			
+void Module2200::updateScene2201() {
+	// TODO
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+	}
+}
+			
+void Module2200::updateScene2202() {
+}
+
+void Module2200::updateScene2203() {
+}
+			
+void Module2200::updateScene2204() {
+}
+			
+void Module2200::updateScene2205() {
+}
+			
+void Module2200::updateScene2206() {
+}
+			
+void Module2200::updateScene2207() {
+}
+			
+void Module2200::updateScene2208() {
+}
+			
+void Module2200::updateScene2209() {
+}
+			
+void Module2200::updateScene2210() {
+}
+			
+void Module2200::updateScene2211() {
+}
+			
+void Module2200::updateScene2212() {
+}
+			
+void Module2200::updateScene2213() {
+}
+			
+void Module2200::updateScene2214() {
+}
+			
+void Module2200::updateScene2215() {
+}
+			
+void Module2200::updateScene2216() {
+}
+			
+void Module2200::updateScene2217() {
+}
+			
+void Module2200::updateScene2218() {
+}
+			
+void Module2200::updateScene2219() {
+}
+			
+void Module2200::updateScene2220() {
+}
+			
+void Module2200::updateScene2221() {
+}
+			
+void Module2200::updateScene2222() {
+}
+			
+void Module2200::updateScene2223() {
+}
+			
+void Module2200::updateScene2224() {
+}
+			
+void Module2200::updateScene2225() {
+}
+			
+void Module2200::updateScene2226() {
+}
+			
+void Module2200::updateScene2227() {
+}
+			
+void Module2200::updateScene2228() {
+}
+			
+void Module2200::updateScene2229() {
+}
+			
+void Module2200::updateScene2230() {
+}
+			
+void Module2200::updateScene2231() {
+}
+			
+void Module2200::updateScene2232() {
+}
+			
+void Module2200::updateScene2233() {
+}
+			
+void Module2200::updateScene2234() {
+}
+			
+void Module2200::updateScene2235() {
+}
+			
+void Module2200::updateScene2236() {
+}
+			
+void Module2200::updateScene2237() {
+}
+			
+void Module2200::updateScene2238() {
+}
+			
+void Module2200::updateScene2239() {
+}
+			
+void Module2200::updateScene2240() {
+}
+			
+void Module2200::updateScene2241() {
+}
+			
+void Module2200::updateScene2242() {
+}
+			
+void Module2200::updateScene2243() {
+}
+			
+void Module2200::updateScene2244() {
+}
+			
+void Module2200::updateScene2245() {
+}
+			
+void Module2200::updateScene2246() {
+}
+			
+void Module2200::updateScene2247() {
+}
+			
+void Module2200::updateScene2248() {
+}
+
+// Scene2201
+
+AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
+
+	_x = 403;
+	_y = 259;
+	createSurface(100, 233, 96);
+	setFileHash(0x8600866, 0, -1);
+	SetUpdateHandler(&AnimatedSprite::update);
+}
+
+AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _doorLightSprite(doorLightSprite), 
+	_countdown(0), _doorOpen(flag1) {
+
+	_x = 408;
+	_y = 290;	
+	createSurface(900, 63, 266);
+	SetUpdateHandler(&AsScene2201Door::update);
+	SetMessageHandler(&AsScene2201Door::handleMessage);
+	if (_doorOpen) {
+		setFileHash(0xE2CB0412, -1, -1);
+		_countdown = 48;
+		_newHashListIndex = -2;
+	} else {
+		setFileHash(0xE2CB0412, 0, -1);
+		_newHashListIndex = 0;
+		_doorLightSprite->getSurface()->setVisible(false);
+	}
+}
+
+void AsScene2201Door::update() {
+	if (_countdown != 0 && _doorOpen && (--_countdown == 0)) {
+		stCloseDoor();
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x11001090) {
+			if (_doorOpen)
+				_doorLightSprite->getSurface()->setVisible(true);
+		} else if (param.asInteger() == 0x11283090) {
+			if (!_doorOpen)
+				_doorLightSprite->getSurface()->setVisible(false);
+		}
+		break;
+	case 0x2000:
+		if (_doorOpen)
+			_countdown = 144;
+		messageResult = _doorOpen ? 1 : 0;
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		_countdown = 144;
+		if (!_doorOpen)
+			stOpenDoor();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2201Door::stOpenDoor() {
+	_doorOpen = true;
+	setFileHash(0xE2CB0412, 0, -1);
+	_newHashListIndex = -2;
+	_soundResource.play(calcHash("fxDoorOpen33"));
+}
+
+void AsScene2201Door::stCloseDoor() {
+	_doorOpen = false;
+	setFileHash(0xE2CB0412, -1, -1);
+	_playBackwards = true;
+	_newHashListIndex = 0;
+	_soundResource.play(calcHash("fxDoorClose33"));
+}
+
+Class444::Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex)
+	: StaticSprite(vm, 900) {
+	
+	_spriteResource.load2(kClass444FileHashes[spriteIndex]);
+	createSurface(100, 16, 16);
+	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = kClass444Points[pointIndex].x;
+	_y = kClass444Points[pointIndex].y;
+	_needRefresh = true;
+}
+
+Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundFlag(false) {
+
+	Sprite *tempSprite;
+
+	if (!getSubVar(0x40050052, 0x60400854)) {
+		// TODO _vm->gameModule()->initScene2201Vars();
+	}
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2201::handleMessage);
+	SetUpdateHandler(&Scene2201::update);
+	
+	loadDataResource(0x04104242);
+	loadHitRectList();
+
+	_background = addBackground(new DirtyBackground(_vm, 0x40008208, 0, 0));
+	_palette = new Palette(_vm, 0x40008208);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x0820C408, NULL));
+
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011));
+	_vm->_collisionMan->addSprite(_asTape); 
+
+	_ssDoorButton = addSprite(new Class426(_vm, this, 0xE4A43E29, 0xE4A43E29, 100, 0));
+	
+	for (uint32 i = 0; i < 9; i++) {
+		if ((int16)getSubVar(0x484498D0, i) >= 0) {
+			addSprite(new Class444(_vm, i, (int16)getSubVar(0x484498D0, i)));
+		}
+	}
+
+	_rect1.y1 = 0;
+	_rect1.x2 = 640;
+	_rect2.x2 = 640;
+	_rect2.y2 = 480;
+	
+	if (!getGlobalVar(0x404290D5)) {
+		addSprite(new StaticSprite(_vm, 0x00026027, 900));
+	}
+	
+	tempSprite = addSprite(new StaticSprite(_vm, 0x030326A0, 1100));
+	_rect1.x1 = tempSprite->getSurface()->getDrawRect().x;
+	
+	addSprite(new StaticSprite(_vm, 0x811DA061, 1100));
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x11180022, 1100));
+	_rect2.x1 = tempSprite->getSurface()->getDrawRect().x;
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x0D411130, 1100));
+	_rect1.y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
+	_rect2.y1 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
+	
+	_doorLightSprite = addSprite(new StaticSprite(_vm, 0xA4062212, 900));
+
+	if (which < 0) {
+		_klayman = new KmScene2201(_vm, this, 300, 427, &_rect1, 2);
+		setMessageList(0x004B8118);
+		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
+	} else if (which == 1) {
+		_klayman = new KmScene2201(_vm, this, 412, 393, &_rect1, 2);
+		setMessageList(0x004B8130);
+		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
+	} else if (which == 2) {
+		if (getGlobalVar(0xC0418A02)) {
+			_klayman = new KmScene2201(_vm, this, 379, 427, &_rect1, 2);
+			_klayman->setDoDeltaX(1);
+		} else {
+			_klayman = new KmScene2201(_vm, this, 261, 427, &_rect1, 2);
+		}
+		setMessageList(0x004B8178);
+		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
+	} else {
+		NPoint pt = _dataResource.getPoint(0x0304D8DC);
+		_klayman = new KmScene2201(_vm, this, pt.x, pt.y, &_rect1, 2);
+		setMessageList(0x004B8120);
+		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true));
+	}
+	addSprite(_klayman);
+	
+	addSprite(new AsScene2201CeilingFan(_vm));
+
+	// TODO Sound1ChList_addSoundResource(0x04106220, 0x81212040, true);
+
+}
+
+Scene2201::~Scene2201() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	// TODO Sound1ChList_sub_407AF0(0x04106220);
+}
+
+void Scene2201::update() {
+	Scene::update();
+	if (!_soundFlag) {
+		// TODO Sound1ChList_playLooping(0x81212040);
+		_soundFlag = true;
+	}
+}
+
+uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x402064D8) {
+			_klayman->sendEntityMessage(0x1014, _ssDoorButton, this);
+		} else if (param.asInteger() == 0x35803198) {
+			if (_asDoor->hasMessageHandler() && _asDoor->sendMessage(0x2000, 0, this)) {
+				setMessageList(0x004B81A0);
+			} else {
+				setMessageList(0x004B81B8);
+			} 
+		} else if (param.asInteger() == 0x51445010) {
+			if (getGlobalVar(0x404290D5)) {
+				setMessageList(0x004B8108);
+			} else {
+				setMessageList(0x004B8150);
+			}
+		} else if (param.asInteger() == 0x1D203082) {
+			setMessageList(0x004B8180);
+		} else if (param.asInteger() == 0x00049091) {
+			if (getGlobalVar(0x404290D5)) {
+				setMessageList(0x004B8138);
+			} else {
+				setMessageList(0x004B8108);
+			}
+		}
+		break;
+	case 0x480B:
+		if (sender == _ssDoorButton) {
+			_asDoor->sendMessage(0x4808, 0, this);
+		}
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			setMessageList(0x004B81C8);
+		}
+		break;
+	}
+	return 0;
+}
+				
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
new file mode 100644
index 0000000..5b14606
--- /dev/null
+++ b/engines/neverhood/module2200.h
@@ -0,0 +1,206 @@
+/* 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_MODULE2200_H
+#define NEVERHOOD_MODULE2200_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module2200
+
+class Module2200 : public Module {
+public:
+	Module2200(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2200();
+protected:
+	void createScene2201(int which);			
+	void createScene2202(int which);			
+	void createScene2203(int which);			
+	void createScene2204(int which);			
+	void createScene2205(int which);			
+	void createScene2206(int which);			
+	void createScene2207(int which);			
+	void createScene2208(int which);			
+	void createScene2209(int which);			
+	void createScene2210(int which);			
+	void createScene2211(int which);			
+	void createScene2212(int which);			
+	void createScene2213(int which);			
+	void createScene2214(int which);			
+	void createScene2215(int which);			
+	void createScene2216(int which);			
+	void createScene2217(int which);			
+	void createScene2218(int which);			
+	void createScene2219(int which);			
+	void createScene2220(int which);			
+	void createScene2221(int which);			
+	void createScene2222(int which);			
+	void createScene2223(int which);			
+	void createScene2224(int which);			
+	void createScene2225(int which);			
+	void createScene2226(int which);			
+	void createScene2227(int which);			
+	void createScene2228(int which);			
+	void createScene2229(int which);			
+	void createScene2230(int which);			
+	void createScene2231(int which);			
+	void createScene2232(int which);			
+	void createScene2233(int which);			
+	void createScene2234(int which);			
+	void createScene2235(int which);			
+	void createScene2236(int which);			
+	void createScene2237(int which);			
+	void createScene2238(int which);			
+	void createScene2239(int which);			
+	void createScene2240(int which);			
+	void createScene2241(int which);			
+	void createScene2242(int which);			
+	void createScene2243(int which);			
+	void createScene2244(int which);			
+	void createScene2245(int which);			
+	void createScene2246(int which);			
+	void createScene2247(int which);			
+	void createScene2248(int which);			
+	void updateScene2201();			
+	void updateScene2202();			
+	void updateScene2203();			
+	void updateScene2204();			
+	void updateScene2205();			
+	void updateScene2206();			
+	void updateScene2207();			
+	void updateScene2208();			
+	void updateScene2209();			
+	void updateScene2210();			
+	void updateScene2211();			
+	void updateScene2212();			
+	void updateScene2213();			
+	void updateScene2214();			
+	void updateScene2215();			
+	void updateScene2216();			
+	void updateScene2217();			
+	void updateScene2218();			
+	void updateScene2219();			
+	void updateScene2220();			
+	void updateScene2221();			
+	void updateScene2222();			
+	void updateScene2223();			
+	void updateScene2224();			
+	void updateScene2225();			
+	void updateScene2226();			
+	void updateScene2227();			
+	void updateScene2228();			
+	void updateScene2229();			
+	void updateScene2230();			
+	void updateScene2231();			
+	void updateScene2232();			
+	void updateScene2233();			
+	void updateScene2234();			
+	void updateScene2235();			
+	void updateScene2236();			
+	void updateScene2237();			
+	void updateScene2238();			
+	void updateScene2239();			
+	void updateScene2240();			
+	void updateScene2241();			
+	void updateScene2242();			
+	void updateScene2243();			
+	void updateScene2244();			
+	void updateScene2245();			
+	void updateScene2246();			
+	void updateScene2247();			
+	void updateScene2248();			
+};
+
+// Scene2201
+
+static const NPoint kClass444Points[] = {
+	{305, 305},
+	{321, 305},
+	{336, 305},
+	{305, 319},
+	{321, 319},
+	{336, 319},
+	{305, 332},
+	{321, 332},
+	{336, 333}
+};
+
+static const uint32 kClass444FileHashes[] = {
+	0x88134A44,
+	0xAA124340,
+	0xB8124602,
+	0xA902464C,
+	0x890A4244,
+	0xA8124642,
+	0xB812C204,
+	0x381A4A4C
+};
+
+class AsScene2201CeilingFan : public AnimatedSprite {
+public:
+	AsScene2201CeilingFan(NeverhoodEngine *vm);
+};
+
+class AsScene2201Door : public AnimatedSprite {
+public:
+	AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1);
+protected:
+	SoundResource _soundResource;
+	Klayman *_klayman;
+	Sprite *_doorLightSprite;
+	bool _doorOpen;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stOpenDoor();
+	void stCloseDoor();
+};
+
+class Class444 : public StaticSprite {
+public:
+	Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex);
+};
+
+
+class Scene2201 : public Scene {
+public:
+	Scene2201(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2201();
+protected:
+	NRect _rect1;
+	NRect _rect2;
+	Sprite *_doorLightSprite;
+	Sprite *_asDoor;
+	Sprite *_ssDoorButton;
+	Sprite *_asTape;
+	bool _soundFlag;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2200_H */
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 39824de..ef8e532 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -497,7 +497,7 @@ void DataResource::load(uint32 fileHash) {
 						hitRect.rect.y1 = dataS.readUint16LE();
 						hitRect.rect.x2 = dataS.readUint16LE();
 						hitRect.rect.y2 = dataS.readUint16LE();
-						hitRect.type = dataS.readUint16LE(); 
+						hitRect.type = dataS.readUint16LE() + 0x5001; 
 						debug(3, "(%d, %d, %d, %d) -> %04d", hitRect.rect.x1, hitRect.rect.y1, hitRect.rect.x2, hitRect.rect.y2, hitRect.type);
 						hitRectList->push_back(hitRect);
 					}
@@ -514,7 +514,7 @@ void DataResource::load(uint32 fileHash) {
 						MessageItem messageItem;
 						messageItem.messageNum = dataS.readUint32LE();
 						messageItem.messageValue = dataS.readUint32LE();
-						debug(3, "(%04X, %08X)", messageItem.messageNum, messageItem.messageValue);
+						debug(3, "(%08X, %08X)", messageItem.messageNum, messageItem.messageValue);
 						messageList->push_back(messageItem);
 					}
 					drDirectoryItem.offset = _messageLists.size();
@@ -602,12 +602,26 @@ NPointArray *DataResource::getPointArray(uint32 nameHash) {
 }
 
 HitRectList *DataResource::getHitRectList() {
-	// TODO
+	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(calcHash("HitArray"), 3);
+	if (drDirectoryItem)
+		return _hitRectLists[drDirectoryItem->offset];
 	return NULL;
 }
 
 MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) {
-	// TODO
+	for (uint i = 0; i < _drRects.size(); i++) {
+		if (klaymanX >= _drRects[i].rect.x1 && klaymanX <= _drRects[i].rect.x2 && 
+			klaymanY >= _drRects[i].rect.y1 && klaymanY <= _drRects[i].rect.y2) {
+			DRSubRectList *drSubRectList = _drSubRectLists[_drRects[i].subRectIndex]; 
+			for (uint j = 0; j < drSubRectList->size(); j++) {
+				DRSubRect &subRect = (*drSubRectList)[j];
+				if (mouseX >= subRect.rect.x1 && mouseX <= subRect.rect.x2 && 
+					mouseY >= subRect.rect.y1 && mouseY <= subRect.rect.y2) {
+					return _messageLists[subRect.messageListItemIndex];
+				}
+			}
+		}
+	}
 	return NULL;
 }
 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 2c6b10e..2a01bc2 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -36,7 +36,6 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_mouseClickPos.y = 0;
 	_mouseClicked = false;
 	_rectList = NULL;
-	// TODO _someRects = NULL;
 	_klayman = NULL;
 	_mouseCursor = NULL;
 	_palette = NULL;
@@ -332,10 +331,10 @@ bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
 }
 
 bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
+	int16 klaymanX = _klayman->getX();
+	int16 klaymanY = _klayman->getY();
 	if (_rectType == 1) {
 		RectList &rectList = *_rectList;
-		int16 klaymanX = _klayman->getX();
-		int16 klaymanY = _klayman->getY();
 		for (uint i = 0; i < rectList.size(); i++) {
 			debug("(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2);
 			if (klaymanX >= rectList[i].rect.x1 && klaymanX <= rectList[i].rect.x2 && 
@@ -350,6 +349,10 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 				}
 			}
 		}
+	} else if (_rectType == 2) {
+		MessageList *messageList = _dataResource.getMessageListAtPos(klaymanX, klaymanY, mouseX, mouseY);
+		if (messageList && messageList->size())
+			setMessageList2(messageList, true, true);
 	}
 	return true;
 }
@@ -440,7 +443,7 @@ void Scene::runMessageList() {
 	if (_messageList && _klayman) {
 	
 		while (_messageList && _messageListIndex < _messageListCount && !_messageListFlag1) {
-			int messageNum = (*_messageList)[_messageListIndex].messageNum;
+			uint32 messageNum = (*_messageList)[_messageListIndex].messageNum;
 			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
 			
 			debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
@@ -450,7 +453,7 @@ void Scene::runMessageList() {
 				_klayman->sendMessage(0x1021, 0, this);
 			}
 			if (_systemCallbackFlag) {
-				// TODO messageNum = systemConvertMessageCb(messageNum);
+				messageNum = convertMessageNum(messageNum);
 			}
 			if (messageNum != 0x4003) {
 				if (messageNum == 0x1009 || messageNum == 0x1024) {
@@ -514,10 +517,48 @@ void Scene::clearRectList() {
 	_rectType = 0;
 }
 
+void Scene::loadHitRectList() {
+	HitRectList *hitRectList = _dataResource.getHitRectList();
+	debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList);
+	if (hitRectList) {
+		_hitRectList = *hitRectList;
+		_vm->_collisionMan->setHitRects(&_hitRectList);
+	}
+}
+
 void Scene::loadDataResource(uint32 fileHash) {
 	_dataResource.load(fileHash);
+	_rectType = 2;
 	if (_klayman)
 		_klayman->loadDataResource(fileHash);
 }
 
+uint16 Scene::convertMessageNum(uint32 messageNum) {
+	switch (messageNum) {
+	case 0x00004004:
+		return 0x4001;
+	case 0x00000083:
+		return 0x100A;
+	case 0x044001C8:
+		return 0x481C;
+	case 0x02420480:
+		return 0x4818;
+	case 0x08004025:
+		return 0x100D;
+	case 0x04404281:
+		return 0x4824;
+	case 0x08400880:
+		return 0x4825;
+	case 0x08209081:
+		return 0x4823;
+	case 0x24000060:
+		return 0x1009;
+	case 0x42002200:
+		return 0x4004;
+	case 0x428D4894:
+		return 0x101A;	
+	}
+	return 0x1000;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index ab5cf9f..e3ed273 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -65,10 +65,8 @@ protected:
 	bool _mouseClicked;
 	DataResource _dataResource;
 	RectList *_rectList;
+	HitRectList _hitRectList;
 	int _rectType;
-	// rectListCount
-	// TODO 00000088 someRects	   dd ?
-	// TODO 0000008C someRectsCount  dw ?
 	// TODO 0000008E field_8E		dw ?
 	Sprite *_mouseCursor;
 	Klayman *_klayman;
@@ -104,8 +102,10 @@ protected:
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);
 	void clearRectList();
+	void loadHitRectList();
 	void messageList402220();
 	void loadDataResource(uint32 fileHash);
+	uint16 convertMessageNum(uint32 messageNum);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index 178e5c9..c19c060 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -50,7 +50,7 @@ struct RectItem {
 typedef Common::Array<RectItem> RectList;
 
 struct MessageItem {
-	uint16 messageNum;
+	uint32 messageNum;
 	uint32 messageValue;
 };
 


Commit: 28177361bf9406fce53db89b469e912219380b4d
    https://github.com/scummvm/scummvm/commit/28177361bf9406fce53db89b469e912219380b4d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Add Hall of Records tables

- Add tables for Scene2201

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 14dd32d..1efc616 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -60,6 +60,28 @@ byte *getData(uint32 offset) {
 	return data + offset - dataStart + fileStart;
 }
 
+const char *getStringP(uint32 offset) {
+	return offset != 0 ? (const char*)getData(offset) : NULL;
+}
+
+uint32 calcHash(const char *value) {
+	if (!value)
+		return 0;
+	uint32 hash = 0, shiftValue = 0;
+	while (*value != 0) {
+		char ch = *value++;
+		if (ch >= 'a' && ch <= 'z')
+			ch -= 32;
+		else if (ch >= '0' && ch <= '9')
+			ch += 22;
+		shiftValue += ch - 64;
+		if (shiftValue >= 32)
+			shiftValue -= 32;
+		hash ^= 1 << shiftValue;
+	}
+	return hash;
+}
+
 struct HitRect {
 	int16 x1, y1, x2, y2;
 	uint16 messageNum;
@@ -217,6 +239,36 @@ struct NavigationItem {
 	
 };
 
+struct SceneInfo140Item {
+	uint32 bgFilename1;
+	uint32 bgFilename2;
+	uint32 txFilename;
+	uint32 bgFilename3;
+	byte xPosIndex;
+	byte count;
+
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		// Only save the hashes instead of the full names
+		bgFilename1 = calcHash(getStringP(READ_LE_UINT32(item + 0)));
+		bgFilename2 = calcHash(getStringP(READ_LE_UINT32(item + 4)));
+		txFilename = calcHash(getStringP(READ_LE_UINT32(item + 8)));
+		bgFilename3 = calcHash(getStringP(READ_LE_UINT32(item + 12)));
+		xPosIndex = item[16];
+		count = item[17];
+	}
+
+	void save(FILE *fd) {
+		writeUint32LE(fd, bgFilename1);
+		writeUint32LE(fd, bgFilename2);
+		writeUint32LE(fd, txFilename);
+		writeUint32LE(fd, bgFilename3);
+		writeByte(fd, xPosIndex);
+		writeByte(fd, count);
+	}
+
+};
+
 template<class ITEMCLASS>
 class StaticDataList {
 public:
@@ -346,10 +398,33 @@ public:
 
 };
 
+template<class ITEMCLASS>
+class StaticDataVector {
+public:
+	std::vector<ITEMCLASS> items;
+	
+	void loadVector(const uint32 *offsets) {
+		for (int i = 0; offsets[i] != 0; i++) {
+			ITEMCLASS item;
+			item.load(offsets[i]);
+			items.push_back(item);
+		}
+	}
+	
+	void saveVector(FILE *fd) {
+		writeUint32LE(fd, items.size());
+		for (typename std::vector<ITEMCLASS>::iterator it = items.begin(); it != items.end(); it++) {
+			(*it).save(fd);
+		}
+	}
+
+};
+
 StaticDataListVector<HitRectList> hitRectLists;
 StaticDataListVector<RectList> rectLists;
 StaticDataListVector<MessageList> messageLists;
 StaticDataListVector<NavigationList> navigationLists;
+StaticDataVector<SceneInfo140Item> sceneInfo140Items; 
 
 void addMessageList(uint32 messageListCount, uint32 messageListOffset) {
 	MessageList *messageList = new MessageList();
@@ -363,24 +438,22 @@ int main(int argc, char *argv[]) {
 
 	loadExe("nhc.exe");
 
-    hitRectLists.loadListVector(hitRectListOffsets);
-    rectLists.loadListVector(rectListOffsets);
-    messageLists.loadListVector(messageListOffsets);
-    navigationLists.loadListVector(navigationListOffsets);
-    
+	hitRectLists.loadListVector(hitRectListOffsets);
+	rectLists.loadListVector(rectListOffsets);
+	messageLists.loadListVector(messageListOffsets);
+	navigationLists.loadListVector(navigationListOffsets);
+	sceneInfo140Items.loadVector(sceneInfo140Offsets);
+	    
 	datFile = fopen("neverhood.dat", "wb");
 
 	writeUint32LE(datFile, 0x11223344); // Some magic
 	writeUint32LE(datFile, DAT_VERSION);
 		
-	// Write all message lists
-    messageLists.saveListVector(datFile);
-	// Write all rect lists
-    rectLists.saveListVector(datFile);
-	// Write all hit rect lists
-    hitRectLists.saveListVector(datFile);
-	// Write all navigation lists
-    navigationLists.saveListVector(datFile);
+	messageLists.saveListVector(datFile);
+	rectLists.saveListVector(datFile);
+	hitRectLists.saveListVector(datFile);
+	navigationLists.saveListVector(datFile);
+	sceneInfo140Items.saveVector(datFile);
 
 	fclose(datFile);
 
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index b2d5bc5..8a139f5 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -159,6 +159,19 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B35F0,
 	2, 0x004B3550,
 	1, 0x004B3530,
+	// Scene2201
+	1, 0x004B8118,
+	1, 0x004B8130,
+	1, 0x004B8178,
+	2, 0x004B8120,
+	3, 0x004B81A0,
+	1, 0x004B81B8,
+	2, 0x004B8108,
+	5, 0x004B8150,
+	4, 0x004B8180,
+	3, 0x004B8138,
+	2, 0x004B8108,
+	2, 0x004B81C8,
 	0, 0
 };
 
@@ -196,3 +209,46 @@ static const uint32 navigationListOffsets[] = {
 	1, 0x004B7FB0,
 	0, 0
 };
+
+// Hall of Records scene definitions
+
+static const uint32 sceneInfo140Offsets[] = {
+	0x004B7180,
+	0x004B7198,
+	0x004B71B0,
+	0x004B71C8,
+	0x004B71E0,
+	0x004B71F8,
+	0x004B7210,
+	0x004B7228,
+	0x004B7240,
+	0x004B7258,
+	0x004B7270,
+	0x004B7288,
+	0x004B72A0,
+	0x004B72B8,
+	0x004B72D0,
+	0x004B72E8,
+	0x004B7300,
+	0x004B7318,
+	0x004B7330,
+	0x004B7348,
+	0x004B7360,
+	0x004B7378,
+	0x004B7390,
+	0x004B73A8,
+	0x004B73C0,
+	0x004B73D8,
+	0x004B73F0,
+	0x004B7408,
+	0x004B7420,
+	0x004B7438,
+	0x004B7450,
+	0x004B7468,
+	0x004B7480,
+	0x004B7498,
+	0x004B74B0,
+	0x004B74C8,
+	0
+};
+
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 84a6425..fb36884 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: b64b0cfac2b066bfdd63e938624d742dc1123365
    https://github.com/scummvm/scummvm/commit/b64b0cfac2b066bfdd63e938624d742dc1123365
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Implement updateScene2201

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2200.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index a118e4f..e797240 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -444,7 +444,7 @@ void GameModule::updateModule2300() {
 		_childObject = NULL;
 		if (_field20 == 1) {
 			createModule2200(0);
-			// TODO _childObject->handleUpdate();
+			_childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createModule1200(0);
 			_childObject->handleUpdate();
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 9e4d083..55f4192 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -338,12 +338,18 @@ void Module2200::createScene2248(int which) {
 }
 			
 void Module2200::updateScene2201() {
-	// TODO
 	_childObject->handleUpdate();
 	if (_done) {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2203(0);
+		} else if (_field20 == 2) {
+			createScene2202(0);
+		} else {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
 	}
 }
 			


Commit: c4a4ce4e3561cbaa09e83e9938e6a41b79d8c0f0
    https://github.com/scummvm/scummvm/commit/c4a4ce4e3561cbaa09e83e9938e6a41b79d8c0f0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Implement Scene2202 (sliding puzzle)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e797240..9d9a97a 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 0;
+	_vm->gameState().sceneNum = 1;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 55f4192..e9cb8fa 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -197,6 +197,10 @@ void Module2200::createScene2201(int which) {
 }
 
 void Module2200::createScene2202(int which) {
+	// TODO Music18hList_play(0x601C908C, 0, 2, 1);
+	_vm->gameState().sceneNum = 1;
+	_childObject = new Scene2202(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2202);
 }
 
 void Module2200::createScene2203(int which) {
@@ -354,6 +358,13 @@ void Module2200::updateScene2201() {
 }
 			
 void Module2200::updateScene2202() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene2201(2);
+	}
 }
 
 void Module2200::updateScene2203() {
@@ -732,5 +743,394 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 	}
 	return 0;
 }
+
+static const NPoint kSsScene2202PuzzleTilePoints[] = {
+	{196, 105},
+	{323, 102},
+	{445, 106},
+	{192, 216},
+	{319, 220},
+	{446, 216},
+	{188, 320},
+	{319, 319},
+	{443, 322}
+};
+
+static const uint32 kSsScene2202PuzzleTileFileHashes1[] = {
+	0xA500800C,
+	0x2182910C,
+	0x2323980C,
+	0x23049084,
+	0x21008080,
+	0x2303900C,
+	0x6120980C,
+	0x2504D808
+};
+
+static const uint32 kSsScene2202PuzzleTileFileHashes2[] = {
+	0x0AAD8080,
+	0x0A290291,
+	0x0A2BA398,
+	0x822B8490,
+	0x86298080,
+	0x0A2B8390,
+	0x0A69A098,
+	0x0E2D84D8
+};
+
+SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value)
+	: StaticSprite(vm, 900), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene),
+	_value(value), _tileIndex(tileIndex), _isMoving(false) {
+	
+	debug("#1 _value = %d; _tileIndex = %d", _value, _tileIndex);
+	SetUpdateHandler(&SsScene2202PuzzleTile::update);
+	SetMessageHandler(&SsScene2202PuzzleTile::handleMessage);
+	debug("#2");
+	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
+	if (_tileIndex >= 0 && _tileIndex <= 2) {
+		createSurface(100, 128, 128);
+	} else	if (_tileIndex >= 3 && _tileIndex <= 5) {
+		createSurface(300, 128, 128);
+	} else {
+		createSurface(500, 128, 128);
+	}
+	debug("#3");
+	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_deltaRect = _drawRect;
+	_x = kSsScene2202PuzzleTilePoints[_tileIndex].x;
+	_y = kSsScene2202PuzzleTilePoints[_tileIndex].y;
+	processDelta();
+	_needRefresh = true;
+	StaticSprite::update();
+	_soundResource1.load(0x40958621);
+	_soundResource2.load(0x51108241);
+	debug("LOAD OK");
+}
+
+void SsScene2202PuzzleTile::update() {
+	handleSpriteUpdate();
+	StaticSprite::update();
+}
+
+uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (!_isMoving && !getGlobalVar(0x404290D5)) {
+			_parentScene->sendMessage(0x2000, _tileIndex, this);
+		}
+		messageResult = 1;
+		break;
+	case 0x2001:
+		_isMoving = true;
+		moveTile(param.asInteger());
+		break;
+	}
+	return messageResult;
+}
 				
+void SsScene2202PuzzleTile::suMoveTileX() {
+
+	bool done = false;
+
+	if (_counterDirection) {
+		if (_counter > 2)
+			_counter -= 2;
+	} else {
+		if (_counter < 20)
+			_counter += 2;
+	}
+
+	for (int16 i = 0; i < _counter; i++) {
+		_x += _xIncr;
+		_errValue += _yDelta;
+		if (_errValue >= _xDelta) {
+			_errValue -= _xDelta;
+			_y += _yIncr;
+		}
+		if (_x == _newX && _y == _newY) {
+			done = true;
+			break;
+		}
+		if (_x == _xFlagPos)
+			_counterDirection = true;
+	}
+	
+	if (done) {
+		stopMoving();			
+	}
+
+	processDelta();
+
+}
+
+void SsScene2202PuzzleTile::suMoveTileY() {
+
+	bool done = false;
+
+	if (_counterDirection) {
+		if (_counter > 2)
+			_counter -= 2;
+	} else {
+		if (_counter < 20)
+			_counter += 2;
+	}
+
+	for (int16 i = 0; i < _counter; i++) {
+		_y += _yIncr;
+		_errValue += _xDelta;
+		if (_errValue >= _yDelta) {
+			_errValue -= _yDelta;
+			_x += _xIncr;
+		}
+		if (_x == _newX && _y == _newY) {
+			done = true;
+			break;
+		}
+		if (_x == _xFlagPos)
+			_counterDirection = true;
+	}
+	
+	if (done) {
+		stopMoving();			
+	}
+
+	processDelta();
+
+}
+
+void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
+
+	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]);
+	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_needRefresh = true;
+
+	setSubVar(0x484498D0, _tileIndex, (uint32)-1);
+	setSubVar(0x484498D0, newTileIndex, (uint32)_value);
+	    
+	_tileIndex = newTileIndex;
+	    
+	_errValue = 0;
+	_counterDirection = false;
+	_counter = 0;
+
+	_newX = kSsScene2202PuzzleTilePoints[newTileIndex].x;
+	_newY = kSsScene2202PuzzleTilePoints[newTileIndex].y;
+
+	if (_x == _newX && _y == _newY)
+		return;
+
+	if (_x <= _newX) {
+		if (_y <= _newY) {
+			_xDelta = _newX - _x;
+			_yDelta = _newY - _y;
+			_xIncr = 1;
+			_yIncr = 1;
+		} else {
+			_xDelta = _newX - _x;
+			_yDelta = _y - _newY;
+			_xIncr = 1;
+			_yIncr = -1;
+		}
+	} else {
+		if (_y <= _newY) {
+			_xDelta = _x - _newX;
+			_yDelta = _newY - _y;
+			_xIncr = -1;
+			_yIncr = 1;
+		} else {
+			_xDelta = _x - _newX;
+			_yDelta = _y - _newY;
+			_xIncr = -1;
+			_yIncr = -1;
+		}
+	}
+
+	if (_xDelta > _yDelta) {
+		SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileX);
+		if (_xIncr > 0) {
+			if (_newX - _x >= 180)
+				_xFlagPos = _newX - 90;
+			else
+				_xFlagPos = _x + _newX / 2;				
+		} else {
+			if (_x - _newX >= 180)
+				_xFlagPos = _x + 90;
+			else
+				_xFlagPos = _x / 2 + _newX;
+		}
+		_soundResource1.play();
+	} else {
+		SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileY);
+		if (_yIncr > 0) {
+			if (_newY - _y >= 180)
+				_xFlagPos = _newY - 90;
+			else
+				_xFlagPos = _y + _newY / 2;				
+		} else {
+			if (_y - _newY >= 180)
+				_xFlagPos = _y + 90;
+			else
+				_xFlagPos = _y / 2 + _newY;
+		}
+		_soundResource2.play();
+	}
+	
+}
+
+void SsScene2202PuzzleTile::stopMoving() {
+	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
+	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_needRefresh = true;
+	SetSpriteCallback(NULL);
+	_isMoving = false;
+	_parentScene->sendMessage(0x2002, _tileIndex, this);
+}
+
+Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
+	_isSolved(false), _leaveScene(false), _isTileMoving(false), _movingTileSprite(NULL), _doneMovingTileSprite(NULL) {
+
+	Palette2 *palette2;
+
+	// TODO initScene2201Vars();
+	SetMessageHandler(&Scene2202::handleMessage);
+	SetUpdateHandler(&Scene2202::update);
+
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x08100A0C, 0, 0));
+	palette2 = new Palette2(_vm, 0x08100A0C);
+	_palette = palette2;
+	_palette->usePalette();
+	addEntity(palette2);
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x00A08089, 20, 620));
+
+	//DEBUG!
+	for (uint32 index = 0; index < 9; index++)
+		setSubVar(0x484498D0, index, 7 - index);
+
+	for (uint32 index = 0; index < 9; index++) {
+		int16 value = (int16)getSubVar(0x484498D0, index);
+		if (value >= 0) {
+			Sprite *puzzleTileSprite = addSprite(new SsScene2202PuzzleTile(_vm, this, index, value));
+			_vm->_collisionMan->addSprite(puzzleTileSprite);
+		}
+	}
+
+	addSprite(new StaticSprite(_vm, 0x55C043B8, 200));
+	addSprite(new StaticSprite(_vm, 0x85500158, 400));
+	addSprite(new StaticSprite(_vm, 0x25547028, 600));
+
+	_soundResource1.load(0x68E25540);
+	_soundResource2.load(0x40400457);
+
+	// TODO Sound1ChList_addSoundResource(0x60400854, 0x8101A241, true);
+	// TODO Sound1ChList_playLooping(0x8101A241);
+
+}
+
+Scene2202::~Scene2202() {
+	// TODO Sound1ChList_sub_407AF0(0x60400854);
+}
+
+void Scene2202::update() {
+	Scene::update();
+
+	if (_leaveScene && !_soundResource2.isPlaying()) {
+		_parentModule->sendMessage(0x1009, 0, this);
+	}
+
+	if (_isSolved && !_soundResource1.isPlaying()) {
+		_soundResource2.play();
+		_isSolved = false;
+		_leaveScene = true;
+	}
+
+	if (_movingTileSprite && !_isTileMoving) {
+		int16 value = getFreeTileIndex(_movingTileIndex);
+		if (value != -1) {
+			setSurfacePriority(_movingTileSprite->getSurface(), 700);
+			_movingTileSprite->sendMessage(0x2001, value, this);
+			_movingTileSprite = NULL;
+			_isTileMoving = true;
+		}
+	}
+
+	if (_doneMovingTileSprite) {
+		setSurfacePriority(_doneMovingTileSprite->getSurface(), _surfacePriority);
+		_doneMovingTileSprite = NULL;
+		if (testIsSolved()) {
+			_soundResource1.play();
+			setGlobalVar(0x404290D5, 1);
+			_isSolved = true;
+		}
+	}
+	
+}
+
+uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO Debug stuff
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	case 0x000D:
+		// TODO Debug stuff
+		break;
+	case 0x2000:
+		_movingTileIndex = (int16)param.asInteger();
+		_movingTileSprite = (Sprite*)sender;
+		break;
+	case 0x2002:
+		_isTileMoving = false;
+		_doneMovingTileSprite = (Sprite*)sender;
+		if (param.asInteger() >= 0 && param.asInteger() <= 2) {
+			_surfacePriority = 100;
+		} else if (param.asInteger() >= 3 && param.asInteger() <= 5) {
+			_surfacePriority = 300;
+		} else {
+			_surfacePriority = 500;
+		}
+		break;
+	}
+	return 0;
+}
+
+int16 Scene2202::getFreeTileIndex(int16 index) {
+	if (index >= 3 && (int16)getSubVar(0x484498D0, index - 3) == -1) {
+		return index - 3;
+	} else if (index <= 5 && (int16)getSubVar(0x484498D0, index + 3) == -1) {
+		return index + 3;
+	} else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(0x484498D0, index - 1) == -1) {
+		return index - 1;
+	} else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(0x484498D0, index + 1) == -1) {
+		return index + 1;
+	} else
+		return -1;
+}
+
+bool Scene2202::testIsSolved() {
+	return 
+		getSubVar(0x484498D0, 0) == 0 &&
+		getSubVar(0x484498D0, 2) == 2 &&
+		getSubVar(0x484498D0, 3) == 3 &&
+		getSubVar(0x484498D0, 4) == 4 &&
+		getSubVar(0x484498D0, 5) == 5 &&
+		getSubVar(0x484498D0, 6) == 6 &&
+		getSubVar(0x484498D0, 8) == 7;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 5b14606..d7f41d6 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -184,7 +184,6 @@ public:
 	Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex);
 };
 
-
 class Scene2201 : public Scene {
 public:
 	Scene2201(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -201,6 +200,52 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class SsScene2202PuzzleTile : public StaticSprite {
+public:
+	SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value);
+protected:
+	Scene *_parentScene;	
+	int16 _value;
+	int16 _tileIndex;
+	int16 _newX, _newY;
+	int16 _xDelta, _yDelta;
+	int16 _xIncr;
+	int16 _yIncr;
+	int16 _errValue;
+	int16 _counter;
+	int16 _xFlagPos;
+	bool _counterDirection;
+	bool _isMoving;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoveTileX();
+	void suMoveTileY();
+	void moveTile(int16 newTileIndex);
+	void stopMoving();
+};
+
+class Scene2202 : public Scene {
+public:
+	Scene2202(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2202();
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	Sprite *_movingTileSprite;
+	Sprite *_doneMovingTileSprite;
+	bool _isTileMoving;
+	int16 _movingTileIndex;
+	int _surfacePriority;
+	bool _leaveScene;
+	bool _isSolved;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	int16 getFreeTileIndex(int16 index);
+	bool testIsSolved();	
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */


Commit: 9273c2e97ab90068faf01df246f89d939804ee79
    https://github.com/scummvm/scummvm/commit/9273c2e97ab90068faf01df246f89d939804ee79
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2203

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 8a139f5..1956ece 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -29,6 +29,8 @@ static const uint32 hitRectListOffsets[] = {
 	4, 0x004AEBD0,
 	// Scene1705
 	1, 0x004B69D8,
+	// Scene2203
+	1, 0x004B8320,
 	0, 0
 };
 
@@ -63,6 +65,8 @@ static const uint32 rectListOffsets[] = {
 	// Scene2001
 	1, 0x004B3680,
 	1, 0x004B3670,
+	// Scene2203
+	1, 0x004B8420,
 	0, 0
 };
 
@@ -172,6 +176,17 @@ static const uint32 messageListOffsets[] = {
 	3, 0x004B8138,
 	2, 0x004B8108,
 	2, 0x004B81C8,
+	// Scene2203
+	1, 0x004B8340,
+	1, 0x004B8350,
+	1, 0x004B8358,
+	1, 0x004B8348,
+	3, 0x004B83B0,
+	3, 0x004B83C8,
+	2, 0x004B8370,
+	2, 0x004B8360,
+	2, 0x004B83E0,
+	2, 0x004B83F0,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index fb36884..e27396b 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 31457e11aa423e9350d08e6bc5663eccfdd448bd
    https://github.com/scummvm/scummvm/commit/31457e11aa423e9350d08e6bc5663eccfdd448bd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Implement Scene2203

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 9d9a97a..daa0555 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 1;
+	_vm->gameState().sceneNum = 2;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 50dd231..8eab4a2 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -1765,6 +1765,17 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub420750() {
+	if (!sub41CEB0(AnimationCallback(&Klayman::sub420750))) {
+		_status2 = 2;
+		_flagE5 = false;
+		setFileHash(0x5CCCB330, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetMessageHandler(&Klayman::handleMessage41DD20);
+	}
+}
+
 void Klayman::sub4207A0() {
 	if (!sub41CEB0(AnimationCallback(&Klayman::sub4207A0))) {
 		_status2 = 2;
@@ -1997,6 +2008,20 @@ uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam &param, E
 	return handleMessage41D480(messageNum, param, sender);
 }
 
+uint32 Klayman::handleMessage41DD20(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x040D4186) {
+			if (_attachedSprite) {
+				_attachedSprite->sendMessage(0x4808, 0, this);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -3498,4 +3523,76 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;	
 }
 
+KmScene2203::KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+	
+uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		}else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x4818:
+		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x4819:
+		setCallback2(AnimationCallback(&Klayman::sub420750));
+		break;
+	case 0x481A:
+		setCallback2(AnimationCallback(&Klayman::sub420680));		
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 1c02f1e..8ca56cc 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -82,6 +82,7 @@ public:
 	void sub421070();
 	void sub420420();
 	void sub420ED0();
+	void sub420750();
 	void sub4207A0();
 	void sub4207F0();
 	void sub420F20();
@@ -237,6 +238,7 @@ protected:
 	uint32 handleMessage41D640(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41EAB0(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D970(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41DD20(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void update41D1C0();
 	
@@ -377,6 +379,13 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2203 : public Klayman {
+public:
+	KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index e9cb8fa..23f8d73 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -204,6 +204,10 @@ void Module2200::createScene2202(int which) {
 }
 
 void Module2200::createScene2203(int which) {
+	// TODO Music18hList_play(0x601C908C, 0, 2, 1);
+	_vm->gameState().sceneNum = 2;
+	_childObject = new Scene2203(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2203);
 }
 
 void Module2200::createScene2204(int which) {
@@ -368,6 +372,22 @@ void Module2200::updateScene2202() {
 }
 
 void Module2200::updateScene2203() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2205(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene2204(0);
+			_childObject->handleUpdate();
+		} else {
+			createScene2201(1);
+			_childObject->handleUpdate();
+		}
+	}
 }
 			
 void Module2200::updateScene2204() {
@@ -782,10 +802,8 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS
 	: StaticSprite(vm, 900), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene),
 	_value(value), _tileIndex(tileIndex), _isMoving(false) {
 	
-	debug("#1 _value = %d; _tileIndex = %d", _value, _tileIndex);
 	SetUpdateHandler(&SsScene2202PuzzleTile::update);
 	SetMessageHandler(&SsScene2202PuzzleTile::handleMessage);
-	debug("#2");
 	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
 	if (_tileIndex >= 0 && _tileIndex <= 2) {
 		createSurface(100, 128, 128);
@@ -794,7 +812,6 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS
 	} else {
 		createSurface(500, 128, 128);
 	}
-	debug("#3");
 	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
 	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
 	_drawRect.width = _spriteResource.getDimensions().width;
@@ -807,7 +824,6 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS
 	StaticSprite::update();
 	_soundResource1.load(0x40958621);
 	_soundResource2.load(0x51108241);
-	debug("LOAD OK");
 }
 
 void SsScene2202PuzzleTile::update() {
@@ -913,9 +929,9 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 
 	setSubVar(0x484498D0, _tileIndex, (uint32)-1);
 	setSubVar(0x484498D0, newTileIndex, (uint32)_value);
-	    
+	
 	_tileIndex = newTileIndex;
-	    
+	
 	_errValue = 0;
 	_counterDirection = false;
 	_counter = 0;
@@ -1133,4 +1149,230 @@ bool Scene2202::testIsSolved() {
 		getSubVar(0x484498D0, 8) == 7;
 }
 
+static const uint32 kClass545FileHashes[] = {
+	0x2450D850,
+	0x0C9CE8D0,
+	0x2C58A152
+};
+
+Class545::Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y)
+	: AnimatedSprite(vm, kClass545FileHashes[index], surfacePriority, x, y), _parentScene(parentScene), _index(index) {
+
+	if (!getSubVar(0x0090EA95, _index) && !getSubVar(0x08D0AB11, _index)) {
+		SetMessageHandler(&Class545::handleMessage);
+	} else {
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+	}
+}
+
+uint32 Class545::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setSubVar(0x0090EA95, _index, 1);
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+	}
+	return messageResult;
+}
+
+static const uint32 kAsScene2203DoorFileHashes[] = {
+	0x7868AE10,
+	0x1A488110
+};
+
+AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene),
+	_index(index) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2203Door::handleMessage);
+	_x = 320;
+	_y = 240;
+	createSurface1(kAsScene2203DoorFileHashes[_index], 900);
+	if (getGlobalVar(0x9A500914) == _index) {
+		setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1);
+		_newHashListIndex = -2;
+	} else {
+		setFileHash(kAsScene2203DoorFileHashes[_index], 0, -1);
+		_newHashListIndex = 0;
+	}
+}
+
+uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_index == getGlobalVar(0x9A500914))
+			_parentScene->sendMessage(0x2002, 0, this);
+		else
+			_parentScene->sendMessage(0x2001, 0, this);
+		messageResult = 1;
+		break;
+	case 0x2000:
+		_otherDoor = (Sprite*)param.asEntity();
+		break;
+	case 0x3002:
+		if (_index == getGlobalVar(0x9A500914))
+			_parentScene->sendMessage(0x4808, 0, this);
+		setFileHash1();
+		break;
+	case 0x4808:
+		setGlobalVar(0x9A500914, _index);
+		_otherDoor->sendMessage(0x4809, 0, this);
+		openDoor();
+		break;
+	case 0x4809:
+		closeDoor();
+		_parentScene->sendMessage(0x2003, 0, this);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2203Door::openDoor() {
+	_soundResource.play(0x341014C4);
+	setFileHash(kAsScene2203DoorFileHashes[_index], 1, -1);
+}
+
+void AsScene2203Door::closeDoor() {
+	setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1);
+	_playBackwards = true;
+	_newHashListIndex = 0;
+}
+
+Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860))
+		setGlobalVar(0x13382860, 1);
+
+	SetMessageHandler(&Scene2203::handleMessage);
+	_surfaceFlag = true;
+
+	_background = addBackground(new DirtyBackground(_vm, 0x82C80334, 0, 0));
+	_palette = new Palette(_vm, 0x82C80334);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x80330824, NULL));
+
+	_vm->_collisionMan->setHitRects(0x004B8320);
+
+	if (getGlobalVar(0x13382860) == 1) {
+		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 282, 432));
+		_vm->_collisionMan->addSprite(_class545);
+	}
+
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 1, 1100, 435, 432, 0x9148A011));
+	_vm->_collisionMan->addSprite(_asTape);
+
+	_asLeftDoor = addSprite(new AsScene2203Door(_vm, this, 0));
+	_asRightDoor = addSprite(new AsScene2203Door(_vm, this, 1));
+	
+	_ssSmallLeftDoor = addSprite(new StaticSprite(_vm, 0x542CC072, 1100));
+	_ssSmallRightDoor = addSprite(new StaticSprite(_vm, 0x0A2C0432, 1100));
+	
+	_leftDoorClipRect.x1 = _ssSmallLeftDoor->getSurface()->getDrawRect().x;
+	_leftDoorClipRect.y1 = 0;
+	_leftDoorClipRect.x2 = 640;
+	_leftDoorClipRect.y2 = 480;
+	
+	_rightDoorClipRect.x1 = 0;
+	_rightDoorClipRect.y1 = 0;
+	_rightDoorClipRect.x2 = _ssSmallRightDoor->getSurface()->getDrawRect().x + _ssSmallRightDoor->getSurface()->getDrawRect().width;
+	_rightDoorClipRect.y2 = 480;
+
+	_asLeftDoor->sendEntityMessage(0x2000, _asRightDoor, this);
+	_asRightDoor->sendEntityMessage(0x2000, _asLeftDoor, this);
+	
+	_vm->_collisionMan->addSprite(_asLeftDoor);
+	_vm->_collisionMan->addSprite(_asRightDoor);
+
+	if (which < 0) {
+		_klayman = new KmScene2203(_vm, this, 200, 427);
+		setMessageList(0x004B8340);
+	} else if (which == 1) {
+		_klayman = new KmScene2203(_vm, this, 640, 427);
+		setMessageList(0x004B8350);
+	} else if (which == 2) {
+		if (getGlobalVar(0xC0418A02)) {
+			_klayman = new KmScene2203(_vm, this, 362, 427);
+			_klayman->setDoDeltaX(1);
+		} else {
+			_klayman = new KmScene2203(_vm, this, 202, 427);
+		}
+		setMessageList(0x004B8358);
+	} else {
+		_klayman = new KmScene2203(_vm, this, 0, 427);
+		setMessageList(0x004B8348);
+	}
+	addSprite(_klayman); 
+
+	if (getGlobalVar(0x9A500914)) {
+		_ssSmallLeftDoor->getSurface()->setVisible(false);
+		_klayman->getSurface()->getClipRect() = _rightDoorClipRect;
+	} else {
+		_ssSmallRightDoor->getSurface()->setVisible(false);
+		_klayman->getSurface()->getClipRect() = _leftDoorClipRect;
+	}
+	
+	setRectList(0x004B8420);
+
+}
+
+Scene2203::~Scene2203() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		_klayman->sendEntityMessage(0x1014, sender, this);
+		if (sender == _asLeftDoor) {
+			setMessageList2(0x004B83B0);
+		} else {
+			setMessageList2(0x004B83C8);
+		}
+		break;
+	case 0x2002:
+		if (sender == _asLeftDoor) {
+			setMessageList2(0x004B8370);
+		} else {
+			setMessageList2(0x004B8360);
+		}
+		break;
+	case 0x2003:
+		if (sender == _asLeftDoor) {
+			_ssSmallLeftDoor->getSurface()->setVisible(false);
+		} else {
+			_ssSmallRightDoor->getSurface()->setVisible(false);
+		}
+		break;
+	case 0x4808:
+		if (sender == _asLeftDoor) {
+			_ssSmallLeftDoor->getSurface()->setVisible(true);
+			_klayman->getSurface()->getClipRect() = _leftDoorClipRect;
+		} else {
+			_ssSmallRightDoor->getSurface()->setVisible(true);
+			_klayman->getSurface()->getClipRect() = _rightDoorClipRect;
+		}
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			setMessageList(0x004B83E0);
+		} else if (sender == _class545) {
+			_klayman->sendEntityMessage(0x1014, _class545, this);
+			setMessageList(0x004B83F0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index d7f41d6..6a0634f 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -246,6 +246,44 @@ protected:
 	bool testIsSolved();	
 };
 
+class Class545 : public AnimatedSprite {
+public:
+	Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y);
+protected:
+	Scene *_parentScene;
+	int _index;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2203Door : public AnimatedSprite {
+public:
+	AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	Sprite *_otherDoor;
+	int _index;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void openDoor();
+	void closeDoor();
+};
+
+class Scene2203 : public Scene {
+public:
+	Scene2203(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2203();
+protected:
+	Sprite *_asLeftDoor;
+	Sprite *_asRightDoor;
+	Sprite *_ssSmallLeftDoor;
+	Sprite *_ssSmallRightDoor;
+	Sprite *_asTape;
+	Sprite *_class545;
+	NRect _leftDoorClipRect;
+	NRect _rightDoorClipRect;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */


Commit: 732f7c8845bf694e30f3d8c1ffe4b33a5a06a7c7
    https://github.com/scummvm/scummvm/commit/732f7c8845bf694e30f3d8c1ffe4b33a5a06a7c7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Add Scene2204 (just a DiskplayerScene)

Changed paths:
    engines/neverhood/module2200.cpp



diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 23f8d73..e8fd77d 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -23,6 +23,7 @@
 #include "neverhood/module2200.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
+#include "neverhood/diskplayerscene.h"
 
 namespace Neverhood {
 
@@ -211,6 +212,10 @@ void Module2200::createScene2203(int which) {
 }
 
 void Module2200::createScene2204(int which) {
+	_vm->gameState().sceneNum = 3;
+	// TODO Music18hList_stop(0x601C908C, 0, 2);
+	_childObject = new DiskplayerScene(_vm, this, 3);
+	SetUpdateHandler(&Module2200::updateScene2204);
 }
 			
 void Module2200::createScene2205(int which) {
@@ -391,6 +396,13 @@ void Module2200::updateScene2203() {
 }
 			
 void Module2200::updateScene2204() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene2203(2);
+	}
 }
 			
 void Module2200::updateScene2205() {


Commit: e177dcf911fc7034faef9c378f7b95f2355ec66b
    https://github.com/scummvm/scummvm/commit/e177dcf911fc7034faef9c378f7b95f2355ec66b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Implement Scene2205

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/mouse.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index daa0555..fd603a8 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 2;
+	_vm->gameState().sceneNum = 4;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 8eab4a2..404cce5 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3595,4 +3595,67 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+void KmScene2205::xUpdate() {
+	setGlobalVar(0x18288913, _frameIndex);
+}
+	
+uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&KmScene2205::sub423980));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4816:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x4818:
+		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+void KmScene2205::sub423980() {
+	int16 frameIndex = getGlobalVar(0x18288913);
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_flagE1 = true;
+	_flagE5 = true;
+	setFileHash(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetAnimationCallback3(&Klayman::sub41FA40);
+	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 8ca56cc..d9d63b1 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -111,20 +111,27 @@ public:
 	void sub420EB0();
 	void sub420680();
 	void sub41F9E0();
+	void sub41FA40();
+	void sub41FB30();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
 	void spriteUpdate41F780();
 	void spriteUpdate41F230();
 	void spriteUpdate41F5A0();
+	void spriteUpdate41F300();
+	void spriteUpdate41F320();
 
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
 
 	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
 	void setKlaymanTable1();
 	void setKlaymanTable2();
 	void setKlaymanTable3();
+	
+	void setSoundFlag(bool value) { _soundFlag = value; }
 
 protected:
 	Entity *_parentScene;
@@ -204,14 +211,8 @@ protected:
 	uint32 handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender);
 	void sub41CD70(int16 x);
 	void sub41F950();
-	void sub41FB30();
 	uint32 handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate41F300();
-	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
-	void sub41FA40();
 
-	void spriteUpdate41F320();
-	
 	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
 
 	uint32 handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender);
@@ -386,6 +387,15 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2205 : public Klayman {
+public:
+	KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	void sub423980();
+protected:
+	void xUpdate();
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 8ee5941..69c6014 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -972,6 +972,32 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui
 
 }
 
+void Class426::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
+	_fileHashes[0] = fileHash1;
+	_fileHashes[1] = fileHash2;
+	if (_status == 2) {
+		_spriteResource.load2(fileHash2);
+		_surface->getDrawRect().x = 0;
+		_surface->getDrawRect().y = 0;
+		_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+		_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+		_x = _spriteResource.getPosition().x;
+		_y = _spriteResource.getPosition().y;
+		_needRefresh = true;
+		StaticSprite::update();
+	} else {
+		_spriteResource.load2(fileHash1);
+		_surface->getDrawRect().x = 0;
+		_surface->getDrawRect().y = 0;
+		_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+		_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+		_x = _spriteResource.getPosition().x;
+		_y = _spriteResource.getPosition().y;
+		_needRefresh = true;
+		StaticSprite::update();
+	}
+}
+
 void Class426::update() {
 	if (_countdown != 0 && (--_countdown) == 0) {
 		if (_status == 1) {
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 0e3f950..5229e7a 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -202,7 +202,7 @@ protected:
 class Class426 : public StaticSprite {
 public:
 	Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
-	// TODO Class426_sub433660 (not used yet)
+	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
 protected:
 	Scene *_parentScene;
 	int _countdown;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index e8fd77d..e7e0257 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -219,6 +219,10 @@ void Module2200::createScene2204(int which) {
 }
 			
 void Module2200::createScene2205(int which) {
+	_vm->gameState().sceneNum = 4;
+	// TODO Music18hList_stop(0x601C908C, 0, 2);
+	_childObject = new Scene2205(_vm, this, 3);
+	SetUpdateHandler(&Module2200::updateScene2205);
 }
 			
 void Module2200::createScene2206(int which) {
@@ -406,6 +410,22 @@ void Module2200::updateScene2204() {
 }
 			
 void Module2200::updateScene2205() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2206(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene2205(2);
+			_childObject->handleUpdate();
+		} else {
+			createScene2203(1);
+			_childObject->handleUpdate();
+		}
+	}
 }
 			
 void Module2200::updateScene2206() {
@@ -1387,4 +1407,164 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
+	: StaticSprite(vm, 900) {
+
+	SetMessageHandler(&SsScene2205DoorFrame::handleMessage);
+	_spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0);
+	createSurface(1100, 45, 206);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
+uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		_spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0);
+		_drawRect.x = 0;
+		_drawRect.y = 0;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
+		_x = _spriteResource.getPosition().x;
+		_y = _spriteResource.getPosition().y;
+		_needRefresh = true;
+		StaticSprite::update();
+	}
+	return messageResult;
+}
+
+Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	Palette2 *palette2;
+	
+	SetMessageHandler(&Scene2205::handleMessage);
+	SetUpdateHandler(&Scene2205::update);
+	
+	_vm->_collisionMan->setHitRects(0x004B0620);
+	_surfaceFlag = true;
+
+	if (getGlobalVar(0x4D080E54)) {
+		_isLightOn = true;
+		_background = addBackground(new DirtyBackground(_vm, 0x0008028D, 0, 0));
+		palette2 = new Palette2(_vm, 0x0008028D);
+		_palette = palette2;
+		_palette->usePalette();
+		addEntity(palette2);
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x80289008, NULL));
+		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0);
+		addSprite(_ssLightSwitch);
+	} else {
+		_isLightOn = false;
+		_background = addBackground(new DirtyBackground(_vm, 0xD00A028D, 0, 0));
+		palette2 = new Palette2(_vm, 0xD00A028D);
+		_palette = palette2;
+		_palette->usePalette();
+		addEntity(palette2);
+		_mouseCursor = addSprite(new Mouse433(_vm, 0xA0289D08, NULL));
+		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0);
+		addSprite(_ssLightSwitch);
+	}
+
+	palette2->addPalette(0xD00A028D, 0, 256, 0);
+	
+	_ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm));
+
+	if (which < 0) {
+		_klayman = new KmScene2205(_vm, this, 320, 417);
+		setMessageList(0x004B0658);
+		if (!getGlobalVar(0x4D080E54)) {
+			_palette->addPalette(0x68033B1C, 0, 65, 0);
+		}
+		_isKlaymanInLight = false;
+	} else if (which == 1) {
+		_klayman = new KmScene2205(_vm, this, 640, 417);
+		setMessageList(0x004B0648);
+		if (!getGlobalVar(0x4D080E54)) {
+			_palette->addPalette(0x68033B1C, 0, 65, 0);
+		}
+		_isKlaymanInLight = false;
+	} else {
+		_klayman = new KmScene2205(_vm, this, 0, 417);
+		setMessageList(0x004B0640);
+		_isKlaymanInLight = true;
+	}
+	addSprite(_klayman);
+
+	_klayman->getSurface()->getClipRect().x1 = _ssDoorFrame->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+
+	loadDataResource(0x00144822);
+	_klayman->setSoundFlag(true);
+
+}
+	
+void Scene2205::update() {
+	Scene::update();
+
+	if (!_isLightOn && getGlobalVar(0x4D080E54)) {
+		_palette->addPalette(0x0008028D, 0, 256, 0);
+		_background->load(0x0008028D);
+		_ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030);
+		_ssDoorFrame->sendMessage(0x2000, 0, this);
+		((Mouse433*)_mouseCursor)->load(0x80289008);
+		((Mouse433*)_mouseCursor)->updateCursor();
+		_isLightOn = true;
+	} else if (_isLightOn && !getGlobalVar(0x4D080E54)) {
+		_palette->addPalette(0xD00A028D, 0, 256, 0);
+		_background->load(0xD00A028D);
+		_ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84);
+		_ssDoorFrame->sendMessage(0x2000, 0, this);
+		((Mouse433*)_mouseCursor)->load(0xA0289D08);
+		((Mouse433*)_mouseCursor)->updateCursor();
+		_isKlaymanInLight = true;
+		if (_klayman->getX() > 85) {
+			_palette->addPalette(0x68033B1C, 0, 65, 0);
+			_isKlaymanInLight = false;
+		}
+		_isLightOn = false;
+	}
+
+	if (!getGlobalVar(0x4D080E54)) {
+		if (_isKlaymanInLight && _klayman->getX() > 85) {
+			((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0);
+			((Palette2*)_palette)->startFadeToPalette(12);
+			_isKlaymanInLight = false;
+		} else if (!_isKlaymanInLight && _klayman->getX() <= 85) {
+			((Palette2*)_palette)->addPalette(0xD00A028D, 0, 65, 0);
+			((Palette2*)_palette)->startFadeToPalette(12);
+			_isKlaymanInLight = true;
+		}
+	}
+	
+}
+
+uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x6449569A) {
+			setMessageList(0x004B0690);
+		} else if (param.asInteger() == 0x2841369C) {
+			setMessageList(0x004B0630);
+		} else if (param.asInteger() == 0x402064D8) {
+			_klayman->sendEntityMessage(0x1014, _ssLightSwitch, this);
+		}
+		break;
+	case 0x480B:
+		setGlobalVar(0x4D080E54, getGlobalVar(0x4D080E54) ? 0 : 1);
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 6a0634f..c79edb4 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -26,6 +26,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/module1000.h"
 
 namespace Neverhood {
 
@@ -284,6 +285,25 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class SsScene2205DoorFrame : public StaticSprite {
+public:
+	SsScene2205DoorFrame(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2205 : public Scene {
+public:
+	Scene2205(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Class426 *_ssLightSwitch;
+	Sprite *_ssDoorFrame;
+	bool _isKlaymanInLight;
+	bool _isLightOn;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index 4f27cb4..65dcb27 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -34,19 +34,20 @@ class Mouse433 : public StaticSprite {
 public:
 	Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect);
 	void load(uint32 fileHash);
+	void updateCursor();
 protected:
 	MouseCursorResource _mouseCursorResource;
 	int _frameNum;
 	NRect _mouseRect;	
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void updateCursor();
 };
 
 class Mouse435 : public StaticSprite {
 public:
 	Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2);
 	void load(uint32 fileHash);
+	void updateCursor();
 protected:
 	MouseCursorResource _mouseCursorResource;
 	int _frameNum;
@@ -54,20 +55,19 @@ protected:
 	int16 _x2;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void updateCursor();
 };
 
 class NavigationMouse : public StaticSprite {
 public:
 	NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type);
 	void load(uint32 fileHash);
+	void updateCursor();
 protected:
 	MouseCursorResource _mouseCursorResource;
 	int _frameNum;
 	int _type;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void updateCursor();
 };
 
 } // End of namespace Neverhood


Commit: 8729ca04d9b7cc42417f8824ccb383fe403058f3
    https://github.com/scummvm/scummvm/commit/8729ca04d9b7cc42417f8824ccb383fe403058f3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:35-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2205

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 1956ece..238edc8 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -31,6 +31,8 @@ static const uint32 hitRectListOffsets[] = {
 	1, 0x004B69D8,
 	// Scene2203
 	1, 0x004B8320,
+	// Scene2205
+	1, 0x004B0620,
 	0, 0
 };
 
@@ -187,6 +189,12 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B8360,
 	2, 0x004B83E0,
 	2, 0x004B83F0,
+	// Scene2205
+	1, 0x004B0658,
+	2, 0x004B0648,
+	1, 0x004B0640,
+	4, 0x004B0690,
+	2, 0x004B0630,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index e27396b..8654c51 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 80bbb06453b080234f3fe52c66f628a80e3ae0fa
    https://github.com/scummvm/scummvm/commit/80bbb06453b080234f3fe52c66f628a80e3ae0fa
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2206

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 238edc8..18ea38b 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -69,6 +69,9 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B3670,
 	// Scene2203
 	1, 0x004B8420,
+	// Scene2206
+	1, 0x004B8AF8,
+	1, 0x004B8B58,
 	0, 0
 };
 
@@ -195,6 +198,21 @@ static const uint32 messageListOffsets[] = {
 	1, 0x004B0640,
 	4, 0x004B0690,
 	2, 0x004B0630,
+	// Scene2206
+	1, 0x004B88A8,
+	2, 0x004B88B8,
+	1, 0x004B88C8,
+	1, 0x004B8A70,
+	1, 0x004B88B0,
+	5, 0x004B8948,
+	2, 0x004B8970,
+	2, 0x004B8988,
+	4, 0x004B8998,
+	4, 0x004B89B8,
+	4, 0x004B89D8,
+	5, 0x004B89F8,
+	5, 0x004B8A20,
+	5, 0x004B8A48,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 8654c51..26e71ac 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: f29619f655ede0e764c93d23f57d35cac7f1c3f7
    https://github.com/scummvm/scummvm/commit/f29619f655ede0e764c93d23f57d35cac7f1c3f7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Implement Scene2206

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index fd603a8..6450f5a 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 4;
+	_vm->gameState().sceneNum = 5;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 404cce5..97fdd5a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3658,4 +3658,147 @@ void KmScene2205::sub423980() {
 	setCallback1(AnimationCallback(&Klayman::sub41FB30));
 }
 
+KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+
+	// TODO Sound1ChList_addSoundResource(0x80101800, 0xD3B02847);
+}
+
+KmScene2206::~KmScene2206() {
+	// TODO Sound1ChList_sub_407AF0(0x80101800);
+}
+
+void KmScene2206::xUpdate() {
+	setGlobalVar(0x18288913, _frameIndex);
+}
+	
+uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4803:
+		setCallback2(AnimationCallback(&KmScene2206::sub482490));
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&KmScene2206::sub482530));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4812:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		}else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub421030));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub421070));
+		}
+		break;
+	case 0x4837:
+		// TODO sub41CE70();
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+void KmScene2206::spriteUpdate482450() {
+	_yDelta++;
+	_y += _yDelta;
+	if (_y > 600) {
+		sendMessage(0x1019, 0, this);
+	}
+}
+
+void KmScene2206::sub482490() {
+	if (!sub41CF10(AnimationCallback(&KmScene2206::sub482490))) {
+		_status2 = 1;
+		_parentScene->sendMessage(0x4803, 0, this);
+		_flagE5 = false;
+		_yDelta = 0;
+		setFileHash(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41D360);
+		SetSpriteCallback(&KmScene2206::spriteUpdate482450);
+		// TODO Sound1ChList_playLooping(0xD3B02847);
+	}
+}
+
+void KmScene2206::sub482530() {
+	int16 frameIndex = getGlobalVar(0x18288913) + 1;
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_flagE1 = true;
+	_flagE5 = true;
+	setFileHash(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetAnimationCallback3(&Klayman::sub41FA40);
+	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index d9d63b1..3cb5e38 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -396,6 +396,19 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2206 : public Klayman {
+public:
+	KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	~KmScene2206();
+protected:
+	int16 _yDelta;
+	void xUpdate();
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void spriteUpdate482450();
+	void sub482490();
+	void sub482530();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index e7e0257..bec20fa 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -221,11 +221,15 @@ void Module2200::createScene2204(int which) {
 void Module2200::createScene2205(int which) {
 	_vm->gameState().sceneNum = 4;
 	// TODO Music18hList_stop(0x601C908C, 0, 2);
-	_childObject = new Scene2205(_vm, this, 3);
+	_childObject = new Scene2205(_vm, this, which);
 	SetUpdateHandler(&Module2200::updateScene2205);
 }
 			
 void Module2200::createScene2206(int which) {
+	_vm->gameState().sceneNum = 5;
+	// TODO Music18hList_stop(0x601C908C, 0, 2);
+	_childObject = new Scene2206(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2206);
 }
 			
 void Module2200::createScene2207(int which) {
@@ -429,6 +433,25 @@ void Module2200::updateScene2205() {
 }
 			
 void Module2200::updateScene2206() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2247(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene2207(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			createScene2209(0);
+			_childObject->handleUpdate();
+		} else {
+			createScene2205(1);
+			_childObject->handleUpdate();
+		}
+	}
 }
 			
 void Module2200::updateScene2207() {
@@ -1567,4 +1590,322 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+static const int16 kScene2206XPositions[] = {
+	384, 
+	480, 
+	572
+};
+
+static const uint32 kScene2206MessageIds1[] = {
+	0x004B8998,
+	0x004B89B8,
+	0x004B89D8
+};
+
+static const uint32 kScene2206MessageIds2[] = {
+	0x004B89F8,
+	0x004B8A20,
+	0x004B8A48
+};
+
+static const int16 kClass603XDeltas1[] = {
+	-24, -28, -18, 6, 9, -8
+};
+
+static const int16 kClass603XDeltas2[] = {
+	-8, 7, 11, 26, 13, 14
+};
+
+Class603::Class603(NeverhoodEngine *vm, uint32 fileHash)
+	: StaticSprite(vm, fileHash, 200), _soundResource(vm) {
+	
+	if (getGlobalVar(0x18890C91))
+		_x -= 63;
+	SetUpdateHandler(&Class603::update);
+	SetMessageHandler(&Class603::handleMessage);
+	SetSpriteCallback(NULL);
+}
+
+void Class603::update() {
+	handleSpriteUpdate();
+	StaticSprite::update();
+}
+
+uint32 Class603::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4808:
+		_index = 0;
+		SetMessageHandler(NULL);
+		SetSpriteCallback(&Class603::spriteUpdate481E60);
+		_soundResource.play(0x032746E0);
+		break;
+	case 0x4809:
+		_index = 0;
+		SetMessageHandler(NULL);
+		SetSpriteCallback(&Class603::spriteUpdate481E90);
+		_soundResource.play(0x002642C0);
+		break;
+	}
+	return messageResult;
+}
+
+void Class603::spriteUpdate481E60() {
+	if (_index < 6) {
+		_x += kClass603XDeltas1[_index];
+		_index++;
+	} else {
+		SetMessageHandler(&Class603::handleMessage);
+		SetSpriteCallback(NULL);
+	}
+}
+
+void Class603::spriteUpdate481E90() {
+	if (_index < 6) {
+		_x += kClass603XDeltas2[_index];
+		_index++;
+	} else {
+		SetMessageHandler(&Class603::handleMessage);
+		SetSpriteCallback(NULL);
+	}
+}
+
+Class604::Class604(NeverhoodEngine *vm, uint32 fileHash)
+	: StaticSprite(vm, fileHash, 50) {
+
+	SetUpdateHandler(&Class604::update);
+	SetMessageHandler(&Class604::handleMessage);
+	SetSpriteCallback(NULL);
+}
+
+void Class604::update() {
+	handleSpriteUpdate();
+	StaticSprite::update();
+}
+
+uint32 Class604::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4803:
+		SetMessageHandler(NULL);
+		SetSpriteCallback(&Class604::spriteUpdate482020);
+		_yDelta = 0;
+		break;
+	}
+	return messageResult;
+}
+
+void Class604::spriteUpdate482020() {
+	_yDelta++;
+	_y += _yDelta;
+}
+
+Class607::Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash)
+	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) {
+
+	if (getGlobalVar(0x45080C38)) {
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+	} else {
+		SetMessageHandler(&Class607::handleMessage);
+	}
+	_deltaRect = _drawRect;
+	processDelta();
+}
+
+uint32 Class607::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setGlobalVar(0x45080C38, 1);
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm) {
+
+	uint32 fileHash;
+	Palette2 *palette2;
+	
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&Scene2206::handleMessage);
+	_surfaceFlag = true;
+	
+	if (getGlobalVar(0x4D080E54)) {
+		fileHash = 0x41983216;
+		_sprite1 = addSprite(new StaticSprite(_vm, 0x2201266A, 100));
+		_sprite2 = addSprite(new StaticSprite(_vm, 0x3406A333, 300));
+		_sprite3 = addSprite(new StaticSprite(_vm, 0x24A223A2, 100));
+		_sprite4 = addSprite(new Class603(_vm, 0x26133023));
+		_sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
+		_sprite4->getSurface()->getClipRect().y1 = 0;
+		_sprite4->getSurface()->getClipRect().x2 = 640;
+		_sprite4->getSurface()->getClipRect().y2 = 480;
+		setRectList(0x004B8AF8);
+		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0));
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x83212411, NULL));
+		_class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x5E00E262));
+		_class604 = addSprite(new Class604(_vm, 0x085E25E0));
+	} else {
+		fileHash = 0xE0102A45;
+		_sprite1 = addSprite(new StaticSprite(_vm, 0x1C1106B8, 100));
+		_sprite2 = addSprite(new StaticSprite(_vm, 0x020462E0, 300));
+		_sprite3 = addSprite(new StaticSprite(_vm, 0x900626A2, 100));
+		_sprite4 = addSprite(new Class603(_vm, 0x544822A8));
+		_sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
+		_sprite4->getSurface()->getClipRect().y1 = 0;
+		_sprite4->getSurface()->getClipRect().x2 = 640;
+		_sprite4->getSurface()->getClipRect().y2 = 480;
+		setRectList(0x004B8B58);
+		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0));
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x02A41E09, NULL));
+		_class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x52032563));
+		_class604 = addSprite(new Class604(_vm, 0x317831A0));
+	}
+
+	_class604->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
+	_class604->getSurface()->getClipRect().y1 = 0;
+	_class604->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
+	_class604->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
+
+	_background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0));
+
+	palette2 = new Palette2(_vm, fileHash);
+	_palette = palette2;
+	_palette->usePalette();
+	addEntity(palette2);
+
+	palette2->addPalette(fileHash, 0, 256, 0);
+
+	if (!getGlobalVar(0x4D080E54)) {
+		_palette->addPalette(0x0263D144, 0, 65, 0);
+	}
+	
+	_vm->_collisionMan->addSprite(_class607);
+	
+	if (which < 0) {
+		_klayman = new KmScene2206(_vm, this, 200, 430);
+		setMessageList(0x004B88A8);
+	} else if (which == 1) {
+		_klayman = new KmScene2206(_vm, this, 640, 430);
+		setMessageList(0x004B88B8);
+	} else if (which == 2) {
+		_klayman = new KmScene2206(_vm, this, 205, 396);
+		setMessageList(0x004B88C8);
+		_palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
+		sub4819D0();
+		_soundResource.play(0x53B8284A);
+	} else if (which == 3) {
+		_klayman = new KmScene2206(_vm, this, kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
+		if (getGlobalVar(0xC0418A02))
+			_klayman->setDoDeltaX(1);
+		setMessageList(0x004B8A70);
+	} else {
+		_klayman = new KmScene2206(_vm, this, 0, 430);
+		setMessageList(0x004B88B0);
+	}
+	addSprite(_klayman);
+
+	_klayman->setSoundFlag(true);
+	_klayman->setKlaymanTable2();
+
+}
+
+Scene2206::~Scene2206() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x800C6694) {
+			sub481B00();
+		} else if (param.asInteger() == 0x402064D8) {
+			_klayman->sendEntityMessage(0x1014, _sprite5, this);
+		} else if (param.asInteger() == 0x11C40840) {
+			if (getGlobalVar(0x18890C91))
+				setMessageList(0x004B8948);
+			else
+				setMessageList(0x004B8970);
+		}
+		break;
+	case 0x4803:
+		_class604->sendMessage(0x4803, 0, this);
+		break;
+	case 0x480B:
+		if (sender == _sprite5) {
+			setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1);
+			if (getGlobalVar(0x18890C91))
+				_sprite4->sendMessage(0x4808, 0, this);
+			else
+				_sprite4->sendMessage(0x4809, 0, this);
+		}
+		break;
+	case 0x4826:
+		_klayman->sendEntityMessage(0x1014, _class607, this);
+		setMessageList(0x004B8988);
+		break;
+	case 0x482A:
+		sub4819D0();
+		break;
+	case 0x482B:
+		sub481950();
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2206::sub481950() {
+	if (getGlobalVar(0x4D080E54)) {
+		((Palette2*)_palette)->addPalette(0x41983216, 0, 65, 0);
+		((Palette2*)_palette)->startFadeToPalette(12);
+	}
+	setSurfacePriority(_sprite1->getSurface(), 100);
+	setSurfacePriority(_sprite2->getSurface(), 300);
+	setSurfacePriority(_sprite3->getSurface(), 100);
+	setSurfacePriority(_sprite4->getSurface(), 200);
+	_klayman->getSurface()->getClipRect().x1 = 0;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+}
+
+void Scene2206::sub4819D0() {
+	if (!getGlobalVar(0x4D080E54)) {
+		((Palette2*)_palette)->addPalette(0xB103B604, 0, 65, 0);
+		((Palette2*)_palette)->startFadeToPalette(12);
+	}
+	setSurfacePriority(_sprite1->getSurface(), 1100);
+	setSurfacePriority(_sprite2->getSurface(), 1300);
+	setSurfacePriority(_sprite3->getSurface(), 1100);
+	setSurfacePriority(_sprite4->getSurface(), 1200);
+	_klayman->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
+	_klayman->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
+}
+
+void Scene2206::sub481B00() {
+	setGlobalVar(0x48A68852, (_mouseClickPos.x - 354) / 96);
+	if (getGlobalVar(0x48A68852) > 2)
+		setGlobalVar(0x48A68852, 2);
+	setGlobalVar(0x49C40058, (_mouseClickPos.y - 183) / 7);
+	setGlobalVar(0xC8C28808, calcHash("stLineagex"));
+	setGlobalVar(0x4CE79018, 0);
+	if (ABS(kScene2206XPositions[getGlobalVar(0x48A68852)] - _klayman->getX()) >= 144) {
+		setMessageList2(kScene2206MessageIds1[getGlobalVar(0x48A68852)]);
+	} else {
+		setMessageList2(kScene2206MessageIds2[getGlobalVar(0x48A68852)]);
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index c79edb4..ef56c3f 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -304,6 +304,55 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Class603 : public StaticSprite {
+public:
+	Class603(NeverhoodEngine *vm, uint32 fileHash);
+protected:
+	int _index;
+	SoundResource _soundResource;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate481E60();
+	void spriteUpdate481E90();
+};
+
+class Class604 : public StaticSprite {
+public:
+	Class604(NeverhoodEngine *vm, uint32 fileHash);
+protected:
+	int16 _yDelta;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void spriteUpdate482020();
+};
+
+class Class607 : public StaticSprite {
+public:
+	Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2206 : public Scene {
+public:
+	Scene2206(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2206();
+protected:
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_sprite4;
+	Sprite *_sprite5;
+	Sprite *_class604;
+	Sprite *_class607;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub481950();
+	void sub4819D0();
+	void sub481B00();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */


Commit: 8459fa97778f1f303bbbcd92359608146e3f5069
    https://github.com/scummvm/scummvm/commit/8459fa97778f1f303bbbcd92359608146e3f5069
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2207

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 18ea38b..597e67f 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -72,6 +72,9 @@ static const uint32 rectListOffsets[] = {
 	// Scene2206
 	1, 0x004B8AF8,
 	1, 0x004B8B58,
+	// Scene2207
+	3, 0x004B38B8,
+	1, 0x004B3948,
 	0, 0
 };
 
@@ -213,6 +216,12 @@ static const uint32 messageListOffsets[] = {
 	5, 0x004B89F8,
 	5, 0x004B8A20,
 	5, 0x004B8A48,
+	// Scene2207
+	1, 0x004B38E8,
+	4, 0x004B38F0,
+	2, 0x004B37D8,
+	2, 0x004B3958,
+	3, 0x004B3920,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 26e71ac..fb991ee 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 41f8749bd08db81a2b710d7422fbdbf0cc1921b9
    https://github.com/scummvm/scummvm/commit/41f8749bd08db81a2b710d7422fbdbf0cc1921b9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Implement Scene2207 (not complete yet)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6450f5a..b987aa7 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 5;
+	_vm->gameState().sceneNum = 6;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 97fdd5a..3e90cf1 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3800,5 +3800,125 @@ void KmScene2206::sub482530() {
 	setCallback1(AnimationCallback(&Klayman::sub41FB30));
 }
 
+KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+	
+uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x2001:
+		setCallback2(AnimationCallback(&KmScene2207::sub442460));
+		break;
+	case 0x2005:
+		spriteUpdate442430();
+		setCallback2(AnimationCallback(&KmScene2207::sub41FC80));
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x480D:
+		setCallback2(AnimationCallback(&KmScene2207::sub4424B0));
+		break;
+	case 0x4812:
+		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		}else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x4827:
+		setCallback2(AnimationCallback(&Klayman::sub420E20));
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+void KmScene2207::spriteUpdate442430() {
+	_x = ((Sprite*)_attachedSprite)->getX() - 20;
+	_y = ((Sprite*)_attachedSprite)->getY() + 46;
+	processDelta();
+}
+
+void KmScene2207::sub442460() {
+	if (!sub41CF10(AnimationCallback(&KmScene2207::sub442460))) {
+		_status2 = 1;
+		_flagE5 = true;
+		setFileHash(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteCallback(&KmScene2207::spriteUpdate442430);
+		SetMessageHandler(&Klayman::handleMessage41D360);
+	}
+}
+
+void KmScene2207::sub4424B0() {
+	if (!sub41CEB0(AnimationCallback(&KmScene2207::sub4424B0))) {
+		_status2 = 0;
+		if (_flagF7) {
+			sub420D50();
+		} else {
+			_flagE5 = false;
+			setFileHash(0x0C303040, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
+			SetMessageHandler(&Klayman::handleMessage41E210);
+			SetAnimationCallback3(&KmScene2207::sub442520);
+		}
+	}
+}
+
+void KmScene2207::sub442520() {
+	setFileHash(0x0D318140, 0, -1);
+	SetAnimationCallback3(&KmScene2207::sub442560);
+	_attachedSprite->sendMessage(0x480F, 0, this);
+}
+
+void KmScene2207::sub442560() {
+	_flagE5 = true;
+	_flagF7 = true;
+	setFileHash(0x1564A2C0, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
+	SetAnimationCallback3(&KmScene2207::sub4425A0);
+}
+
+void KmScene2207::sub4425A0() {
+	_flagE5 = true;
+	_flagF7 = true;
+	setFileHash(0x4464A440, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3cb5e38..7187905 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -125,6 +125,7 @@ public:
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
 
 	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
 	void setKlaymanTable1();
@@ -213,8 +214,6 @@ protected:
 	void sub41F950();
 	uint32 handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender);
 
-	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
-
 	uint32 handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender);
 	
 	uint32 handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender);
@@ -409,6 +408,19 @@ protected:
 	void sub482530();
 };
 
+class KmScene2207 : public Klayman {
+public:
+	KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void spriteUpdate442430();
+	void sub442460();
+	void sub4424B0();
+	void sub442520();
+	void sub442560();
+	void sub4425A0();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index bec20fa..67c3be8 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -23,6 +23,7 @@
 #include "neverhood/module2200.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/diskplayerscene.h"
 
 namespace Neverhood {
@@ -233,6 +234,9 @@ void Module2200::createScene2206(int which) {
 }
 			
 void Module2200::createScene2207(int which) {
+	_vm->gameState().sceneNum = 6;
+	_childObject = new Scene2207(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2207);
 }
 			
 void Module2200::createScene2208(int which) {
@@ -455,6 +459,14 @@ void Module2200::updateScene2206() {
 }
 			
 void Module2200::updateScene2207() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene2206(2);
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2208() {
@@ -1908,4 +1920,498 @@ void Scene2206::sub481B00() {
 	}
 }
 
+static const uint32 kScene2207FileHashes[] = {
+	0x33B1E12E,
+	0x33D1E12E,
+	0x3311E12E,
+	0x3291E12E,
+	0x3191E12E,
+	0x3791E12E,
+	0x3B91E12E,
+	0x2391E12E,
+	0x1391E12E,
+	0x3BB1E12E,
+	0x23B1E12E,
+	0x13B1E12E
+};
+
+AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _soundResource(vm),
+	_pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) {
+
+	NPoint pt;
+
+	_dataResource.load(0x00524846);
+	_pointArray = _dataResource.getPointArray(0x005B02B7);
+	pt = _dataResource.getPoint(0x403A82B1);
+	_x = pt.x;
+	_y = pt.y;
+	createSurface(1100, 129, 103);
+	setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0);
+	SetUpdateHandler(&AsScene2207Elevator::update);
+	SetSpriteCallback(&AsScene2207Elevator::suSetPosition);
+	SetMessageHandler(&AsScene2207Elevator::handleMessage);
+	_newHashListIndex = 0;
+}
+
+AsScene2207Elevator::~AsScene2207Elevator() {
+	// TODO Sound1ChList_sub_407AF0(0x02700413);
+}
+
+void AsScene2207Elevator::update() {
+
+	if (_destPointIndex + _destPointIndexDelta > _pointIndex) {
+		_pointIndex++;
+		setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
+		_newHashListIndex = _pointIndex;		
+		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
+			if (_destPointIndexDelta != 0) {
+				_destPointIndexDelta = 0;
+			} else {
+				// TODO Sound1ChList_deleteSoundByHash(0xD3B02847);
+				_soundResource.play(0x53B8284A);
+			}
+		}
+	}
+
+	if (_destPointIndex + _destPointIndexDelta < _pointIndex) {
+		_pointIndex--;
+		if (_pointIndex == 0)
+			_parentScene->sendMessage(0x2003, 0, this);
+		setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
+		_newHashListIndex = _pointIndex;		
+		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
+			if (_destPointIndexDelta != 0) {
+				_destPointIndexDelta = 0;
+			} else {
+				// TODO Sound1ChList_deleteSoundByHash(0xD3B02847);
+				_soundResource.play(0x53B8284A);
+			}
+		}
+	}
+
+	if (_pointIndex > 20 && _surface->getPriority() != 900) {
+		_parentScene->sendMessage(0x2002, 900, this);
+	} else if (_pointIndex < 20 && _surface->getPriority() != 1100) {
+		_parentScene->sendMessage(0x2002, 1100, this);
+	}
+	
+	AnimatedSprite::update();
+	
+	if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) {
+		_parentScene->sendMessage(0x2004, 0, this);
+		_isMoving = false;
+	}
+	
+}
+
+void AsScene2207Elevator::suSetPosition() {
+	_x = (*_pointArray)[_pointIndex].x;
+	_y = (*_pointArray)[_pointIndex].y - 60;
+	processDelta();
+}
+
+uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		moveToY(param.asInteger());
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2207Elevator::moveToY(int16 y) {
+	int16 minDistance = 480;
+
+	if (!_pointArray || _pointArray->size() == 0)
+		return;
+	
+	for (uint i = 0; i < _pointArray->size(); i++) {
+		int16 distance = ABS(y - (*_pointArray)[i].y);
+		if (distance < minDistance) {
+			minDistance = distance;
+			_destPointIndex = i;
+		}
+	}	
+
+	if (_destPointIndex != _pointIndex) {
+		if (_destPointIndex == 0 || _destPointIndex == _pointArray->size() - 1) {
+			_destPointIndexDelta = 0;
+		} else if (_destPointIndex < _pointIndex) {
+			_destPointIndexDelta = -2;
+		} else {
+			_destPointIndexDelta = 2;
+		}
+		// TODO Sound1ChList_addSoundResource(0x02700413, 0xD3B02847, true);
+		// TODO Sound1ChList_playLooping(0xD3B02847);
+	}
+
+	_isMoving = true;
+
+}
+
+Class500::Class500(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm),
+	_soundResource3(vm), _soundResource4(vm), _flag1(true) {
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class500::handleMessage);
+	createSurface1(0xCCFD6090, 100);
+	_x = 309;
+	_y = 320;
+	setFileHash(0xCCFD6090, 0, -1);
+	_newHashListIndex = 0;
+	_soundResource2.load(0x40330872);
+	_soundResource3.load(0x72A2914A);
+	_soundResource4.load(0xD4226080);
+}
+
+Class500::~Class500() {
+	// TODO Sound1ChList_sub_407AF0(0x80D00820);
+}
+
+uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (!_flag1) {
+			if (param.asInteger() == 0x3423093) {
+				// TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true);
+				// TODO Sound1ChList_playLooping(0x12121943);
+			} else if (param.asInteger() == 0x834AB011) {
+				_soundResource1.stop();
+				_soundResource2.stop();
+				_soundResource3.stop();
+				_soundResource4.stop();
+				// TODO Sound1ChList_deleteSoundByHash(0x12121943);
+			} else if (param.asInteger() == 0x3A980501) {
+				_soundResource2.play();
+			} else if (param.asInteger() == 0x2A2AD498) {
+				_soundResource3.play();
+			} else if (param.asInteger() == 0xC4980008) {
+				_soundResource4.play();
+			} else if (param.asInteger() == 0x06B84228) {
+				_soundResource1.play(0xE0702146);
+			}
+		}
+		break;
+	case 0x2006:
+		sub441D50();
+		break;
+	case 0x2007:
+		sub441D90();
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class500::sub441D50() {
+	if (!_flag1) {
+		SetAnimationCallback3(NULL);
+	} else {
+		setFileHash(0xCCFD6090, 0, -1);
+		_flag1 = false;
+		_surface->setVisible(true);
+	}
+}
+
+void Class500::sub441D90() {
+	SetAnimationCallback3(&Class500::sub441DA0);
+}
+
+void Class500::sub441DA0() {
+	setFileHash1();
+	_soundResource1.stop();
+	_soundResource2.stop();
+	_soundResource3.stop();
+	_soundResource4.stop();
+	// TODO Sound1ChList_deleteSoundByHash(0x12121943);
+	_flag1 = true;
+	_surface->setVisible(false);
+}
+
+Class501::Class501(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _flag1(true) {
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class501::handleMessage);
+	createSurface1(0x8CAA0099, 100);
+	_x = 309;
+	_y = 320;
+	setFileHash(0x8CAA0099, 0, -1);
+	_newHashListIndex = 0;
+}
+
+uint32 Class501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2006:
+		sub441FA0();
+		break;
+	case 0x2007:
+		sub441FE0();
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class501::sub441FA0() {
+	if (!_flag1) {
+		SetAnimationCallback3(NULL);
+	} else {
+		_surface->setVisible(true);
+		setFileHash(0x8CAA0099, 0, -1);
+		_flag1 = false;
+	}
+}
+
+void Class501::sub441FE0() {
+	SetAnimationCallback3(&Class501::sub441FF0);
+}
+
+void Class501::sub441FF0() {
+	setFileHash1();
+	_surface->setVisible(false);
+	_flag1 = true;
+}
+
+Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index)
+	: StaticSprite(vm, fileHash, 100) {
+
+	_x = 330;
+	_y = 246 + index * 50;
+	StaticSprite::update();	
+}
+
+Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
+	_flag1(true), _elevatorSurfacePriority(0) {
+
+	_vm->gameModule()->initScene3009Vars();
+
+	//DEBUG
+	setGlobalVar(0x4D080E54, 1);
+
+	if (!getSubVar(0x40050052, 0x88460852))
+		setSubVar(0x40050052, 0x88460852, 1);
+
+	SetMessageHandler(&Scene2207::handleMessage);
+	SetUpdateHandler(&Scene2207::update);
+	_surfaceFlag = true;
+
+	_klayman = new KmScene2207(_vm, this, 0, 0); // CHECKME: Stack vars are uninitialized?!
+	addSprite(_klayman);
+	_klayman->setRepl(64, 0);
+	
+	setMessageList(0x004B38E8);
+	
+	_asElevator = addSprite(new AsScene2207Elevator(_vm, this));
+	
+	if (getGlobalVar(0x4D080E54)) {
+
+		_background = addBackground(new DirtyBackground(_vm, 0x88C00241, 0, 0));
+		_palette = new Palette(_vm, 0x88C00241);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL));
+	
+		_ssMaskPart1 = addSprite(new StaticSprite(_vm, 0xE20A28A0, 1200));
+		_ssMaskPart2 = addSprite(new StaticSprite(_vm, 0x688F62A5, 1100));
+		_ssMaskPart3 = addSprite(new StaticSprite(_vm, 0x0043B038, 1100));
+	
+		_asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011));
+		_vm->_collisionMan->addSprite(_asTape); 
+	
+//		_class487 = addSprite(new Class487(_vm, this, 527, 333, 0));
+//		_vm->_collisionMan->addSprite(_class487);
+		
+		_class500 = addSprite(new Class500(_vm, this));
+		_class501 = addSprite(new Class501(_vm));
+		
+		_class500->getSurface()->setVisible(false);
+		_class501->getSurface()->setVisible(false);
+
+		_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0));
+	
+//		_class487->getSurface()->getClipRect().x1 = 0;
+//		_class487->getSurface()->getClipRect().y1 = 0;
+//		_class487->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width;
+//		_class487->getSurface()->getClipRect().y2 = 480;
+	
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
+		_klayman->getSurface()->getClipRect().x2 = 640;
+		_klayman->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height;
+	
+		_asElevator->getSurface()->getClipRect().x1 = 0;
+		_asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
+		_asElevator->getSurface()->getClipRect().x2 = 640;
+		_asElevator->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height;
+	
+	} else {
+
+		setGlobalVar(0x81890D14, 1);
+
+		_background = addBackground(new DirtyBackground(_vm, 0x05C02A55, 0, 0));
+		_palette = new Palette(_vm, 0x05C02A55);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL));
+
+		_ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200));
+
+		addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
+		addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
+		addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2));
+
+		_asTape = NULL;
+		_class487 = NULL;
+		_class500 = NULL;
+		_class501 = NULL;
+		_ssButton = NULL;
+
+		_klayman->getSurface()->getClipRect().x1 = 0;
+		_klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
+		_klayman->getSurface()->getClipRect().x2 = 640;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+		
+		_asElevator->getSurface()->getClipRect().x1 = 0;
+		_asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
+		_asElevator->getSurface()->getClipRect().x2 = 640;
+		_asElevator->getSurface()->getClipRect().y2 = 480;
+
+	}
+
+	_dataResource.load(0x00524846);
+
+	setRectList(0x004B38B8);
+
+	_klayman->sendEntityMessage(0x1014, _asElevator, this);
+	_klayman->sendMessage(0x2001, 0, this);
+	_asElevator->sendMessage(0x2000, 480, this);
+
+	_soundResource2.load(calcHash("fxFogHornSoft"));
+
+}
+
+void Scene2207::update() {
+	Scene::update();
+	if (_elevatorSurfacePriority != 0) {
+		setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority);
+		_elevatorSurfacePriority = 0;
+	}
+	if (_klayman->getY() == 423) {
+		_flag1 = _klayman->getX() > 459 && _klayman->getX() < 525;
+	}
+}
+
+uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0014F275) {
+			if (_flag1) {
+				_asElevator->sendMessage(0x2000, _mouseClickPos.y, this);
+				_klayman->sendEntityMessage(0x1014, _asElevator, this);
+				_klayman->sendMessage(0x2001, 0, this);
+			} else {
+				messageList402220();
+			}
+		} else if (param.asInteger() == 0x34569073) {
+			if (_flag1) {
+				_messageListFlag1 = true;
+				_asElevator->sendMessage(0x2000, 0, this);
+				_klayman->sendEntityMessage(0x1014, _asElevator, this);
+				_klayman->sendMessage(0x2001, 0, this);
+			} else {
+				messageList402220();
+			}
+		} else if (param.asInteger() == 0x4054C877) {
+			if (_flag1) {
+				_asElevator->sendMessage(0x2000, 480, this);
+				_klayman->sendEntityMessage(0x1014, _asElevator, this);
+				_klayman->sendMessage(0x2001, 0, this);
+			} else {
+				messageList402220();
+			}
+		} else if (param.asInteger() == 0x0CBC6211) {
+			_klayman->sendEntityMessage(0x1014, _asElevator, this);
+			_klayman->sendMessage(0x2001, 0, this);
+			setRectList(0x004B38B8);
+		} else if (param.asInteger() == 0x402064D8) {
+			_klayman->sendEntityMessage(0x1014, _ssButton, this);
+		} else if (param.asInteger() == 0x231DA241) {
+			if (_ssButton) {
+				setMessageList(0x004B38F0);
+			} else {
+				setMessageList(0x004B37D8);
+			}
+		}
+		break;
+	case 0x2002:
+		_elevatorSurfacePriority = param.asInteger();
+		break;
+	case 0x2003:
+		_messageListFlag1 = false;
+		break;
+	case 0x4807:
+		_class500->sendMessage(0x2007, 0, this);
+		_class501->sendMessage(0x2007, 0, this);
+		break;
+	case 0x480B:
+		if (sender == _ssButton) {
+			if (getSubVar(0x14800353, 0x40119852)) {
+				setSubVar(0x14800353, 0x40119852, 0);
+				_soundResource1.play(calcHash("fx3LocksDisable"));
+			} else {
+				setSubVar(0x14800353, 0x40119852, 1);
+				_soundResource2.play();
+			}
+		}
+		break;
+	case 0x480F:
+		_class500->sendMessage(0x2006, 0, this);
+		_class501->sendMessage(0x2006, 0, this);
+		_class500->getSurface()->setVisible(true);
+		_class501->getSurface()->setVisible(true);
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			if (_klayman->getY() == 423) {
+				_klayman->sendEntityMessage(0x1014, _asTape, this);
+				setMessageList(0x004B3958);
+			}
+		} else if (_flag1) {
+			SetMessageHandler(&Scene2207::handleMessage2);
+			_asElevator->sendMessage(0x2000, 347, this);
+			_klayman->sendEntityMessage(0x1014, _asElevator, this);
+			_klayman->sendMessage(0x2001, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		_elevatorSurfacePriority = param.asInteger();
+		break;
+	case 0x2004:
+		SetMessageHandler(&Scene2207::handleMessage);
+		_klayman->sendMessage(0x2005, 0, this);
+//		_klayman->sendEntityMessage(0x1014, _class487, this);
+		setMessageList(0x004B3920);
+		setRectList(0x004B3948);
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index ef56c3f..cf53e69 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -353,6 +353,77 @@ protected:
 	void sub481B00();
 };
 
+class AsScene2207Elevator : public AnimatedSprite {
+public:
+	AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene);
+	~AsScene2207Elevator();
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	NPointArray *_pointArray;
+	int16 _pointIndex;
+	int16 _destPointIndex, _destPointIndexDelta;
+	bool _isMoving;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suSetPosition();
+	void moveToY(int16 y);
+};
+
+class Class500 : public AnimatedSprite {
+public:
+	Class500(NeverhoodEngine *vm, Scene *parentScene);
+	~Class500();
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	bool _flag1;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub441D50();
+	void sub441D90();
+	void sub441DA0();
+};
+
+class Class501 : public AnimatedSprite {
+public:
+	Class501(NeverhoodEngine *vm);
+protected:
+	bool _flag1;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub441FA0();
+	void sub441FE0();
+	void sub441FF0();
+};
+
+class Class597 : public StaticSprite {
+public:
+	Class597(NeverhoodEngine *vm, uint32 fileHash, int index);
+};
+
+class Scene2207 : public Scene {
+public:
+	Scene2207(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	Sprite *_asElevator;
+	Sprite *_ssMaskPart1;
+	Sprite *_ssMaskPart2;
+	Sprite *_ssMaskPart3;
+	Sprite *_asTape;
+	Sprite *_class487;
+	Sprite *_class500;
+	Sprite *_class501;
+	Sprite *_ssButton;
+	int _elevatorSurfacePriority;
+	bool _flag1;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage2(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */


Commit: 50996201f417ca392add73535cbf636c685b95ed
    https://github.com/scummvm/scummvm/commit/50996201f417ca392add73535cbf636c685b95ed
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Very small cleanup

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 69c6014..3387e2e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -53,12 +53,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 			break;
 		}
 	} else if (which == 0) {
-		//createScene1001(0);//Real
-		// DEBUG: Jump to room
-		setGlobalVar(0x8306F218, 1);
-		createScene1002(2);
-		//createScene1005(0);
-		//createScene1004(0);
+		createScene1001(0);
 	} else if (which == 1) {
 		createScene1002(1);
 	}
@@ -884,16 +879,11 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
 	SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0);
-	
 	createSurface(800, 136, 147);
 	_surface->getClipRect() = clipRect;
-	
 	spriteUpdate448AA0();
-
-	// TODO _soundResource.load(0xC0C40298);
-	
+	_soundResource.load(0xC0C40298);
 	setFileHash(0x586C1D48, 0, 0);
-		
 }
 
 uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam &param, Entity *sender) {
@@ -903,7 +893,7 @@ uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessagePara
 		if (param.asInteger() == 0xA61CA1C2) {
 			_class505->sendMessage(0x2004, 0, this);
 		} else if (param.asInteger() == 0x14CE0620) {
-			// TODO _soundResource.play();
+			_soundResource.play();
 		}
 		break;
 	case 0x2003:
@@ -1212,7 +1202,6 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag
 }
 
 void AsScene1002VenusFlyTrap::sub4484F0() {
-	//ok
 	setDoDeltaX(2);
 	setFileHash(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
@@ -1221,7 +1210,6 @@ void AsScene1002VenusFlyTrap::sub4484F0() {
 }
 
 void AsScene1002VenusFlyTrap::sub448530() {
-	//ok
 	setFileHash(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
@@ -1229,7 +1217,6 @@ void AsScene1002VenusFlyTrap::sub448530() {
 }
 
 void AsScene1002VenusFlyTrap::sub448560() {
-	//ok
 	_parentScene->sendMessage(0x4807, 0, this);
 	setFileHash(0x82292851, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
@@ -1238,7 +1225,6 @@ void AsScene1002VenusFlyTrap::sub448560() {
 }
 
 void AsScene1002VenusFlyTrap::sub4485B0() {
-	//ok
 	setDoDeltaX(1);
 	setFileHash(0x86A82A11, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
@@ -1247,14 +1233,12 @@ void AsScene1002VenusFlyTrap::sub4485B0() {
 }
 
 void AsScene1002VenusFlyTrap::sub4485F0() {
-	//ok
 	setFileHash(0xB5A86034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
 }
 
 void AsScene1002VenusFlyTrap::sub448620() {
-	//ok
 	setFileHash(0x31303094, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(NULL);
@@ -1284,7 +1268,6 @@ void AsScene1002VenusFlyTrap::sub448660() {
 }
 
 void AsScene1002VenusFlyTrap::sub448720() {
-	//ok
 	setFileHash(0x152920C4, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
@@ -1292,7 +1275,6 @@ void AsScene1002VenusFlyTrap::sub448720() {
 }
 
 void AsScene1002VenusFlyTrap::sub448750() {
-	//ok
 	setFileHash(0x84001117, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
@@ -1300,7 +1282,6 @@ void AsScene1002VenusFlyTrap::sub448750() {
 }
 
 void AsScene1002VenusFlyTrap::sub448780() {
-debug("AsScene1002VenusFlyTrap::sub448780()");
 	if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) {
 		if (_flag) {
 			setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0);
@@ -1417,6 +1398,53 @@ void Class478::update() {
 	AnimatedSprite::update();
 }
 
+Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman)
+	: AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman),
+	_flag1(false) {
+	
+	SetUpdateHandler(&Class479::update);
+	SetMessageHandler(&Class479::handleMessage);
+	createSurface(1000, 33, 41);
+	_surface->setVisible(false);
+}
+
+void Class479::update() {
+	if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) {
+		setFileHash(0x9820C913, _klayman->getFrameIndex(), -1);
+		_newHashListIndex = _klayman->getFrameIndex();
+		_surface->setVisible(true);
+		_x = _klayman->getX();
+		_y = _klayman->getY();
+		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
+	} else {
+		_surface->setVisible(false);
+	}
+	AnimatedSprite::update();
+}
+
+uint32 Class479::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			_parentScene->sendMessage(0x1022, 1200, this);
+			_flag1 = true;
+			_savedClipRect = _surface->getClipRect();
+			_surface->getClipRect().x1 = 0;
+			_surface->getClipRect().y1 = 0;
+			_surface->getClipRect().x2 = 640;
+			_surface->getClipRect().y2 = 480;
+		} else if (param.asInteger() == 0x88001184) {
+			_parentScene->sendMessage(0x1022, 1000, this);
+			if (_flag1) {
+				_surface->getClipRect() = _savedClipRect;
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
 	_flag1B4(false), _flag1BE(false) {
@@ -1424,17 +1452,6 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	NRect tempClipRect;
 	Sprite *tempSprite;
 
-	// TODO _field1B6 = -1;
-	// TODO _resourceTable8.setResourceList(0x004B4110);
-	// TODO _resourceTable7.setResourceList(0x004B4100);
-	// TODO _resourceTable6.setResourceList(0x004B40E8);
-	// TODO _resourceTable5.setResourceList(0x004B40C0);
-	// TODO _resourceTable4.setResourceList(0x004B4080);
-	// TODO _resourceTable3.setResourceList(0x004B4060);
-	// TODO _resourceTable2.setResourceList(0x004B4000, true);
-	// TODO _resourceTable1.setResourceList(0x004B3F90, true);
-	// TODO _resourceTable1.loadSome(3000);
-
 	SetUpdateHandler(&Scene1002::update);
 	SetMessageHandler(&Scene1002::handleMessage);
 
@@ -1479,42 +1496,40 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		}
+	} else if (which == 1) {
+		_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
+		_class478 = addSprite(new Class478(_vm, _klayman));
+		setMessageList(0x004B4478);
+		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
+		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_vm->_gameState.field2 = 1;
+	} else if (which == 2) {
+		_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
+		_class478 = addSprite(new Class478(_vm, _klayman));
+		setMessageList(0x004B4298);
+		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
+		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_vm->_gameState.field2 = 1;
+		_klayman->sendMessage(0x4820, 0, this);
 	} else {
-		if (which == 1) {
-			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
-			_class478 = addSprite(new Class478(_vm, _klayman));
-			setMessageList(0x004B4478);
-			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
-			_klayman->getSurface()->getClipRect().y1 = 0;
-			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
-			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
-			_vm->_gameState.field2 = 1;
-		} else if (which == 2) {
-			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
-			_class478 = addSprite(new Class478(_vm, _klayman));
-			setMessageList(0x004B4298);
-			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
-			_klayman->getSurface()->getClipRect().y1 = 0;
-			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
-			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
-			_vm->_gameState.field2 = 1;
-			_klayman->sendMessage(0x4820, 0, this);
-		} else {
-			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
-			_class478 = addSprite(new Class478(_vm, _klayman));
-			setMessageList(0x004B4470);
-			_klayman->getSurface()->getClipRect().x1 = 31;
-			_klayman->getSurface()->getClipRect().y1 = 0;
-			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height;
-			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
-			// TODO _class479 = addSprite(new Class479(_vm, this, _klayman));
-			// TODO _class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
-			_klayman->setRepl(64, 0);
-			_vm->_gameState.field2 = 0;
-		} 
+		_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
+		_class478 = addSprite(new Class478(_vm, _klayman));
+		setMessageList(0x004B4470);
+		_klayman->getSurface()->getClipRect().x1 = 31;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height;
+		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_class479 = addSprite(new Class479(_vm, this, _klayman));
+		_class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_klayman->setRepl(64, 0);
+		_vm->_gameState.field2 = 0;
 	}
 
 	addSprite(_klayman);
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 5229e7a..385ac10 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -262,6 +262,18 @@ protected:
 	void update();
 };
 
+class Class479 : public AnimatedSprite {
+public:
+	Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman);
+protected:
+	Scene *_parentScene;
+	Klayman *_klayman;
+	bool _flag1;
+	NRect _savedClipRect;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene1002 : public Scene {
 public:
 	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);


Commit: 730844f1b7455ff8beea78be207920c95d11bf15
    https://github.com/scummvm/scummvm/commit/730844f1b7455ff8beea78be207920c95d11bf15
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Implement Scene2208 (viewer for Hall Of Records text)

- Implement Screen::drawSurface3 and Screen::drawUnk and move actual blitting code to Screen::blit

Changed paths:
    engines/neverhood/background.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/neverhood.h
    engines/neverhood/palette.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h
index 733f80b..8ac3581 100644
--- a/engines/neverhood/background.h
+++ b/engines/neverhood/background.h
@@ -38,6 +38,7 @@ public:
 	BaseSurface *getSurface() { return _surface; }
 	void createSurface(int surfacePriority, int16 width, int16 height);
 	void load(uint32 fileHash);
+	SpriteResource& getSpriteResource() { return _spriteResource; }
 protected:
 	BaseSurface *_surface;
 	SpriteResource _spriteResource;
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index b987aa7..920893c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 6;
+	_vm->gameState().sceneNum = 7;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 204e386..900ad57 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -52,8 +52,11 @@ BaseSurface::~BaseSurface() {
 
 void BaseSurface::draw() {
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
-		// TODO: _sysRect alternate drawing code (is that used?)
-		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
+		if (_sysRect.x == 0 && _sysRect.y == 0) {
+			_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
+		} else {
+			_vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent);
+		}
 	}
 }
 
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 67c3be8..2fb3eec 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -240,6 +240,11 @@ void Module2200::createScene2207(int which) {
 }
 			
 void Module2200::createScene2208(int which) {
+	if (which >= 0)
+		_vm->gameState().which = _vm->gameState().sceneNum; 
+	_vm->gameState().sceneNum = 7;
+	_childObject = new Scene2208(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2208);
 }
 			
 void Module2200::createScene2209(int which) {
@@ -470,6 +475,15 @@ void Module2200::updateScene2207() {
 }
 			
 void Module2200::updateScene2208() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		// TODO
+		createScene2206(2);
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2209() {
@@ -2414,4 +2428,199 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Enti
 	return messageResult;
 }
 
+static const uint32 kScene2208FileHashes1[] = {
+	0x041023CB,
+	0x041020CB,
+	0x041026CB,
+	0x04102ACB,
+	0x041032CB,
+	0x041002CB
+};
+	
+static const uint32 kScene2208FileHashes2[] = {
+	0x091206C9,
+	0x091406C9,
+	0x091806C9,
+	0x090006C9,
+	0x093006C9,
+	0x095006C9
+};
+
+Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _textResource(vm) {
+
+	SpriteResource spriteResource(_vm);
+	const char *textStart, *textEnd;
+
+	if (!getGlobalVar(0xC8C28808))
+		setGlobalVar(0xC8C28808, calcHash("stLineagex"));
+
+	_textResource.load(getGlobalVar(0xC8C28808));
+	
+	textStart = _textResource.getString(getGlobalVar(0x48A68852), textEnd);
+	while (textStart < textEnd) {
+		_strings.push_back(textStart);
+		textStart += strlen(textStart) + 1;
+	}
+	
+	_maxRowIndex = 8 + 10 * (3 - (getGlobalVar(0xC8C28808) == calcHash("stLineagex") ? 1 : 0));
+
+	_background = new Background(_vm, 0);
+	_background->createSurface(0, 640, 528);
+	_background->getSpriteResource().getPosition().y = 480;
+	addBackground(_background);
+	
+	_palette = new Palette(_vm, 0x08100289);
+	_palette->usePalette();
+	addEntity(_palette); // Why?
+
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x0028D089, 40, 600));
+	
+	createFontSurface();
+	
+	_backgroundSurface = new BaseSurface(_vm, 0, 640, 480);
+	spriteResource.load2(0x08100289);
+	_backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
+
+	_topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192);
+	spriteResource.load2(!getGlobalVar(0x4CE79018) ? kScene2208FileHashes1[getGlobalVar(0x48A68852) % 6] : getGlobalVar(0x4CE79018));
+	_topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
+
+	_bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192);
+	spriteResource.load2(kScene2208FileHashes2[getGlobalVar(0x48A68852) % 6]);
+	_bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
+	
+	SetUpdateHandler(&Scene2208::update);
+	SetMessageHandler(&Scene2208::handleMessage);
+
+	_visibleRowsCount = 10;
+
+	_newRowIndex = (int16)getGlobalVar(0x49C40058);
+	if (_newRowIndex + _visibleRowsCount > _maxRowIndex)
+		_newRowIndex = _maxRowIndex - _visibleRowsCount;
+	if (_newRowIndex < 6)
+		_newRowIndex = 0;
+
+	_rowScrollY = 0;
+
+	_backgroundScrollY = 48 * _newRowIndex;		
+
+	_currRowIndex = _newRowIndex;
+
+	for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++)
+		drawRow(_newRowIndex + rowIndex);
+
+	_background->getSurface()->getSysRect().y = _backgroundScrollY;
+
+	// TODO Screen.yOffset = _backgroundScrollY;
+	// TODO Scene2208_sub409080 (creates background Sprites via the text, doesn't seem to be used?)
+
+}
+
+Scene2208::~Scene2208() {
+	delete _fontSurface;
+	delete _backgroundSurface;
+	delete _topBackgroundSurface;
+	delete _bottomBackgroundSurface;
+}
+
+void Scene2208::update() {
+
+	int16 mouseY = _vm->getMouseY();
+	
+	if (mouseY < 48) {
+		if (_currRowIndex > 0)
+			_newRowIndex = _currRowIndex - 1;
+	} else if (mouseY > 432) {
+		if (_currRowIndex < _maxRowIndex - _visibleRowsCount)
+			_newRowIndex = _currRowIndex + 1;
+	} else {
+		if (_currRowIndex > _newRowIndex)
+			_newRowIndex = _currRowIndex;
+	}
+
+	if (_currRowIndex < _newRowIndex) {
+		if (_rowScrollY == 0) {
+			drawRow(_currRowIndex + _visibleRowsCount);
+		}
+		_backgroundScrollY += 4;
+		_rowScrollY += 4;
+		if (_rowScrollY == 48) {
+			_rowScrollY = 0;
+			_currRowIndex++;
+		}
+		_background->getSurface()->getSysRect().y = _backgroundScrollY;
+	} else if (_currRowIndex > _newRowIndex || _rowScrollY > 0) {
+		if (_rowScrollY == 0) {
+			drawRow(_currRowIndex - 1);
+			_currRowIndex--;
+		}
+		_backgroundScrollY -= 4;
+		if (_rowScrollY == 0)
+			_rowScrollY = 48;
+		_rowScrollY -= 4;
+		_background->getSurface()->getSysRect().y = _backgroundScrollY;
+	}
+
+	// TODO Screen.yOffset = _backgroundScrollY;
+	Scene::update();
+
+}
+
+uint32 Scene2208::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 40 || param.asPoint().x >= 600) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2208::createFontSurface() {
+	DataResource fontData(_vm);
+	SpriteResource spriteResource(_vm);
+	fontData.load(calcHash("asRecFont"));
+	uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x;
+	uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x;
+	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
+	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
+	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
+	spriteResource.load2(0x0800090C);
+	_fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight);
+	_fontSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
+}
+
+void Scene2208::drawRow(int16 rowIndex) {
+	NDrawRect sourceRect;	
+	int16 y = (rowIndex * 48) % 528;
+	if (rowIndex < 4) {
+		sourceRect.x = 0;
+		sourceRect.y = y;
+		sourceRect.width = 640;
+		sourceRect.height = 48;
+		_background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true);
+	} else if (rowIndex >= _maxRowIndex - 5) {
+		sourceRect.x = 0;
+		sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48;
+		sourceRect.width = 640;
+		sourceRect.height = 48;
+		_background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect, true);
+	} else {
+		rowIndex -= 4;
+		sourceRect.x = 0;
+		sourceRect.y = (rowIndex * 48) % 480;
+		sourceRect.width = 640;
+		sourceRect.height = 48;
+		_background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true);
+		if (rowIndex < _strings.size()) {
+			const char *text = _strings[rowIndex];
+			// TODO/CHECKME: Use temporary string up to '{' character (see above)
+			_fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text);
+		}
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index cf53e69..7a75e12 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -27,6 +27,7 @@
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
 #include "neverhood/module1000.h"
+#include "neverhood/graphics.h"
 
 namespace Neverhood {
 
@@ -424,6 +425,29 @@ protected:
 	uint32 handleMessage2(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2208 : public Scene {
+public:
+	Scene2208(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2208();
+protected:
+	FontSurface *_fontSurface;
+	BaseSurface *_backgroundSurface;
+	BaseSurface *_topBackgroundSurface;
+	BaseSurface *_bottomBackgroundSurface;
+	TextResource _textResource;
+	int16 _backgroundScrollY;
+	int16 _newRowIndex;
+	int16 _currRowIndex;
+	int16 _rowScrollY;
+	int16 _maxRowIndex;
+	int16 _visibleRowsCount;
+	Common::Array<const char*> _strings; // TODO: Move to TextResource
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createFontSurface();
+	void drawRow(int16 rowIndex);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index edb204c..b4bc333 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -49,6 +49,7 @@ struct NPoint;
 
 struct GameState {
 	int sceneNum;
+	int which;
 	int field2;
 };
 
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index 28fa81b..bd1d6b2 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -114,7 +114,7 @@ void Palette::startFadeToWhite(int counter) {
 }
 
 void Palette::update() {
-	debug("Palette::update() _status = %d", _status);
+	debug(2, "Palette::update() _status = %d", _status);
 	if (_status == 1) {
 		if (_palCounter > 1) {
 			for (int i = 0; i < 256; i++) {
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index a884914..351e51a 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -125,7 +125,53 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 		ddRect.y1 = 0;
 	}
 	
-	debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
+	//debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
+
+	blit(surface, destX, destY, ddRect, transparent);
+
+	// Useful for debugging	
+	//_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); 
+	//_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); 
+	//_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255);
+
+}
+
+void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent) {
+
+	int16 destX, destY;
+	NRect ddRect;
+	
+	if (x + drawRect.width >= clipRect.x2)
+		ddRect.x2 = clipRect.x2 - drawRect.x - x;
+	else
+		ddRect.x2 = drawRect.x + drawRect.width;
+		
+	if (x < clipRect.x1) {
+		destX = clipRect.x1;
+		ddRect.x1 = clipRect.x1 + drawRect.x - x;
+	} else {
+		destX = x;
+		ddRect.x1 = drawRect.x;
+	}
+
+	if (y + drawRect.height >= clipRect.y2)
+		ddRect.y2 = clipRect.y2 + drawRect.y - y;
+	else
+		ddRect.y2 = drawRect.y + drawRect.height;
+	
+	if (y < clipRect.y1) {
+		destY = clipRect.y1;
+		ddRect.y1 = clipRect.y1 + drawRect.y - y;
+	} else {
+		destY = y;
+		ddRect.y1 = drawRect.y;
+	}
+	
+	blit(surface, destX, destY, ddRect, transparent);
+
+}
+
+void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent) {
 
 	const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
 	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
@@ -151,11 +197,6 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 		}
 	}
 
-	// Useful for debugging	
-	//_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); 
-	//_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); 
-	//_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255);
-
 }
 
 void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) {
@@ -176,4 +217,73 @@ void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &dra
 
 }
 
+void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent) {
+	
+	int16 x, y;
+	bool xflag, yflag;
+	NDrawRect newDrawRect;
+
+	x = sysRect.x;
+	if (sysRect.width <= x || -sysRect.width >= x) {
+		x = x % sysRect.width;
+	}
+	if (x < 0)
+		x += sysRect.width;
+
+	y = sysRect.y;
+	if (y >= sysRect.height || -sysRect.height >= y) {
+		y = y % sysRect.height;
+	}
+	if (y < 0)
+		y += sysRect.height;
+	
+	xflag = x <= 0;
+	yflag = y <= 0;
+  
+	newDrawRect.x = x;
+	newDrawRect.width = sysRect.width - x;
+	if (drawRect.width < newDrawRect.width) {
+		xflag = true;
+		newDrawRect.width = drawRect.width;
+	}
+  
+	newDrawRect.y = y;
+	newDrawRect.height = sysRect.height - y;
+	if (drawRect.height < newDrawRect.height) {
+		yflag = true;
+		newDrawRect.height = drawRect.height;
+	}
+	
+	drawSurface3(surface, drawRect.x, drawRect.y, newDrawRect, clipRect, transparent);
+  
+	if (!xflag) {
+		newDrawRect.x = 0;
+		newDrawRect.y = y;
+		newDrawRect.width = x + drawRect.width - sysRect.width;
+		newDrawRect.height = sysRect.height - y;
+		if (drawRect.height < newDrawRect.height)
+			newDrawRect.height = drawRect.height;
+		drawSurface3(surface, sysRect.width + drawRect.x - x, drawRect.y, newDrawRect, clipRect, transparent);
+	}
+  
+	if (!yflag) {
+		newDrawRect.x = x;
+		newDrawRect.y = 0;
+		newDrawRect.width = sysRect.width - x;
+		newDrawRect.height = y + drawRect.height - sysRect.height;
+		if (drawRect.width < newDrawRect.width)
+			newDrawRect.width = drawRect.width;
+		drawSurface3(surface, drawRect.x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent);
+	}
+  
+	if (!xflag && !yflag) {
+		newDrawRect.x = 0;
+		newDrawRect.y = 0;
+		newDrawRect.width = x + drawRect.width - sysRect.width;
+		newDrawRect.height = y + drawRect.height - sysRect.height;
+		drawSurface3(surface, sysRect.width + drawRect.x - x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent);
+	}
+
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 922ad48..e813e63 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -43,7 +43,10 @@ public:
 	void updatePalette();
 	void clear();
 	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent);
+	void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent);
+	void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent);
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
+	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent);
 protected:
 	NeverhoodEngine *_vm;
 	Graphics::Surface *_backScreen;


Commit: 904f7ac33520a3b578ad46bb3b1552074ae57326
    https://github.com/scummvm/scummvm/commit/904f7ac33520a3b578ad46bb3b1552074ae57326
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2242

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 597e67f..5f54df9 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -75,6 +75,9 @@ static const uint32 rectListOffsets[] = {
 	// Scene2207
 	3, 0x004B38B8,
 	1, 0x004B3948,
+	// Scene2242
+	1, 0x004B3DC8,
+	1, 0x004B3E18,
 	0, 0
 };
 
@@ -222,6 +225,16 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B37D8,
 	2, 0x004B3958,
 	3, 0x004B3920,
+	// Scene2242
+	1, 0x004B3C18,
+	1, 0x004B3D60,
+	1, 0x004B3D48,
+	1, 0x004B3C20,
+	2, 0x004B3D50,
+	5, 0x004B3CF8,
+	5, 0x004B3D20,
+	4, 0x004B3CB8,
+	4, 0x004B3CD8,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index fb991ee..d217943 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 9133d17cdf33a96fcb0423576e69d888323f2b00
    https://github.com/scummvm/scummvm/commit/9133d17cdf33a96fcb0423576e69d888323f2b00
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Implement Scene2242

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 920893c..d9237b9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 7;
+	_vm->gameState().sceneNum = 41;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 3e90cf1..a20f91b 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -440,6 +440,14 @@ void Klayman::sub421310() {
 
 /////////////////////////////////////////////////////////////////
 
+void Klayman::sub41CE70() {
+	_x4 = _x;
+	if (!_flagE1 && !_flagE2 && !_flagE3) {
+		setCallback2(NULL);
+		sub41C7B0();
+	}
+}
+
 void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) {
 	_resourceHandle = _vm->_res->useResource(fileHash);
 	if (_resourceHandle != -1) {
@@ -3751,7 +3759,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4837:
-		// TODO sub41CE70();
+		sub41CE70();
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -3921,4 +3929,89 @@ void KmScene2207::sub4425A0() {
 	SetMessageHandler(&Klayman::handleMessage41D360);
 }
 
+KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+void KmScene2242::xUpdate() {
+	setGlobalVar(0x18288913, _frameIndex);
+}
+
+uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&KmScene2242::sub444D20));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x4837:
+		sub41CE70();
+		break;
+	}
+	return 0;
+}
+
+void KmScene2242::sub444D20() {
+	int16 frameIndex = (int16)getGlobalVar(0x18288913) + 1;
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_flagE1 = true;
+	_flagE5 = true;
+	setFileHash(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetAnimationCallback3(&Klayman::sub41FA40);
+	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 7187905..a5abc0f 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -113,6 +113,8 @@ public:
 	void sub41F9E0();
 	void sub41FA40();
 	void sub41FB30();
+
+	void sub41CE70();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
@@ -421,6 +423,15 @@ protected:
 	void sub4425A0();
 };
 
+class KmScene2242 : public Klayman {
+public:
+	KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	void xUpdate();
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub444D20();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 2fb3eec..eb2829c 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -248,6 +248,9 @@ void Module2200::createScene2208(int which) {
 }
 			
 void Module2200::createScene2209(int which) {
+	_vm->gameState().sceneNum = 8;
+	_childObject = new Scene2208(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2209);
 }
 			
 void Module2200::createScene2210(int which) {
@@ -347,6 +350,9 @@ void Module2200::createScene2241(int which) {
 }
 			
 void Module2200::createScene2242(int which) {
+	_vm->gameState().sceneNum = 41;
+	_childObject = new Scene2242(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2242);
 }
 			
 void Module2200::createScene2243(int which) {
@@ -487,6 +493,14 @@ void Module2200::updateScene2208() {
 }
 			
 void Module2200::updateScene2209() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene2206(3);
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2210() {
@@ -586,6 +600,22 @@ void Module2200::updateScene2241() {
 }
 			
 void Module2200::updateScene2242() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2248(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 2) {
+			createScene2208(0);
+			_childObject->handleUpdate();
+		} else {
+			createScene2241(1);
+			_childObject->handleUpdate();
+		}
+	}
 }
 			
 void Module2200::updateScene2243() {
@@ -2623,4 +2653,130 @@ void Scene2208::drawRow(int16 rowIndex) {
 	}
 }
 
+static const int16 kScene2242XPositions[] = {
+	68, 
+	158
+};
+
+static const uint32 kScene2242MessageListIds2[] = {
+	0x004B3CB8,
+	0x004B3CD8
+};
+
+static const uint32 kScene2242MessageListIds1[] = {
+	0x004B3CF8,
+	0x004B3D20
+};
+
+Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _isKlaymanInLight(false) {
+
+	Palette2 *palette2;
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2242::handleMessage);
+	SetUpdateHandler(&Scene2242::update);
+	
+	setGlobalVar(0x4D080E54,1);
+	
+	if (getGlobalVar(0x4D080E54)) {
+		_background = addBackground(new DirtyBackground(_vm, 0x11840E24, 0, 0));
+		_palette = new Palette(_vm, 0x11840E24);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x40E20110, NULL));
+		setRectList(0x004B3DC8);
+	} else {
+		_background = addBackground(new DirtyBackground(_vm, 0x25848E24, 0, 0));
+		palette2 = new Palette2(_vm, 0x25848E24);
+		_palette = palette2;
+		_palette->usePalette();
+		addEntity(palette2);
+		((Palette2*)_palette)->copyBasePalette(0, 256, 0);
+		_palette->addPalette(0x68033B1C, 0, 65, 0);
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x48E20250, NULL));
+		setRectList(0x004B3E18);
+	}
+
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 10, 1100, 464, 435, 0x9148A011));
+	_vm->_collisionMan->addSprite(_asTape); 
+
+	if (which < 0) {
+		_klayman = new KmScene2242(_vm, this, 200, 430);
+		setMessageList(0x004B3C18);
+	} else if (which == 1) {
+		_klayman = new KmScene2242(_vm, this, 530, 430);
+		setMessageList(0x004B3D60);
+	} else if (which == 2) {
+		_klayman = new KmScene2242(_vm, this, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430);
+		setMessageList(0x004B3D48);
+		if (getGlobalVar(0xC0418A02))
+			_klayman->setDoDeltaX(1);
+	} else {
+		_klayman = new KmScene2242(_vm, this, 0, 430);
+		setMessageList(0x004B3C20);
+	}
+	addSprite(_klayman);
+
+	_klayman->setSoundFlag(true);
+
+}
+
+Scene2242::~Scene2242() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+void Scene2242::update() {
+	if (!getGlobalVar(0x4D080E54)) {
+		if (_isKlaymanInLight && _klayman->getX() < 440) {
+			((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0);
+			((Palette2*)_palette)->startFadeToPalette(12);
+			_isKlaymanInLight = false;
+		} else if (!_isKlaymanInLight && _klayman->getX() >= 440) {
+			((Palette2*)_palette)->addPalette(0x25848E24, 0, 65, 0);
+			((Palette2*)_palette)->startFadeToPalette(12);
+			_isKlaymanInLight = true;
+		}
+	}
+	Scene::update();
+}
+
+uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x800C6694) {
+			sub4448D0();
+		}
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			setMessageList(0x004B3D50);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2242::sub4448D0() {
+	int index;
+	if (_mouseClickPos.x < 108) {
+		setGlobalVar(0xC8C28808, 0x04290188);
+		setGlobalVar(0x48A68852, 42);
+		setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart1"));
+		index = 0;
+	} else {
+		setGlobalVar(0xC8C28808, 0x04290188);
+		setGlobalVar(0x48A68852, 43);
+		setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2"));
+		index = 1;
+	}
+	setGlobalVar(0x49C40058, (_mouseClickPos.x - 100) / 7);
+	if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) {
+		setMessageList2(kScene2242MessageListIds1[index]);
+	} else {
+		setMessageList2(kScene2242MessageListIds2[index]);
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 7a75e12..d06f30b 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -448,6 +448,18 @@ protected:
 	void drawRow(int16 rowIndex);
 };
 
+class Scene2242 : public Scene {
+public:
+	Scene2242(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2242();
+protected:
+	Sprite *_asTape;
+	bool _isKlaymanInLight;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub4448D0();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2200_H */


Commit: 49658b6b5a0537010680f25248f2912114021b85
    https://github.com/scummvm/scummvm/commit/49658b6b5a0537010680f25248f2912114021b85
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Forgot to remove debug code

Changed paths:
    engines/neverhood/module2200.cpp



diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index eb2829c..15e1ca4 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2677,8 +2677,6 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2242::handleMessage);
 	SetUpdateHandler(&Scene2242::update);
 	
-	setGlobalVar(0x4D080E54,1);
-	
 	if (getGlobalVar(0x4D080E54)) {
 		_background = addBackground(new DirtyBackground(_vm, 0x11840E24, 0, 0));
 		_palette = new Palette(_vm, 0x11840E24);


Commit: b16f34c376d16ca98fa7ef18e9781a30b159c918
    https://github.com/scummvm/scummvm/commit/b16f34c376d16ca98fa7ef18e9781a30b159c918
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Add Scene2248

Changed paths:
    engines/neverhood/module2200.cpp



diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 15e1ca4..515e4bd 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -371,6 +371,19 @@ void Module2200::createScene2247(int which) {
 }
 			
 void Module2200::createScene2248(int which) {
+	_vm->gameState().sceneNum = 47;
+	if (!getGlobalVar(0x98109F12)) {
+		if (getGlobalVar(0x4D080E54))
+			_childObject = new Class152(_vm, this, 0x83110287, 0x10283839);
+		else
+			_childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C);
+	} else {
+		if (getGlobalVar(0x4D080E54))
+			_childObject = new Class152(_vm, this, 0x48632087, 0x3208348E);
+		else
+			_childObject = new Class152(_vm, this, 0x08C74886, 0x74882084);
+	}
+	SetUpdateHandler(&Module2200::updateScene2248);
 }
 			
 void Module2200::updateScene2201() {
@@ -634,6 +647,14 @@ void Module2200::updateScene2247() {
 }
 			
 void Module2200::updateScene2248() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene2242(1);
+		_childObject->handleUpdate();
+	}
 }
 
 // Scene2201


Commit: 9b151cefc352a8f42c005a7406d4b694aa4a221c
    https://github.com/scummvm/scummvm/commit/9b151cefc352a8f42c005a7406d4b694aa4a221c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:36-07:00

Commit Message:
NEVERHOOD: Implement HallOfRecordsScene (and all HoR scenes) and Scene2247

- Load SceneInfo140 from neverhood.dat
- Some renaming

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamevars.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/scene.cpp
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d9237b9..31330f9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -242,7 +242,7 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 41;
+	_vm->gameState().sceneNum = 46;
 	createModule2200(-1);
 #endif
 }
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index e0cae80..3e4e604 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -102,7 +102,7 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
 }
 
 int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
-	debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
+	//debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
 	int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
 	if (subVarIndex == -1) {
 		subVarIndex = addSubVar(varIndex, subNameHash, 0);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index a20f91b..e0359fc 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -150,7 +150,7 @@ uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FD90() {
-	// TODO _soundResource1.stop(0);
+	_soundResource1.stop();
 }
 
 void Klayman::sub41FDA0() {
@@ -195,7 +195,7 @@ void Klayman::sub41FE00() {
 }
 
 void Klayman::sub41FE50() {
-	// TODO _soundResource1.stop(0);
+	_soundResource1.stop();
 }
 
 uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender) {
@@ -485,7 +485,6 @@ bool Klayman::sub41CF10(AnimationCb callback) {
 }
 
 void Klayman::sub41C7B0() {
-	//debug("Klayman::sub41C7B0()");
 	if (_callback1Cb) {
 		AnimationCb cb = _callback1Cb;
 		_callback1Cb = NULL;
@@ -515,7 +514,6 @@ void Klayman::sub41C790() {
 }
 
 void Klayman::sub41FC80() {
-	//ok
 	if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) {
 		_status2 = 1;
 		_flagE5 = true;
@@ -555,7 +553,6 @@ void Klayman::update41D0F0() {
 }
 
 uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41D360(%04X)", messageNum);
 	Sprite::handleMessage(messageNum, param, sender);
 	uint32 messageResult = xHandleMessage(messageNum, param);
 	switch (messageNum) {
@@ -603,7 +600,6 @@ void Klayman::sub41FF00() {
 }
 
 uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41D480(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -614,7 +610,6 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FCF0() {
-	//ok
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x5420E254, 0, -1);
@@ -624,7 +619,6 @@ void Klayman::sub41FCF0() {
 }
 
 uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41F140(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -640,7 +634,6 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, E
 
 
 void Klayman::sub41C930(int16 x, bool flag) {
-	//debug("Klayman::sub41C930(%d, %d)", x, flag);
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
 		_x4 = x;
@@ -690,8 +683,6 @@ void Klayman::sub4211B0() {
 }
 
 uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
-	//debug("Klayman::handleMessage41E920(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -720,7 +711,6 @@ bool Klayman::sub41CEB0(AnimationCb callback3) {
 }
 
 void Klayman::spriteUpdate41F250() {
-	//debug("Klayman::spriteUpdate41F250()");
 
 	int16 xdiff = _x4 - _x;
 
@@ -752,7 +742,6 @@ void Klayman::spriteUpdate41F250() {
 }
 
 void Klayman::spriteUpdate41F5F0() {
-	//debug("Klayman::spriteUpdate41F5F0()");
 	
 	int16 xdiff = _x4 - _x;
 	
@@ -817,7 +806,6 @@ void Klayman::sub41FBB0() {
 }
 
 uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41DD80(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -848,7 +836,6 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41CD70(int16 x) {
-	//debug("Klayman::sub41CD70(%d)", x);
 	if (x > _x) {
 		if (ABS(x - _x) <= 105) {
 			sub41CAC0(x);
@@ -884,7 +871,6 @@ void Klayman::sub41FB30() {
 }
 
 uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41EC70(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -924,7 +910,6 @@ void Klayman::spriteUpdate41F300() {
 }
 
 uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41EB70(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1063,7 +1048,6 @@ void Klayman::sub41FF80() {
 }
 
 uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41D4C0(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1101,7 +1085,6 @@ void Klayman::sub420120() {
 }
 
 uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41DAD0(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1182,7 +1165,6 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 }
 
 void Klayman::sub41CAC0(int16 x) {
-	//debug("Klayman::sub41CAC0(%d)", x);
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
 		_x4 = x;
@@ -1272,7 +1254,6 @@ void Klayman::spriteUpdate41F780() {
 }
 
 uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41DF10(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1318,7 +1299,6 @@ void Klayman::sub4208F0() {
 }
 
 uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("Klayman::handleMessage41EEF0(%04X)", messageNum);
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2039,7 +2019,6 @@ KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
-	//debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum);
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
@@ -2125,7 +2104,6 @@ void KmScene1001::sub44FA50() {
 }
 
 uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
-	//debug("KmScene1001::handleMessage44FA00(%04X)", messageNum);
 	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2160,8 +2138,6 @@ void KmScene1002::xUpdate() {
 }
 	
 uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
-	//ok
-	//debug("KmScene1002::xHandleMessage(%04X)", messageNum);
 	switch (messageNum) {
 	case 0x2001:
 		setCallback2(AnimationCallback(&KmScene1002::sub449E90));
@@ -2263,7 +2239,6 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene1002::update4497D0() {
-	//debug("KmScene1002::update4497D0()");
 	Klayman::update();
 	if (_counter1 != 0 && (--_counter1 == 0)) {
 		_surface->setVisible(true);
@@ -2272,7 +2247,6 @@ void KmScene1002::update4497D0() {
 }
 
 uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2299,7 +2273,6 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &para
 }
 
 uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
 	switch (messageNum) {
 	case 0x4811:
 		_soundResource1.play(0x5252A0E4);
@@ -2323,7 +2296,6 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &para
 }
 
 uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2376,7 +2348,6 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &para
 }
 
 uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2395,7 +2366,6 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &para
 }
 
 uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
@@ -2420,7 +2390,6 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &para
 }
 
 uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender) {
-	//ok
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2433,10 +2402,8 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &para
 }
 
 void KmScene1002::spriteUpdate449DC0() {
-	//debug("KmScene1002::spriteUpdate449DC0()");
 	AnimatedSprite::updateDeltaXY();
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
-	//debug("$$$ hitRect->type = %04X", hitRect->type);
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
 		processDelta();
@@ -2446,7 +2413,6 @@ void KmScene1002::spriteUpdate449DC0() {
 }
 
 void KmScene1002::sub449E20() {
-	//debug("KmScene1002::sub449E20()");
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) {
 		_status2 = 2;
 		_flagE5 = false;
@@ -2460,7 +2426,6 @@ void KmScene1002::sub449E20() {
 }
 
 void KmScene1002::sub449E90() {
-	//debug("KmScene1002::sub449E90()");
 	_soundResource1.play(0x56548280);
 	_status2 = 0;
 	_flagE5 = false;
@@ -2472,8 +2437,6 @@ void KmScene1002::sub449E90() {
 }
 
 void KmScene1002::sub449EF0() {
-	//ok
-	//debug("KmScene1002::sub449EF0()");
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
@@ -2491,8 +2454,6 @@ void KmScene1002::sub449EF0() {
 }
 
 void KmScene1002::sub449F70() {
-	//ok
-	//debug("KmScene1002::sub449F70()");
 	_parentScene->sendMessage(0x1024, 1, this);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
@@ -2511,8 +2472,6 @@ void KmScene1002::sub449F70() {
 }
 
 void KmScene1002::sub44A050() {
-	//ok
-	//debug("KmScene1002::sub44A050()");
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
@@ -2526,8 +2485,6 @@ void KmScene1002::sub44A050() {
 }
 
 void KmScene1002::sub44A0D0() {
-	//ok
-	//debug("KmScene1002::sub44A0D0()");
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
@@ -2541,8 +2498,6 @@ void KmScene1002::sub44A0D0() {
 }
 
 void KmScene1002::sub44A150() {
-	//ok
-	//debug("KmScene1002::sub44A150()");
 	_parentScene->sendMessage(0x1024, 1, this);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
@@ -2561,15 +2516,11 @@ void KmScene1002::sub44A150() {
 }
 
 void KmScene1002::sub44A230() {
-	//ok
-	//debug("KmScene1002::sub44A230()");
 	setDoDeltaX(2);
 	sub41FC80();
 }
 
 void KmScene1002::sub44A250() {
-	//ok
-	//debug("KmScene1002::sub44A250()");
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) {
 		_parentScene->sendMessage(0x1024, 3, this);
 		_status2 = 2;
@@ -2583,8 +2534,6 @@ void KmScene1002::sub44A250() {
 }
 
 void KmScene1002::sub44A2C0() {
-	//ok
-	//debug("KmScene1002::sub44A2C0()");
 	if (_attachedSprite) {
 		_x = ((Sprite*)_attachedSprite)->getX();
 		_attachedSprite->sendMessage(0x4807, 0, this);
@@ -2600,8 +2549,6 @@ void KmScene1002::sub44A2C0() {
 }
 
 void KmScene1002::sub44A330() {
-	//ok
-	//debug("KmScene1002::sub44A330()");
 	_status2 = 2;
 	_flagE5 = true;
 	setDoDeltaX(0);
@@ -2612,8 +2559,6 @@ void KmScene1002::sub44A330() {
 }
 
 void KmScene1002::sub44A370() {
-	//ok
-	//debug("KmScene1002::sub44A370()");
 	_status2 = 1;
 	_flagE5 = false;
 	setFileHash(0x35AA8059, 0, -1);
@@ -2624,13 +2569,10 @@ void KmScene1002::sub44A370() {
 }
 
 void KmScene1002::sub44A3C0() {
-	//debug("KmScene1002::sub44A3C0()");
 	_parentScene->sendMessage(0x1024, 1, this);
 }
 
 void KmScene1002::sub44A3E0() {
-	//ok
-	//debug("KmScene1002::sub44A3E0()");
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) {
 		_status2 = 2;
 		_flagE4 = false;
@@ -2645,8 +2587,6 @@ void KmScene1002::sub44A3E0() {
 }
 
 void KmScene1002::sub44A460() {
-	//ok
-	//debug("KmScene1002::sub44A460()");
 	_flagE4 = false;
 	_flagE5 = true;
 	setFileHash2(0x5C01A870, 0x01084280, 0);
@@ -4000,7 +3940,145 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene2242::sub444D20() {
-	int16 frameIndex = (int16)getGlobalVar(0x18288913) + 1;
+	int16 frameIndex = (int16)getGlobalVar(0x18288913);
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_flagE1 = true;
+	_flagE5 = true;
+	setFileHash(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetAnimationCallback3(&Klayman::sub41FA40);
+	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
+KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+void KmHallOfRecords::xUpdate() {
+	setGlobalVar(0x18288913, _frameIndex);
+}
+
+uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&KmHallOfRecords::sub43B130));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x4837:
+		sub41CE70();
+		break;
+	}
+	return 0;
+}
+
+void KmHallOfRecords::sub43B130() {
+	int16 frameIndex = (int16)getGlobalVar(0x18288913);
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_flagE1 = true;
+	_flagE5 = true;
+	setFileHash(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetAnimationCallback3(&Klayman::sub41FA40);
+	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+}
+
+KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+void KmScene2247::xUpdate() {
+	setGlobalVar(0x18288913, _frameIndex);
+}
+
+uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&KmScene2247::sub453520));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x4837:
+		sub41CE70();
+		break;
+	}
+	return 0;
+}
+  
+void KmScene2247::sub453520() {
+	int16 frameIndex = (int16)getGlobalVar(0x18288913);
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a5abc0f..12862e3 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -432,6 +432,24 @@ protected:
 	void sub444D20();
 };
 
+class KmHallOfRecords : public Klayman {
+public:
+	KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	void xUpdate();
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub43B130();
+};
+
+class KmScene2247 : public Klayman {
+public:
+	KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	void xUpdate();
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub453520();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 515e4bd..fe6f36c 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -254,99 +254,195 @@ void Module2200::createScene2209(int which) {
 }
 			
 void Module2200::createScene2210(int which) {
+	_vm->gameState().sceneNum = 9;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180);
+	SetUpdateHandler(&Module2200::updateScene2210);
 }
 			
 void Module2200::createScene2211(int which) {
+	_vm->gameState().sceneNum = 10;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198);
+	SetUpdateHandler(&Module2200::updateScene2211);
 }
 			
 void Module2200::createScene2212(int which) {
+	_vm->gameState().sceneNum = 11;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0);
+	SetUpdateHandler(&Module2200::updateScene2212);
 }
 			
 void Module2200::createScene2213(int which) {
+	_vm->gameState().sceneNum = 12;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8);
+	SetUpdateHandler(&Module2200::updateScene2213);
 }
-			
+
 void Module2200::createScene2214(int which) {
+	_vm->gameState().sceneNum = 13;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0);
+	SetUpdateHandler(&Module2200::updateScene2214);
 }
 			
 void Module2200::createScene2215(int which) {
+	_vm->gameState().sceneNum = 14;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8);
+	SetUpdateHandler(&Module2200::updateScene2215);
 }
 			
 void Module2200::createScene2216(int which) {
+	_vm->gameState().sceneNum = 15;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210);
+	SetUpdateHandler(&Module2200::updateScene2216);
 }
 			
 void Module2200::createScene2217(int which) {
+	_vm->gameState().sceneNum = 16;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228);
+	SetUpdateHandler(&Module2200::updateScene2217);
 }
 			
 void Module2200::createScene2218(int which) {
+	_vm->gameState().sceneNum = 17;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240);
+	SetUpdateHandler(&Module2200::updateScene2218);
 }
 			
 void Module2200::createScene2219(int which) {
+	_vm->gameState().sceneNum = 18;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258);
+	SetUpdateHandler(&Module2200::updateScene2219);
 }
 			
 void Module2200::createScene2220(int which) {
+	_vm->gameState().sceneNum = 19;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270);
+	SetUpdateHandler(&Module2200::updateScene2220);
 }
 			
 void Module2200::createScene2221(int which) {
+	_vm->gameState().sceneNum = 20;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288);
+	SetUpdateHandler(&Module2200::updateScene2221);
 }
 			
 void Module2200::createScene2222(int which) {
+	_vm->gameState().sceneNum = 21;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0);
+	SetUpdateHandler(&Module2200::updateScene2222);
 }
 			
 void Module2200::createScene2223(int which) {
+	_vm->gameState().sceneNum = 22;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8);
+	SetUpdateHandler(&Module2200::updateScene2223);
 }
 			
 void Module2200::createScene2224(int which) {
+	_vm->gameState().sceneNum = 23;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0);
+	SetUpdateHandler(&Module2200::updateScene2224);
 }
 			
 void Module2200::createScene2225(int which) {
+	_vm->gameState().sceneNum = 24;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8);
+	SetUpdateHandler(&Module2200::updateScene2225);
 }
 			
 void Module2200::createScene2226(int which) {
+	_vm->gameState().sceneNum = 25;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300);
+	SetUpdateHandler(&Module2200::updateScene2226);
 }
 			
 void Module2200::createScene2227(int which) {
+	_vm->gameState().sceneNum = 26;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318);
+	SetUpdateHandler(&Module2200::updateScene2227);
 }
 			
 void Module2200::createScene2228(int which) {
+	_vm->gameState().sceneNum = 27;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330);
+	SetUpdateHandler(&Module2200::updateScene2228);
 }
 			
 void Module2200::createScene2229(int which) {
+	_vm->gameState().sceneNum = 28;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348);
+	SetUpdateHandler(&Module2200::updateScene2229);
 }
 			
 void Module2200::createScene2230(int which) {
+	_vm->gameState().sceneNum = 29;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360);
+	SetUpdateHandler(&Module2200::updateScene2230);
 }
 			
 void Module2200::createScene2231(int which) {
+	_vm->gameState().sceneNum = 30;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378);
+	SetUpdateHandler(&Module2200::updateScene2231);
 }
 			
 void Module2200::createScene2232(int which) {
+	_vm->gameState().sceneNum = 31;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390);
+	SetUpdateHandler(&Module2200::updateScene2232);
 }
 			
 void Module2200::createScene2233(int which) {
+	_vm->gameState().sceneNum = 32;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8);
+	SetUpdateHandler(&Module2200::updateScene2233);
 }
 			
 void Module2200::createScene2234(int which) {
+	_vm->gameState().sceneNum = 33;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0);
+	SetUpdateHandler(&Module2200::updateScene2234);
 }
 			
 void Module2200::createScene2235(int which) {
+	_vm->gameState().sceneNum = 34;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8);
+	SetUpdateHandler(&Module2200::updateScene2235);
 }
 			
 void Module2200::createScene2236(int which) {
+	_vm->gameState().sceneNum = 35;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0);
+	SetUpdateHandler(&Module2200::updateScene2236);
 }
 			
 void Module2200::createScene2237(int which) {
+	_vm->gameState().sceneNum = 36;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408);
+	SetUpdateHandler(&Module2200::updateScene2237);
 }
 			
 void Module2200::createScene2238(int which) {
+	_vm->gameState().sceneNum = 37;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420);
+	SetUpdateHandler(&Module2200::updateScene2238);
 }
 			
 void Module2200::createScene2239(int which) {
+	_vm->gameState().sceneNum = 38;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438);
+	SetUpdateHandler(&Module2200::updateScene2239);
 }
 			
 void Module2200::createScene2240(int which) {
+	_vm->gameState().sceneNum = 39;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450);
+	SetUpdateHandler(&Module2200::updateScene2240);
 }
 			
 void Module2200::createScene2241(int which) {
+	_vm->gameState().sceneNum = 40;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468);
+	SetUpdateHandler(&Module2200::updateScene2241);
 }
 			
 void Module2200::createScene2242(int which) {
@@ -356,18 +452,33 @@ void Module2200::createScene2242(int which) {
 }
 			
 void Module2200::createScene2243(int which) {
+	_vm->gameState().sceneNum = 42;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480);
+	SetUpdateHandler(&Module2200::updateScene2243);
 }
 			
 void Module2200::createScene2244(int which) {
+	_vm->gameState().sceneNum = 43;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498);
+	SetUpdateHandler(&Module2200::updateScene2244);
 }
 			
 void Module2200::createScene2245(int which) {
+	_vm->gameState().sceneNum = 44;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0);
+	SetUpdateHandler(&Module2200::updateScene2245);
 }
 			
 void Module2200::createScene2246(int which) {
+	_vm->gameState().sceneNum = 45;
+	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8);
+	SetUpdateHandler(&Module2200::updateScene2246);
 }
 			
 void Module2200::createScene2247(int which) {
+	_vm->gameState().sceneNum = 46;
+	_childObject = new Scene2247(_vm, this, which);
+	SetUpdateHandler(&Module2200::updateScene2247);
 }
 			
 void Module2200::createScene2248(int which) {
@@ -420,14 +531,12 @@ void Module2200::updateScene2203() {
 		_childObject = NULL;
 		if (_field20 == 1) {
 			createScene2205(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createScene2204(0);
-			_childObject->handleUpdate();
 		} else {
 			createScene2201(1);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
 	}
 }
 			
@@ -449,14 +558,12 @@ void Module2200::updateScene2205() {
 		_childObject = NULL;
 		if (_field20 == 1) {
 			createScene2206(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createScene2205(2);
-			_childObject->handleUpdate();
 		} else {
 			createScene2203(1);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
 	}
 }
 			
@@ -468,17 +575,14 @@ void Module2200::updateScene2206() {
 		_childObject = NULL;
 		if (_field20 == 1) {
 			createScene2247(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createScene2207(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 3) {
 			createScene2209(0);
-			_childObject->handleUpdate();
 		} else {
 			createScene2205(1);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
 	}
 }
 			
@@ -499,8 +603,123 @@ void Module2200::updateScene2208() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
-		// TODO
-		createScene2206(2);
+		// This is madness!
+		switch (_vm->gameState().which) {
+		case 4:
+			createScene2205(2);
+			break;
+		case 9:
+			createScene2210(2);
+			break;
+		case 10:
+			createScene2211(2);
+			break;
+		case 11:
+			createScene2212(2);
+			break;
+		case 12:
+			createScene2213(2);
+			break;
+		case 13:
+			createScene2214(2);
+			break;
+		case 14:
+			createScene2215(2);
+			break;
+		case 15:
+			createScene2216(2);
+			break;
+		case 16:
+			createScene2217(2);
+			break;
+		case 17:
+			createScene2218(2);
+			break;
+		case 18:
+			createScene2219(2);
+			break;
+		case 19:
+			createScene2220(2);
+			break;
+		case 20:
+			createScene2221(2);
+			break;
+		case 21:
+			createScene2222(2);
+			break;
+		case 22:
+			createScene2223(2);
+			break;
+		case 23:
+			createScene2224(2);
+			break;
+		case 24:
+			createScene2225(2);
+			break;
+		case 25:
+			createScene2226(2);
+			break;
+		case 26:
+			createScene2227(2);
+			break;
+		case 27:
+			createScene2228(2);
+			break;
+		case 28:
+			createScene2229(2);
+			break;
+		case 29:
+			createScene2230(2);
+			break;
+		case 30:
+			createScene2231(2);
+			break;
+		case 31:
+			createScene2232(2);
+			break;
+		case 32:
+			createScene2233(2);
+			break;
+		case 33:
+			createScene2234(2);
+			break;
+		case 34:
+			createScene2235(2);
+			break;
+		case 35:
+			createScene2236(2);
+			break;
+		case 36:
+			createScene2237(2);
+			break;
+		case 37:
+			createScene2238(2);
+			break;
+		case 38:
+			createScene2239(2);
+			break;
+		case 39:
+			createScene2240(2);
+			break;
+		case 40:
+			createScene2241(2);
+			break;
+		case 41:
+			createScene2242(2);
+			break;
+		case 42:
+			createScene2243(2);
+			break;
+		case 43:
+			createScene2244(2);
+			break;
+		case 44:
+			createScene2245(2);
+			break;
+		case 46:
+			createScene2247(2);
+			break;
+		}
 		_childObject->handleUpdate();
 	}
 }
@@ -517,99 +736,547 @@ void Module2200::updateScene2209() {
 }
 			
 void Module2200::updateScene2210() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2211(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2247(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2211() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2212(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2210(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2212() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2213(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2211(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2213() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2214(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2212(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2214() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2215(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2213(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2215() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2216(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2214(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2216() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2217(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2215(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2217() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2218(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2216(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2218() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2219(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2217(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2219() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2220(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2218(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2220() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2221(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2219(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2221() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2222(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2220(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2222() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2223(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2221(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2223() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2224(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2222(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2224() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2225(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2223(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2225() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2226(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2224(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2226() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2227(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2225(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2227() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2228(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2226(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2228() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2229(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2227(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2229() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2230(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2228(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2230() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2231(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2229(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2231() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2232(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2230(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2232() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2233(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2231(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2233() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2234(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2232(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2234() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2235(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2233(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2235() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2243(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2234(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2236() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2237(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2246(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2237() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2238(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2236(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2238() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2239(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2237(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2239() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2240(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2238(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2240() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2241(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2239(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2241() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2242(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2240(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2242() {
@@ -632,18 +1299,88 @@ void Module2200::updateScene2242() {
 }
 			
 void Module2200::updateScene2243() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2244(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2235(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2244() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2245(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2243(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2245() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2246(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2244(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2246() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2236(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2245(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2247() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene2210(0);
+		} else if (_field20 == 2) {
+			createScene2208(0);
+		} else {
+			createScene2206(1);
+		}
+		_childObject->handleUpdate();
+	}
 }
 			
 void Module2200::updateScene2248() {
@@ -1245,7 +1982,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2002:
 		_isTileMoving = false;
 		_doneMovingTileSprite = (Sprite*)sender;
-		if (param.asInteger() >= 0 && param.asInteger() <= 2) {
+		if (param.asInteger() <= 2) {
 			_surfacePriority = 100;
 		} else if (param.asInteger() >= 3 && param.asInteger() <= 5) {
 			_surfacePriority = 300;
@@ -1318,7 +2055,7 @@ static const uint32 kAsScene2203DoorFileHashes[] = {
 	0x1A488110
 };
 
-AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index)
+AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index)
 	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene),
 	_index(index) {
 
@@ -2101,7 +2838,7 @@ void AsScene2207Elevator::moveToY(int16 y) {
 	}	
 
 	if (_destPointIndex != _pointIndex) {
-		if (_destPointIndex == 0 || _destPointIndex == _pointArray->size() - 1) {
+		if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) {
 			_destPointIndexDelta = 0;
 		} else if (_destPointIndex < _pointIndex) {
 			_destPointIndexDelta = -2;
@@ -2116,12 +2853,73 @@ void AsScene2207Elevator::moveToY(int16 y) {
 
 }
 
-Class500::Class500(NeverhoodEngine *vm, Scene *parentScene)
+AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2207Lever::handleMessage);
+	createSurface(1010, 71, 73);
+	setDoDeltaX(doDeltaX);
+	setFileHash(0x80880090, 0, -1);
+	_newHashListIndex = 0;
+	_x = x;
+	_y = y;
+}
+
+uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x3002:
+		removeCallbacks();
+		setFileHash1();
+		break;
+	case 0x4807:
+		stLeverUp();
+		break;
+	case 0x480F:
+		stLeverDown();
+		break;
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 990, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1010, this);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2207Lever::stLeverDown() {
+	setFileHash(0x80880090, 1, -1);
+	setCallback1(AnimationCallback(&AsScene2207Lever::stLeverDownEvent));
+	_soundResource.play(0x40581882);
+}
+
+void AsScene2207Lever::stLeverDownEvent() {
+	_parentScene->sendMessage(0x480F, 0, this);
+}
+
+void AsScene2207Lever::stLeverUp() {
+	setFileHash(0x80880090, 6, -1);
+	setCallback1(AnimationCallback(&AsScene2207Lever::stLeverUpEvent));
+	_playBackwards = true;
+	_soundResource.play(0x40581882);
+}
+
+void AsScene2207Lever::stLeverUpEvent() {
+	_parentScene->sendMessage(0x4807, 0, this);
+}
+
+AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _soundResource4(vm), _flag1(true) {
+	_soundResource3(vm), _soundResource4(vm), _idle(true) {
 	
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class500::handleMessage);
+	SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage);
 	createSurface1(0xCCFD6090, 100);
 	_x = 309;
 	_y = 320;
@@ -2132,15 +2930,15 @@ Class500::Class500(NeverhoodEngine *vm, Scene *parentScene)
 	_soundResource4.load(0xD4226080);
 }
 
-Class500::~Class500() {
+AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
 	// TODO Sound1ChList_sub_407AF0(0x80D00820);
 }
 
-uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (!_flag1) {
+		if (!_idle) {
 			if (param.asInteger() == 0x3423093) {
 				// TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true);
 				// TODO Sound1ChList_playLooping(0x12121943);
@@ -2162,10 +2960,10 @@ uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity
 		}
 		break;
 	case 0x2006:
-		sub441D50();
+		stStartAnimation();
 		break;
 	case 0x2007:
-		sub441D90();
+		stStopAnimation();
 		break;
 	case 0x3002:
 		removeCallbacks();
@@ -2174,36 +2972,36 @@ uint32 Class500::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class500::sub441D50() {
-	if (!_flag1) {
+void AsScene2207WallRobotAnimation::stStartAnimation() {
+	if (!_idle) {
 		SetAnimationCallback3(NULL);
 	} else {
 		setFileHash(0xCCFD6090, 0, -1);
-		_flag1 = false;
+		_idle = false;
 		_surface->setVisible(true);
 	}
 }
 
-void Class500::sub441D90() {
-	SetAnimationCallback3(&Class500::sub441DA0);
+void AsScene2207WallRobotAnimation::stStopAnimation() {
+	SetAnimationCallback3(&AsScene2207WallRobotAnimation::cbStopAnimation);
 }
 
-void Class500::sub441DA0() {
+void AsScene2207WallRobotAnimation::cbStopAnimation() {
 	setFileHash1();
 	_soundResource1.stop();
 	_soundResource2.stop();
 	_soundResource3.stop();
 	_soundResource4.stop();
 	// TODO Sound1ChList_deleteSoundByHash(0x12121943);
-	_flag1 = true;
+	_idle = true;
 	_surface->setVisible(false);
 }
 
-Class501::Class501(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _flag1(true) {
+AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _idle(true) {
 	
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class501::handleMessage);
+	SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage);
 	createSurface1(0x8CAA0099, 100);
 	_x = 309;
 	_y = 320;
@@ -2211,14 +3009,14 @@ Class501::Class501(NeverhoodEngine *vm)
 	_newHashListIndex = 0;
 }
 
-uint32 Class501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2006:
-		sub441FA0();
+		stStartAnimation();
 		break;
 	case 0x2007:
-		sub441FE0();
+		stStopAnimation();
 		break;
 	case 0x3002:
 		removeCallbacks();
@@ -2227,27 +3025,27 @@ uint32 Class501::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class501::sub441FA0() {
-	if (!_flag1) {
+void AsScene2207WallCannonAnimation::stStartAnimation() {
+	if (!_idle) {
 		SetAnimationCallback3(NULL);
 	} else {
 		_surface->setVisible(true);
 		setFileHash(0x8CAA0099, 0, -1);
-		_flag1 = false;
+		_idle = false;
 	}
 }
 
-void Class501::sub441FE0() {
-	SetAnimationCallback3(&Class501::sub441FF0);
+void AsScene2207WallCannonAnimation::stStopAnimation() {
+	SetAnimationCallback3(&AsScene2207WallCannonAnimation::cbStopAnimation);
 }
 
-void Class501::sub441FF0() {
+void AsScene2207WallCannonAnimation::cbStopAnimation() {
 	setFileHash1();
 	_surface->setVisible(false);
-	_flag1 = true;
+	_idle = true;
 }
 
-Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index)
+SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index)
 	: StaticSprite(vm, fileHash, 100) {
 
 	_x = 330;
@@ -2257,13 +3055,13 @@ Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index)
 
 Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
-	_flag1(true), _elevatorSurfacePriority(0) {
-
-	_vm->gameModule()->initScene3009Vars();
+	_klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
 	//DEBUG
 	setGlobalVar(0x4D080E54, 1);
 
+	_vm->gameModule()->initScene3009Vars();
+
 	if (!getSubVar(0x40050052, 0x88460852))
 		setSubVar(0x40050052, 0x88460852, 1);
 
@@ -2293,21 +3091,21 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011));
 		_vm->_collisionMan->addSprite(_asTape); 
 	
-//		_class487 = addSprite(new Class487(_vm, this, 527, 333, 0));
-//		_vm->_collisionMan->addSprite(_class487);
+		_asLever = addSprite(new AsScene2207Lever(_vm, this, 527, 333, 0));
+		_vm->_collisionMan->addSprite(_asLever);
 		
-		_class500 = addSprite(new Class500(_vm, this));
-		_class501 = addSprite(new Class501(_vm));
+		_asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this));
+		_asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm));
 		
-		_class500->getSurface()->setVisible(false);
-		_class501->getSurface()->setVisible(false);
+		_asWallRobotAnimation->getSurface()->setVisible(false);
+		_asWallCannonAnimation->getSurface()->setVisible(false);
 
 		_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0));
 	
-//		_class487->getSurface()->getClipRect().x1 = 0;
-//		_class487->getSurface()->getClipRect().y1 = 0;
-//		_class487->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width;
-//		_class487->getSurface()->getClipRect().y2 = 480;
+		_asLever->getSurface()->getClipRect().x1 = 0;
+		_asLever->getSurface()->getClipRect().y1 = 0;
+		_asLever->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width;
+		_asLever->getSurface()->getClipRect().y2 = 480;
 	
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
@@ -2330,14 +3128,14 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 		_ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200));
 
-		addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
-		addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
-		addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2));
+		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
+		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
+		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2));
 
 		_asTape = NULL;
-		_class487 = NULL;
-		_class500 = NULL;
-		_class501 = NULL;
+		_asLever = NULL;
+		_asWallRobotAnimation = NULL;
+		_asWallCannonAnimation = NULL;
 		_ssButton = NULL;
 
 		_klayman->getSurface()->getClipRect().x1 = 0;
@@ -2371,7 +3169,7 @@ void Scene2207::update() {
 		_elevatorSurfacePriority = 0;
 	}
 	if (_klayman->getY() == 423) {
-		_flag1 = _klayman->getX() > 459 && _klayman->getX() < 525;
+		_klaymanAtElevator = _klayman->getX() > 459 && _klayman->getX() < 525;
 	}
 }
 
@@ -2380,7 +3178,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x0014F275) {
-			if (_flag1) {
+			if (_klaymanAtElevator) {
 				_asElevator->sendMessage(0x2000, _mouseClickPos.y, this);
 				_klayman->sendEntityMessage(0x1014, _asElevator, this);
 				_klayman->sendMessage(0x2001, 0, this);
@@ -2388,7 +3186,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 				messageList402220();
 			}
 		} else if (param.asInteger() == 0x34569073) {
-			if (_flag1) {
+			if (_klaymanAtElevator) {
 				_messageListFlag1 = true;
 				_asElevator->sendMessage(0x2000, 0, this);
 				_klayman->sendEntityMessage(0x1014, _asElevator, this);
@@ -2397,7 +3195,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 				messageList402220();
 			}
 		} else if (param.asInteger() == 0x4054C877) {
-			if (_flag1) {
+			if (_klaymanAtElevator) {
 				_asElevator->sendMessage(0x2000, 480, this);
 				_klayman->sendEntityMessage(0x1014, _asElevator, this);
 				_klayman->sendMessage(0x2001, 0, this);
@@ -2425,8 +3223,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		_messageListFlag1 = false;
 		break;
 	case 0x4807:
-		_class500->sendMessage(0x2007, 0, this);
-		_class501->sendMessage(0x2007, 0, this);
+		_asWallRobotAnimation->sendMessage(0x2007, 0, this);
+		_asWallCannonAnimation->sendMessage(0x2007, 0, this);
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
@@ -2440,10 +3238,10 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x480F:
-		_class500->sendMessage(0x2006, 0, this);
-		_class501->sendMessage(0x2006, 0, this);
-		_class500->getSurface()->setVisible(true);
-		_class501->getSurface()->setVisible(true);
+		_asWallRobotAnimation->sendMessage(0x2006, 0, this);
+		_asWallCannonAnimation->sendMessage(0x2006, 0, this);
+		_asWallRobotAnimation->getSurface()->setVisible(true);
+		_asWallCannonAnimation->getSurface()->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
@@ -2451,7 +3249,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 				_klayman->sendEntityMessage(0x1014, _asTape, this);
 				setMessageList(0x004B3958);
 			}
-		} else if (_flag1) {
+		} else if (_klaymanAtElevator) {
 			SetMessageHandler(&Scene2207::handleMessage2);
 			_asElevator->sendMessage(0x2000, 347, this);
 			_klayman->sendEntityMessage(0x1014, _asElevator, this);
@@ -2471,7 +3269,7 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Enti
 	case 0x2004:
 		SetMessageHandler(&Scene2207::handleMessage);
 		_klayman->sendMessage(0x2005, 0, this);
-//		_klayman->sendEntityMessage(0x1014, _class487, this);
+		_klayman->sendEntityMessage(0x1014, _asLever, this);
 		setMessageList(0x004B3920);
 		setRectList(0x004B3948);
 		break;
@@ -2653,7 +3451,7 @@ void Scene2208::drawRow(int16 rowIndex) {
 		sourceRect.width = 640;
 		sourceRect.height = 48;
 		_background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true);
-	} else if (rowIndex >= _maxRowIndex - 5) {
+	} else if (rowIndex > _maxRowIndex - 5) {
 		sourceRect.x = 0;
 		sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48;
 		sourceRect.width = 640;
@@ -2666,7 +3464,7 @@ void Scene2208::drawRow(int16 rowIndex) {
 		sourceRect.width = 640;
 		sourceRect.height = 48;
 		_background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true);
-		if (rowIndex < _strings.size()) {
+		if (rowIndex < (int)_strings.size()) {
 			const char *text = _strings[rowIndex];
 			// TODO/CHECKME: Use temporary string up to '{' character (see above)
 			_fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text);
@@ -2764,7 +3562,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x800C6694) {
-			sub4448D0();
+			readClickedColumn();
 		}
 		break;
 	case 0x4826:
@@ -2777,7 +3575,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-void Scene2242::sub4448D0() {
+void Scene2242::readClickedColumn() {
 	int index;
 	if (_mouseClickPos.x < 108) {
 		setGlobalVar(0xC8C28808, 0x04290188);
@@ -2790,7 +3588,7 @@ void Scene2242::sub4448D0() {
 		setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2"));
 		index = 1;
 	}
-	setGlobalVar(0x49C40058, (_mouseClickPos.x - 100) / 7);
+	setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
 	if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) {
 		setMessageList2(kScene2242MessageListIds1[index]);
 	} else {
@@ -2798,4 +3596,213 @@ void Scene2242::sub4448D0() {
 	}
 }
 
+static const int16 kHallOfRecordsKlaymanXPos[] = {
+	68, 
+	157, 
+	246, 
+	335, 
+	424, 
+	513, 
+	602
+};
+
+static const uint32 kHallOfRecordsSceneMessageListIds2[] = {
+	0x004B2978,
+	0x004B2998,
+	0x004B29B8,
+	0x004B29D8,
+	0x004B29F8,
+	0x004B2A18,
+	0x004B2A38
+};
+
+static const uint32 kHallOfRecordsSceneMessageListIds1[] = {
+	0x004B2A58,
+	0x004B2A80,
+	0x004B2AA8,
+	0x004B2AD0,
+	0x004B2AF8,
+	0x004B2B20,
+	0x004B2B48
+};
+
+HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id)
+	: Scene(vm, parentModule, true) {
+	
+	_sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id);
+
+	_surfaceFlag = true;
+	SetMessageHandler(&HallOfRecordsScene::handleMessage);
+	SetUpdateHandler(&Scene::update);
+
+	if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) {
+		setRectList(0x004B2BF8);
+		_background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename2, 0, 0));
+		_palette = new Palette(_vm, _sceneInfo140->bgFilename2);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
+	} else {
+		setRectList(0x004B2BB8);
+		_background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename1, 0, 0));
+		_palette = new Palette(_vm, _sceneInfo140->bgFilename1);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL));
+	}
+
+	if (which < 0) {
+		_klayman = new KmHallOfRecords(_vm, this, 200, 430);
+		setMessageList(0x004B2900);
+	} else if (which == 1) {
+		_klayman = new KmHallOfRecords(_vm, this, 640, 430);
+		setMessageList(0x004B2910);
+	} else if (which == 2) {
+		_klayman = new KmHallOfRecords(_vm, this, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
+		setMessageList(0x004B2B70);
+		if (getGlobalVar(0xC0418A02))
+			_klayman->setDoDeltaX(1);
+	} else {
+		_klayman = new KmHallOfRecords(_vm, this, 0, 430);
+		setMessageList(0x004B2908);
+	}
+	addSprite(_klayman);
+
+	_klayman->setSoundFlag(true);
+	_klayman->setKlaymanTable2();
+
+}
+
+HallOfRecordsScene::~HallOfRecordsScene() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x800C6694) {
+			readClickedColumn();
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void HallOfRecordsScene::readClickedColumn() {
+	int16 index = (_mouseClickPos.x - 23) / 89;
+	if (index >= _sceneInfo140->count) {
+		setMessageList2(0x004B2920);
+	} else {
+		setGlobalVar(0x48A68852, _sceneInfo140->xPosIndex + index);
+		setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
+		setGlobalVar(0xC8C28808, _sceneInfo140->txFilename);
+		if (index == 0 && _sceneInfo140->bgFilename3) {
+			setGlobalVar(0x4CE79018, _sceneInfo140->bgFilename3);
+		} else {
+			setGlobalVar(0x4CE79018, 0);
+		}
+		if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) {
+			setMessageList2(kHallOfRecordsSceneMessageListIds1[index]);
+		} else {
+			setMessageList2(kHallOfRecordsSceneMessageListIds2[index]);
+		}
+	}
+}
+
+static const int16 kScene2247XPositions[] = {
+	513,
+	602
+};
+
+static const uint32 kScene2247MessageListIds2[] = {
+	0x004B54A0,
+	0x004B54C0
+};
+
+static const uint32 kScene2247MessageListIds1[] = {
+	0x004B54E0,
+	0x004B5508
+};
+
+Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	//DEBUG
+	setGlobalVar(0x4D080E54, 1);
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2247::handleMessage);
+	SetUpdateHandler(&Scene::update);
+
+	if (getGlobalVar(0x4D080E54)) {
+		setRectList(0x004B5588);
+		_background = addBackground(new DirtyBackground(_vm, 0x40339414, 0, 0));
+		_palette = new Palette(_vm, 0x40339414);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL));
+	} else {
+		setRectList(0x004B55C8);
+		_background = addBackground(new DirtyBackground(_vm, 0x071963E5, 0, 0));
+		_palette = new Palette(_vm, 0x071963E5);
+		_palette->usePalette();
+		_mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
+	}
+
+	if (which < 0) {
+		_klayman = new KmScene2247(_vm, this, 200, 430);
+		setMessageList(0x004B5428);
+	} else if (which == 1) {
+		_klayman = new KmScene2247(_vm, this, 640, 430);
+		setMessageList(0x004B5438);
+	} else if (which == 2) {
+		_klayman = new KmScene2247(_vm, this, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
+		if (getGlobalVar(0xC0418A02))
+			_klayman->setDoDeltaX(1);
+		setMessageList(0x004B5530);
+	} else {
+		_klayman = new KmScene2247(_vm, this, 0, 430);
+		setMessageList(0x004B5430);
+	}
+	addSprite(_klayman);
+
+	_klayman->setSoundFlag(true);
+	
+}
+
+Scene2247::~Scene2247() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	// TODO: Debug stuff
+	case 0x100D:
+		if (param.asInteger() == 0x800C6694) {
+			readClickedColumn();
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2247::readClickedColumn() {
+	int index;
+	if (_mouseClickPos.x < 553) {
+		setGlobalVar(0xC8C28808, 0x0008E486);
+		setGlobalVar(0x4CE79018, calcHash("bgFatherHeader"));
+		index = 0;
+	} else {
+		setGlobalVar(0xC8C28808, 0x03086004);
+		setGlobalVar(0x4CE79018, calcHash("bgQuaterHeader"));
+		index = 1;
+	}
+	setGlobalVar(0x48A68852, 0);
+	setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
+	if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) {
+		setMessageList2(kScene2247MessageListIds1[index]);
+	} else {
+		setMessageList2(kScene2247MessageListIds2[index]);
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index d06f30b..4dfd827 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -259,12 +259,12 @@ protected:
 
 class AsScene2203Door : public AnimatedSprite {
 public:
-	AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index);
+	AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index);
 protected:
 	Scene *_parentScene;
 	SoundResource _soundResource;
 	Sprite *_otherDoor;
-	int _index;
+	uint _index;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void openDoor();
 	void closeDoor();
@@ -371,36 +371,49 @@ protected:
 	void moveToY(int16 y);
 };
 
-class Class500 : public AnimatedSprite {
+class AsScene2207Lever : public AnimatedSprite {
 public:
-	Class500(NeverhoodEngine *vm, Scene *parentScene);
-	~Class500();
+	AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stLeverDown();
+	void stLeverDownEvent();
+	void stLeverUp();
+	void stLeverUpEvent();
+};
+
+class AsScene2207WallRobotAnimation : public AnimatedSprite {
+public:
+	AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene);
+	~AsScene2207WallRobotAnimation();
 protected:
 	SoundResource _soundResource1;
 	SoundResource _soundResource2;
 	SoundResource _soundResource3;
 	SoundResource _soundResource4;
-	bool _flag1;
+	bool _idle;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub441D50();
-	void sub441D90();
-	void sub441DA0();
+	void stStartAnimation();
+	void stStopAnimation();
+	void cbStopAnimation();
 };
 
-class Class501 : public AnimatedSprite {
+class AsScene2207WallCannonAnimation : public AnimatedSprite {
 public:
-	Class501(NeverhoodEngine *vm);
+	AsScene2207WallCannonAnimation(NeverhoodEngine *vm);
 protected:
-	bool _flag1;
+	bool _idle;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub441FA0();
-	void sub441FE0();
-	void sub441FF0();
+	void stStartAnimation();
+	void stStopAnimation();
+	void cbStopAnimation();
 };
 
-class Class597 : public StaticSprite {
+class SsScene2207Symbol : public StaticSprite {
 public:
-	Class597(NeverhoodEngine *vm, uint32 fileHash, int index);
+	SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index);
 };
 
 class Scene2207 : public Scene {
@@ -414,12 +427,12 @@ protected:
 	Sprite *_ssMaskPart2;
 	Sprite *_ssMaskPart3;
 	Sprite *_asTape;
-	Sprite *_class487;
-	Sprite *_class500;
-	Sprite *_class501;
+	Sprite *_asLever;
+	Sprite *_asWallRobotAnimation;
+	Sprite *_asWallCannonAnimation;
 	Sprite *_ssButton;
 	int _elevatorSurfacePriority;
-	bool _flag1;
+	bool _klaymanAtElevator;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage2(int messageNum, const MessageParam &param, Entity *sender);
@@ -457,7 +470,26 @@ protected:
 	bool _isKlaymanInLight;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub4448D0();
+	void readClickedColumn();
+};
+
+class HallOfRecordsScene : public Scene {
+public:
+	HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id);
+	~HallOfRecordsScene();
+protected:
+	SceneInfo140 *_sceneInfo140;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void readClickedColumn();
+};
+
+class Scene2247 : public Scene {
+public:
+	Scene2247(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene2247();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void readClickedColumn();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 2a01bc2..8192216 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -234,7 +234,6 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		// TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
 		break;
 	case 1: // mouse clicked
-		debug("mouse clicked");
 		_mouseClicked = true;
 		_mouseClickPos = param.asPoint();
 		break;
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 42af497..d897d7a 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -125,6 +125,21 @@ void StaticData::load(const char *filename) {
 		_navigationLists[id] = navigationList;
 	}
 
+	// Load SceneInfo140 items
+	uint32 sceneInfo140ItemsCount = fd.readUint32LE();
+	debug("sceneInfo140ItemsCount: %d", sceneInfo140ItemsCount);
+	for (uint32 i = 0; i < sceneInfo140ItemsCount; i++) {
+		SceneInfo140 *sceneInfo140 = new SceneInfo140();
+		uint32 id = fd.readUint32LE();
+		sceneInfo140->bgFilename1 = fd.readUint32LE();
+		sceneInfo140->bgFilename2 = fd.readUint32LE();
+		sceneInfo140->txFilename = fd.readUint32LE();
+		sceneInfo140->bgFilename3 = fd.readUint32LE();
+		sceneInfo140->xPosIndex = fd.readByte();
+		sceneInfo140->count = fd.readByte();
+		_sceneInfo140Items[id] = sceneInfo140;
+	}
+
 }
 
 HitRectList *StaticData::getHitRectList(uint32 id) {
@@ -151,4 +166,10 @@ NavigationList *StaticData::getNavigationList(uint32 id) {
 	return _navigationLists[id];
 }
 
+SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) {
+	if (!_sceneInfo140Items[id])
+		error("StaticData::getSceneInfo140Item() SceneInfo140 with id %08X not found", id);
+	return _sceneInfo140Items[id];
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index c19c060..2a0cc90 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -68,6 +68,15 @@ struct NavigationItem {
 
 typedef Common::Array<NavigationItem> NavigationList;
 
+struct SceneInfo140 {
+	uint32 bgFilename1;
+	uint32 bgFilename2;
+	uint32 txFilename;
+	uint32 bgFilename3;
+	byte xPosIndex;
+	byte count;
+};
+
 class StaticData {
 public:
 	StaticData();
@@ -77,11 +86,13 @@ public:
 	RectList *getRectList(uint32 id);
 	MessageList *getMessageList(uint32 id);
 	NavigationList *getNavigationList(uint32 id);
+	SceneInfo140 *getSceneInfo140Item(uint32 id);
 protected:
 	Common::HashMap<uint32, HitRectList*> _hitRectLists;
 	Common::HashMap<uint32, RectList*> _rectLists;
 	Common::HashMap<uint32, MessageList*> _messageLists;
 	Common::HashMap<uint32, NavigationList*> _navigationLists;
+	Common::HashMap<uint32, SceneInfo140*> _sceneInfo140Items;
 };
 
 } // End of namespace Neverhood


Commit: 5214284271d0ae050e5f33fe66d0fc0b8cbb94af
    https://github.com/scummvm/scummvm/commit/5214284271d0ae050e5f33fe66d0fc0b8cbb94af
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1302

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 1efc616..2d11931 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -87,6 +87,7 @@ struct HitRect {
 	uint16 messageNum;
 	
 	void load(uint32 offset) {
+		printf("Loading HitRect @ %08X...\n", offset);
 		byte *item = getData(offset);
 		x1 = READ_LE_UINT16(item + 0);
 		y1 = READ_LE_UINT16(item + 2);
@@ -116,6 +117,7 @@ struct MessageItem {
 	MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {}
 	
 	void load(uint32 offset) {
+		printf("Loading MessageItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		messageNum = READ_LE_UINT16(item + 0);
 		messageParam = READ_LE_UINT32(item + 4);
@@ -138,6 +140,7 @@ struct SubRectItem {
 	uint32 messageListOffset;
 
 	void load(uint32 offset) {
+		printf("Loading SubRectItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		x1 = READ_LE_UINT16(item + 0);
 		y1 = READ_LE_UINT16(item + 2);
@@ -170,6 +173,7 @@ struct RectItem {
 	std::vector<SubRectItem> subRectItems;
 
 	void load(uint32 offset) {
+		printf("Loading RectItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		uint32 subItemOffset;
 		x1 = READ_LE_UINT16(item + 0);
@@ -213,6 +217,7 @@ struct NavigationItem {
 	uint32 mouseCursorFileHash;
 	
 	void load(uint32 offset) {
+		printf("Loading NavigationItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		fileHash = READ_LE_UINT32(item + 0); 
 		leftSmackerFileHash = READ_LE_UINT32(item + 4);
@@ -240,6 +245,7 @@ struct NavigationItem {
 };
 
 struct SceneInfo140Item {
+	uint32 id;
 	uint32 bgFilename1;
 	uint32 bgFilename2;
 	uint32 txFilename;
@@ -249,6 +255,7 @@ struct SceneInfo140Item {
 
 	void load(uint32 offset) {
 		byte *item = getData(offset);
+		id = offset;
 		// Only save the hashes instead of the full names
 		bgFilename1 = calcHash(getStringP(READ_LE_UINT32(item + 0)));
 		bgFilename2 = calcHash(getStringP(READ_LE_UINT32(item + 4)));
@@ -259,6 +266,7 @@ struct SceneInfo140Item {
 	}
 
 	void save(FILE *fd) {
+		writeUint32LE(fd, id);
 		writeUint32LE(fd, bgFilename1);
 		writeUint32LE(fd, bgFilename2);
 		writeUint32LE(fd, txFilename);
@@ -353,6 +361,30 @@ public:
 			add(MessageItem(0x100D, 0x42845B19));
 			add(MessageItem(0x4805, 1));
 			return true;
+		// Scene 1302 rings
+		case 0x004B0888:
+			add(MessageItem(0x4800, 218));
+			add(MessageItem(0x100D, 0x4A845A00));
+			add(MessageItem(0x4805, 1));
+			return true;
+		case 0x004B08A0:
+			add(MessageItem(0x4800, 218 + 32));
+			add(MessageItem(0x100D, 0x43807801));
+			return true;
+		case 0x004B08B0:
+			add(MessageItem(0x4800, 218 + 32 + 32));
+			add(MessageItem(0x100D, 0x46C26A01));
+			add(MessageItem(0x4805, 1));
+			return true;
+		case 0x004B08C8:
+			add(MessageItem(0x4800, 218 + 32 + 32 + 32));
+			add(MessageItem(0x100D, 0x468C7B11));
+			return true;
+		case 0x004B08D8:
+			add(MessageItem(0x4800, 218 + 32 + 32 + 32 + 32));
+			add(MessageItem(0x100D, 0x42845B19));
+			add(MessageItem(0x4805, 4));
+			return true;
 		}
 		return false;
 	}
@@ -360,7 +392,6 @@ public:
 };
 
 class NavigationList : public StaticDataList<NavigationItem> {
-
 };
 
 template<class LISTCLASS>
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 5f54df9..7f80b8c 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -27,6 +27,8 @@ static const uint32 hitRectListOffsets[] = {
 	1, 0x004B4138,
 	// Scene1201
 	4, 0x004AEBD0,
+	// Scene1302
+	1, 0x004B0858,
 	// Scene1705
 	1, 0x004B69D8,
 	// Scene2203
@@ -51,6 +53,8 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004AEDC8,
 	1, 0x004AEE18,
 	1, 0x004AED88,
+	// Scene1302
+	2, 0x004B0A38,
 	// Scene1401
 	1, 0x004B6758,
 	// Scene1402
@@ -78,6 +82,12 @@ static const uint32 rectListOffsets[] = {
 	// Scene2242
 	1, 0x004B3DC8,
 	1, 0x004B3E18,
+	// HallOfRecordsScene
+	1, 0x004B2BF8,
+	1, 0x004B2BB8,
+	// Scene2247
+	1, 0x004B5588,
+	1, 0x004B55C8,
 	0, 0
 };
 
@@ -123,6 +133,18 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004AECD0,
 	2, 0x004AECE0,
 	2, 0x004AED38,
+	// Scene1302
+	4, 0x004B08F0,
+	3, 0x004B0920,
+	1, 0x004B0950,
+	2, 0x004B0940,
+	1, 0x004B0938,
+	2, 0x004B0910,
+	1, 0x004B0968,
+	2, 0x004B0878,
+	4, 0x004B0978,
+	1, 0x004B0870,
+	1, 0x004B0868,
 	// Scene1401
 	1, 0x004B65C8,
 	1, 0x004B65D0,
@@ -235,10 +257,45 @@ static const uint32 messageListOffsets[] = {
 	5, 0x004B3D20,
 	4, 0x004B3CB8,
 	4, 0x004B3CD8,
+	// HallOfRecordsScene
+	1, 0x004B2900,
+	2, 0x004B2910,
+	1, 0x004B2B70,
+	1, 0x004B2908,
+	2, 0x004B2920,
+	4, 0x004B2978,
+	4, 0x004B2998,
+	4, 0x004B29B8,
+	4, 0x004B29D8,
+	4, 0x004B29F8,
+	4, 0x004B2A18,
+	4, 0x004B2A38,
+	5, 0x004B2A58,
+	5, 0x004B2A80,
+	5, 0x004B2AA8,
+	5, 0x004B2AD0,
+	5, 0x004B2AF8,
+	5, 0x004B2B20,
+	5, 0x004B2B48,
+	// Scene2247
+	1, 0x004B5428,
+	2, 0x004B5438,
+	1, 0x004B5530,
+	1, 0x004B5430,
+	4, 0x004B54A0,
+	4, 0x004B54C0,
+	5, 0x004B54E0,
+	5, 0x004B5508,
 	0, 0
 };
 
 static const uint32 navigationListOffsets[] = {
+	// Module1300
+	6, 0x004B2718,
+	2, 0x004B27A8,
+	2, 0x004B27D8,
+	2, 0x004B2808,
+	2, 0x004B2838,
 	// Module1700
 	2, 0x004AE8B8,
 	3, 0x004AE8E8,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index d217943..decb83b 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: d4030b7a9ffc2a907c80948024f3ee369a08c760
    https://github.com/scummvm/scummvm/commit/d4030b7a9ffc2a907c80948024f3ee369a08c760
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Start with Module1300 and implement Scene1302

Changed paths:
  A engines/neverhood/module1300.cpp
  A engines/neverhood/module1300.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 31330f9..f4159f3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -25,6 +25,7 @@
 #include "neverhood/graphics.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
+#include "neverhood/module1300.h"
 #include "neverhood/module1400.h"
 #include "neverhood/module1500.h"
 #include "neverhood/module1700.h"
@@ -241,10 +242,14 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule2000(-1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 46;
 	createModule2200(-1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 1;
+	createModule1300(-1);
+#endif
 }
 
 void GameModule::createModule1000(int which) {
@@ -292,6 +297,30 @@ void GameModule::updateModule1200() {
 	}
 }
 
+void GameModule::createModule1300(int which) {
+	setGlobalVar(0x91080831, 0x0061C090);
+	_childObject = new Module1300(_vm, this, which);
+	SetUpdateHandler(&GameModule::updateModule1300);
+}
+
+void GameModule::updateModule1300() {
+	if (!_childObject)
+		return;
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			// TODO _gameState.clear();
+			// TODO GameModule_handleKeyEscape
+		} else {
+			// TODO createModule2900(0);
+			_childObject->handleUpdate();
+		}
+	}
+}
+
 void GameModule::createModule1400(int which) {
 	setGlobalVar(0x91080831, 0x00AD0012);
 	_childObject = new Module1400(_vm, this, which);
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 9ef1b92..ef199f7 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -55,6 +55,8 @@ protected:
 	void updateModule1000();
 	void createModule1200(int which);
 	void updateModule1200();
+	void createModule1300(int which);
+	void updateModule1300();
 	void createModule1400(int which);
 	void updateModule1400();
 	void createModule1500(int which);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 9122eaf..1b4d6e4 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -13,6 +13,7 @@ MODULE_OBJS = \
 	module.o \
 	module1000.o \
 	module1200.o \
+	module1300.o \
 	module1400.o \
 	module1500.o \
 	module1700.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 3387e2e..5e1ae6f 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1045,7 +1045,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 
-	if (!flag) {
+	if (!_flag) {
 		if (getGlobalVar(0x8306F218)) {
 			setDoDeltaX(1);
 			_x = 366;
@@ -1110,7 +1110,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 		break;
 	case 0x480B:
 		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
-		if (_flag) {
+		if (!_flag) {
 			if (getGlobalVar(0x8306F218)) {
 				sub448560();
 			} else {
@@ -1143,7 +1143,6 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 		}
 		break;
 	case 0x4810:
-	debug("trap collision");
 		sub448780();
 		break;
 	case 0x482A:
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
new file mode 100644
index 0000000..7c7beb7
--- /dev/null
+++ b/engines/neverhood/module1300.cpp
@@ -0,0 +1,664 @@
+/* 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/module1300.h"
+#include "neverhood/module1000.h"
+#include "neverhood/diskplayerscene.h"
+#include "neverhood/navigationscene.h"
+#include "neverhood/smackerscene.h"
+
+namespace Neverhood {
+
+Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	debug("Create Module1300(%d)", which);
+
+	// TODO Music18hList_add(0x61C090, 0x203197);
+	// TODO Sound1ChList_addSoundResources(0x61C090, dword_4B2868, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, 0, 50, 600, 20, 150);
+	// TODO Sound1ChList_sub_407C70(0x61C090, 0x48498E46, 0x50399F64, 0);
+	// TODO Sound1ChList_setVolume(0x48498E46, 70);
+	// TODO Sound1ChList_setVolume(0x50399F64, 70);
+
+	if (which < 0) {
+		switch (_vm->gameState().sceneNum) {
+		case 1:
+			createScene1302(-1);
+			break;
+		case 2:
+			createScene1303(-1);
+			break;
+		case 3:
+			createScene1304(-1);
+			break;
+		case 4:
+			createScene1305(-1);
+			break;
+		case 5:
+			createScene1306(-1);
+			break;
+		case 6:
+			createScene1307(-1);
+			break;
+		case 7:
+			createScene1308(-1);
+			break;
+		case 8:
+			createScene1309(-1);
+			break;
+		case 9:
+			createScene1310(-1);
+			break;
+		case 10:
+			createScene1311(-1);
+			break;
+		case 11:
+			createScene1312(-1);
+			break;
+		case 12:
+			createScene1313(-1);
+			break;
+		case 13:
+			createScene1314(-1);
+			break;
+		case 14:
+			createScene1315(-1);
+			break;
+		case 15:
+			createScene1316(-1);
+			break;
+		case 16:
+			createScene1317(-1);
+			break;
+		case 17:
+			createScene1318(-1);
+			break;
+		default:
+			createScene1312(0);
+		}
+	} else {
+		switch (which) {
+		case 0:
+			createScene1312(0);
+			break;
+		case 1:
+			createScene1314(0);
+			break;
+		case 2:
+			createScene1315(0);
+			break;
+		case 3:
+			createScene1316(0);
+			break;
+		case 4:
+			createScene1308(0);
+			break;
+		case 5:
+			createScene1306(1);
+			break;
+		case 6:
+			createScene1306(5);
+			break;
+		case 7:
+			createScene1304(0);
+			break;
+		case 8:
+			createScene1302(0);
+			break;
+		case 9:
+			createScene1303(0);
+			break;
+		case 10:
+			createScene1307(0);
+			break;
+		case 11:
+			createScene1305(0);
+			break;
+		default:
+			createScene1313(0);
+			break;
+		}
+	}
+	
+}
+
+Module1300::~Module1300() {
+	// TODO Sound1ChList_sub_407A50(0x61C090);
+}
+
+void Module1300::createScene1302(int which) {
+	_vm->gameState().sceneNum = 1;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_play(0x203197, 0, 2, 1);
+	_childObject = new Scene1302(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1302);
+}
+			
+void Module1300::createScene1303(int which) {
+}
+			
+void Module1300::createScene1304(int which) {
+}
+			
+void Module1300::createScene1305(int which) {
+}
+			
+void Module1300::createScene1306(int which) {
+}
+			
+void Module1300::createScene1307(int which) {
+}
+			
+void Module1300::createScene1308(int which) {
+}
+			
+void Module1300::createScene1309(int which) {
+}
+			
+void Module1300::createScene1310(int which) {
+}
+			
+void Module1300::createScene1311(int which) {
+}
+			
+void Module1300::createScene1312(int which) {
+	_vm->gameState().sceneNum = 11;
+	createNavigationScene(0x004B27A8, which);
+	SetUpdateHandler(&Module1300::updateScene1312);
+	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+}
+			
+void Module1300::createScene1313(int which) {
+	_vm->gameState().sceneNum = 12;
+	createNavigationScene(0x004B2718, which);
+	SetUpdateHandler(&Module1300::updateScene1313);
+	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+}
+			
+void Module1300::createScene1314(int which) {
+	_vm->gameState().sceneNum = 13;
+	createNavigationScene(0x004B27D8, which);
+	SetUpdateHandler(&Module1300::updateScene1314);
+	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+}
+			
+void Module1300::createScene1315(int which) {
+	_vm->gameState().sceneNum = 14;
+	createNavigationScene(0x004B2808, which);
+	SetUpdateHandler(&Module1300::updateScene1315);
+	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+}
+			
+void Module1300::createScene1316(int which) {
+	_vm->gameState().sceneNum = 15;
+	createNavigationScene(0x004B2838, which);
+	SetUpdateHandler(&Module1300::updateScene1316);
+	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+}
+			
+void Module1300::createScene1317(int which) {
+}
+			
+void Module1300::createScene1318(int which) {
+}
+			
+void Module1300::updateScene1302() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 1) {
+			createScene1305(0);
+		} else {
+			createScene1308(1);
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1300::updateScene1303() {
+}
+
+void Module1300::updateScene1304() {
+}
+
+void Module1300::updateScene1305() {
+}
+
+void Module1300::updateScene1306() {
+}
+
+void Module1300::updateScene1307() {
+}
+
+void Module1300::updateScene1308() {
+}
+
+void Module1300::updateScene1309() {
+}
+
+void Module1300::updateScene1310() {
+}
+
+void Module1300::updateScene1311() {
+}
+
+void Module1300::updateScene1312() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1313(0);
+		} else if (_field20 == 1) {
+			createScene1312(1);
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1300::updateScene1313() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		switch (_field20) {
+		case 0:
+			createScene1315(1);
+			break;
+		case 1:
+			createScene1316(1);
+			break;
+		case 3:
+			createScene1312(1);
+			break;
+		case 5:
+			createScene1314(1);
+			break;
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1300::updateScene1314() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1313(2);
+		} else if (_field20 == 1) {
+			createScene1308(0);
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1300::updateScene1315() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1313(3);
+		} else if (_field20 == 1) {
+			createScene1310(-1);
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1300::updateScene1316() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1313(4);
+		} else if (_field20 == 1) {
+			createScene1304(0);
+		}
+		_childObject->handleUpdate();
+	}
+}
+
+void Module1300::updateScene1317() {
+}
+
+void Module1300::updateScene1318() {
+}
+
+AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x88148150, 500);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1302Bridge::handleMessage);
+	if (!getGlobalVar(0x13206309)) {
+		setFileHash(0x88148150, 0, -1);
+		_newHashListIndex = 0;
+	} else {
+		setFileHash(0x88148150, -1, -1);
+		_newHashListIndex = -2;
+	}
+	_soundResource1.load(0x68895082);
+	_soundResource2.load(0x689BD0C1);
+}
+
+uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		stLowerBridge();
+		break;
+	case 0x4809:
+		stRaiseBridge();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1302Bridge::stLowerBridge() {
+	setFileHash(0x88148150, 0, -1);
+	SetAnimationCallback3(&AsScene1302Bridge::cbLowerBridgeEvent);
+	_soundResource2.play();
+}
+
+void AsScene1302Bridge::stRaiseBridge() {
+	setFileHash(0x88148150, 7, -1);
+	_playBackwards = true;
+	_newHashListIndex = 0;
+	_soundResource1.play();
+}
+
+void AsScene1302Bridge::cbLowerBridgeEvent() {
+	_parentScene->sendMessage(0x2032, 0, this);
+	setFileHash(0x88148150, -1, -1);
+	_newHashListIndex = -2;
+}
+
+SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
+	: StaticSprite(vm, 0x11122122, 200), _soundResource1(vm), _soundResource2(vm) {
+	
+	SetUpdateHandler(&SsScene1302Fence::update);
+	SetMessageHandler(&SsScene1302Fence::handleMessage);
+	SetSpriteCallback(NULL);
+	_firstY = _y;
+	if (getGlobalVar(0x80101B1E))
+		_y += 152;
+	_soundResource1.load(0x7A00400C);
+	_soundResource2.load(0x78184098);
+}
+
+void SsScene1302Fence::update() {
+	handleSpriteUpdate();
+	StaticSprite::update();
+}
+
+uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4808:
+		_soundResource1.play();
+		SetSpriteCallback(&SsScene1302Fence::suMoveDown);
+		SetMessageHandler(NULL);
+		break;
+	case 0x4809:
+		_soundResource2.play();
+		SetSpriteCallback(&SsScene1302Fence::suMoveUp);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+void SsScene1302Fence::suMoveDown() {
+	if (_y < _firstY + 152)
+		_y += 8;
+	else {
+		SetMessageHandler(&SsScene1302Fence::handleMessage);
+		SetSpriteCallback(NULL);
+	}
+}
+
+void SsScene1302Fence::suMoveUp() {
+	if (_y > _firstY)
+		_y -= 8;
+	else {
+		SetMessageHandler(&SsScene1302Fence::handleMessage);
+		SetSpriteCallback(NULL);
+	}
+}
+
+Class595::Class595(NeverhoodEngine *vm, Scene *parentScene)
+	: StaticSprite(vm, 0xB0420130, 1015), _parentScene(parentScene) {
+
+	SetMessageHandler(&Class595::handleMessage);
+}
+
+uint32 Class595::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x482A:
+		_parentScene->sendMessage(0x1022, 995, this);
+		break;
+	case 0x482B:
+		_parentScene->sendMessage(0x1022, 1015, this);
+		break;
+	}
+	return messageResult;
+}
+
+Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm) {
+
+	SetMessageHandler(&Scene1302::handleMessage);
+	_vm->_collisionMan->setHitRects(0x004B0858);
+	setRectList(0x004B0A38);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x420643C4, 0, 0));
+	_palette = new Palette(_vm, 0x420643C4);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL));
+
+	_class595 = addSprite(new Class595(_vm, this));
+	_sprite1 = addSprite(new StaticSprite(_vm, 0x942FC224, 300));
+	_sprite2 = addSprite(new StaticSprite(_vm, 0x70430830, 1200));
+	_sprite2->getSurface()->setVisible(false);
+	_sprite3 = addSprite(new StaticSprite(_vm, 0x16E01E20, 1100));
+
+	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false));
+	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x13206309)));
+	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getSurface()->getDrawRect().y, false));
+	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x80101B1E)));
+	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getSurface()->getDrawRect().y, false));
+
+	_asBridge = addSprite(new AsScene1302Bridge(_vm, this));
+	_ssFence = addSprite(new SsScene1302Fence(_vm));
+	_ssFence->getSurface()->getClipRect().x1 = 0;
+	_ssFence->getSurface()->getClipRect().y1 = 0;
+	_ssFence->getSurface()->getClipRect().x2 = 640;
+	_ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
+
+	if (which < 0) {
+		_klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364);
+		setMessageList(0x004B0868);
+	} else {
+		_klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330);
+		setMessageList(0x004B0870);
+	}
+	addSprite(_klayman);
+
+	_klayman->getSurface()->getClipRect().x1 = 0;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+
+	_asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true));
+	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
+
+	_klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this);
+	
+}
+
+uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4A845A00) {
+			_klayman->sendEntityMessage(0x1014, _asRing1, this);
+		} else if (param.asInteger() == 0x43807801) {
+			if (!getGlobalVar(0x13206309)) {
+				_klayman->sendEntityMessage(0x1014, _asRing2, this);
+				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) {
+					setMessageList(0x004B0940);
+				} else {
+					setMessageList(0x004B0938);
+				}
+			} else {
+				setMessageList(0x004B0950);
+			}
+			messageResult = 1;
+		} else if (param.asInteger() == 0x46C26A01) {
+			_klayman->sendEntityMessage(0x1014, _asRing3, this);
+		} else if (param.asInteger() == 0x468C7B11) {
+			if (!getGlobalVar(0x80101B1E)) {
+				_klayman->sendEntityMessage(0x1014, _asRing4, this);
+				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) {
+					setMessageList(0x004B0940);
+				} else {
+					setMessageList(0x004B0938);
+				}
+			} else {
+				setMessageList(0x004B0950);
+			}
+			messageResult = 1;
+		} else if (param.asInteger() == 0x42845B19) {
+			_klayman->sendEntityMessage(0x1014, _asRing5, this);
+		} else if (param.asInteger() == 0x430A6060) {
+			if (getGlobalVar(0x13206309)) {
+				setMessageList2(0x004B0910);
+			} else {
+				messageList402220();
+			}
+		} else if (param.asInteger() == 0x012E2070) {
+			if (getGlobalVar(0x13206309)) {
+				setMessageList2(0x004B0968);
+			} else {
+				messageList402220();
+			}
+		} else if (param.asInteger() == 0x11C40840) {
+			if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) {
+				setMessageList(0x004B0878);
+			} else {
+				setMessageList(0x004B0978);
+			}
+		}
+		break;
+	case 0x2000:
+		if (_klayman->getY() > 360) {
+			_klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this);
+			setMessageList2(0x004B08F0);	
+		} else {
+			setMessageList2(0x004B0920);
+		}
+		break;
+	case 0x2002:
+		if (_klayman->getX() > 545) {
+			_parentModule->sendMessage(0x1009, 1, this);
+		}
+		break;
+	case 0x2032:
+		_sprite2->getSurface()->setVisible(true);
+		break;
+	case 0x4806:
+		_parentModule->sendMessage(0x1024, 2, this);
+		if (sender == _asRing1) {
+			_soundResource.play(0x665198C0);
+		} else if (sender == _asRing2) {
+			_asBridge->sendMessage(0x4808, 0, this);
+			setGlobalVar(0x13206309, 1);
+		} else if (sender == _asRing3) {
+			_soundResource.play(0xE2D389C0);
+		} else if (sender == _asRing4) {
+			_ssFence->sendMessage(0x4808, 0, this);
+			setGlobalVar(0x80101B1E, 1);
+		} else if (sender == _asRing5) {
+			_soundResource.play(0x40428A09);
+		}
+		break;
+	case 0x4807:
+		if (sender == _asRing2) {
+			_asBridge->sendMessage(0x4809, 0, this);
+			setGlobalVar(0x13206309, 0);
+			_sprite2->getSurface()->setVisible(false);
+		} else if (sender == _asRing4) {
+			_ssFence->sendMessage(0x4809, 0, this);
+			setGlobalVar(0x80101B1E, 0);
+		} else if (sender == _asVenusFlyTrap) {
+			if (getGlobalVar(0x13206309)) {
+				_asRing2->sendMessage(0x4807, 0, this);
+			} else {
+				_asRing4->sendMessage(0x4807, 0, this);
+			}
+		}
+		break;
+	case 0x480F:
+		if (sender == _asRing2) {
+			_soundResource.play(0x60755842);
+			_asBridge->sendMessage(0x4808, 0, this);
+			setGlobalVar(0x13206309, 1);
+		} else if (sender == _asRing4) {
+			_soundResource.play(0x60755842);
+			_ssFence->sendMessage(0x4808, 0, this);
+			setGlobalVar(0x80101B1E, 1);
+		}
+		break;
+	case 0x482A:
+		_asVenusFlyTrap->sendMessage(0x482B, 0, this);
+		break;
+	case 0x482B:
+		_asVenusFlyTrap->sendMessage(0x482A, 0, this);
+		break;
+	}
+	return messageResult;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
new file mode 100644
index 0000000..25dde46
--- /dev/null
+++ b/engines/neverhood/module1300.h
@@ -0,0 +1,132 @@
+/* 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_MODULE1300_H
+#define NEVERHOOD_MODULE1300_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module1300
+
+class Module1300 : public Module {
+public:
+	Module1300(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1300();
+protected:
+	uint32 _musicFileHash;
+	void createScene1302(int which);			
+	void createScene1303(int which);			
+	void createScene1304(int which);			
+	void createScene1305(int which);			
+	void createScene1306(int which);			
+	void createScene1307(int which);			
+	void createScene1308(int which);			
+	void createScene1309(int which);			
+	void createScene1310(int which);			
+	void createScene1311(int which);			
+	void createScene1312(int which);			
+	void createScene1313(int which);			
+	void createScene1314(int which);			
+	void createScene1315(int which);			
+	void createScene1316(int which);			
+	void createScene1317(int which);			
+	void createScene1318(int which);			
+	void updateScene1302();			
+	void updateScene1303();			
+	void updateScene1304();			
+	void updateScene1305();			
+	void updateScene1306();			
+	void updateScene1307();			
+	void updateScene1308();			
+	void updateScene1309();			
+	void updateScene1310();			
+	void updateScene1311();			
+	void updateScene1312();			
+	void updateScene1313();			
+	void updateScene1314();			
+	void updateScene1315();			
+	void updateScene1316();			
+	void updateScene1317();			
+	void updateScene1318();			
+};
+
+class AsScene1302Bridge : public AnimatedSprite {
+public:
+	AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stLowerBridge();
+	void stRaiseBridge();
+	void cbLowerBridgeEvent();
+};
+
+class SsScene1302Fence : public StaticSprite {
+public:
+	SsScene1302Fence(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	int16 _firstY;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoveDown();
+	void suMoveUp();
+};
+
+class Class595 : public StaticSprite {
+public:
+	Class595(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1302 : public Scene {
+public:
+	Scene1302(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	SoundResource _soundResource;
+	Sprite *_asVenusFlyTrap;
+	Sprite *_asBridge;
+	Sprite *_ssFence;
+	Sprite *_asRing1;
+	Sprite *_asRing2;
+	Sprite *_asRing3;
+	Sprite *_asRing4;
+	Sprite *_asRing5;
+	Sprite *_class595;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1300_H */


Commit: b5fc6ed2c0db21d132873fb8d35510bc8c186899
    https://github.com/scummvm/scummvm/commit/b5fc6ed2c0db21d132873fb8d35510bc8c186899
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1303

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 7f80b8c..bcd7584 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -55,6 +55,8 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004AED88,
 	// Scene1302
 	2, 0x004B0A38,
+	// Scene1303
+	1, 0x004AF9E8,
 	// Scene1401
 	1, 0x004B6758,
 	// Scene1402
@@ -145,6 +147,9 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B0978,
 	1, 0x004B0870,
 	1, 0x004B0868,
+	// Scene1303
+	1, 0x004AF9A0,
+	2, 0x004AF9B8,
 	// Scene1401
 	1, 0x004B65C8,
 	1, 0x004B65D0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index decb83b..bb53d46 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 9d6e3b95758a16c1b2a441aa5f206c50593202fd
    https://github.com/scummvm/scummvm/commit/9d6e3b95758a16c1b2a441aa5f206c50593202fd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Add Scene1303

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f4159f3..8b984e2 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -247,7 +247,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 1;
+	_vm->gameState().sceneNum = 2;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index e0359fc..d8b1dbe 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2892,6 +2892,92 @@ void KmScene1201::sub40E040() {
 	}
 }
 
+KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	// Empty
+}
+
+uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4804:
+		setCallback2(AnimationCallback(&KmScene1303::sub4161D0));
+		break;
+	case 0x483B:
+		setCallback2(AnimationCallback(&KmScene1303::sub4162B0));
+		break;
+	case 0x483C:
+		setCallback2(AnimationCallback(&KmScene1303::sub416210));
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene1303::handleMessage4160A0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == calcHash("PopBalloon")) {
+			_parentScene->sendMessage(0x2000, 0, this);
+		} else if (param.asInteger() == 0x02B20220) {
+			_soundResource1.play(0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			_soundResource1.play(0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			_soundResource1.play(0x44051000);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1303::update4161A0() {
+	Klayman::update();
+	_counter3++;
+	if (_counter3 >= _counter3Max)
+		sub416250();
+}
+
+void KmScene1303::sub4161D0() {
+	_status2 = 0;
+	_flagE5 = true;
+	setFileHash(0xAC20C012, 8, 37);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetAnimationCallback3(&KmScene1303::sub416250);
+}
+
+void KmScene1303::sub416210() {
+	_status2 = 1;
+	_flagE5 = false;
+	setFileHash(0xAC20C012, 43, 49);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+}
+
+void KmScene1303::sub416250() {
+	_counter3 = 0;
+	_status2 = 0;
+	_flagE5 = true;
+	_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+	setFileHash(0xAC20C012, 38, 42);
+	SetUpdateHandler(&KmScene1303::update4161A0);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	_newHashListIndex = 42;
+}
+
+void KmScene1303::sub4162B0() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x2426932E, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1303::handleMessage4160A0);
+}
+
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 12862e3..31a96f7 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -322,6 +322,19 @@ protected:
 	void sub40E040();
 };
 
+class KmScene1303 : public Klayman {
+public:
+	KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage4160A0(int messageNum, const MessageParam &param, Entity *sender);
+	void update4161A0();
+	void sub4161D0();
+	void sub416210();
+	void sub416250();
+	void sub4162B0();
+};
+
 class KmScene1401 : public Klayman {
 public:
 	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 7c7beb7..d893e8f 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -155,6 +155,11 @@ void Module1300::createScene1302(int which) {
 }
 			
 void Module1300::createScene1303(int which) {
+	_vm->gameState().sceneNum = 2;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+	_childObject = new Scene1303(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1303);
 }
 			
 void Module1300::createScene1304(int which) {
@@ -243,6 +248,14 @@ void Module1300::updateScene1302() {
 }
 
 void Module1300::updateScene1303() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1306(3);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1304() {
@@ -661,4 +674,100 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	
+	// TODO createSurface3(200, dword_4AF9F8);
+	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
+	_x = 289;
+	_y = 390;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1303Balloon::handleMessage);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	setFileHash(0x800278D2, 0, -1);
+}
+
+uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		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) {
+			_soundResource.play(0x742B0055);
+		} 
+		break;
+	case 0x3002:
+		_soundResource.play(0x470007EE);
+		setFileHash1();
+		SetMessageHandler(NULL);
+		_surface->setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1303Balloon::stPopBalloon() {
+	setFileHash(0xAC004CD0, 0, -1);
+	SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped);
+}
+
+Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1303::handleMessage);
+	setRectList(0x004AF9E8);
+	
+	_background = addBackground(new DirtyBackground(_vm, 0x01581A9C, 0, 0));
+	_palette = new Palette(_vm, 0x01581A9C);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x81A9801D, NULL));
+
+	if (!getGlobalVar(0xAC00C0D0)) {
+		_asBalloon = addSprite(new AsScene1303Balloon(_vm, this));
+		_vm->_collisionMan->addSprite(_asBalloon);
+	}
+	
+	_sprite1 = addSprite(new StaticSprite(_vm, 0xA014216B, 1100));
+
+	_klayman = new KmScene1303(_vm, this, 207, 332);
+	addSprite(_klayman);
+	setMessageList(0x004AF9A0);
+
+	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+
+}
+
+uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		setGlobalVar(0xAC00C0D0, 1);
+		_asBalloon->sendMessage(0x2000, 0, this);
+		break;
+	case 0x4826:
+		if (sender == _asBalloon && getGlobalVar(0x31C63C51)) {
+			setMessageList(0x004AF9B8);
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 25dde46..edabe4f 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -127,6 +127,26 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class AsScene1303Balloon : public AnimatedSprite {
+public:
+	AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	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, int which);
+protected:
+	Sprite *_sprite1;
+	Sprite *_asBalloon;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */


Commit: 4c7930bd342740c2dd89eb1477c6b4b47ba41ca3
    https://github.com/scummvm/scummvm/commit/4c7930bd342740c2dd89eb1477c6b4b47ba41ca3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1304

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index bcd7584..30ae94d 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -57,6 +57,8 @@ static const uint32 rectListOffsets[] = {
 	2, 0x004B0A38,
 	// Scene1303
 	1, 0x004AF9E8,
+	// Scene1304
+	1, 0x004B91A8,
 	// Scene1401
 	1, 0x004B6758,
 	// Scene1402
@@ -150,6 +152,12 @@ static const uint32 messageListOffsets[] = {
 	// Scene1303
 	1, 0x004AF9A0,
 	2, 0x004AF9B8,
+	// Scene1304
+	1, 0x004B90E8,
+	1, 0x004B90F0,
+	2, 0x004B9158,
+	2, 0x004B9130,
+	2, 0x004B9140,
 	// Scene1401
 	1, 0x004B65C8,
 	1, 0x004B65D0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index bb53d46..4b510ce 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 086879a4aac6ef0d9662293dfb6a7dce4d61cb57
    https://github.com/scummvm/scummvm/commit/086879a4aac6ef0d9662293dfb6a7dce4d61cb57
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Add Scene1304

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/module1400.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 8b984e2..4c70ff2 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -247,7 +247,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 2;
+	_vm->gameState().sceneNum = 3;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index d8b1dbe..57e1274 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2978,6 +2978,59 @@ void KmScene1303::sub4162B0() {
 	SetMessageHandler(&KmScene1303::handleMessage4160A0);
 }
 
+KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+}
+
+uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;		
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;						
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 31a96f7..77c4160 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -335,6 +335,13 @@ protected:
 	void sub4162B0();
 };
 
+class KmScene1304 : public Klayman {
+public:
+	KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene1401 : public Klayman {
 public:
 	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index d893e8f..c6dfd38 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/module1300.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module2200.h"
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/navigationscene.h"
 #include "neverhood/smackerscene.h"
@@ -163,6 +164,11 @@ void Module1300::createScene1303(int which) {
 }
 			
 void Module1300::createScene1304(int which) {
+	_vm->gameState().sceneNum = 3;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+	_childObject = new Scene1304(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1304);
 }
 			
 void Module1300::createScene1305(int which) {
@@ -259,6 +265,14 @@ void Module1300::updateScene1303() {
 }
 
 void Module1300::updateScene1304() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1316(0);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1305() {
@@ -770,4 +784,103 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y)
+	: AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) {
+	
+	if (getGlobalVar(0x31C63C51)) {
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+	} else {
+		SetMessageHandler(&Class544::handleMessage);
+	}
+}
+
+uint32 Class544::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		_parentScene->sendMessage(0x4826, 0, this);
+		messageResult = 1;
+		break;
+	case 0x4806:
+		setGlobalVar(0x31C63C51, 1);
+		_surface->setVisible(false);
+		SetMessageHandler(NULL);
+		break;
+	}
+	return messageResult;
+}
+
+Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1304::handleMessage);
+	setRectList(0x004B91A8);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x062C0214, 0, 0));
+	_palette = new Palette(_vm, 0x062C0214);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL));
+	
+	if (getGlobalVar(0xAC00C0D0)) {
+		_class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347));
+		_vm->_collisionMan->addSprite(_class545);
+	} else {
+		_class545 = addSprite(new AnimatedSprite(_vm, 0x80106018, 100, 279, 48));
+		// TODO _class545->setUpdateDeltaXY();
+	}
+
+	if (!getGlobalVar(0x31C63C51)) {
+		_class544 = addSprite(new Class544(_vm, this, 1100, 278, 347));
+		_vm->_collisionMan->addSprite(_class544);
+	} else {
+		_class544 = NULL;
+	}
+
+	_sprite1 = addSprite(new StaticSprite(_vm, 0x0562E621, 1100));
+	addSprite(new StaticSprite(_vm, 0x012AE033, 1100));
+	addSprite(new StaticSprite(_vm, 0x090AF033, 1100));
+
+	if (which < 0) {
+		_klayman = new KmScene1304(_vm, this, 217, 347);
+		setMessageList(0x004B90E8);
+	} else {
+		_klayman = new KmScene1304(_vm, this, 100, 347);
+		setMessageList(0x004B90F0);
+	}
+	addSprite(_klayman);
+
+	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
+	_klayman->getSurface()->getClipRect().y1 = 0;
+	_klayman->getSurface()->getClipRect().x2 = 640;
+	_klayman->getSurface()->getClipRect().y2 = 480;
+
+}
+
+uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x415634A4) {
+			if (getGlobalVar(0xAC00C0D0)) {
+				messageList402220();
+			} else {
+				setMessageList(0x004B9158);
+			}
+		}
+		break;
+	case 0x4826:
+		if (sender == _class544) {
+			_klayman->sendEntityMessage(0x1014, _class544, this);
+			setMessageList(0x004B9130);
+		} else if (sender == _class545) {
+			_klayman->sendEntityMessage(0x1014, _class545, this);
+			setMessageList(0x004B9140);
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index edabe4f..ca53147 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -147,6 +147,24 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Class544 : public AnimatedSprite {
+public:
+	Class544(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);
+protected:
+	Sprite *_sprite1;
+	Sprite *_class545;
+	Sprite *_class544;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 52e5ae7..7835520 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/module1400.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module2200.h"
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/gamemodule.h"
 
@@ -1456,7 +1457,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class401_1->getSurface()->setVisible(false);
 
 	_class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995));
-	    
+	
 	_class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995));
 
 	_asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011);
@@ -1578,8 +1579,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	_mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL));
 
 	if (getGlobalVar(0x13382860) == 5) {
-		// TODO _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411));
-		// TODO _vm->_collisionMan->addSprite(_class545);
+		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411));
+		_vm->_collisionMan->addSprite(_class545);
 	}
 
 	_sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100));


Commit: a29c62ce5a801e245a44daa680f5c109f965f750
    https://github.com/scummvm/scummvm/commit/a29c62ce5a801e245a44daa680f5c109f965f750
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:37-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1305

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 30ae94d..207f2f7 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -59,6 +59,8 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004AF9E8,
 	// Scene1304
 	1, 0x004B91A8,
+	// Scene1305
+	1, 0x004B6E98,
 	// Scene1401
 	1, 0x004B6758,
 	// Scene1402
@@ -158,6 +160,9 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B9158,
 	2, 0x004B9130,
 	2, 0x004B9140,
+	// Scene1305
+	1, 0x004B6E40,
+	1, 0x004B6E48,
 	// Scene1401
 	1, 0x004B65C8,
 	1, 0x004B65D0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 4b510ce..7e94af3 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: a6cb31c9c3b4d516b5cfe4d93ccb94cc4c62c9d1
    https://github.com/scummvm/scummvm/commit/a6cb31c9c3b4d516b5cfe4d93ccb94cc4c62c9d1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add Scene1305

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 4c70ff2..1487e8c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -247,7 +247,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 3;
+	_vm->gameState().sceneNum = 4;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 57e1274..3f03faa 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2981,6 +2981,7 @@ void KmScene1303::sub4162B0() {
 KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
+	// Empty	
 }
 
 uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3031,6 +3032,48 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene1305::KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+
+	// Empty	
+}
+
+uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;		
+	case 0x4804:
+		setCallback2(AnimationCallback(&KmScene1305::sub46BEF0));
+		break;		
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	}
+	return 0;
+}
+
+void KmScene1305::sub46BEF0() {
+	_soundResource1.play(0x41648271);
+	_status2 = 1;
+	_flagE5 = false;
+	setFileHash2(0x000BAB02, 0x88003000, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetAnimationCallback3(&KmScene1305::sub46BF60);
+}
+
+void KmScene1305::sub46BF60() {
+	setDoDeltaX(2);
+	sub41FC80();
+}
+
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 77c4160..c269e91 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -342,6 +342,15 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene1305 : public Klayman {
+public:
+	KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub46BEF0();
+	void sub46BF60();
+};
+
 class KmScene1401 : public Klayman {
 public:
 	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index c6dfd38..4814f41 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -172,6 +172,11 @@ void Module1300::createScene1304(int which) {
 }
 			
 void Module1300::createScene1305(int which) {
+	_vm->gameState().sceneNum = 4;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_play(0x203197, 0, 2, 1);
+	_childObject = new Scene1305(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1305);
 }
 			
 void Module1300::createScene1306(int which) {
@@ -276,6 +281,14 @@ void Module1300::updateScene1304() {
 }
 
 void Module1300::updateScene1305() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1317(-1);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1306() {
@@ -883,4 +896,31 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1305::handleMessage);
+	setRectList(0x004B6E98);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x28801B64, 0, 0));
+	_palette = new Palette(_vm, 0x28801B64);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL));
+
+	if (which < 0) {
+		_klayman = new KmScene1305(_vm, this, 212, 441);
+		setMessageList(0x004B6E40);
+	} else {
+		_klayman = new KmScene1305(_vm, this, 212, 441);
+		setMessageList(0x004B6E48);
+	}
+	addSprite(_klayman);
+	
+}
+
+uint32 Scene1305::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	return Scene::handleMessage(messageNum, param, sender);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index ca53147..03e3d6e 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -165,6 +165,13 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene1305 : public Scene {
+public:
+	Scene1305(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */


Commit: 089ada55ba0eb1ba877921e9fd175ff16a9b7320
    https://github.com/scummvm/scummvm/commit/089ada55ba0eb1ba877921e9fd175ff16a9b7320
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1306

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 207f2f7..54eed45 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -61,6 +61,9 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B91A8,
 	// Scene1305
 	1, 0x004B6E98,
+	// Scene1306
+	1, 0x004AFD28,
+	1, 0x004AFD18,
 	// Scene1401
 	1, 0x004B6758,
 	// Scene1402
@@ -163,6 +166,19 @@ static const uint32 messageListOffsets[] = {
 	// Scene1305
 	1, 0x004B6E40,
 	1, 0x004B6E48,
+	// Scene1306
+	1, 0x004AFAD0,
+	2, 0x004AFAF0,
+	1, 0x004AFBC8,
+	1, 0x004AFC30,
+	4, 0x004AFC38,
+	2, 0x004AFB00,
+	1, 0x004AFBD0,
+	4, 0x004AFBD8,
+	2, 0x004AFAE0,
+	1, 0x004AFAD8,
+	2, 0x004AFC58,
+	2, 0x004AFC68,
 	// Scene1401
 	1, 0x004B65C8,
 	1, 0x004B65D0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 7e94af3..3d08f66 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 30ff790a0756466bfcd19b1193e9efb4e2bb377c
    https://github.com/scummvm/scummvm/commit/30ff790a0756466bfcd19b1193e9efb4e2bb377c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add Scene1306

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 1487e8c..93ea6c5 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -247,7 +247,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 4;
+	_vm->gameState().sceneNum = 5;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 3f03faa..739c8ad 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3074,6 +3074,163 @@ void KmScene1305::sub46BF60() {
 	sub41FC80();
 }
 
+KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	_flag1 = false;	
+}
+
+uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x2000:
+		_flag1 = param.asInteger() != 0;
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub421350));
+		else
+			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481A:
+		setCallback2(AnimationCallback(&Klayman::sub420680));		
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+		else
+			setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub421510));
+		else
+			setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x482E:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub421030));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub421070));
+		}
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x4835:
+		_parentScene->sendMessage(0x2000, 1, this);
+		_flag1 = true;
+		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		break;																		
+	case 0x4836:
+		_parentScene->sendMessage(0x2000, 0, this);
+		_flag1 = false;
+		setCallback2(AnimationCallback(&Klayman::sub421310));
+		break;
+	case 0x483D:
+		sub417D40();
+		break;																				
+	case 0x483E:
+		sub417D80();
+		break;																				
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1306::sub417D40() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0xEE084A04, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1306::handleMessage417CB0);
+}
+
+void KmScene1306::sub417D80() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0xB86A4274, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1306::handleMessage417CB0);
+}
+
+uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			_soundResource1.play(0x85B10BB8);
+		} else if (param.asInteger() == 0x4E6A0CA0) {
+			_soundResource1.play(0xC5B709B0);
+		}
+	}
+	return messageResult;
+}
+
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index c269e91..118e813 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -351,6 +351,17 @@ protected:
 	void sub46BF60();
 };
 
+class KmScene1306 : public Klayman {
+public:
+	KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag1;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage417CB0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub417D40();
+	void sub417D80();
+};
+
 class KmScene1401 : public Klayman {
 public:
 	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 4814f41..f437ddc 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/module1300.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module1200.h"
 #include "neverhood/module2200.h"
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/navigationscene.h"
@@ -180,6 +181,11 @@ void Module1300::createScene1305(int which) {
 }
 			
 void Module1300::createScene1306(int which) {
+	_vm->gameState().sceneNum = 5;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_play(0x203197, 0, 2, 1);
+	_childObject = new Scene1306(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1306);
 }
 			
 void Module1300::createScene1307(int which) {
@@ -292,6 +298,24 @@ void Module1300::updateScene1305() {
 }
 
 void Module1300::updateScene1306() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 2) {
+			createScene1309(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 3) {
+			createScene1303(0);
+			_childObject->handleUpdate();
+		} else if (_field20 == 0) {
+			_parentModule->sendMessage(0x1009, 0, this);
+		} else if (_field20 == 1) {
+			createScene1311(-1);
+			_childObject->handleUpdate();
+		}
+	}
 }
 
 void Module1300::updateScene1307() {
@@ -923,4 +947,270 @@ 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), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), 
+	_parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true),
+	_countdown(0) {
+
+	_x = 320;
+	_y = 240;
+	createSurface1(0x043B0270, 100);
+	setFileHash(0x043B0270, 0, -1);
+	_newHashListIndex = 0;
+	SetMessageHandler(&AsScene1306Elevator::handleMessage);
+	_soundResource1.load(0x1C100E83);
+	_soundResource2.load(0x1C08CEC5);
+	_soundResource3.load(0x5D011E87);
+}
+
+void AsScene1306Elevator::update() {
+	if (_isUp && _countdown != 0 && (--_countdown == 0)) {
+		stGoingDown();
+	}
+	AnimatedSprite::update();
+	if (_frameIndex == 7) {
+		_soundResource3.play();
+		_asElevatorDoor->getSurface()->setVisible(false);
+	}
+}
+
+void AsScene1306Elevator::upGoingDown() {
+	AnimatedSprite::update();
+	if (_frameIndex == 5) {
+		_asElevatorDoor->getSurface()->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:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		if (_isDown)
+			stGoingUp();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1306Elevator::stGoingUp() {
+	_surface->setVisible(true);
+	_isDown = false;
+	SetUpdateHandler(&AsScene1306Elevator::update);
+	setFileHash(0x043B0270, 0, -1);
+	SetAnimationCallback3(&AsScene1306Elevator::cbGoingUpEvent);
+	_soundResource1.play();
+}
+
+void AsScene1306Elevator::cbGoingUpEvent() {
+	SetUpdateHandler(&AsScene1306Elevator::update);
+	_parentScene->sendMessage(0x4808, 0, this);
+	_isUp = true;
+	_countdown = 144;
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+void AsScene1306Elevator::stGoingDown() {
+	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
+	_isUp = false;
+	_surface->setVisible(true);
+	setFileHash(0x043B0270, -1, -1);
+	_playBackwards = true;
+	SetAnimationCallback3(&AsScene1306Elevator::cbGoingDownEvent);
+	_soundResource2.play();
+}
+
+void AsScene1306Elevator::cbGoingDownEvent() {
+	_isDown = true;
+	_parentScene->sendMessage(0x4809, 0, this);
+	SetUpdateHandler(&AsScene1306Elevator::update);
+	setFileHash1();
+}
+
+Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860))
+		setGlobalVar(0x13382860, 4);
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1306::handleMessage);
+
+	_background = addBackground(new DirtyBackground(_vm, 0x05303114, 0, 0));
+	_palette = new Palette(_vm, 0x05303114);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x0311005B, NULL));
+
+	if (!getGlobalVar(0x13382860)) {
+		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 435, 445));
+		_vm->_collisionMan->addSprite(_class545);
+	}
+
+	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x404A36A0, 100, 0x440C1000));
+	
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 19, 1100, 359, 445, 0x9148A011));
+
+	_asElevatorDoor = new AnimatedSprite(_vm, 0x043B0270, 90, 320, 240);
+	_asElevatorDoor->setFileHash(0x043B0270, 6, -1);
+	_asElevatorDoor->setNewHashListIndex(6);
+	addSprite(_asElevatorDoor);
+
+	_asElevator = addSprite(new AsScene1306Elevator(_vm, this, _asElevatorDoor));
+	
+	_sprite1 = addSprite(new StaticSprite(_vm, 0x036A1EE0, 80));
+	
+	addSprite(new StaticSprite(_vm, 0x00042313, 1100));
+
+	if (which < 0) {
+		_klayman = new KmScene1306(_vm, this, 380, 440);
+		setMessageList(0x004AFAD0);
+		sendMessage(0x2000, 0, this);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else if (which == 1) {
+		_klayman = new KmScene1306(_vm, this, 136, 440);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004AFAF0);
+		sendMessage(0x2000, 1, this);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else if (which == 2) {
+		if (getGlobalVar(0xC0418A02)) {
+			_klayman = new KmScene1306(_vm, this, 515, 440);
+			_klayman->setDoDeltaX(1);
+		} else {
+			_klayman = new KmScene1306(_vm, this, 355, 440);
+		}
+		setMessageList(0x004AFBC8);
+		sendMessage(0x2000, 0, this);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else if (which == 3) {
+		_klayman = new KmScene1306(_vm, this, 534, 440);
+		setMessageList(0x004AFC30);
+		sendMessage(0x2000, 0, this);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else if (which == 4) {
+		_klayman = new KmScene1306(_vm, this, 136, 440);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004AFC38);
+		sendMessage(0x2000, 1, this);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else if (which == 5) {
+		_klayman = new KmScene1306(_vm, this, 136, 440);
+		_klayman->sendMessage(0x2000, 1, this);
+		setMessageList(0x004AFB00);
+		sendMessage(0x2000, 1, this);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else {
+		_klayman = new KmScene1306(_vm, this, 286, 408);
+		setSurfacePriority(_asElevator->getSurface(), 1100);
+		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
+		setSurfacePriority(_sprite1->getSurface(), 1080);
+		sendMessage(0x2000, 0, this);
+		SetMessageHandler(&Scene1306::handleMessage416EB0);
+		clearRectList();
+		_asElevator->sendMessage(0x4808, 0, this);
+	}
+	addSprite(_klayman);
+
+}
+	
+Scene1306::~Scene1306() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+if (messageNum) debug("%04X", messageNum);
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x402064D8) {
+			_klayman->sendEntityMessage(0x1014, _ssButton, this);
+		} else if (param.asInteger() == 0x01C66840) {
+			if (_asElevator->sendMessage(0x2001, 0, this) != 0) {
+				setMessageList(0x004AFBD8);
+			} else {
+				setMessageList(0x004AFAE0);
+			}
+		} else if (param.asInteger() == 0x8E646E00) {
+			setMessageList(0x004AFAD8);
+			clearRectList();
+			SetMessageHandler(&Scene1306::handleMessage416EB0);
+		}
+		break;
+	case 0x2000:
+		if (param.asInteger() != 0) {
+			setRectList(0x004AFD28);
+			_klayman->setKlaymanTable3();
+		} else {
+			setRectList(0x004AFD18);
+			_klayman->setKlaymanTable1();
+		}
+		break;
+	case 0x480B:
+		if (sender == _ssButton) {
+			_asElevator->sendMessage(0x4808, 0, this);
+		}
+		break;
+	case 0x4826:
+		if (sender == _class545) {
+			if (_klayman->getX() >= 249) {
+				_klayman->sendEntityMessage(0x1014, _class545, this);
+				setMessageList(0x004AFC58);
+			}
+		} else if (sender == _asTape) {
+			if (_klayman->getX() >= 249) {
+				_klayman->sendEntityMessage(0x1014, _class545, this);
+				setMessageList(0x004AFC68);
+			}
+		}
+		break;
+	case 0x482A:
+		setSurfacePriority(_asElevator->getSurface(), 1100);
+		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
+		setSurfacePriority(_sprite1->getSurface(), 1080);
+		break;
+	case 0x482B:
+		setSurfacePriority(_asElevator->getSurface(), 100);
+		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
+		setSurfacePriority(_sprite1->getSurface(), 80);
+		sendMessage(0x2000, 0, this);
+		_vm->_collisionMan->addSprite(_asTape);
+		break;
+	}
+	return 0;
+}
+
+uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4808:
+		setMessageList(0x004AFBD0);
+		SetMessageHandler(&Scene1306::handleMessage);
+		break;
+	case 0x4809:
+		_parentModule->sendMessage(0x1009, 1, this);
+		break;
+	case 0x482A:
+		setSurfacePriority(_asElevator->getSurface(), 1100);
+		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
+		setSurfacePriority(_sprite1->getSurface(), 1080);
+		break;
+	case 0x482B:
+		setSurfacePriority(_asElevator->getSurface(), 100);
+		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
+		setSurfacePriority(_sprite1->getSurface(), 80);
+		sendMessage(0x2000, 0, this);
+		_vm->_collisionMan->addSprite(_asTape);
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 03e3d6e..33f5fb5 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -172,6 +172,42 @@ 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;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	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);
+	~Scene1306();
+protected:
+	Sprite *_ssButton;
+	Sprite *_asTape;
+	AnimatedSprite *_asElevatorDoor;
+	Sprite *_asElevator;
+	Sprite *_sprite1;
+	Sprite *_class545;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 7ec5d91..16d7931 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -114,6 +114,8 @@ public:
 	void clearRepl();
 	uint32 getCurrAnimFileHash() const { return _currAnimFileHash; }
 	int16 getFrameIndex() const { return _frameIndex; }
+	void setNewHashListIndex(int value) { _newHashListIndex = value; }
+	void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4);
 protected:
 	typedef void (AnimatedSprite::*AnimationCb)();
 	AnimResource _animResource;
@@ -154,7 +156,6 @@ protected:
 	void updateFrameIndex();
 	void updateFrameInfo();
 	void createSurface1(uint32 fileHash, int surfacePriority);
-	void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4);
 	void setFileHash1();
 	void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5);
 	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);


Commit: e13b8740c9b6d3bfa74ca583aea3f1d101b78bc9
    https://github.com/scummvm/scummvm/commit/e13b8740c9b6d3bfa74ca583aea3f1d101b78bc9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add Scene1307

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 93ea6c5..277b55d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -85,6 +85,43 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 	}				
 }
 
+void GameModule::initScene1307Vars() {
+
+	if (getSubVar(0x40050052, 0x25400B10))
+		return;
+
+	for (uint i = 0; i < 3; i++) {
+		bool more;
+		do {
+			more = false;
+			setSubVar(0x0C10A000, i, _vm->_rnd->getRandomNumber(16 - 1));
+			if (i > 0) {
+				for (uint j = 0; j < i && !more; j++) {
+					more = getSubVar(0x0C10A000, j) == getSubVar(0x0C10A000, i);
+				}
+			}
+		} while (more);
+	}
+
+	for (uint i = 0; i < 3; i++) {
+		bool more;
+		do {
+			more = false;
+			setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1));
+			if (i > 0) {
+				for (uint j = 0; j < i && !more; j++) {
+					more = getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i);
+				}
+			}
+			if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i))
+				more = true;
+		} while (more);
+	}
+
+	setSubVar(0x40050052, 0x25400B10, 1);
+
+}
+
 void GameModule::initScene1405Vars() {
 
 	// TODO: Give better names
@@ -247,7 +284,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 5;
+	_vm->gameState().sceneNum = 6;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index ef199f7..02f16c5 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -37,6 +37,7 @@ public:
 	void startup();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
+	void initScene1307Vars();
 	void initScene1405Vars();
 	void initScene3009Vars();
 protected:
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index f437ddc..27f8a11 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -24,6 +24,7 @@
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
 #include "neverhood/module2200.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/navigationscene.h"
 #include "neverhood/smackerscene.h"
@@ -189,6 +190,11 @@ void Module1300::createScene1306(int which) {
 }
 			
 void Module1300::createScene1307(int which) {
+	_vm->gameState().sceneNum = 6;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_play(0x203197, 0, 2, 1);
+	_childObject = new Scene1307(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1307);
 }
 			
 void Module1300::createScene1308(int which) {
@@ -319,6 +325,14 @@ void Module1300::updateScene1306() {
 }
 
 void Module1300::updateScene1307() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1308(2);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1308() {
@@ -1126,7 +1140,6 @@ Scene1306::~Scene1306() {
 }
 
 uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-if (messageNum) debug("%04X", messageNum);
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1213,4 +1226,375 @@ 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 index, NRect *clipRects)
+	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
+	_soundResource4(vm), _parentScene(parentScene), _index(index), _clipRects(clipRects),
+	_isClickable(true) {
+	
+	NPoint pt;
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	
+	_dataResource.load(0x22102142);
+	_pointList = _dataResource.getPointArray(0xAC849240);
+	
+	pt = (*_pointList)[getSubVar(0xA010B810, _index)];
+	_x = pt.x;
+	_y = pt.y;
+	
+	// TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], fileHashes);
+	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], 640, 480); //TODO: Remeove once the line above is done
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1307Key::handleMessage);
+	
+	setFileHash(fileHashes[0], 0, -1);
+	
+	_soundResource1.load(0xDC4A1280);
+	_soundResource2.load(0xCC021233);
+	_soundResource3.load(0xC4C23844);
+	_soundResource3.load(0xC4523208);
+
+}
+
+uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_isClickable) {
+			_parentScene->sendMessage(0x4826, 0, this);
+			stRemoveKey();
+			messageResult = 1;
+		}
+		break;
+	case 0x2000:
+		_isClickable = param.asInteger() != 0;
+		break;
+	case 0x2001:
+		setSubVar(0xA010B810, _index, param.asInteger());
+		stMoveKey();
+		break;
+	case 0x2003:
+		_soundResource4.play();
+		stUnlock();
+		break;
+	case 0x2004:
+		_soundResource3.play();
+		stInsert();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1307Key::suRemoveKey() {
+	if (_pointIndex < kAsScene1307KeyPointsCount) {
+		_x += kAsScene1307KeyPoints[_pointIndex].x;
+		_y += kAsScene1307KeyPoints[_pointIndex].y;
+		processDelta();
+		_pointIndex++;
+	} else {
+		SetSpriteCallback(NULL);
+	}
+}
+
+void AsScene1307Key::suInsertKey() {
+	if (_pointIndex < kAsScene1307KeyPointsCount) {
+		_x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x;
+		_y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y;
+		processDelta();
+		_pointIndex++;
+		if (_pointIndex == 7)
+			_soundResource1.play();
+	} else {
+		SetSpriteCallback(NULL);
+		_parentScene->sendMessage(0x2002, 0, this);
+	}
+}
+
+void AsScene1307Key::suMoveKey() {
+	if (_pointIndex < kAsScene1307KeyFrameIndicesCount) {
+		_frameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
+		_x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue;
+		_y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue;
+		processDelta();
+		_pointIndex++;
+	} else {
+		NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)];
+		_x = pt.x + kAsScene1307KeyXDelta;
+		_y = pt.y + kAsScene1307KeyYDelta;
+		stInsertKey();
+	}
+}
+
+void AsScene1307Key::stRemoveKey() {
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	_pointIndex = 0;
+	SetSpriteCallback(&AsScene1307Key::suRemoveKey);
+	setFileHash(fileHashes[0], 0, -1);
+	_soundResource2.play();
+}
+
+void AsScene1307Key::stInsertKey() {
+	_pointIndex = 0;
+	_parentScene->sendMessage(0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], this);
+	_surface->getClipRect() = _clipRects[getSubVar(0xA010B810, _index) % 4];
+	SetSpriteCallback(&AsScene1307Key::suInsertKey);
+	_newHashListIndex = -2;
+}
+
+void AsScene1307Key::stMoveKey() {
+	NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)];
+	int16 newX = pt.x + kAsScene1307KeyXDelta;
+	int16 newY = pt.y + kAsScene1307KeyYDelta;
+	_parentScene->sendMessage(0x1022, 1000, this);
+	_surface->getClipRect().x1 = 0;
+	_surface->getClipRect().y1 = 0;
+	_surface->getClipRect().x2 = 640;
+	_surface->getClipRect().y2 = 480;
+	_prevX = _x;
+	_prevY = _y;
+	if (newX == _x && newY == _y) {
+		stInsertKey();
+	} else {
+		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+		_pointIndex = 0;
+		_frameIndex = 0;
+		_deltaX = newX - _x;
+		_deltaY = newY - _y;
+		SetSpriteCallback(&AsScene1307Key::suMoveKey);
+		setFileHash(fileHashes[0], 0, -1);
+	}
+}
+
+void AsScene1307Key::stUnlock() {
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	setFileHash(fileHashes[1], 0, -1);
+	_newHashListIndex = -2;
+}
+
+void AsScene1307Key::stInsert() {
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	setFileHash(fileHashes[2], 0, -1);
+	_newHashListIndex = -2;
+}
+
+Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm), _countdown(0),
+	_asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
+
+	//DEBUG
+	setSubVar(0x08D0AB11, 0, 1);
+	setSubVar(0x08D0AB11, 1, 1);
+	setSubVar(0x08D0AB11, 2, 1);
+
+	Sprite *tempSprite;
+	
+	_vm->gameModule()->initScene1307Vars();
+	
+	_dataResource.load(0x22102142);
+	_keyHolePoints = _dataResource.getPointArray(0xAC849240);
+
+	for (uint i = 0; i < 16; i++) {
+		NPoint pt = (*_keyHolePoints)[i];
+		_keyHoleRects[i].x1 = pt.x - 15;
+		_keyHoleRects[i].y1 = pt.y - 15;
+		_keyHoleRects[i].x2 = pt.x + 15;
+		_keyHoleRects[i].y2 = pt.y + 15;
+	}
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1307::handleMessage);
+	SetUpdateHandler(&Scene1307::update);
+
+	_background = addBackground(new DirtyBackground(_vm, 0xA8006200, 0, 0));
+	_palette = new Palette(_vm, 0xA8006200);
+	_palette->usePalette();
+	addEntity(_palette);
+	_mouseCursor = addSprite(new Mouse435(_vm, 0x06204A88, 20, 620));
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3621C, 800));
+	_clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x;
+	_clipRects[0].y1 = 0;
+	_clipRects[0].x2 = 640;
+	_clipRects[0].y2 = 480;
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3641C, 600));
+	_clipRects[1].x1 = tempSprite->getSurface()->getDrawRect().x;
+	_clipRects[1].y1 = 0;
+	_clipRects[1].x2 = 640;
+	_clipRects[1].y2 = 480;
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3681C, 400));
+	_clipRects[2].x1 = tempSprite->getSurface()->getDrawRect().x;
+	_clipRects[2].y1 = 0;
+	_clipRects[2].x2 = 640;
+	_clipRects[2].y2 = 480;
+
+	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3701C, 200));
+	_clipRects[3].x1 = tempSprite->getSurface()->getDrawRect().x;
+	_clipRects[3].y1 = 0;
+	_clipRects[3].x2 = 640;
+	_clipRects[3].y2 = 480;
+
+	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
+		if (getSubVar(0x08D0AB11, keyIndex)) {
+			_asKeys[keyIndex] = addSprite(new AsScene1307Key(_vm, this, keyIndex, _clipRects));
+			_vm->_collisionMan->addSprite(_asKeys[keyIndex]);
+		} else {
+			_asKeys[keyIndex] = NULL;
+		}
+	}
+
+	_soundResource.load(0x68E25540);
+
+}
+
+void Scene1307::update() {
+	Scene::update();
+	if (_countdown && (--_countdown == 0)) {
+		_doLeaveScene = true;
+	} else if (_countdown == 20) {
+		_palette->startFadeToWhite(40);
+	}
+	if (_doLeaveScene && !_soundResource.isPlaying()) {
+		_parentModule->sendMessage(0x1009, 1, this);
+		setGlobalVar(0x80455A41, 1);
+	} 
+}
+
+uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO Debug stuff
+		if (!_isPuzzleSolved) {
+			if (param.asPoint().x > 20 && param.asPoint().x < 620) {
+				if (_asCurrKey && !_isInsertingKey) {
+					int16 mouseX = param.asPoint().x;
+					int16 mouseY = param.asPoint().y;
+					uint clickedKeyHoleIndex;
+					for (clickedKeyHoleIndex = 0; clickedKeyHoleIndex < 16; clickedKeyHoleIndex++) {
+						if (mouseX >= _keyHoleRects[clickedKeyHoleIndex].x1 && mouseX <= _keyHoleRects[clickedKeyHoleIndex].x2 && 
+							mouseY >= _keyHoleRects[clickedKeyHoleIndex].y1 && mouseY <= _keyHoleRects[clickedKeyHoleIndex].y2)
+							break;
+					}
+					if (clickedKeyHoleIndex < 16) {
+						// Check if the clicked keyhole is already occupied with a key
+						bool occupied = false;
+						for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) {
+							if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex] != _asCurrKey) {
+								if (getSubVar(0xA010B810, keyIndex) == clickedKeyHoleIndex)
+									occupied = true;
+							}
+						}
+						if (!occupied) {
+							// If the keyhole is free, insert the current key
+							_asCurrKey->sendMessage(0x2001, clickedKeyHoleIndex, this);
+							_isInsertingKey = true;
+							_mouseClicked = false;
+						}
+					}
+				}
+			} else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) {
+				_parentModule->sendMessage(0x1009, 0, this);
+			}
+		}
+		break;
+	// TODO Debug stuff
+	case 0x2002:
+		// Check if all keys are in the correct keyholes
+		if (getSubVar(0x08D0AB11, 0) && getSubVar(0xA010B810, 0) == getSubVar(0x0C10A000, 0) &&
+			getSubVar(0x08D0AB11, 1) && getSubVar(0xA010B810, 1) == getSubVar(0x0C10A000, 1) &&
+			getSubVar(0x08D0AB11, 2) && getSubVar(0xA010B810, 2) == getSubVar(0x0C10A000, 2)) {
+			// Play unlock animations for all keys
+			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
+				if (_asKeys[keyIndex])
+					_asKeys[keyIndex]->sendMessage(0x2003, 1, this);
+			}
+			_soundResource.play();
+			_isPuzzleSolved = true;
+			_countdown = 47;
+		} else {
+			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
+				if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) {
+					_asKeys[keyIndex]->sendMessage(0x2000, 1, this);
+				}
+			}
+			_asCurrKey->sendMessage(0x2004, 1, this);
+		}
+		_asCurrKey = NULL;
+		_isInsertingKey = false;
+		break;
+	case 0x4826:
+		_asCurrKey = (Sprite*)sender;
+		for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
+			if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) {
+				_asKeys[keyIndex]->sendMessage(0x2000, 0, this);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 33f5fb5..80b2774 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -208,6 +208,52 @@ protected:
 	uint32 handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class AsScene1307Key : public AnimatedSprite {
+public:
+	AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	NPointArray *_pointList;
+	uint _pointIndex;
+	int _frameIndex;
+	uint _index;
+	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, int which);
+protected:
+	SoundResource _soundResource;
+	NPointArray *_keyHolePoints;
+	NRect _keyHoleRects[16];
+	NRect _clipRects[4];
+	Sprite *_asKeys[3];
+	int _countdown;
+	Sprite *_asCurrKey;
+	bool _isInsertingKey;
+	bool _doLeaveScene;
+	bool _isPuzzleSolved;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */


Commit: 85a216737cd1a8c8946dfd4ac7eafd68caeb6c09
    https://github.com/scummvm/scummvm/commit/85a216737cd1a8c8946dfd4ac7eafd68caeb6c09
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1308

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 54eed45..ef32a22 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -64,6 +64,10 @@ static const uint32 rectListOffsets[] = {
 	// Scene1306
 	1, 0x004AFD28,
 	1, 0x004AFD18,
+	// Scene1308
+	1, 0x004B5990,
+	1, 0x004B5980,
+	1, 0x004B59A0,
 	// Scene1401
 	1, 0x004B6758,
 	// Scene1402
@@ -179,6 +183,18 @@ static const uint32 messageListOffsets[] = {
 	1, 0x004AFAD8,
 	2, 0x004AFC58,
 	2, 0x004AFC68,
+	// Scene1308
+	1, 0x004B57C0,
+	1, 0x004B57C8,
+	1, 0x004B58B0,
+	3, 0x004B57D0,
+	3, 0x004B57E8,
+	2, 0x004B5868,
+	4, 0x004B5848,
+	3, 0x004B5830,
+	2, 0x004B5800,
+	2, 0x004B5868,
+	2, 0x004B58E0,
 	// Scene1401
 	1, 0x004B65C8,
 	1, 0x004B65D0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 3d08f66..f902613 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 3e122b002c08162fdbc841e9df8a73c95358b0a4
    https://github.com/scummvm/scummvm/commit/3e122b002c08162fdbc841e9df8a73c95358b0a4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add Scene1308 (renaming of stuff todo)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 277b55d..6e7eb15 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -284,7 +284,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 6;
+	_vm->gameState().sceneNum = 7;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 739c8ad..26f9d1a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3231,6 +3231,141 @@ uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
+KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	_flag1 = false;
+}
+
+uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x480A:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420600));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420550));
+		}	
+		break;		
+	case 0x480D:
+		setCallback2(AnimationCallback(&KmScene1001::sub420C50));
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481A:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&KmScene1308::sub456150));		
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420680));		
+		}
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x4827:
+		setCallback2(AnimationCallback(&Klayman::sub420E20));
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene1308::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (!_flag1 && param.asInteger() == 0x06040580) {
+			setFileHash3(0xDC409440, 0x46431401, 0);
+		} else if (_flag1 && param.asInteger() == 0x46431401) {
+			_flag1 = false;
+			setFileHash2(0xDC409440, 0x01084280, 0);
+		} else if (param.asInteger() == 0x062A1510) {
+			_soundResource1.play(0x41688704);
+		} else if (param.asInteger() == 0x02B20220) {
+			_soundResource1.play(0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			_soundResource1.play(0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			_soundResource1.play(0x44051000);
+		} else if (param.asInteger() == 0x0E4C8141) {
+			_soundResource1.play(0xDC4A1280);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1308::sub456150() {
+	if (!sub41CF10(AnimationCallback(&KmScene1308::sub456150))) {
+		_status2 = 2;
+		_flag1 = false;
+		for (uint i = 0; i < 3; i++) {
+			if (getSubVar(0x0090EA95, i)) {
+				bool more;
+				setSubVar(0x08D0AB11, i, 1);
+				setSubVar(0x0090EA95, i, 0);
+				do {
+					more = false;
+					setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1));
+					for (uint j = 0; j < i && !more; j++) {
+						if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i))
+							more = true;
+					}
+					if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i))
+						more = true;
+				} while (more);
+				_flag1 = true;
+			} 
+		}
+		if (!_flag1) {
+			setCallback2(NULL);
+			sub41C7B0();
+		} else {
+			_flagE5 = false;
+			setFileHash(0xDC409440, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetSpriteCallback(&Klayman::spriteUpdate41F250);
+			SetMessageHandler(&KmScene1308::handleMessage);
+			_flag1 = false;
+		}
+	}
+}
+
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 118e813..a5381c8 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -362,6 +362,16 @@ protected:
 	void sub417D80();
 };
 
+class KmScene1308 : public Klayman {
+public:
+	KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag1;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub456150();
+};
+
 class KmScene1401 : public Klayman {
 public:
 	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 27f8a11..c5d2870 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -23,6 +23,7 @@
 #include "neverhood/module1300.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
+#include "neverhood/module1400.h"
 #include "neverhood/module2200.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/diskplayerscene.h"
@@ -198,6 +199,11 @@ void Module1300::createScene1307(int which) {
 }
 			
 void Module1300::createScene1308(int which) {
+	_vm->gameState().sceneNum = 7;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_play(0x203197, 0, 2, 1);
+	_childObject = new Scene1308(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1308);
 }
 			
 void Module1300::createScene1309(int which) {
@@ -336,6 +342,20 @@ void Module1300::updateScene1307() {
 }
 
 void Module1300::updateScene1308() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_field20 == 0) {
+			createScene1314(0);
+		} else if (_field20 == 1) {
+			createScene1302(0);
+		} else if (_field20 == 2) {
+			createScene1307(0);
+		}
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1309() {
@@ -1597,4 +1617,378 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+static const uint32 kScene1308FileHashes[] = {
+	0x08006320,
+	0x10006320,
+	0x20006320,
+	0x40006320,
+	0x80006320,
+	0x00006321,
+	0x00006322,
+	0x00006324,
+	0x00006328,
+	0x08306320,
+	0x10306320,
+	0x20306320,
+	0x40306320,
+	0x80306320,
+	0x00306321,
+	0x00306322
+};
+
+Class549::Class549(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _soundResource(vm), 
+	_parentScene(parentScene) {
+	
+	SetMessageHandler(&Class549::handleMessage);
+	_surface->setVisible(false);
+	setFileHash1();
+}
+
+uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		sub455470();
+		break;
+	case 0x4809:
+		sub4554F0();
+		break;
+	}
+	return messageResult;
+}
+
+void Class549::sub455470() {
+	setFileHash(0xBA0AE050, 0, -1);
+	_surface->setVisible(true);
+	SetAnimationCallback3(&Class549::hide);
+	_soundResource.play(calcHash("fxDoorOpen38"));
+}
+
+void Class549::hide() {
+	_parentScene->sendMessage(0x2000, 0, this);
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+void Class549::sub4554F0() {
+	setFileHash(0xBA0AE050, -1, -1);
+	_playBackwards = true;
+	_surface->setVisible(true);
+	SetAnimationCallback3(&Class549::sub455550);
+	_soundResource.play(calcHash("fxDoorClose38"));
+}
+
+void Class549::sub455550() {
+	_parentScene->sendMessage(0x2001, 0, this);
+	setFileHash1();
+}
+
+Class592::Class592(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _soundResource(vm), 
+	_parentScene(parentScene) {
+	
+	SetMessageHandler(&Class592::handleMessage);
+	SetAnimationCallback3(&Class592::sub455710);
+	_soundResource.play(0x51456049);
+}
+ 
+uint32 Class592::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class592::sub455710() {
+	setFileHash(0x6238B191, 0, -1);
+	SetAnimationCallback3(&Class592::sub455740);
+	_x = 580;
+	_y = 383;
+}
+
+void Class592::sub455740() {
+	_parentScene->sendMessage(0x2004, 0, this);
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+Class593::Class593(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) {
+	
+	SetMessageHandler(&Class593::handleMessage);
+	_surface->setVisible(false);
+	setFileHash1();
+	Entity::_priority = 1200;
+}
+
+uint32 Class593::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		sub4558F0();
+		break;
+	case 0x2003:
+		sub455920();
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void Class593::sub4558F0() {
+	setFileHash(0x80180A10, 0, -1);
+	_surface->setVisible(false);
+	_newHashListIndex = -2;
+}
+
+void Class593::sub455920() {
+	setFileHash(0x80180A10, -1, -1);
+	_playBackwards = true;
+	SetAnimationCallback3(&Class593::sub455950);
+}
+
+void Class593::sub455950() {
+	_parentScene->sendMessage(0x2003, 0, this);
+	setFileHash1();
+	_surface->setVisible(false);
+}
+
+Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index)
+	: StaticSprite(vm, fileHash, 100) {
+	
+	_surface->setVisible(false);
+	_x = _spriteResource.getPosition().x + index * 20;
+	StaticSprite::update();
+}
+
+Class513::Class513(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100), _soundResource(vm) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class513::handleMessage);
+	_x = 286;
+	_y = 429;
+	createSurface1(0xA282C472, 100);
+	setFileHash(0xA282C472, 0, -1);
+}
+
+uint32 Class513::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x66382026) {
+			_soundResource.play(0x0CD84468);
+		} else if (param.asInteger() == 0x6E28061C) {
+			_soundResource.play(0x78C8402C);
+		} else if (param.asInteger() == 0x462F0410) {
+			_soundResource.play(0x60984E28);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _flag1(false) {
+	
+	_vm->gameModule()->initScene1307Vars();
+
+	_surfaceFlag = true;		
+	SetMessageHandler(&Scene1308::handleMessage);
+	
+	_background = addBackground(new DirtyBackground(_vm, 0x41024202, 0, 0));
+	_palette = new Palette(_vm, 0x41024202);
+	_palette->usePalette();
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x24206418, NULL));
+
+	_asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011));
+	_vm->_collisionMan->addSprite(_asTape);
+
+	if (getGlobalVar(0x01023818)) {
+		addSprite(new Class513(_vm));
+		addSprite(new AnimatedSprite(_vm, 0x461A1490, 200, 235, 429));
+	}
+	
+	_sprite1 = addSprite(new StaticSprite(_vm, 0x0A042060, 1100));
+	_class549 = addSprite(new Class549(_vm, this));
+	_class593 = addSprite(new Class593(_vm, this));
+
+	_class601_1 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0));
+	_class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1));
+	_class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2));
+
+	_sprite2 = addSprite(new StaticSprite(_vm, 0x40043120, 995));
+	_sprite3 = addSprite(new StaticSprite(_vm, 0x43003100, 995));
+	_sprite4 = NULL;
+
+	if (which < 0) {
+		_klayman = new KmScene1308(_vm, this, 380, 440);
+		setMessageList(0x004B57C0);
+		if (getGlobalVar(0x80455A41)) {
+			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			setRectList(0x004B5990);
+		} else {
+			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			setRectList(0x004B5980);
+		}
+	} else if (which == 1) {
+		_klayman = new KmScene1308(_vm, this, 640, 440);
+		setMessageList(0x004B57C8);
+		if (getGlobalVar(0x80455A41)) {
+			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			setRectList(0x004B5990);
+		} else {
+			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			setRectList(0x004B5980);
+		}
+	} else if (which == 2) {
+		_klayman = new KmScene1308(_vm, this, 475, 440);
+		setMessageList(0x004B58B0);
+		if (getGlobalVar(0x80455A41)) {
+			_sprite5 = addSprite(new Class592(_vm, this));
+			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			_sprite4->getSurface()->setVisible(false);
+		} else {
+			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			setRectList(0x004B5980);
+		}
+	} else {
+		_klayman = new KmScene1308(_vm, this, 41, 440);
+		setMessageList(0x004B57D0);
+		_class549->sendMessage(0x4808, 0, this);
+		_sprite1->getSurface()->setVisible(false);
+		if (getGlobalVar(0x80455A41)) {
+			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			_klayman->getSurface()->setVisible(false);
+		} else {
+			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			_klayman->getSurface()->setVisible(false);
+		}
+	}
+	addSprite(_klayman);
+
+	if (_sprite4) {
+		_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = _sprite4->getSurface()->getDrawRect().x + _sprite4->getSurface()->getDrawRect().width;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	} else {
+		_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
+		_klayman->getSurface()->getClipRect().y1 = 0;
+		_klayman->getSurface()->getClipRect().x2 = 640;
+		_klayman->getSurface()->getClipRect().y2 = 480;
+	}
+
+	if (getGlobalVar(0x04A105B3) == 4) {
+		_class489 = new Class489(_vm, this, _klayman, 0);
+		addSprite(_class489);
+		_vm->_collisionMan->addSprite(_class489);
+		_class489->getSurface()->getClipRect().x1 = 0;
+		_class489->getSurface()->getClipRect().y1 = 0;
+		_class489->getSurface()->getClipRect().x2 = 0;
+		_class489->getSurface()->getClipRect().y2 = _sprite2->getSurface()->getDrawRect().y + _sprite2->getSurface()->getDrawRect().height;
+		_class489->setRepl(64, 0);
+	} else {
+		_class489 = NULL;
+	}
+
+}
+
+uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x88C11390) {
+			setRectList(0x004B59A0);
+			_flag1 = true;
+		} else if (param.asInteger() == 0x08821382) {
+			_klayman->sendEntityMessage(0x1014, _class489, this);
+			if (getGlobalVar(0x80455A41)) {
+				setRectList(0x004B5990);
+			} else {
+				setRectList(0x004B5980);
+			}
+			_flag1 = false;
+		} else if (param.asInteger() == 0x4AC68808) {
+			clearRectList();
+			_class549->sendMessage(0x4809, 0, this);
+			_sprite1->getSurface()->setVisible(false);
+			_klayman->getSurface()->setVisible(false);
+		}
+		break;
+	case 0x1022:
+		if (sender == _class489) {
+			if (param.asInteger() >= 1000)
+				setSurfacePriority(_sprite3->getSurface(), 1100);
+			else
+				setSurfacePriority(_sprite3->getSurface(), 995);
+		}
+		break;
+	case 0x2000:
+		if (getGlobalVar(0x80455A41)) {
+			setRectList(0x004B5990);
+		} else {
+			setRectList(0x004B5980);
+		}
+		setMessageList(0x004B57E8);
+		_sprite1->getSurface()->setVisible(true);
+		_klayman->getSurface()->setVisible(true);
+		break;
+	case 0x2001:
+		_parentModule->sendMessage(0x1009, 0, this);
+		break;
+	case 0x2003:
+		_class601_1->getSurface()->setVisible(false);
+		_class601_2->getSurface()->setVisible(false);
+		_class601_3->getSurface()->setVisible(false);
+		break;
+	case 0x2004:
+		_sprite4->getSurface()->setVisible(true);
+		setRectList(0x004B5990);
+		break;
+	case 0x4807:
+		_class593->sendMessage(0x2003, 0, this);
+		break;
+	case 0x480F:
+		_class593->sendMessage(0x2002, 0, this);
+		_class601_1->getSurface()->setVisible(true);
+		_class601_2->getSurface()->setVisible(true);
+		_class601_3->getSurface()->setVisible(true);
+		break;
+	case 0x4826:
+		if (sender == _class489) {
+			if (_flag1) {
+				setMessageList2(0x004B5868);
+			} else {
+				if (param.asInteger() == 1) {
+					_klayman->sendMessage(0x1014, _class489, this);
+					setMessageList2(0x004B5848);
+				} else if (_class489->sendMessage(0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1, this) != 0) {
+					_klayman->sendEntityMessage(0x1014, _class489, this);
+					setMessageList2(0x004B5830);
+				} else {
+					setMessageList2(0x004B5800);
+				}
+			}
+		} else if (sender == _asTape) {
+			if (_flag1) {
+				setMessageList2(0x004B5868);
+			} else if (_messageListStatus != 2) {
+				_klayman->sendMessage(0x1014, _asTape, this);
+				setMessageList2(0x004B58E0);
+			}
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 80b2774..8e14202 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -254,6 +254,74 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Class549 : public AnimatedSprite {
+public:
+	Class549(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub455470();
+	void hide();
+	void sub4554F0();
+	void sub455550();
+};
+
+class Class592 : public AnimatedSprite {
+public:
+	Class592(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub455710();
+	void sub455740();
+};
+
+class Class593 : public AnimatedSprite {
+public:
+	Class593(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub4558F0();
+	void sub455920();
+	void sub455950();
+};
+
+class Class601 : public StaticSprite {
+public:
+	Class601(NeverhoodEngine *vm, uint32 fileHash, int index);
+};
+
+class Class513 : public AnimatedSprite {
+public:
+	Class513(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1308 : public Scene {
+public:
+	Scene1308(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_asTape;
+	Sprite *_class549;
+	Sprite *_class593;
+	Sprite *_class601_1;
+	Sprite *_class601_2;
+	Sprite *_class601_3;
+	AnimatedSprite *_class489;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_sprite4;
+	Sprite *_sprite5;
+	bool _flag1;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */


Commit: 38378d2090ef637c632e7d867d9519f57ef5db6e
    https://github.com/scummvm/scummvm/commit/38378d2090ef637c632e7d867d9519f57ef5db6e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add Scene1317

- Fix SmackerPlayer (last frame was dropped, this hopefully doesn't break other stuff...)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6e7eb15..fc2ca8e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -284,7 +284,7 @@ void GameModule::startup() {
 	createModule2200(-1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 7;
+	_vm->gameState().sceneNum = 16;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index c5d2870..7de50b1 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -207,6 +207,11 @@ void Module1300::createScene1308(int which) {
 }
 			
 void Module1300::createScene1309(int which) {
+	_vm->gameState().sceneNum = 8;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+	_childObject = new DiskplayerScene(_vm, this, 1);
+	SetUpdateHandler(&Module1300::updateScene1309);
 }
 			
 void Module1300::createScene1310(int which) {
@@ -256,6 +261,11 @@ void Module1300::createScene1316(int which) {
 }
 			
 void Module1300::createScene1317(int which) {
+	_vm->gameState().sceneNum = 16;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+	_childObject = new Scene1317(_vm, this, which);
+	SetUpdateHandler(&Module1300::updateScene1317);
 }
 			
 void Module1300::createScene1318(int which) {
@@ -359,6 +369,14 @@ void Module1300::updateScene1308() {
 }
 
 void Module1300::updateScene1309() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1306(2);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1310() {
@@ -452,6 +470,14 @@ void Module1300::updateScene1316() {
 }
 
 void Module1300::updateScene1317() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		createScene1318(-1);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1318() {
@@ -1991,4 +2017,159 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	SetMessageHandler(&Scene1317::handleMessage);
+	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
+	_mouseCursor = addSprite(new Mouse433(_vm, 0x08284011, NULL));
+	_mouseCursor->getSurface()->setVisible(false);
+	_smackerFileHash = 0;
+	_smackerFlag1 = false;
+}
+
+void Scene1317::update() {
+	if (_smackerFileHash) {
+		_smackerPlayer->open(_smackerFileHash, _smackerFlag1);
+		_smackerFileHash = 0;
+	}
+	Scene::update();
+}
+
+void Scene1317::upChooseKing() {
+	if (!_klaymanBlinks && _klaymanBlinkCountdown != 0 && (--_klaymanBlinkCountdown == 0))
+		_klaymanBlinks = true;
+		
+	if (!_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) {
+		_smackerPlayer->rewind();
+	} else if (_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) {
+		_smackerPlayer->rewind();
+		_klaymanBlinks = false;
+		_klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
+	}
+
+	if (!_klaymanBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0))
+		stNoDecisionYet();
+			
+	if (_smackerFileHash) {
+		_smackerPlayer->open(_smackerFileHash, _smackerFlag1);
+		_smackerFileHash = 0;
+	}
+
+	Scene::update();
+	
+}
+
+uint32 Scene1317::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		stChooseKing();
+		break;
+	}
+	return messageResult;
+}
+	
+uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x >= 21 && param.asPoint().y >= 24 &&
+			param.asPoint().x <= 261 && param.asPoint().y <= 280) {
+			stHoborgAsKing();
+		} else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 &&
+			param.asPoint().x <= 399 && param.asPoint().y <= 379) {
+			stKlaymanAsKing();
+		} else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 &&
+			param.asPoint().x <= 418 && param.asPoint().y <= 474) {
+			stKlaymanAsKing();
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene1317::hmNoDecisionYet(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		stChooseKing();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		stEndMovie();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		_parentModule->sendMessage(0x1009, 0, this);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		_parentModule->sendMessage(0x1009, 0, this);
+		break;
+	}
+	return messageResult;
+}
+
+void Scene1317::stChooseKing() {
+	_mouseCursor->getSurface()->setVisible(true);
+	SetMessageHandler(&Scene1317::hmChooseKing);
+	SetUpdateHandler(&Scene1317::upChooseKing);
+	_smackerFileHash = 0x10982841;
+	_smackerFlag1 = true;
+	_decisionCountdown = 450;
+	_klaymanBlinks = false;
+	_klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
+}
+
+void Scene1317::stNoDecisionYet() {
+	_mouseCursor->getSurface()->setVisible(false);
+	SetMessageHandler(&Scene1317::hmNoDecisionYet);
+	SetUpdateHandler(&Scene1317::update);
+	_smackerFileHash = 0x20982841;
+	_smackerFlag1 = false;
+}
+
+void Scene1317::stHoborgAsKing() {
+	_mouseCursor->getSurface()->setVisible(false);
+	SetMessageHandler(&Scene1317::hmHoborgAsKing);
+	SetUpdateHandler(&Scene1317::update);
+	_smackerFileHash = 0x40982841;
+	_smackerFlag1 = false;
+}
+
+void Scene1317::stKlaymanAsKing() {
+	_mouseCursor->getSurface()->setVisible(false);
+	SetMessageHandler(&Scene1317::hmKlaymanAsKing);
+	SetUpdateHandler(&Scene1317::update);
+	_smackerFileHash = 0x80982841;
+	_smackerFlag1 = false;
+}
+
+void Scene1317::stEndMovie() {
+	_mouseCursor->getSurface()->setVisible(false);
+	SetMessageHandler(&Scene1317::hmEndMovie);
+	SetUpdateHandler(&Scene1317::update);
+	_smackerFileHash = 0x40800711;
+	_smackerFlag1 = false;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 8e14202..0e9837c 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -26,6 +26,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/smackerplayer.h"
 
 namespace Neverhood {
 
@@ -322,6 +323,31 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene1317 : public Scene {
+public:
+	Scene1317(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	SmackerPlayer *_smackerPlayer;
+	bool _klaymanBlinks;
+	int _klaymanBlinkCountdown;
+	int _decisionCountdown;
+	uint32 _smackerFileHash;
+	bool _smackerFlag1;
+	void update();
+	void upChooseKing();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmChooseKing(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmNoDecisionYet(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmKlaymanAsKing(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmEndMovie(int messageNum, const MessageParam &param, Entity *sender);
+	void stChooseKing();
+	void stNoDecisionYet();
+	void stHoborgAsKing();
+	void stKlaymanAsKing();
+	void stEndMovie();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1300_H */
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 39f49cb..0ebec5e 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -170,10 +170,9 @@ void SmackerPlayer::update() {
 		_dirtyFlag = false;
 	}
 
+#if 0
 	if (!_smackerDecoder->endOfVideo()) {
-
 		updateFrame();
-
 		if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
 			// Inform the scene about the end of the video playback
 			if (_scene) {
@@ -187,8 +186,23 @@ void SmackerPlayer::update() {
 			}
 			_flag2 = false;
 		}
-		
 	}
+#endif
+
+	if (!_smackerDecoder->endOfVideo()) {
+		updateFrame();
+	} else if (!_keepLastFrame) {
+		// Inform the scene about the end of the video playback
+		if (_scene) {
+			_scene->sendMessage(0x3002, 0, this);
+		}
+		_flag2 = true;
+	} else {
+		rewind();
+		updateFrame();
+		_flag2 = false;
+	}
+	
 }
 
 void SmackerPlayer::updateFrame() {
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index fb7f6da..883cb52 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -59,6 +59,7 @@ public:
 	uint32 getFrameNumber(); 
 	uint getStatus();
 	void setDrawPos(int16 x, int16 y);
+	void rewind();
 protected:
 	Scene *_scene;
 	Palette *_palette;
@@ -72,7 +73,6 @@ protected:
 	bool _flag2;
 	bool _dirtyFlag;
 	int _drawX, _drawY;
-	void rewind();
 	void update();
 	void updateFrame();
 	void updatePalette();


Commit: a21f9ef891d32487b0f6a57651aee2d8f7106a40
    https://github.com/scummvm/scummvm/commit/a21f9ef891d32487b0f6a57651aee2d8f7106a40
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Add Scene1310 and Scene1311

Changed paths:
    engines/neverhood/module1300.cpp



diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 7de50b1..04f4a2e 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -215,9 +215,19 @@ void Module1300::createScene1309(int which) {
 }
 			
 void Module1300::createScene1310(int which) {
+	_vm->gameState().sceneNum = 9;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+	createSmackerScene(0x20082818, true, true, false);
+	SetUpdateHandler(&Module1300::updateScene1310);
 }
 			
 void Module1300::createScene1311(int which) {
+	_vm->gameState().sceneNum = 10;
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+	// TODO Music18hList_stop(0x203197, 0, 2);
+	createSmackerScene(0x20082828, true, true, false);
+	SetUpdateHandler(&Module1300::updateScene1310);
 }
 			
 void Module1300::createScene1312(int which) {
@@ -269,6 +279,7 @@ void Module1300::createScene1317(int which) {
 }
 			
 void Module1300::createScene1318(int which) {
+	// TODO: Credits scene
 }
 			
 void Module1300::updateScene1302() {
@@ -380,6 +391,17 @@ void Module1300::updateScene1309() {
 }
 
 void Module1300::updateScene1310() {
+	_childObject->handleUpdate();
+	if (_done) {
+		_done = false;
+		delete _childObject;
+		_childObject = NULL;
+		if (_vm->gameState().sceneNum == 9)
+			createScene1315(0);
+		else
+			createScene1306(0);
+		_childObject->handleUpdate();
+	}
 }
 
 void Module1300::updateScene1311() {


Commit: b757e22f881797f51fa1fb951dd78a88d3ae15d9
    https://github.com/scummvm/scummvm/commit/b757e22f881797f51fa1fb951dd78a88d3ae15d9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Multiple changes to make the game logic code cleaner (hopefully :)

- Introduce Scene::insertStaticSprite to create static sprites instead of the old "addSprite(new StaticSprite" (not used everywhere yet)
- Introduce macro InsertKlayman to create the Klayman object
- Change sendMessage semantics from "receiver->sendMessage(num,arg,sender)" to "sendMessage(receiver,num,arg)", the sender is always the sending object ("this")
- Similar changes using macros will follow
- And fixed a bug in the elevator

Changed paths:
    engines/neverhood/collisionman.cpp
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerscene.cpp
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index 4296b91..a1314bf 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -98,7 +98,7 @@ void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum,
 	for (Common::Array<Sprite*>::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) {
 		Sprite *collSprite = *iter;
 		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getRect())) {
-			collSprite->sendMessage(messageNum, messageParam, sprite);
+			sprite->sendMessage(collSprite, messageNum, messageParam);
 		}
 	}	
 }
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index dd2c837..3eeef92 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -225,10 +225,10 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p
 	case 0x1011:
 		if (!_diskplayerScene->getFlag3()) {
 			if (_isPlaying) {
-				_diskplayerScene->sendMessage(0x2001, 0, this);
+				sendMessage(_diskplayerScene, 0x2001, 0);
 				release();
 			} else {
-				_diskplayerScene->sendMessage(0x2000, 0, this);
+				sendMessage(_diskplayerScene, 0x2000, 0);
 				press();
 			}
 		}
@@ -500,7 +500,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 		case 0x0001:
 			// TODO: Debug/Cheat
 			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			} else if (!_flag3 &&
 				param.asPoint().x > 38 && param.asPoint().x < 598 &&
 				param.asPoint().y > 400 && param.asPoint().y < 460) {
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index e49aa94..582e93f 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -96,20 +96,23 @@ public:
 			(this->*_updateHandlerCb)();
 	}
 	bool hasMessageHandler() const { return _messageHandlerCb != NULL; } 
-	uint32 sendMessage(int messageNum, const MessageParam &param, Entity *sender) {
-		debug(2, "sendMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
+	uint32 receiveMessage(int messageNum, const MessageParam &param, Entity *sender) {
+		debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
 		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
 	}
 	// NOTE: These were overloaded before for the various message parameter types
 	// it caused some problems so each type gets its own sendMessage variant now
-	uint32 sendMessage(int messageNum, uint32 param, Entity *sender) {
-		return sendMessage(messageNum, MessageParam(param), sender);
+	uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam &param) {
+		return receiver->receiveMessage(messageNum, param, this);
 	}
-	uint32 sendPointMessage(int messageNum, const NPoint &param, Entity *sender) {
-		return sendMessage(messageNum, MessageParam(param), sender);
+	uint32 sendMessage(Entity *receiver, int messageNum, uint32 param) {
+		return receiver->receiveMessage(messageNum, MessageParam(param), this);
 	}
-	uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) {
-		return sendMessage(messageNum, MessageParam((Entity*)param), sender);
+	uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint &param) {
+		return receiver->receiveMessage(messageNum, MessageParam(param), this);
+	}
+	uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param) {
+		return receiver->receiveMessage(messageNum, MessageParam((Entity*)param), this);
 	}
 	int getPriority() const { return _priority; }
 	// Shortcuts for game variable access
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index fc2ca8e..650287b 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -71,7 +71,7 @@ void GameModule::handleMouseMove(int16 x, int16 y) {
 		mousePos.x = x;
 		mousePos.y = y;
 		debug(2, "GameModule::handleMouseMove(%d, %d)", x, y);
-		_childObject->sendPointMessage(0, mousePos, this);
+		sendPointMessage(_childObject, 0, mousePos);
 	}				
 }
 
@@ -81,7 +81,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 		mousePos.x = x;
 		mousePos.y = y;
 		debug(2, "GameModule::handleMouseDown(%d, %d)", x, y);
-		_childObject->sendPointMessage(1, mousePos, this);
+		sendPointMessage(_childObject, 1, mousePos);
 	}				
 }
 
@@ -267,9 +267,9 @@ void GameModule::startup() {
 	//createModule1700(-1);
 	//createModule1700(1);
 	//createModule1400(-1);
-#if 0
-	_vm->gameState().sceneNum = 10;
-	createModule3000(-1);
+#if 1
+	_vm->gameState().sceneNum = 1;
+	createModule1000(-1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -280,11 +280,11 @@ void GameModule::startup() {
 	createModule2000(-1);
 #endif
 #if 0
-	_vm->gameState().sceneNum = 46;
+	_vm->gameState().sceneNum = 0;
 	createModule2200(-1);
 #endif
-#if 1
-	_vm->gameState().sceneNum = 16;
+#if 0
+	_vm->gameState().sceneNum = 5;
 	createModule1300(-1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 26f9d1a..e0ca57c 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -57,7 +57,7 @@ static const KlaymanTableItem klaymanTable4[] = {
 
 // Klayman
 
-Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority)
+Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
 	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
 	_counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false),
@@ -360,7 +360,7 @@ uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0xC1380080) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x4806, 0, this);
+				sendMessage(_attachedSprite, 0x4806, 0);
 				_soundResource1.play(0xC8004340);
 			}
 		} else if (param.asInteger() == 0x02B20220) {
@@ -499,7 +499,7 @@ void Klayman::sub41C7B0() {
 		removeCallbackList();
 #endif		
 	} else {
-		_parentScene->sendMessage(0x1006, 0, this);
+		sendMessage(_parentScene, 0x1006, 0);
 	}
 }
 
@@ -975,15 +975,15 @@ void Klayman::spriteUpdate41F320() {
 	_deltaX = 0;		
 
 	if (xdiff == 0) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	} else if (_status3 == 3 && xdiff < 30) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	} else if (_status3 == 3 && xdiff < 150 && _frameIndex >= 6) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdelta;
@@ -1026,9 +1026,9 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x482A, 0, this);
+			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
-			_attachedSprite->sendMessage(0x482B, 0, this);
+			sendMessage(_attachedSprite, 0x482B, 0);
 		}
 		break;
 	}
@@ -1053,7 +1053,7 @@ uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0xC1380080) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x4806, 0, this);
+				sendMessage(_attachedSprite, 0x4806, 0);
 			}
 			_soundResource1.play(0x40208200);
 		} else if (param.asInteger() == 0x02B20220) {
@@ -1090,7 +1090,7 @@ uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0x0D01B294) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x480B, 0, this);
+				sendMessage(_attachedSprite, 0x480B, 0);
 			}
 		} else if (param.asInteger() == 0x32180101) {
 			_soundResource1.play(0x4924AAC4);
@@ -1375,7 +1375,7 @@ void Klayman::sub4201C0() {
 	SetMessageHandler(&Klayman::handleMessage41D790);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetAnimationCallback3(&Klayman::sub420340);
-	_attachedSprite->sendMessage(0x482B, 0, this);
+	sendMessage(_attachedSprite, 0x482B, 0);
 }
 
 uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1384,15 +1384,15 @@ uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x4806, 0, this);
+				sendMessage(_attachedSprite, 0x4806, 0);
 			}
 			_flagE5 = true;
 		} else if (param.asInteger() == 0x320AC306) {
 			_soundResource1.play(0x5860C640);
 		} else if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x482A, 0, this);
+			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
-			_attachedSprite->sendMessage(0x482B, 0, this);
+			sendMessage(_attachedSprite, 0x482B, 0);
 		}
 		break;
 	}
@@ -1430,7 +1430,7 @@ void Klayman::sub420290() {
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::handleMessage41D880);
 		SetAnimationCallback3(&Klayman::sub420380);
-		_attachedSprite->sendMessage(0x482B, 0, this);
+		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
 
@@ -1440,14 +1440,14 @@ uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x4806, 0, this);
+				sendMessage(_attachedSprite, 0x4806, 0);
 			}
 		} else if (param.asInteger() == 0x320AC306) {
 			_soundResource1.play(0x5860C640);
 		} else if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x482A, 0, this);
+			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
-			_attachedSprite->sendMessage(0x482B, 0, this);
+			sendMessage(_attachedSprite, 0x482B, 0);
 		}
 		break;
 	}
@@ -1475,7 +1475,7 @@ void Klayman::sub4203C0() {
 	_status2 = 1;
 	_flagE5 = false;
 	if (_attachedSprite) {
-		_attachedSprite->sendMessage(0x4807, 0, this);
+		sendMessage(_attachedSprite, 0x4807, 0);
 		_attachedSprite = NULL;
 	}
 	setFileHash(0xB869A4B9, 0, -1);
@@ -1597,11 +1597,11 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, E
 			}
 			if (_statusE0 == 1) {
 				if (_y4 >= _y - 30) {
-					sendMessage(0x1019, 0, this);
+					sendMessage(this, 0x1019, 0);
 				}
 			} else {
 				if (_y4 <= _y) {
-					sendMessage(0x1019, 0, this);
+					sendMessage(this, 0x1019, 0);
 				}
 			}
 		}
@@ -1651,9 +1651,9 @@ uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x80C110B5) {
-			_parentScene->sendMessage(0x482A, 0, this);
+			sendMessage(_parentScene, 0x482A, 0);
 		} else if (param.asInteger() == 0x110010D1) {
-			_parentScene->sendMessage(0x482B, 0, this);
+			sendMessage(_parentScene, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
 			if (_soundFlag) {
 				_soundResource1.play(0x48498E46);
@@ -1795,7 +1795,7 @@ void Klayman::sub420F20() {
 
 void Klayman::spriteUpdate41F5A0() {
 	if (!_flagF8 && ABS(_x4 - _x) < 80) {
-		_parentScene->sendMessage(0x4829, 0, this);
+		sendMessage(_parentScene, 0x4829, 0);
 		_flagF8 = true;
 	}
 	AnimatedSprite::updateDeltaXY();
@@ -1812,7 +1812,7 @@ void Klayman::sub420600() {
 }
 
 void Klayman::sub420660() {
-	_attachedSprite->sendMessage(0x4807, 0, this);
+	sendMessage(_attachedSprite, 0x4807, 0);
 }
 
 uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1820,9 +1820,9 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
 			if (_attachedSprite)
-				_attachedSprite->sendMessage(0x480B, _doDeltaX ? 1 : 0, this);
+				sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
 		} else if (param.asInteger() == 0x02421405) {
-			if (_flagE4 && _attachedSprite->hasMessageHandler() && _attachedSprite->sendMessage(0x480C, _doDeltaX ? 1 : 0, this) != 0) {
+			if (_flagE4 && _attachedSprite->hasMessageHandler() && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
 				sub4205C0();
 			} else {
 				setCallback1(AnimationCallback(&Klayman::sub420660));
@@ -1869,7 +1869,7 @@ void Klayman::sub420C50() {
 		if (_flagF7) {
 			sub420D50();
 		} else {
-			_attachedSprite->sendMessage(0x482B, 0, this);
+			sendMessage(_attachedSprite, 0x482B, 0);
 			setFileHash(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
@@ -1882,7 +1882,7 @@ void Klayman::sub420C50() {
 
 void Klayman::sub420CD0() {
 	setFileHash(0x0D318140, 0, -1);
-	_attachedSprite->sendMessage(0x480F, 0, this);
+	sendMessage(_attachedSprite, 0x480F, 0);
 	SetAnimationCallback3(&Klayman::sub420D10);
 }
 
@@ -1900,14 +1900,14 @@ void Klayman::sub420D50() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41E210);
-	_attachedSprite->sendMessage(0x4807, 0, this);
+	sendMessage(_attachedSprite, 0x4807, 0);
 	SetAnimationCallback3(&Klayman::sub420DA0);
 	_flagE5 = false;
 }
 
 void Klayman::sub420DA0() {
 	setFileHash(0x0D318140, 0, -1);
-	_attachedSprite->sendMessage(0x480F, 0, this);
+	sendMessage(_attachedSprite, 0x480F, 0);
 	SetAnimationCallback3(&Klayman::sub420DE0);
 }
 
@@ -1927,7 +1927,7 @@ void Klayman::sub420E20() {
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::handleMessage41E210);
-		_attachedSprite->sendMessage(0x4807, 0, this);
+		sendMessage(_attachedSprite, 0x4807, 0);
 		SetAnimationCallback3(&Klayman::sub420E90);
 		_flagE5 = false;
 		_flagF7 = false;
@@ -1942,7 +1942,7 @@ void Klayman::sub420E90() {
 }
 
 void Klayman::sub420EB0() {
-	_attachedSprite->sendMessage(0x482A, 0, this);
+	sendMessage(_attachedSprite, 0x482A, 0);
 }
 
 void Klayman::sub420680() {
@@ -2002,7 +2002,7 @@ uint32 Klayman::handleMessage41DD20(int messageNum, const MessageParam &param, E
 	case 0x100D:
 		if (param.asInteger() == 0x040D4186) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x4808, 0, this);
+				sendMessage(_attachedSprite, 0x4808, 0);
 			}
 		}
 		break;
@@ -2078,7 +2078,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4836:
 		if (param.asInteger() == 1) {
-			_parentScene->sendMessage(0x2002, 0, this);
+			sendMessage(_parentScene, 0x2002, 0);
 			setCallback2(AnimationCallback(&Klayman::sub4211F0));
 		}
 		break;		
@@ -2108,7 +2108,7 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x480F, 0, this);
+			sendMessage(_attachedSprite, 0x480F, 0);
 		}
 		break;
 	}
@@ -2117,8 +2117,8 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &para
 
 // KmScene1002
 
-KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _class599(class599), _ssLadderArch(ssLadderArch), _otherSprite(NULL),
+KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL),
 	_status(0) {
 	
 	setKlaymanTable1();
@@ -2197,21 +2197,21 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41CCE0(param.asInteger());
 		break;
 	case 0x4820:  
-		_parentScene->sendMessage(0x2005, 0, this);
+		sendMessage(_parentScene, 0x2005, 0);
 		setCallback2(AnimationCallback(&Klayman::sub420970));	 
 		break;
 	case 0x4821:	
-		_parentScene->sendMessage(0x2005, 0, this);
+		sendMessage(_parentScene, 0x2005, 0);
 		_y4 = param.asInteger();
 		setCallback2(AnimationCallback(&Klayman::sub4209D0));	 
 		break;
 	case 0x4822:  
-		_parentScene->sendMessage(0x2005, 0, this);
+		sendMessage(_parentScene, 0x2005, 0);
 		_y4 = param.asInteger();
 		setCallback2(AnimationCallback(&Klayman::sub420AD0));	 
 		break;
 	case 0x4823:
-		_parentScene->sendMessage(0x2006, 0, this);
+		sendMessage(_parentScene, 0x2006, 0);
 		setCallback2(AnimationCallback(&Klayman::sub420BC0));	 
 		break;
 	case 0x482E:	 
@@ -2252,19 +2252,19 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &para
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x480F, 0, this);
+				sendMessage(_attachedSprite, 0x480F, 0);
 			}
 		} else if (param.asInteger() == 0x586B0300) {
 			if (_otherSprite) {
-				_otherSprite->sendMessage(0x480E, 1, this);
+				sendMessage(_otherSprite, 0x480E, 1);
 			}
 		} else if (param.asInteger() == 0x4AB28209) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x482A, 0, this);
+				sendMessage(_attachedSprite, 0x482A, 0);
 			}
 		} else if (param.asInteger() == 0x88001184) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x482B, 0, this);
+				sendMessage(_attachedSprite, 0x482B, 0);
 			}
 		}
 		break;
@@ -2301,12 +2301,12 @@ uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &para
 	case 0x100D:
 		if (param.asInteger() == 0x942D2081) {
 			_flagE5 = false;
-			_attachedSprite->sendMessage(0x2003, 0, this);
+			sendMessage(_attachedSprite, 0x2003, 0);
 		} else if (param.asInteger() == 0xDA600012) {
 			sub44A370();
 		} else if (param.asInteger() == 0x0D01B294) {
 			_flagE5 = false;
-			_attachedSprite->sendMessage(0x480B, 0, this);
+			sendMessage(_attachedSprite, 0x480B, 0);
 		}
 		break;
 	}
@@ -2318,12 +2318,12 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &para
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x480B, (uint32)_doDeltaX, this);
+				sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX);
 			}
 		} else if (param.asInteger() == 0x02421405) {
 			if (_flagE4) {
 				if (_attachedSprite) {
-					if (_attachedSprite->sendMessage(0x480C, (uint32)_doDeltaX, this) != 0) {
+					if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) {
 						sub44A460();
 					}
 				}
@@ -2331,9 +2331,9 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &para
 				SetMessageHandler(&KmScene1002::handleMessage449BA0);
 			}
 		} else if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x482A, 0, this);
+			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
-			_attachedSprite->sendMessage(0x482B, 0, this);
+			sendMessage(_attachedSprite, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
 			_soundResource1.play(0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
@@ -2352,9 +2352,9 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
-			_attachedSprite->sendMessage(0x482A, 0, this);
+			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
-			_attachedSprite->sendMessage(0x482B, 0, this);
+			sendMessage(_attachedSprite, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
 			_soundResource1.play(0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
@@ -2407,7 +2407,7 @@ void KmScene1002::spriteUpdate449DC0() {
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
 		processDelta();
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	}
 	_vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0);
 }
@@ -2421,7 +2421,7 @@ void KmScene1002::sub449E20() {
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1002::handleMessage449800);
 		SetAnimationCallback3(&Klayman::sub420420);
-		_attachedSprite->sendMessage(0x482B, 0, this);
+		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
 
@@ -2449,12 +2449,12 @@ void KmScene1002::sub449EF0() {
 	
 	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
 	SetAnimationCallback3(&KmScene1002::sub449F70);
-	_class599->sendMessage(0x482A, 0, this);
-	_ssLadderArch->sendMessage(0x482A, 0, this);
+	sendMessage(_class599, 0x482A, 0);
+	sendMessage(_ssLadderArch, 0x482A, 0);
 }
 
 void KmScene1002::sub449F70() {
-	_parentScene->sendMessage(0x1024, 1, this);
+	sendMessage(_parentScene, 0x1024, 1);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
 	_flagE5 = false;
@@ -2464,11 +2464,11 @@ void KmScene1002::sub449F70() {
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
 	SetAnimationCallback3(&KmScene1002::sub44A230);
-	_parentScene->sendMessage(0x2002, 0, this);
+	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
-	_class599->sendMessage(0x482B, 0, this);
-	_ssLadderArch->sendMessage(0x482B, 0, this);
+	sendMessage(_class599, 0x482B, 0);
+	sendMessage(_ssLadderArch, 0x482B, 0);
 }
 
 void KmScene1002::sub44A050() {
@@ -2480,8 +2480,8 @@ void KmScene1002::sub44A050() {
 	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetAnimationCallback3(&KmScene1002::sub449F70);
-	_class599->sendMessage(0x482A, 0, this);
-	_ssLadderArch->sendMessage(0x482A, 0, this);
+	sendMessage(_class599, 0x482A, 0);
+	sendMessage(_ssLadderArch, 0x482A, 0);
 }
 
 void KmScene1002::sub44A0D0() {
@@ -2493,12 +2493,12 @@ void KmScene1002::sub44A0D0() {
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
 	SetAnimationCallback3(&KmScene1002::sub44A150);
-	_class599->sendMessage(0x482A, 0, this);
-	_ssLadderArch->sendMessage(0x482A, 0, this);
+	sendMessage(_class599, 0x482A, 0);
+	sendMessage(_ssLadderArch, 0x482A, 0);
 }
 
 void KmScene1002::sub44A150() {
-	_parentScene->sendMessage(0x1024, 1, this);
+	sendMessage(_parentScene, 0x1024, 1);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
 	_flagE5 = false;
@@ -2508,11 +2508,11 @@ void KmScene1002::sub44A150() {
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
 	SetSpriteCallback(NULL);
 	SetAnimationCallback3(&KmScene1002::sub44A230);
-	_parentScene->sendMessage(0x2002, 0, this);
+	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
-	_class599->sendMessage(0x482B, 0, this);
-	_ssLadderArch->sendMessage(0x482B, 0, this);
+	sendMessage(_class599, 0x482B, 0);
+	sendMessage(_ssLadderArch, 0x482B, 0);
 }
 
 void KmScene1002::sub44A230() {
@@ -2522,7 +2522,7 @@ void KmScene1002::sub44A230() {
 
 void KmScene1002::sub44A250() {
 	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) {
-		_parentScene->sendMessage(0x1024, 3, this);
+		sendMessage(_parentScene, 0x1024, 3);
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0xB93AB151, 0, -1);
@@ -2536,7 +2536,7 @@ void KmScene1002::sub44A250() {
 void KmScene1002::sub44A2C0() {
 	if (_attachedSprite) {
 		_x = ((Sprite*)_attachedSprite)->getX();
-		_attachedSprite->sendMessage(0x4807, 0, this);
+		sendMessage(_attachedSprite, 0x4807, 0);
 		_attachedSprite = NULL;
 	}
 	_status2 = 2;
@@ -2569,7 +2569,7 @@ void KmScene1002::sub44A370() {
 }
 
 void KmScene1002::sub44A3C0() {
-	_parentScene->sendMessage(0x1024, 1, this);
+	sendMessage(_parentScene, 0x1024, 1);
 }
 
 void KmScene1002::sub44A3E0() {
@@ -2597,7 +2597,7 @@ void KmScene1002::sub44A460() {
 }
 
 void KmScene1002::sub44A4B0() {
-	_attachedSprite->sendMessage(0x482A, 0, this);
+	sendMessage(_attachedSprite, 0x482A, 0);
 }
 
 // KmScene1004
@@ -2628,30 +2628,30 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&KmScene1004::sub478170));
 		break;
 	case 0x4820:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		setCallback2(AnimationCallback(&Klayman::sub420970));
 		break;
 	case 0x4821:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = param.asInteger();
 		setCallback2(AnimationCallback(&Klayman::sub4209D0));
 		break;
 	case 0x4822:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = param.asInteger();
 		setCallback2(AnimationCallback(&Klayman::sub420AD0));
 		break;
 	case 0x4823:
-		_parentScene->sendMessage(0x2001, 0, this);
+		sendMessage(_parentScene, 0x2001, 0);
 		setCallback2(AnimationCallback(&Klayman::sub420BC0));
 		break;
 	case 0x4824:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = _dataResource.getPoint(param.asInteger()).y;
 		setCallback2(AnimationCallback(&Klayman::sub4209D0));
 		break;
 	case 0x4825:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = _dataResource.getPoint(param.asInteger()).y;
 		setCallback2(AnimationCallback(&Klayman::sub420AD0));
 		break;
@@ -2674,7 +2674,7 @@ uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam &para
 	case 0x100D:
 		if (param.asInteger() == 0x04684052) {
 			_flagE5 = true;
-			_parentScene->sendMessage(0x2002, 0, this);
+			sendMessage(_parentScene, 0x2002, 0);
 		}
 		break;
 	}
@@ -2818,7 +2818,7 @@ uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam &para
 		if (param.asInteger() == 0x01084280) {
 			_soundResource1.play(0x405002D8);
 			if (_attachedSprite) {
-				_attachedSprite->sendMessage(0x480B, 0, this);
+				sendMessage(_attachedSprite, 0x480B, 0);
 			}
 		} else if (param.asInteger() == 0x02421405) {
 			if (_countdown != 0) {
@@ -2876,7 +2876,7 @@ void KmScene1201::sub40DFA0() {
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1201::handleMessage40DEA0);
 		SetAnimationCallback3(&Klayman::sub41FC80);
-		_class464->sendMessage(0x2006, 0, this);
+		sendMessage(_class464, 0x2006, 0);
 		_soundResource1.play(0x62E0A356);
 	}
 }
@@ -2918,7 +2918,7 @@ uint32 KmScene1303::handleMessage4160A0(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == calcHash("PopBalloon")) {
-			_parentScene->sendMessage(0x2000, 0, this);
+			sendMessage(_parentScene, 0x2000, 0);
 		} else if (param.asInteger() == 0x02B20220) {
 			_soundResource1.play(0xC5408620);
 		} else if (param.asInteger() == 0x0A720138) {
@@ -3175,12 +3175,12 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&Klayman::sub421160));
 		break;
 	case 0x4835:
-		_parentScene->sendMessage(0x2000, 1, this);
+		sendMessage(_parentScene, 0x2000, 1);
 		_flag1 = true;
 		setCallback2(AnimationCallback(&Klayman::sub4212C0));
 		break;																		
 	case 0x4836:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_flag1 = false;
 		setCallback2(AnimationCallback(&Klayman::sub421310));
 		break;
@@ -3702,12 +3702,12 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&Klayman::sub421160));
 		break;
 	case 0x4835:
-		_parentScene->sendMessage(0x2000, 1, this);
+		sendMessage(_parentScene, 0x2000, 1);
 		_flag = true;
 		setCallback2(AnimationCallback(&Klayman::sub4212C0));
 		break;																		
 	case 0x4836:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_flag = false;
 		setCallback2(AnimationCallback(&Klayman::sub421310));
 		break;
@@ -3741,7 +3741,7 @@ void KmScene1705::spriteUpdate468A30() {
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
 		processDelta();
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	}
 }
 
@@ -3821,12 +3821,12 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		setCallback2(AnimationCallback(&Klayman::sub421160));
 		break;
 	case 0x4835:
-		_parentScene->sendMessage(0x2000, 1, this);
+		sendMessage(_parentScene, 0x2000, 1);
 		_flag = true;
 		setCallback2(AnimationCallback(&Klayman::sub4212C0));
 		break;
 	case 0x4836:
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_flag = false;
 		setCallback2(AnimationCallback(&Klayman::sub421310));
 		break;
@@ -4189,14 +4189,14 @@ void KmScene2206::spriteUpdate482450() {
 	_yDelta++;
 	_y += _yDelta;
 	if (_y > 600) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	}
 }
 
 void KmScene2206::sub482490() {
 	if (!sub41CF10(AnimationCallback(&KmScene2206::sub482490))) {
 		_status2 = 1;
-		_parentScene->sendMessage(0x4803, 0, this);
+		sendMessage(_parentScene, 0x4803, 0);
 		_flagE5 = false;
 		_yDelta = 0;
 		setFileHash(0x5420E254, 0, -1);
@@ -4322,7 +4322,7 @@ void KmScene2207::sub4424B0() {
 void KmScene2207::sub442520() {
 	setFileHash(0x0D318140, 0, -1);
 	SetAnimationCallback3(&KmScene2207::sub442560);
-	_attachedSprite->sendMessage(0x480F, 0, this);
+	sendMessage(_attachedSprite, 0x480F, 0);
 }
 
 void KmScene2207::sub442560() {
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a5381c8..23bd110 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -41,7 +41,8 @@ struct KlaymanTableItem {
 
 class Klayman : public AnimatedSprite {
 public:
-	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000);
+	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);
+	void init() { }
 
 	void update();
 
@@ -259,7 +260,11 @@ protected:
 
 class KmScene1002 : public Klayman {
 public:
-	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y);
+	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	void init(Sprite *class599, Sprite *ssLadderArch) {
+		_class599 = class599;
+		_ssLadderArch = ssLadderArch;  
+	}
 protected:
 	Sprite *_class599;
 	Sprite *_ssLadderArch;
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index edf67c7..c38b96e 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -47,7 +47,7 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 	switch (messageNum) {
 	case 0x0008:
 		if (_parentModule)
-			_parentModule->sendMessage(8, 0, this);
+			sendMessage(_parentModule, 8, 0);
 		return 0;
 	case 0x1009:
 		_field24 = -1;
@@ -67,7 +67,7 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 		return 0;
 	default:
 		if (_childObject && sender == _parentModule)
-			return _childObject->sendMessage(messageNum, param, sender);
+			return sender->sendMessage(_childObject, messageNum, param);
 	}
 	return 0;
 }
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 5e1ae6f..011ea9e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -67,7 +67,6 @@ Module1000::~Module1000() {
 void Module1000::createScene1001(int which) {
 	_vm->gameState().sceneNum = 0;
 	_childObject = new Scene1001(_vm, this, which);
-	// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3);
 	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
 	SetUpdateHandler(&Module1000::updateScene1001);
 }
@@ -75,7 +74,6 @@ void Module1000::createScene1001(int which) {
 void Module1000::createScene1002(int which) {
 	_vm->gameState().sceneNum = 1;
 	_childObject = new Scene1002(_vm, this, which);
-	// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
 	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
 	SetUpdateHandler(&Module1000::updateScene1002);
 }
@@ -91,7 +89,6 @@ void Module1000::createScene1004(int which) {
 	_vm->gameState().sceneNum = 3;
 	_childObject = new Scene1004(_vm, this, which);
 	SetUpdateHandler(&Module1000::updateScene1004);
-	// TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1);
 	// TODO Music18hList_stop(0x061880C6, 0, 2);
 }
 
@@ -106,7 +103,6 @@ void Module1000::createScene1005(int which) {
 void Module1000::updateScene1001() {
 	_childObject->handleUpdate();
 	if (_done) {
-		debug("SCENE 1001 DONE; _field20 = %d", _field20);
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
@@ -118,30 +114,16 @@ void Module1000::updateScene1001() {
 			_childObject->handleUpdate();
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 2) {
-			// TODO ResourceTable_multiLoad(&_resourceTable2, &_resourceTable1, &_resourceTable3);
-			_field24 = -1;
-		} else {
-			// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable1);
-			_field24 = -1;
-		}
-	}
-	if (_field26 >= 0) {
-		// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3);
-		_field26 = -1;
-	}
 }
 
 void Module1000::updateScene1002() {
 	_childObject->handleUpdate();
 	if (_done) {
-		debug("SCENE 1002 DONE; _field20 = %d", _field20);
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		} else if (_field20 == 2) {
 			createScene1004(0);
 			_childObject->handleUpdate();
@@ -150,27 +132,6 @@ void Module1000::updateScene1002() {
 			_childObject->handleUpdate();
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 1) {
-			_parentModule->sendMessage(0x100A, 0, this);
-		} else if (_field24 == 2) {
-			// TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1);
-		} else {
-			// TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable3);
-		}
-		_field24 = -1;
-	}
-	if (_field26 >= 0) {
-		if (_field26 == 1) {
-			_parentModule->sendMessage(0x1023, 0, this);
-		} else {
-			// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
-		}
-		_field26 = -1;
-	}
-	if (_field28 >= 0) {
-		_field28 = -1;
-	}
 }
 			
 void Module1000::updateScene1003() {
@@ -187,7 +148,6 @@ void Module1000::updateScene1003() {
 void Module1000::updateScene1004() {
 	_childObject->handleUpdate();
 	if (_done) {
-		debug("SCENE 1004 DONE; _field20 = %d", _field20);
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
@@ -199,22 +159,11 @@ void Module1000::updateScene1004() {
 			_childObject->handleUpdate();
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 0) {
-			// TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1);
-		}
-		_field24 = -1;
-	}
-	if (_field26 >= 0) {
-		// TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1);
-		_field26 = -1;
-	}
 }
 			
 void Module1000::updateScene1005() {
 	_childObject->handleUpdate();
 	if (_done) {
-		debug("SCENE 1005 DONE");
 		// TODO Music18hList_stop(_musicFileHash, 0, 1);
 		_done = false;
 		delete _childObject;
@@ -323,7 +272,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 	case 0x100D:
 		if (param.asInteger() == 0x00352100) {
 			if (_asDoor) {
-				_asDoor->sendMessage(0x2000, 0, this);
+				sendMessage(_asDoor, 0x2000, 0);
 			}
 		} else if (param.asInteger() == 0x0A1A0109) {
 			_soundResource.play(0x66410886);
@@ -388,13 +337,13 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x00C0C444) {
-			_parentScene->sendMessage(0x480F, 0, this);
+			sendMessage(_parentScene, 0x480F, 0);
 		} else if (param.asInteger() == 0xC41A02C0) {
 			_soundResource.play(0x40581882);
 		}
 		break;
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x3002:
@@ -405,10 +354,10 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 		setFileHash(0x04A98C36, 0, -1);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -434,7 +383,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x480B:
-		_parentScene->sendMessage(0x480B, 0, this);
+		sendMessage(_parentScene, 0x480B, 0);
 		_surface->setVisible(true);
 		_countdown = 8;
 		_soundResource.play(_soundFileHash);
@@ -483,7 +432,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	addSprite(_klayman);
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300));
+	tempSprite = insertStaticSprite(0x2080A3A8, 1300);
 
 	// TODO: This sucks somehow, find a better way
 	_klayman->getSurface()->getClipRect().x1 = 0;
@@ -503,13 +452,13 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1));
 
-	addSprite(new StaticSprite(_vm, 0x809861A6, 950));
-	addSprite(new StaticSprite(_vm, 0x89C03848, 1100));
+	insertStaticSprite(0x809861A6, 950);
+	insertStaticSprite(0x89C03848, 1100);
 
 	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0));
 
 	if (getGlobalVar(0x03C698DA) == 0) {
-		tempSprite = addSprite(new StaticSprite(_vm, 0x8C066150, 200));
+		tempSprite = insertStaticSprite(0x8C066150, 200);
 		_asWindow = addSprite(new AsScene1001Window(_vm));
 		_asWindow->getSurface()->getClipRect().x1 = tempSprite->getSurface()->getDrawRect().x;
 		_asWindow->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
@@ -534,18 +483,18 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x000D:
 		if (param.asInteger() == 0x188B2105) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 			messageResult = 1;
 		}
 		break;
 	case 0x100D:
 		if (param.asInteger() == 0x00342624) {
-			_klayman->sendMessage(0x1014, _asLever, this);
+			sendEntityMessage(_klayman, 0x1014, _asLever);
 			setMessageList2(0x004B4910);
 			messageResult = 1;
 		} else if (param.asInteger() == 0x21E64A00) {
@@ -556,7 +505,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 			messageResult = 1;
 		} else if (param.asInteger() == 0x040424D0) {
-			_klayman->sendMessage(0x1014, _ssButton, this);
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x80006358) {
 			if (getGlobalVar(0x03C698DA)) {
 				setMessageList(0x004B4938);
@@ -570,12 +519,12 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (_asWindow) {
-			_asWindow->sendMessage(0x2001, 0, this);
+			sendMessage(_asWindow, 0x2001, 0);
 		}
 		break;
 	case 0x480F:
 		if (_asHammer) {
-			_asHammer->sendMessage(0x2000, 0, this);
+			sendMessage(_asHammer, 0x2000, 0);
 		}
 		break;
 	}
@@ -594,10 +543,10 @@ uint32 SsScene1002LadderArch::handleMessage(int messageNum, const MessageParam &
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 995, this);
+		sendMessage(_parentScene, 0x1022, 995);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1015, this);
+		sendMessage(_parentScene, 0x1022, 1015);
 		break;
 	}
 	return messageResult;
@@ -613,10 +562,10 @@ uint32 Class599::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 995, this);
+		sendMessage(_parentScene, 0x1022, 995);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1015, this);
+		sendMessage(_parentScene, 0x1022, 1015);
 		break;
 	}
 	return messageResult;
@@ -666,7 +615,7 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &
 	switch (messageNum) {
 	case 0x4806:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
-		_parentScene->sendMessage(0x4806, 0, this);
+		sendMessage(_parentScene, 0x4806, 0);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447760);
 		if (_flag1) {
 			setFileHash(0x87502558, 0, -1);
@@ -676,15 +625,15 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &
 		break;
 	case 0x480F:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
-		_parentScene->sendMessage(0x480F, 0, this);
+		sendMessage(_parentScene, 0x480F, 0);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447890);
 		setFileHash(0x861A2020, 0, -1);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -703,16 +652,16 @@ uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam &
 		}
 		break;
 	case 0x4807:
-		_parentScene->sendMessage(0x4807, 0, this);
+		sendMessage(_parentScene, 0x4807, 0);
 		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
 		setFileHash(0x8258A030, 0, -1);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -726,10 +675,10 @@ uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam &
 		SetMessageHandler(&AsScene1002Ring::handleMessage447930);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -739,16 +688,16 @@ uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam &
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4807:
-		_parentScene->sendMessage(0x4807, 0, this);
+		sendMessage(_parentScene, 0x4807, 0);
 		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
 		setFileHash(0x8258A030, 0, -1);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -766,10 +715,10 @@ uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam &
 		setFileHash(0xA85C4011, 0, -1);
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -891,7 +840,7 @@ uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessagePara
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xA61CA1C2) {
-			_class505->sendMessage(0x2004, 0, this);
+			sendMessage(_class505, 0x2004, 0);
 		} else if (param.asInteger() == 0x14CE0620) {
 			_soundResource.play();
 		}
@@ -1025,7 +974,7 @@ uint32 Class426::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x480B:
-		_parentScene->sendMessage(0x480B, 0, this);
+		sendMessage(_parentScene, 0x480B, 0);
 		_status = 1;
 		_countdown = 4;
 		_surface->setVisible(true);
@@ -1098,12 +1047,12 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 	case 0x1011:
 		if (_flag) {
 			if (_x >= 154 && _x <= 346) {
-				_parentScene->sendMessage(0x2000, 0, this);
+				sendMessage(_parentScene, 0x2000, 0);
 				messageResult = 1;
 			}
 		} else {
 			if (_x >= 174 && _x <= 430) {
-				_parentScene->sendMessage(0x2000, 0, this);
+				sendMessage(_parentScene, 0x2000, 0);
 				messageResult = 1;
 			}
 		}
@@ -1146,10 +1095,10 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 		sub448780();
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 995, this);
+		sendMessage(_parentScene, 0x1022, 995);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1015, this);
+		sendMessage(_parentScene, 0x1022, 1015);
 		break;
 	}
 	return messageResult;
@@ -1174,14 +1123,14 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag
 		} else if (param.asInteger() == 0x41881801) {
 			if (_flag) {
 				if (_x > 330) {
-					_klayman->sendMessage(0x4811, 2, this);
+					sendMessage(_klayman, 0x4811, 2);
 				} else if (_x > 265) {
-					_klayman->sendMessage(0x4811, 0, this);
+					sendMessage(_klayman, 0x4811, 0);
 				} else {
-					_klayman->sendMessage(0x4811, 0, this);
+					sendMessage(_klayman, 0x4811, 0);
 				}
 			} else {
-				_klayman->sendMessage(0x4811, 0, this);
+				sendMessage(_klayman, 0x4811, 0);
 			}
 		} else if (param.asInteger() == 0x522200A0) {
 			_soundResource.play(0x931080C8);
@@ -1191,10 +1140,10 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag
 		removeCallbacks();
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 995, this);
+		sendMessage(_parentScene, 0x1022, 995);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1015, this);
+		sendMessage(_parentScene, 0x1022, 1015);
 		break;
 	}
 	return messageResult;
@@ -1216,7 +1165,7 @@ void AsScene1002VenusFlyTrap::sub448530() {
 }
 
 void AsScene1002VenusFlyTrap::sub448560() {
-	_parentScene->sendMessage(0x4807, 0, this);
+	sendMessage(_parentScene, 0x4807, 0);
 	setFileHash(0x82292851, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
@@ -1287,7 +1236,7 @@ void AsScene1002VenusFlyTrap::sub448780() {
 		} else {
 			setDoDeltaX(_x > 320 ? 1 : 0);
 		}
-		_klayman->sendMessage(0x2001, 0, this);
+		sendMessage(_klayman, 0x2001, 0);
 		setFileHash(0x8C2C80D4, 0, -1);
 		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 		SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
@@ -1426,7 +1375,7 @@ uint32 Class479::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
-			_parentScene->sendMessage(0x1022, 1200, this);
+			sendMessage(_parentScene, 0x1022, 1200);
 			_flag1 = true;
 			_savedClipRect = _surface->getClipRect();
 			_surface->getClipRect().x1 = 0;
@@ -1434,7 +1383,7 @@ uint32 Class479::handleMessage(int messageNum, const MessageParam &param, Entity
 			_surface->getClipRect().x2 = 640;
 			_surface->getClipRect().y2 = 480;
 		} else if (param.asInteger() == 0x88001184) {
-			_parentScene->sendMessage(0x1022, 1000, this);
+			sendMessage(_parentScene, 0x1022, 1000);
 			if (_flag1) {
 				_surface->getClipRect() = _savedClipRect;
 			}
@@ -1464,19 +1413,19 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_flag = false;
 
-	addSprite(new StaticSprite(_vm, 0x06149428, 1100));
-	addSprite(new StaticSprite(_vm, 0x312C8774, 1100));
+	insertStaticSprite(0x06149428, 1100);
+	insertStaticSprite(0x312C8774, 1100);
 
 	_ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this));
-	_ssLadderArchPart1 = addSprite(new StaticSprite(_vm, 0x060000A0, 1200));
-	_ssLadderArchPart2 = addSprite(new StaticSprite(_vm, 0xB2A423B0, 1100));
-	_ssLadderArchPart3 = addSprite(new StaticSprite(_vm, 0x316E0772, 1100));
+	_ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200);
+	_ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100);
+	_ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100);
 
 	_class599 = addSprite(new Class599(_vm, this));
 
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
-			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
+			InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch)); 
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			_klayman->getSurface()->getClipRect().x1 = 31;
@@ -1486,7 +1435,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
-			_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435);
+			InsertKlayman(KmScene1002, 379, 435, (_class599, _ssLadderArch));
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
@@ -1496,7 +1445,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		}
 	} else if (which == 1) {
-		_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
+		InsertKlayman(KmScene1002, 650, 435, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4478);
 		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
@@ -1506,7 +1455,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
-		_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
+		InsertKlayman(KmScene1002, 68, 645, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4298);
 		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
@@ -1515,9 +1464,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
 		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		_vm->_gameState.field2 = 1;
-		_klayman->sendMessage(0x4820, 0, this);
+		sendMessage(_klayman, 0x4820, 0);
 	} else {
-		_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
+		InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4470);
 		_klayman->getSurface()->getClipRect().x1 = 31;
@@ -1531,11 +1480,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_gameState.field2 = 0;
 	}
 
-	addSprite(_klayman);
-
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL));
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0xB3242310, 825));
+	tempSprite = insertStaticSprite(0xB3242310, 825);
 	tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x;
 	tempClipRect.y1 = tempSprite->getSurface()->getDrawRect().y;
 	tempClipRect.x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
@@ -1558,7 +1505,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
 
-	_klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this);
+	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 
 	_class506 = addSprite(new Class506(_vm));
 								  
@@ -1587,7 +1534,7 @@ void Scene1002::update() {
 	}
 
 	if (_flag1BE && _klayman->getY() > 422) {
-		_parentModule->sendMessage(0x1024, 1, this);
+		sendMessage(_parentModule, 0x1024, 1);
 		_flag1BE = false;
 	}
 	
@@ -1602,14 +1549,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
 			setGlobalVar(0x8306F218, 1);
 			setGlobalVar(0x1B144052, 3);
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		}
 		break;
 	case 0x000D:
 		if (param.asInteger() == 0x48848178) {
 			setGlobalVar(0x8306F218, 1);
 			setGlobalVar(0x1B144052, 3);
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		}
 		messageResult = 1;
 		break;
@@ -1624,15 +1571,15 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			messageResult = 1;
 		} else if (param.asInteger() == 0x4A845A00) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _asRing1, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing1);
 		} else if (param.asInteger() == 0x43807801) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _asRing2, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing2);
 		} else if (param.asInteger() == 0x46C26A01) {
 			if (getGlobalVar(0x8306F218)) {
 				setMessageList(0x004B44B8);
 			} else {
-				_klayman->sendEntityMessage(0x1014, _asRing3, this);
+				sendEntityMessage(_klayman, 0x1014, _asRing3);
 				if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) {
 					setGlobalVar(0x2B514304, 1);
 					setMessageList(0x004B44A8);
@@ -1644,12 +1591,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			messageResult = 1;
 		} else if (param.asInteger() == 0x468C7B11) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _asRing4, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing4);
 		} else if (param.asInteger() == 0x42845B19) {
 			// TODO _resourceTable4.load();
-			_klayman->sendEntityMessage(0x1014, _asRing5, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing5);
 		} else if (param.asInteger() == 0xC0A07458) {
-			_klayman->sendEntityMessage(0x1014, _class426, this);
+			sendEntityMessage(_klayman, 0x1014, _class426);
 		}
 		break;
 	case 0x1024:
@@ -1658,14 +1605,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 3) {
 			// TODO _resourceTable2.load();
 		}
-		_parentModule->sendMessage(0x1024, param, this);
+		sendMessage(_parentModule, 0x1024, param.asInteger());
 		break;
 	case 0x2000:
 		if (_flag) {
 			setMessageList2(0x004B43D0);
 		} else {
 			if (_klayman->getY() > 420) {
-				_klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this);
+				sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap);
 				setMessageList2(0x004B4480);
 			} else if (_klayman->getY() > 227) {
 				setMessageList2(0x004B41E0);
@@ -1686,7 +1633,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		setRectList(0x004B43A0);
 		break;
 	case 0x4806:
-		_parentModule->sendMessage(0x1024, 2, this);
+		sendMessage(_parentModule, 0x1024, 2);
 		_flag1BE = true;
 		if (sender == _asRing1) {
 			setGlobalVar(0x4DE80AC0, 0);
@@ -1697,8 +1644,8 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (sender == _asRing3) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource2.play();
-			_asDoor->sendMessage(0x4808, 0, this);
-			_class506->sendMessage(0x4808, 0, this);
+			sendMessage(_asDoor, 0x4808, 0);
+			sendMessage(_class506, 0x4808, 0);
 		} else if (sender == _asRing4) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource1.play(0xE0558848);
@@ -1710,22 +1657,22 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x4807:
 		if (sender == _asRing3) {
 			_soundResource3.play();
-			_asDoor->sendMessage(0x4809, 0, this);
-			_class506->sendMessage(0x4809, 0, this);
+			sendMessage(_asDoor, 0x4809, 0);
+			sendMessage(_class506, 0x4809, 0);
 		} else if (sender == _asVenusFlyTrap) {
 			if (getGlobalVar(0x8306F218)) {
-				_asRing3->sendMessage(0x4807, 0, this);
+				sendMessage(_asRing3, 0x4807, 0);
 			}
 		}	
 		break;
 	case 0x480B:
-		_klayman->sendEntityMessage(0x1014, _asDoorSpy, this);
+		sendEntityMessage(_klayman, 0x1014, _asDoorSpy);
 		break;				
 	case 0x480F:
 		setGlobalVar(0x4DE80AC0, 0);
 		_soundResource2.play();
-		_asDoor->sendMessage(0x4808, 0, this);
-		_class506->sendMessage(0x4808, 0, this);
+		sendMessage(_asDoor, 0x4808, 0);
+		sendMessage(_class506, 0x4808, 0);
 		break;				
 	}	
 	return messageResult;
@@ -1751,7 +1698,7 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	}
@@ -1837,10 +1784,10 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_class478 = addSprite(new Class478(_vm, _klayman));
 
-	addSprite(new StaticSprite(_vm, 0x800034A0, 1100));
-	addSprite(new StaticSprite(_vm, 0x64402020, 1100));
-	addSprite(new StaticSprite(_vm, 0x3060222E, 1300));
-	tempSprite = addSprite(new StaticSprite(_vm, 0x0E002004, 1300));
+	insertStaticSprite(0x800034A0, 1100);
+	insertStaticSprite(0x64402020, 1100);
+	insertStaticSprite(0x3060222E, 1300);
+	tempSprite = insertStaticSprite(0x0E002004, 1300);
 	
 	_klayman->getSurface()->getClipRect().x1 = 0;
 	_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
@@ -1874,7 +1821,7 @@ uint32 Scene1004::handleMessage(int messageNum, const MessageParam &param, Entit
 		setRectList(0x004B7C70);
 		break;
 	case 0x2002:
-		_asTrashCan->sendMessage(0x2002, 0, this);
+		sendMessage(_asTrashCan, 0x2002, 0);
 		break;
 	}
 	return messageResult;
@@ -1909,14 +1856,14 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 		_background = addBackground(new DirtyBackground(_vm, 0x2800E011, 0, 0));
 		_palette = new Palette(_vm, 0x2800E011);
 		_palette->usePalette();
-		addSprite(new StaticSprite(_vm, 0x492D5AD7, 100));
+		insertStaticSprite(0x492D5AD7, 100);
 		_mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620));
 	} else {
 		_background = addBackground(new DirtyBackground(_vm, 0x8870A546, 0, 0));
 		_palette = new Palette(_vm, 0x8870A546);
 		_palette->usePalette();
-		addSprite(new StaticSprite(_vm, 0x40D1E0A9, 100));
-		addSprite(new StaticSprite(_vm, 0x149C00A6, 100));
+		insertStaticSprite(0x40D1E0A9, 100);
+		insertStaticSprite(0x149C00A6, 100);
 		_mouseCursor = addSprite(new Mouse435(_vm, 0x0A54288F, 20, 620));
 	}
 
@@ -1929,7 +1876,7 @@ uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);			
 		}
 		break;
 	}
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index ff494e7..163fc63 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -97,11 +97,11 @@ void Module1200::updateScene1201() {
 			createScene1202(0);
 			_childObject->handleUpdate();
 		} else if (_moduleDoneStatus == 2) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		} else if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
 			createScene1203(-1);
 		} else {
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		}
 	}
 }
@@ -245,7 +245,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x4806:
@@ -417,13 +417,13 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x092870C0) {
-			_class466->sendMessage(0x2006, 0, this);
+			sendMessage(_class466, 0x2006, 0);
 		} else if (param.asInteger() == 0x11CA0144) {
 			_soundResource.play(0x51800A04);
 		}
 		break;
 	case 0x1011:
-		_parentScene->sendMessage(0x2002, 0, this);
+		sendMessage(_parentScene, 0x2002, 0);
 		messageResult = 1;
 	case 0x480B:
 		if (!_flag) {
@@ -570,7 +570,7 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam
 	uint32 messageResult = handleMessage40C2D0(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x2001, 0, this);
+		sendMessage(_parentScene, 0x2001, 0);
 		messageResult = 1;
 		break;
 	case 0x4806:
@@ -693,8 +693,8 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar
 	case 0x100D:
 		if (param.asInteger() == 0x02060018) {
 			_soundResource.play(0xCD298116);
-			_parentScene->sendMessage(0x4814, 0, this);
-			_klayman->sendMessage(0x4814, 0, this);
+			sendMessage(_parentScene, 0x4814, 0);
+			sendMessage(_klayman, 0x4814, 0);
 		}
 		break;
 	case 0x3002:
@@ -1014,12 +1014,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x07053000) {
 			_flag = true;
-			_asCreature->sendMessage(0x2004, 0, this);
+			sendMessage(_asCreature, 0x2004, 0);
 		} else if (param.asInteger() == 0x140E5744) {
-			_asCreature->sendMessage(0x2005, 0, this);
+			sendMessage(_asCreature, 0x2005, 0);
 		} else if (param.asInteger() == 0x40253C40) {
 			_messageListFlag = false;
-			_asCreature->sendMessage(0x2006, 0, this);
+			sendMessage(_asCreature, 0x2006, 0);
 		} else if (param.asInteger() == 0x090EB048) {
 			if (_klayman->getX() < 572) {
 				setMessageList2(0x004AEC90);
@@ -1032,16 +1032,16 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (!getGlobalVar(0x0112090A)) {
 			setMessageList2(0x004AECB0);
 		} else {
-			_klayman->sendEntityMessage(0x1014, _asMatch, this);
+			sendEntityMessage(_klayman, 0x1014, _asMatch);
 			setMessageList2(0x004AECC0);
 		}
 		break;
 	case 0x2002:		
 		if (getGlobalVar(0x20A0C516)) {
-			_klayman->sendEntityMessage(0x1014, _asTntMan, this);
+			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			setMessageList2(0x004AECF0);
 		} else if (getGlobalVar(0x0112090A) == 3) {
-			_klayman->sendEntityMessage(0x1014, _asTntMan, this);
+			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			if (_klayman->getX() > _asTntMan->getX()) {
 				setMessageList(0x004AECD0);
 			} else {
@@ -1054,12 +1054,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
-			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004AED38);
 		}
 		break;
 	case 0x4829:
-		_asRightDoor->sendMessage(0x4829, 0, this);
+		sendMessage(_asRightDoor, 0x4829, 0);
 		break;		
 	}
 	return messageResult;
@@ -1131,7 +1131,7 @@ uint32 AsScene1202TntItem::handleMessage453FE0(int messageNum, const MessagePara
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x2000, _index, this);
+		sendMessage(_parentScene, 0x2000, _index);
 		messageResult = 1;
 		break;
 	case 0x2001:
@@ -1174,7 +1174,7 @@ void AsScene1202TntItem::sub454100() {
 }
 
 void AsScene1202TntItem::sub454160() {
-	_parentScene->sendMessage(0x2002, _index, this);
+	sendMessage(_parentScene, 0x2002, _index);
 	sub4540A0();
 }
 
@@ -1230,7 +1230,7 @@ void Scene1202::update() {
 	Scene::update();
 	if (_soundFlag) {
 		if (!_soundResource4.isPlaying()) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 	} else if (_counter == 0 && isSolved()) {
 		SetMessageHandler(&Scene1202::handleMessage453D90);
@@ -1240,8 +1240,8 @@ void Scene1202::update() {
 		_soundFlag = true;
 	} else if (_index >= 0 && _counter == 0) {
 		int index2 = kScene1202Table[_index];
-		_asTntItems[_index]->sendMessage(0x2001, getSubVar(0x10055D14, index2), this);
-		_asTntItems[index2]->sendMessage(0x2001, getSubVar(0x10055D14, _index), this);
+		sendMessage(_asTntItems[_index], 0x2001, getSubVar(0x10055D14, index2));
+		sendMessage(_asTntItems[index2], 0x2001, getSubVar(0x10055D14, _index));
 		int temp = getSubVar(0x10055D14, index2);
 		setSubVar(0x10055D14, index2, getSubVar(0x10055D14, _index));
 		setSubVar(0x10055D14, _index, temp);
@@ -1263,7 +1263,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam &param,
 	case 0x0001:
 		// TODO: Debug/Cheat stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x000D:
@@ -1287,7 +1287,7 @@ uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	}
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 04f4a2e..b8b7b8b 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -336,6 +336,7 @@ void Module1300::updateScene1306() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
+		debug("_field20 = %d", _field20);
 		if (_field20 == 2) {
 			createScene1309(0);
 			_childObject->handleUpdate();
@@ -343,7 +344,7 @@ void Module1300::updateScene1306() {
 			createScene1303(0);
 			_childObject->handleUpdate();
 		} else if (_field20 == 0) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		} else if (_field20 == 1) {
 			createScene1311(-1);
 			_childObject->handleUpdate();
@@ -397,9 +398,9 @@ void Module1300::updateScene1310() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_vm->gameState().sceneNum == 9)
-			createScene1315(0);
-		else
 			createScene1306(0);
+		else
+			createScene1315(0);
 		_childObject->handleUpdate();
 	}
 }
@@ -554,7 +555,7 @@ void AsScene1302Bridge::stRaiseBridge() {
 }
 
 void AsScene1302Bridge::cbLowerBridgeEvent() {
-	_parentScene->sendMessage(0x2032, 0, this);
+	sendMessage(_parentScene, 0x2032, 0);
 	setFileHash(0x88148150, -1, -1);
 	_newHashListIndex = -2;
 }
@@ -622,10 +623,10 @@ uint32 Class595::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 995, this);
+		sendMessage(_parentScene, 0x1022, 995);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1015, this);
+		sendMessage(_parentScene, 0x1022, 1015);
 		break;
 	}
 	return messageResult;
@@ -663,10 +664,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
 
 	if (which < 0) {
-		_klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364);
+//		_klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364);
 		setMessageList(0x004B0868);
 	} else {
-		_klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330);
+//		_klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330);
 		setMessageList(0x004B0870);
 	}
 	addSprite(_klayman);
@@ -679,7 +680,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true));
 	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
 
-	_klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this);
+	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 	
 }
 
@@ -689,10 +690,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4A845A00) {
-			_klayman->sendEntityMessage(0x1014, _asRing1, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing1);
 		} else if (param.asInteger() == 0x43807801) {
 			if (!getGlobalVar(0x13206309)) {
-				_klayman->sendEntityMessage(0x1014, _asRing2, this);
+				sendEntityMessage(_klayman, 0x1014, _asRing2);
 				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) {
 					setMessageList(0x004B0940);
 				} else {
@@ -703,10 +704,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 			messageResult = 1;
 		} else if (param.asInteger() == 0x46C26A01) {
-			_klayman->sendEntityMessage(0x1014, _asRing3, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing3);
 		} else if (param.asInteger() == 0x468C7B11) {
 			if (!getGlobalVar(0x80101B1E)) {
-				_klayman->sendEntityMessage(0x1014, _asRing4, this);
+				sendEntityMessage(_klayman, 0x1014, _asRing4);
 				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) {
 					setMessageList(0x004B0940);
 				} else {
@@ -717,7 +718,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 			messageResult = 1;
 		} else if (param.asInteger() == 0x42845B19) {
-			_klayman->sendEntityMessage(0x1014, _asRing5, this);
+			sendEntityMessage(_klayman, 0x1014, _asRing5);
 		} else if (param.asInteger() == 0x430A6060) {
 			if (getGlobalVar(0x13206309)) {
 				setMessageList2(0x004B0910);
@@ -740,7 +741,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2000:
 		if (_klayman->getY() > 360) {
-			_klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this);
+			sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap);
 			setMessageList2(0x004B08F0);	
 		} else {
 			setMessageList2(0x004B0920);
@@ -748,23 +749,23 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2002:
 		if (_klayman->getX() > 545) {
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		}
 		break;
 	case 0x2032:
 		_sprite2->getSurface()->setVisible(true);
 		break;
 	case 0x4806:
-		_parentModule->sendMessage(0x1024, 2, this);
+		sendMessage(_parentModule, 0x1024, 2);
 		if (sender == _asRing1) {
 			_soundResource.play(0x665198C0);
 		} else if (sender == _asRing2) {
-			_asBridge->sendMessage(0x4808, 0, this);
+			sendMessage(_asBridge, 0x4808, 0);
 			setGlobalVar(0x13206309, 1);
 		} else if (sender == _asRing3) {
 			_soundResource.play(0xE2D389C0);
 		} else if (sender == _asRing4) {
-			_ssFence->sendMessage(0x4808, 0, this);
+			sendMessage(_ssFence, 0x4808, 0);
 			setGlobalVar(0x80101B1E, 1);
 		} else if (sender == _asRing5) {
 			_soundResource.play(0x40428A09);
@@ -772,36 +773,36 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4807:
 		if (sender == _asRing2) {
-			_asBridge->sendMessage(0x4809, 0, this);
+			sendMessage(_asBridge, 0x4809, 0);
 			setGlobalVar(0x13206309, 0);
 			_sprite2->getSurface()->setVisible(false);
 		} else if (sender == _asRing4) {
-			_ssFence->sendMessage(0x4809, 0, this);
+			sendMessage(_ssFence, 0x4809, 0);
 			setGlobalVar(0x80101B1E, 0);
 		} else if (sender == _asVenusFlyTrap) {
 			if (getGlobalVar(0x13206309)) {
-				_asRing2->sendMessage(0x4807, 0, this);
+				sendMessage(_asRing2, 0x4807, 0);
 			} else {
-				_asRing4->sendMessage(0x4807, 0, this);
+				sendMessage(_asRing4, 0x4807, 0);
 			}
 		}
 		break;
 	case 0x480F:
 		if (sender == _asRing2) {
 			_soundResource.play(0x60755842);
-			_asBridge->sendMessage(0x4808, 0, this);
+			sendMessage(_asBridge, 0x4808, 0);
 			setGlobalVar(0x13206309, 1);
 		} else if (sender == _asRing4) {
 			_soundResource.play(0x60755842);
-			_ssFence->sendMessage(0x4808, 0, this);
+			sendMessage(_ssFence, 0x4808, 0);
 			setGlobalVar(0x80101B1E, 1);
 		}
 		break;
 	case 0x482A:
-		_asVenusFlyTrap->sendMessage(0x482B, 0, this);
+		sendMessage(_asVenusFlyTrap, 0x482B, 0);
 		break;
 	case 0x482B:
-		_asVenusFlyTrap->sendMessage(0x482A, 0, this);
+		sendMessage(_asVenusFlyTrap, 0x482A, 0);
 		break;
 	}
 	return messageResult;
@@ -824,7 +825,7 @@ uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &par
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x2000:
@@ -864,7 +865,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1303::handleMessage);
 	setRectList(0x004AF9E8);
 	
-	_background = addBackground(new DirtyBackground(_vm, 0x01581A9C, 0, 0));
+	setBackground(0x01581A9C);
 	_palette = new Palette(_vm, 0x01581A9C);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x81A9801D, NULL));
@@ -892,7 +893,7 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x2000:
 		setGlobalVar(0xAC00C0D0, 1);
-		_asBalloon->sendMessage(0x2000, 0, this);
+		sendMessage(_asBalloon, 0x2000, 0);
 		break;
 	case 0x4826:
 		if (sender == _asBalloon && getGlobalVar(0x31C63C51)) {
@@ -918,7 +919,7 @@ uint32 Class544::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x4806:
@@ -937,7 +938,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1304::handleMessage);
 	setRectList(0x004B91A8);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x062C0214, 0, 0));
+	setBackground(0x062C0214);
 	_palette = new Palette(_vm, 0x062C0214);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL));
@@ -991,10 +992,10 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _class544) {
-			_klayman->sendEntityMessage(0x1014, _class544, this);
+			sendEntityMessage(_klayman, 0x1014, _class544);
 			setMessageList(0x004B9130);
 		} else if (sender == _class545) {
-			_klayman->sendEntityMessage(0x1014, _class545, this);
+			sendEntityMessage(_klayman, 0x1014, _class545);
 			setMessageList(0x004B9140);
 		}
 		break;
@@ -1093,7 +1094,7 @@ void AsScene1306Elevator::stGoingUp() {
 
 void AsScene1306Elevator::cbGoingUpEvent() {
 	SetUpdateHandler(&AsScene1306Elevator::update);
-	_parentScene->sendMessage(0x4808, 0, this);
+	sendMessage(_parentScene, 0x4808, 0);
 	_isUp = true;
 	_countdown = 144;
 	setFileHash1();
@@ -1112,7 +1113,7 @@ void AsScene1306Elevator::stGoingDown() {
 
 void AsScene1306Elevator::cbGoingDownEvent() {
 	_isDown = true;
-	_parentScene->sendMessage(0x4809, 0, this);
+	sendMessage(_parentScene, 0x4809, 0);
 	SetUpdateHandler(&AsScene1306Elevator::update);
 	setFileHash1();
 }
@@ -1154,13 +1155,13 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		_klayman = new KmScene1306(_vm, this, 380, 440);
 		setMessageList(0x004AFAD0);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 1) {
 		_klayman = new KmScene1306(_vm, this, 136, 440);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFAF0);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
@@ -1170,34 +1171,34 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman = new KmScene1306(_vm, this, 355, 440);
 		}
 		setMessageList(0x004AFBC8);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 3) {
 		_klayman = new KmScene1306(_vm, this, 534, 440);
 		setMessageList(0x004AFC30);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 4) {
 		_klayman = new KmScene1306(_vm, this, 136, 440);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFC38);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 5) {
 		_klayman = new KmScene1306(_vm, this, 136, 440);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFB00);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else {
 		_klayman = new KmScene1306(_vm, this, 286, 408);
 		setSurfacePriority(_asElevator->getSurface(), 1100);
 		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
 		setSurfacePriority(_sprite1->getSurface(), 1080);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		SetMessageHandler(&Scene1306::handleMessage416EB0);
 		clearRectList();
-		_asElevator->sendMessage(0x4808, 0, this);
+		sendMessage(_asElevator, 0x4808, 0);
 	}
 	addSprite(_klayman);
 
@@ -1212,9 +1213,9 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x402064D8) {
-			_klayman->sendEntityMessage(0x1014, _ssButton, this);
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x01C66840) {
-			if (_asElevator->sendMessage(0x2001, 0, this) != 0) {
+			if (sendMessage(_asElevator, 0x2001, 0) != 0) {
 				setMessageList(0x004AFBD8);
 			} else {
 				setMessageList(0x004AFAE0);
@@ -1236,18 +1237,18 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
-			_asElevator->sendMessage(0x4808, 0, this);
+			sendMessage(_asElevator, 0x4808, 0);
 		}
 		break;
 	case 0x4826:
 		if (sender == _class545) {
 			if (_klayman->getX() >= 249) {
-				_klayman->sendEntityMessage(0x1014, _class545, this);
+				sendEntityMessage(_klayman, 0x1014, _class545);
 				setMessageList(0x004AFC58);
 			}
 		} else if (sender == _asTape) {
 			if (_klayman->getX() >= 249) {
-				_klayman->sendEntityMessage(0x1014, _class545, this);
+				sendEntityMessage(_klayman, 0x1014, _class545);
 				setMessageList(0x004AFC68);
 			}
 		}
@@ -1261,7 +1262,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 		setSurfacePriority(_asElevator->getSurface(), 100);
 		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
 		setSurfacePriority(_sprite1->getSurface(), 80);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 		break;
 	}
@@ -1276,7 +1277,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 		SetMessageHandler(&Scene1306::handleMessage);
 		break;
 	case 0x4809:
-		_parentModule->sendMessage(0x1009, 1, this);
+		sendMessage(_parentModule, 0x1009, 1);
 		break;
 	case 0x482A:
 		setSurfacePriority(_asElevator->getSurface(), 1100);
@@ -1287,7 +1288,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 		setSurfacePriority(_asElevator->getSurface(), 100);
 		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
 		setSurfacePriority(_sprite1->getSurface(), 80);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 		break;
 	}
@@ -1389,7 +1390,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x1011:
 		if (_isClickable) {
-			_parentScene->sendMessage(0x4826, 0, this);
+			sendMessage(_parentScene, 0x4826, 0);
 			stRemoveKey();
 			messageResult = 1;
 		}
@@ -1434,7 +1435,7 @@ void AsScene1307Key::suInsertKey() {
 			_soundResource1.play();
 	} else {
 		SetSpriteCallback(NULL);
-		_parentScene->sendMessage(0x2002, 0, this);
+		sendMessage(_parentScene, 0x2002, 0);
 	}
 }
 
@@ -1463,7 +1464,7 @@ void AsScene1307Key::stRemoveKey() {
 
 void AsScene1307Key::stInsertKey() {
 	_pointIndex = 0;
-	_parentScene->sendMessage(0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], this);
+	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]);
 	_surface->getClipRect() = _clipRects[getSubVar(0xA010B810, _index) % 4];
 	SetSpriteCallback(&AsScene1307Key::suInsertKey);
 	_newHashListIndex = -2;
@@ -1473,7 +1474,7 @@ void AsScene1307Key::stMoveKey() {
 	NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)];
 	int16 newX = pt.x + kAsScene1307KeyXDelta;
 	int16 newY = pt.y + kAsScene1307KeyYDelta;
-	_parentScene->sendMessage(0x1022, 1000, this);
+	sendMessage(_parentScene, 0x1022, 1000);
 	_surface->getClipRect().x1 = 0;
 	_surface->getClipRect().y1 = 0;
 	_surface->getClipRect().x2 = 640;
@@ -1584,7 +1585,7 @@ void Scene1307::update() {
 		_palette->startFadeToWhite(40);
 	}
 	if (_doLeaveScene && !_soundResource.isPlaying()) {
-		_parentModule->sendMessage(0x1009, 1, this);
+		sendMessage(_parentModule, 0x1009, 1);
 		setGlobalVar(0x80455A41, 1);
 	} 
 }
@@ -1617,14 +1618,14 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 						}
 						if (!occupied) {
 							// If the keyhole is free, insert the current key
-							_asCurrKey->sendMessage(0x2001, clickedKeyHoleIndex, this);
+							sendMessage(_asCurrKey, 0x2001, clickedKeyHoleIndex);
 							_isInsertingKey = true;
 							_mouseClicked = false;
 						}
 					}
 				}
 			} else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) {
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			}
 		}
 		break;
@@ -1637,7 +1638,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 			// Play unlock animations for all keys
 			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 				if (_asKeys[keyIndex])
-					_asKeys[keyIndex]->sendMessage(0x2003, 1, this);
+					sendMessage(_asKeys[keyIndex], 0x2003, 1);
 			}
 			_soundResource.play();
 			_isPuzzleSolved = true;
@@ -1645,10 +1646,10 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else {
 			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 				if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) {
-					_asKeys[keyIndex]->sendMessage(0x2000, 1, this);
+					sendMessage(_asKeys[keyIndex], 0x2000, 1);
 				}
 			}
-			_asCurrKey->sendMessage(0x2004, 1, this);
+			sendMessage(_asCurrKey, 0x2004, 1);
 		}
 		_asCurrKey = NULL;
 		_isInsertingKey = false;
@@ -1657,7 +1658,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 		_asCurrKey = (Sprite*)sender;
 		for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 			if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) {
-				_asKeys[keyIndex]->sendMessage(0x2000, 0, this);
+				sendMessage(_asKeys[keyIndex], 0x2000, 0);
 			}
 		}
 		break;
@@ -1717,7 +1718,7 @@ void Class549::sub455470() {
 }
 
 void Class549::hide() {
-	_parentScene->sendMessage(0x2000, 0, this);
+	sendMessage(_parentScene, 0x2000, 0);
 	setFileHash1();
 	_surface->setVisible(false);
 }
@@ -1731,7 +1732,7 @@ void Class549::sub4554F0() {
 }
 
 void Class549::sub455550() {
-	_parentScene->sendMessage(0x2001, 0, this);
+	sendMessage(_parentScene, 0x2001, 0);
 	setFileHash1();
 }
 
@@ -1762,7 +1763,7 @@ void Class592::sub455710() {
 }
 
 void Class592::sub455740() {
-	_parentScene->sendMessage(0x2004, 0, this);
+	sendMessage(_parentScene, 0x2004, 0);
 	setFileHash1();
 	_surface->setVisible(false);
 }
@@ -1804,7 +1805,7 @@ void Class593::sub455920() {
 }
 
 void Class593::sub455950() {
-	_parentScene->sendMessage(0x2003, 0, this);
+	sendMessage(_parentScene, 0x2003, 0);
 	setFileHash1();
 	_surface->setVisible(false);
 }
@@ -1911,7 +1912,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else {
 		_klayman = new KmScene1308(_vm, this, 41, 440);
 		setMessageList(0x004B57D0);
-		_class549->sendMessage(0x4808, 0, this);
+		sendMessage(_class549, 0x4808, 0);
 		_sprite1->getSurface()->setVisible(false);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
@@ -1958,7 +1959,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			setRectList(0x004B59A0);
 			_flag1 = true;
 		} else if (param.asInteger() == 0x08821382) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			if (getGlobalVar(0x80455A41)) {
 				setRectList(0x004B5990);
 			} else {
@@ -1967,7 +1968,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			_flag1 = false;
 		} else if (param.asInteger() == 0x4AC68808) {
 			clearRectList();
-			_class549->sendMessage(0x4809, 0, this);
+			sendMessage(_class549, 0x4809, 0);
 			_sprite1->getSurface()->setVisible(false);
 			_klayman->getSurface()->setVisible(false);
 		}
@@ -1991,7 +1992,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		_klayman->getSurface()->setVisible(true);
 		break;
 	case 0x2001:
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	case 0x2003:
 		_class601_1->getSurface()->setVisible(false);
@@ -2003,10 +2004,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		setRectList(0x004B5990);
 		break;
 	case 0x4807:
-		_class593->sendMessage(0x2003, 0, this);
+		sendMessage(_class593, 0x2003, 0);
 		break;
 	case 0x480F:
-		_class593->sendMessage(0x2002, 0, this);
+		sendMessage(_class593, 0x2002, 0);
 		_class601_1->getSurface()->setVisible(true);
 		_class601_2->getSurface()->setVisible(true);
 		_class601_3->getSurface()->setVisible(true);
@@ -2017,10 +2018,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 				setMessageList2(0x004B5868);
 			} else {
 				if (param.asInteger() == 1) {
-					_klayman->sendMessage(0x1014, _class489, this);
+					sendEntityMessage(_klayman, 0x1014, _class489);
 					setMessageList2(0x004B5848);
-				} else if (_class489->sendMessage(0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1, this) != 0) {
-					_klayman->sendEntityMessage(0x1014, _class489, this);
+				} else if (sendMessage(_class489, 0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1) != 0) {
+					sendEntityMessage(_klayman, 0x1014, _class489);
 					setMessageList2(0x004B5830);
 				} else {
 					setMessageList2(0x004B5800);
@@ -2030,7 +2031,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (_flag1) {
 				setMessageList2(0x004B5868);
 			} else if (_messageListStatus != 2) {
-				_klayman->sendMessage(0x1014, _asTape, this);
+				sendEntityMessage(_klayman, 0x1014, _asTape);
 				setMessageList2(0x004B58E0);
 			}
 		}
@@ -2135,7 +2136,7 @@ uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam &param, Ent
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	}
 	return messageResult;
@@ -2145,7 +2146,7 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 7835520..60e5279 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -133,7 +133,7 @@ void Module1400::updateScene1401() {
 			createScene1404(0);
 			_childObject->handleUpdate();
 		} else {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 	}
 }
@@ -505,7 +505,7 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x4807:
@@ -534,10 +534,10 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity
 		}
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	case 0x4828:
 		sub435040();
@@ -552,14 +552,14 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam &param,
 	case 0x1011:
 		if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 &&
 			param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) {
-			_parentScene->sendMessage(0x4826, 1, this);
+			sendMessage(_parentScene, 0x4826, 1);
 		} else {
-			_parentScene->sendMessage(0x4826, 0, this);
+			sendMessage(_parentScene, 0x4826, 0);
 		}
 		messageResult = 1;
 		break;
 	case 0x4807:
-		_parentScene->sendMessage(0x4807, 0, this);
+		sendMessage(_parentScene, 0x4807, 0);
 		sub434F80();
 		break;
 	case 0x480B:
@@ -583,10 +583,10 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam &param,
 		sub434EC0();
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -610,11 +610,11 @@ void Class489::spriteUpdate434B60() {
 	sub434C80();
 	if (_remX == _x) {
 		if (getGlobalVar(0x04A10F33) == 0 && _class489Item->flag4 != 0) {
-			_parentScene->sendMessage(0x1019, 0, this);
+			sendMessage(_parentScene, 0x1019, 0);
 			incGlobalVar(0x04A105B3, -1);
 			setGlobalVar(0x04A10F33, kClass489Items[getGlobalVar(0x04A105B3)].varIndex1);
 		} else if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex1 && _class489Item->flag != 0) {
-			_parentScene->sendMessage(0x1019, 1, this);
+			sendMessage(_parentScene, 0x1019, 1);
 			incGlobalVar(0x04A105B3, +1);
 			setGlobalVar(0x04A10F33, 0);
 		}
@@ -666,7 +666,7 @@ void Class489::sub434C80() {
 void Class489::sub434D80() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
-		_class525->sendMessage(0x483A, 0, this);
+		sendMessage(_class525, 0x483A, 0);
 		setFileHash1();
 		SetMessageHandler(&Sprite::handleMessage);
 		SetSpriteCallback(NULL);
@@ -713,7 +713,7 @@ void Class489::sub434EC0() {
 }
 
 void Class489::sub434F40() {
-	_parentScene->sendMessage(0x480F, 0, this);
+	sendMessage(_parentScene, 0x480F, 0);
 	setFileHash(0xD833207F, 0, -1);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage4348E0);
@@ -799,12 +799,12 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class489 = addSprite(new Class489(_vm, this, _klayman, _class525));
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x04A10F33) == 6) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			_klayman->setX(_class489->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B6670);
 		} else if (getGlobalVar(0x04A10F33) == 0) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			_klayman->setX(_class489->getX() - 100);
 			_klayman->processDelta();
 			setMessageList(0x004B6670);
@@ -821,7 +821,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->getSurface()->getClipRect().y2 = 480;
 
 	if (which == 0 && _class489 && _class489->hasMessageHandler()) {
-		_class489->sendMessage(0x482B, 0, this);
+		sendMessage(_class489, 0x482B, 0);
 	}
 
 	_class528 = addSprite(new Class528(_vm, _klayman, which == 1));
@@ -843,11 +843,11 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02144CB1) {
-			_klayman->sendEntityMessage(0x1014, _class427, this);
+			sendEntityMessage(_klayman, 0x1014, _class427);
 		} else if (param.asInteger() == 0x402064D8) {
-			_klayman->sendEntityMessage(0x1014, _ssButton, this);
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x01C66840) {
-			if (_class528->hasMessageHandler() && _class528->sendMessage(0x2001, 0, this) != 0) {
+			if (_class528->hasMessageHandler() && sendMessage(_class528, 0x2001, 0) != 0) {
 				setMessageList(0x004B6690);
 			} else {
 				setMessageList(0x004B66B0);
@@ -856,30 +856,30 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x1019:
 		if (param.asInteger() != 0) {
-			_parentModule->sendMessage(0x1009, 2, this);
+			sendMessage(_parentModule, 0x1009, 2);
 		} else {
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		}			
 		break;
 	case 0x480B:
 		if (sender == _class427) {
-			_class525->sendMessage(0x2000, 0, this);
+			sendMessage(_class525, 0x2000, 0);
 			if (!getGlobalVar(0x01023818)) {
-				_class526->sendMessage(0x4839, 0, this);
-				_class527->sendMessage(0x4839, 0, this);
+				sendMessage(_class526, 0x4839, 0);
+				sendMessage(_class527, 0x4839, 0);
 				setGlobalVar(0x01023818, 1);
 			}
 			if (_class489 && _class489->getX() > 404 && _class489->getX() < 504) {
-				_class489 ->sendMessage(0x4839, 0, this);
+				sendMessage(_class489 , 0x4839, 0);
 			}
 		} else if (sender == _ssButton) {
-			_ssButton->sendMessage(0x4808, 0, this);
+			sendMessage(_ssButton, 0x4808, 0);
 		}
 		break;
 	case 0x4826:
 		if (sender == _class489) {
-			if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
-				_klayman->sendEntityMessage(0x1014, _class489, this);
+			if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _class489);
 				setMessageList2(0x004B6658);
 			} else {
 				setMessageList2(0x004B65F0);
@@ -889,13 +889,13 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x482A:
 		_sprite1->getSurface()->setVisible(true);
 		if (_class489) {
-			_class489->sendMessage(0x482B, 0, this);
+			sendMessage(_class489, 0x482B, 0);
 		}
 		break;
 	case 0x482B:
 		_sprite1->getSurface()->setVisible(false);
 		if (_class489) {
-			_class489->sendMessage(0x482A, 0, this);
+			sendMessage(_class489, 0x482A, 0);
 		}
 		break;
 	}
@@ -955,19 +955,19 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Class482::sub428500() {
-	_parentScene->sendMessage(0x2000, 0, this);
+	sendMessage(_parentScene, 0x2000, 0);
 	setFileHash1();
 	_surface->setVisible(false);
 }
 
 void Class482::sub428530() {
-	_parentScene->sendMessage(0x2001, 0, this);
+	sendMessage(_parentScene, 0x2001, 0);
 	setFileHash1();
 	_surface->setVisible(false);
 }
 
 void Class482::sub428560() {
-	_parentScene->sendMessage(0x2003, 0, this);
+	sendMessage(_parentScene, 0x2003, 0);
 	setFileHash1();
 }
 
@@ -1035,12 +1035,12 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x4A10F33) == 4) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			_klayman->setX(_class489->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
 		} else if (getGlobalVar(0x4A10F33) == 0) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			_klayman->setX(_class489->getX() - 100);
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
@@ -1086,21 +1086,21 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x00F43389) {
 			if (getGlobalVar(0x70A1189C)) {
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			} else {
 				clearRectList();
 				_klayman->getSurface()->setVisible(false);
 				_mouseCursor->getSurface()->setVisible(false);
-				_class482->sendMessage(0x2002, 0, this);
+				sendMessage(_class482, 0x2002, 0);
 				sub428220();
 			}
 		}
 		break;
 	case 0x1019:
 		if (param.asInteger()) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		} else {
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		}
 		break;
 	case 0x2000:
@@ -1110,15 +1110,15 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2001:
 		sub428230();
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	case 0x2003:
 		sub428230();
 		break;
 	case 0x4826:
 		if (sender == _class489) {
-			if (_class489->sendMessage(0x408C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
-				_klayman->sendEntityMessage(0x1014, _class489, this);
+			if (sendMessage(_class489, 0x408C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _class489);
 				setMessageList2(0x004B0BB8);
 			} else {
 				setMessageList2(0x004B0B68);
@@ -1249,7 +1249,7 @@ void AsScene1407Mouse::suWalkTo() {
 		xdelta = -_deltaX;
 	_deltaX = 0;		
 	if (_walkDestX == _x) {
-		sendMessage(0x1019, 0, this);
+		sendMessage(this, 0x1019, 0);
 	} else {
 		_x += xdelta;
 		processDelta();
@@ -1362,7 +1362,7 @@ void AsScene1407Mouse::stArriveAtHole() {
 	_x = kScene1407MouseHoles[_nextHoleIndex].x;
 	_y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex];
 	if (_nextHoleIndex == 1) {
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_walkDestX = 512;
 		stWalkToDest();
 		_surface->setVisible(true);
@@ -1396,7 +1396,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene1407::update() {
 	Scene::update();
 	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) {
-		_parentModule->sendMessage(0x1009, 1, this);
+		sendMessage(_parentModule, 0x1009, 1);
 	} else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) {
 		_ssResetButton->getSurface()->setVisible(false);
 	}
@@ -1410,17 +1410,17 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 			// TODO: Debug/Cheat stuff
 			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 				// Exit scene
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			} else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 &&
 				param.asPoint().y >= 62 && param.asPoint().y <= 90) {
 				// The reset button was clicked
-				_asMouse->sendMessage(0x2001, 0, this);
+				sendMessage(_asMouse, 0x2001, 0);
 				_ssResetButton->getSurface()->setVisible(true);
 				_soundResource.play(0x44045000);
 				_resetButtonCountdown = 12;
 			} else {
 				// Handle the mouse
-				_asMouse->sendMessage(messageNum, param, this);
+				sendMessage(_asMouse, messageNum, param);
 			}
 		}
 		break;
@@ -1487,7 +1487,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 		addSprite(_class489);
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x04A10F33) == 4) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			_klayman->setX(_class489->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B1F70);
@@ -1509,13 +1509,13 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 			setRectList(0x004B2008);
 			_flag = true;
 		} else if (param.asInteger() == 0x08821382) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			setRectList(0x004B1FF8);
 			_flag = false;
 		}
 		break;
 	case 0x1019:
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	case 0x1022:
 		if (sender == _class489) {
@@ -1537,10 +1537,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (_flag) {
 				setMessageList2(0x004B1FA8);
 			} else if (param.asInteger() == 1) {
-				_klayman->sendEntityMessage(0x1014, _class489, this);
+				sendEntityMessage(_klayman, 0x1014, _class489);
 				setMessageList2(0x004B1F88);
-			} else if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
-				_klayman->sendEntityMessage(0x1014, _class489, this);
+			} else if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _class489);
 				setMessageList2(0x004B1F58);
 			} else {
 				setMessageList2(0x004B1F28);
@@ -1549,7 +1549,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (_flag) {
 				setMessageList2(0x004B1FA8);
 			} else if (_messageListStatus != 2) {
-				_klayman->sendEntityMessage(0x1014, sender, this);
+				sendEntityMessage(_klayman, 0x1014, sender);
 				setMessageList2(0x004B1FB8);
 			}
 		}
@@ -1612,7 +1612,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x04A10F33) == 0) {
-			_klayman->sendEntityMessage(0x1014, _class489, this);
+			sendEntityMessage(_klayman, 0x1014, _class489);
 			_klayman->setX(_class489->getX() - 100);
 			_klayman->processDelta();
 			setMessageList(0x004B8CB8);
@@ -1647,21 +1647,21 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x1019:
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	case 0x4826:
 		if (sender == _class489) {
-			if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) {
-				_klayman->sendEntityMessage(0x1014, _class489, this);
+			if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _class489);
 				setMessageList2(0x004B8CA0);
 			} else {
 				setMessageList2(0x004B8C40);
 			}
 		} else if (sender == _asTape && _messageListStatus != 2) {
-			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B8CD0);
 		} else if (sender == _class545 && _messageListStatus != 2) {
-			_klayman->sendEntityMessage(0x1014, _class545, this);
+			sendEntityMessage(_klayman, 0x1014, _class545);
 			setMessageList(0x004B8D18);
 		}
 		break;
@@ -1757,7 +1757,7 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param,
 	case 0x1011:
 		if (getSubVar(0xCCE0280F, _index) == 0 && _parentScene->getCountdown() == 0) {
 			show();
-			_parentScene->sendMessage(0x2000, _index, this);
+			sendMessage(_parentScene, 0x2000, _index);
 		}
 		messageResult = 1;
 		break;
@@ -1841,7 +1841,7 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x0001:
 		// TODO: Debug/Cheat stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x000D:
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 9506f80..40b15b3 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -63,14 +63,14 @@ void Module1500::update() {
 			if (_flag) {
 				createScene1503();
 			} else {
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			}
 			break;
 		case 3:
 			createScene1501();
 			break;
 		default:
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 			break;
 		}
 	}
@@ -91,7 +91,7 @@ void Module1500::createScene1502() {
 }
 
 void Module1500::createScene1503() {
-	_parentModule->sendMessage(0x0800, 0, this);
+	sendMessage(_parentModule, 0x0800, 0);
 	_vm->gameState().sceneNum = 2;
 	createSmackerScene(0x001A0005, true, true, true);
 	SetUpdateHandler(&Module1500::update);
@@ -148,7 +148,7 @@ void Scene1501::update() {
 		_countdown1--;
 		if (_countdown1 == 0) {
 			_vm->_screen->clear();
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) {
 		_countdown1 = 12;
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index e6cbe62..b281b38 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -161,7 +161,7 @@ void Module1700::updateScene1705() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
-		_parentModule->sendMessage(0x1009, 1, this);
+		sendMessage(_parentModule, 0x1009, 1);
 	}
 }
 
@@ -211,7 +211,7 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x4806:
@@ -264,43 +264,43 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		_klayman = new KmScene1705(_vm, this, 231, 434);
 		setMessageList(0x004B69E8);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = 0;
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else if (which == 1) {
 		_klayman = new KmScene1705(_vm, this, 431, 434);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A08);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = 0;
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else if (which == 2) {
 		_klayman = new KmScene1705(_vm, this, 431, 434);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6AA0);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = 0;
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else if (which == 3) {
 		_klayman = new KmScene1705(_vm, this, 431, 434);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A18);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = 0;
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else {
 		_klayman = new KmScene1705(_vm, this, 231, 74);
-		_klayman->sendMessage(0x2000, 0, this);
+		sendMessage(_klayman, 0x2000, 0);
 		setMessageList(0x004B69F0);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		tempSprite = addSprite(new StaticSprite(_vm, 0x30303822, 1100));
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
@@ -339,7 +339,7 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _class606 && _klayman->getX() <= 318) {
-			_klayman->sendEntityMessage(0x1014, sender, this);
+			sendEntityMessage(_klayman, 0x1014, sender);
 			setMessageList(0x004B6AC0);
 		}
 		break;		
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index e2c88dc..f503848 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -196,12 +196,12 @@ void Module1800::updateScene1803() {
 			createScene1801(2);
 			_childObject->handleUpdate();
 		} else if (_field20 == 3) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		} else if (_field20 == 6) {
 			createScene1809(-1);
 			_childObject->handleUpdate();
 		} else if (_field20 == 7) {
-			_parentModule->sendMessage(0x1009, 3, this);
+			sendMessage(_parentModule, 0x1009, 3);
 		}
 	}
 }
@@ -251,7 +251,7 @@ void Module1800::updateScene1806() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 0) {
-			_parentModule->sendMessage(0x1009, 2, this);
+			sendMessage(_parentModule, 0x1009, 2);
 		} else if (_field20 == 1) {
 			createScene1805(3);
 			_childObject->handleUpdate();
@@ -271,7 +271,7 @@ void Module1800::updateScene1809() {
 		_done = false;
 		delete _childObject;
 		_childObject = NULL;
-		_parentModule->sendMessage(0x1009, 1, this);
+		sendMessage(_parentModule, 0x1009, 1);
 		// TODO GameState stuff
 	}
 }
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 9f45db2..1af7799 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -89,7 +89,7 @@ void Module2000::updateScene2001() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		} else {
 			createScene2002(0);
 		}
@@ -144,26 +144,26 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		_klayman = new KmScene2001(_vm, this, 300, 345);
 		setMessageList(0x004B3538);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 	} else if (which == 1) {
 		_klayman = new KmScene2001(_vm, this, 116, 345);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3540);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
 		_klayman = new KmScene2001(_vm, this, 116, 345);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B35F0);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
 		_klayman = new KmScene2001(_vm, this, 116, 345);
-		_klayman->sendMessage(0x2000, 1, this);
+		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3550);
-		sendMessage(0x2000, 1, this);
+		sendMessage(this, 0x2000, 1);
 	} else {
 		_klayman = new KmScene2001(_vm, this, 390, 345);
 		setMessageList(0x004B3530);
-		sendMessage(0x2000, 0, this);
+		sendMessage(this, 0x2000, 0);
 		_klayman->setDoDeltaX(1);
 	}
 	addSprite(_klayman);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index fe6f36c..3faad25 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -508,7 +508,7 @@ void Module2200::updateScene2201() {
 		} else if (_field20 == 2) {
 			createScene2202(0);
 		} else {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 	}
 }
@@ -1529,22 +1529,22 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_rect2.y2 = 480;
 	
 	if (!getGlobalVar(0x404290D5)) {
-		addSprite(new StaticSprite(_vm, 0x00026027, 900));
+		insertStaticSprite(0x00026027, 900);
 	}
 	
-	tempSprite = addSprite(new StaticSprite(_vm, 0x030326A0, 1100));
+	tempSprite = insertStaticSprite(0x030326A0, 1100);
 	_rect1.x1 = tempSprite->getSurface()->getDrawRect().x;
 	
-	addSprite(new StaticSprite(_vm, 0x811DA061, 1100));
+	insertStaticSprite(0x811DA061, 1100);
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x11180022, 1100));
+	tempSprite = insertStaticSprite(0x11180022, 1100);
 	_rect2.x1 = tempSprite->getSurface()->getDrawRect().x;
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x0D411130, 1100));
+	tempSprite = insertStaticSprite(0x0D411130, 1100);
 	_rect1.y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
 	_rect2.y1 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
 	
-	_doorLightSprite = addSprite(new StaticSprite(_vm, 0xA4062212, 900));
+	_doorLightSprite = insertStaticSprite(0xA4062212, 900);
 
 	if (which < 0) {
 		_klayman = new KmScene2201(_vm, this, 300, 427, &_rect1, 2);
@@ -1595,9 +1595,9 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x402064D8) {
-			_klayman->sendEntityMessage(0x1014, _ssDoorButton, this);
+			sendEntityMessage(_klayman, 0x1014, _ssDoorButton);
 		} else if (param.asInteger() == 0x35803198) {
-			if (_asDoor->hasMessageHandler() && _asDoor->sendMessage(0x2000, 0, this)) {
+			if (_asDoor->hasMessageHandler() && sendMessage(_asDoor, 0x2000, 0)) {
 				setMessageList(0x004B81A0);
 			} else {
 				setMessageList(0x004B81B8);
@@ -1620,12 +1620,12 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (sender == _ssDoorButton) {
-			_asDoor->sendMessage(0x4808, 0, this);
+			sendMessage(_asDoor, 0x4808, 0);
 		}
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
-			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B81C8);
 		}
 		break;
@@ -1705,7 +1705,7 @@ uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam &
 	switch (messageNum) {
 	case 0x1011:
 		if (!_isMoving && !getGlobalVar(0x404290D5)) {
-			_parentScene->sendMessage(0x2000, _tileIndex, this);
+			sendMessage(_parentScene, 0x2000, _tileIndex);
 		}
 		messageResult = 1;
 		break;
@@ -1878,7 +1878,7 @@ void SsScene2202PuzzleTile::stopMoving() {
 	_needRefresh = true;
 	SetSpriteCallback(NULL);
 	_isMoving = false;
-	_parentScene->sendMessage(0x2002, _tileIndex, this);
+	sendMessage(_parentScene, 0x2002, _tileIndex);
 }
 
 Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1912,9 +1912,9 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 
-	addSprite(new StaticSprite(_vm, 0x55C043B8, 200));
-	addSprite(new StaticSprite(_vm, 0x85500158, 400));
-	addSprite(new StaticSprite(_vm, 0x25547028, 600));
+	insertStaticSprite(0x55C043B8, 200);
+	insertStaticSprite(0x85500158, 400);
+	insertStaticSprite(0x25547028, 600);
 
 	_soundResource1.load(0x68E25540);
 	_soundResource2.load(0x40400457);
@@ -1932,7 +1932,7 @@ void Scene2202::update() {
 	Scene::update();
 
 	if (_leaveScene && !_soundResource2.isPlaying()) {
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 	}
 
 	if (_isSolved && !_soundResource1.isPlaying()) {
@@ -1945,7 +1945,7 @@ void Scene2202::update() {
 		int16 value = getFreeTileIndex(_movingTileIndex);
 		if (value != -1) {
 			setSurfacePriority(_movingTileSprite->getSurface(), 700);
-			_movingTileSprite->sendMessage(0x2001, value, this);
+			sendMessage(_movingTileSprite, 0x2001, value);
 			_movingTileSprite = NULL;
 			_isTileMoving = true;
 		}
@@ -1969,7 +1969,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x0001:
 		// TODO Debug stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x000D:
@@ -2039,7 +2039,7 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x4806:
@@ -2078,9 +2078,9 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x1011:
 		if (_index == getGlobalVar(0x9A500914))
-			_parentScene->sendMessage(0x2002, 0, this);
+			sendMessage(_parentScene, 0x2002, 0);
 		else
-			_parentScene->sendMessage(0x2001, 0, this);
+			sendMessage(_parentScene, 0x2001, 0);
 		messageResult = 1;
 		break;
 	case 0x2000:
@@ -2088,17 +2088,17 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 		break;
 	case 0x3002:
 		if (_index == getGlobalVar(0x9A500914))
-			_parentScene->sendMessage(0x4808, 0, this);
+			sendMessage(_parentScene, 0x4808, 0);
 		setFileHash1();
 		break;
 	case 0x4808:
 		setGlobalVar(0x9A500914, _index);
-		_otherDoor->sendMessage(0x4809, 0, this);
+		sendMessage(_otherDoor, 0x4809, 0);
 		openDoor();
 		break;
 	case 0x4809:
 		closeDoor();
-		_parentScene->sendMessage(0x2003, 0, this);
+		sendMessage(_parentScene, 0x2003, 0);
 		break;
 	}
 	return messageResult;
@@ -2142,8 +2142,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asLeftDoor = addSprite(new AsScene2203Door(_vm, this, 0));
 	_asRightDoor = addSprite(new AsScene2203Door(_vm, this, 1));
 	
-	_ssSmallLeftDoor = addSprite(new StaticSprite(_vm, 0x542CC072, 1100));
-	_ssSmallRightDoor = addSprite(new StaticSprite(_vm, 0x0A2C0432, 1100));
+	_ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100);
+	_ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100);
 	
 	_leftDoorClipRect.x1 = _ssSmallLeftDoor->getSurface()->getDrawRect().x;
 	_leftDoorClipRect.y1 = 0;
@@ -2155,8 +2155,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_rightDoorClipRect.x2 = _ssSmallRightDoor->getSurface()->getDrawRect().x + _ssSmallRightDoor->getSurface()->getDrawRect().width;
 	_rightDoorClipRect.y2 = 480;
 
-	_asLeftDoor->sendEntityMessage(0x2000, _asRightDoor, this);
-	_asRightDoor->sendEntityMessage(0x2000, _asLeftDoor, this);
+	sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor);
+	sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor);
 	
 	_vm->_collisionMan->addSprite(_asLeftDoor);
 	_vm->_collisionMan->addSprite(_asRightDoor);
@@ -2201,7 +2201,7 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2001:
-		_klayman->sendEntityMessage(0x1014, sender, this);
+		sendEntityMessage(_klayman, 0x1014, sender);
 		if (sender == _asLeftDoor) {
 			setMessageList2(0x004B83B0);
 		} else {
@@ -2233,10 +2233,10 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
-			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B83E0);
 		} else if (sender == _class545) {
-			_klayman->sendEntityMessage(0x1014, _class545, this);
+			sendEntityMessage(_klayman, 0x1014, _class545);
 			setMessageList(0x004B83F0);
 		}
 		break;
@@ -2352,7 +2352,7 @@ void Scene2205::update() {
 		_palette->addPalette(0x0008028D, 0, 256, 0);
 		_background->load(0x0008028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030);
-		_ssDoorFrame->sendMessage(0x2000, 0, this);
+		sendMessage(_ssDoorFrame, 0x2000, 0);
 		((Mouse433*)_mouseCursor)->load(0x80289008);
 		((Mouse433*)_mouseCursor)->updateCursor();
 		_isLightOn = true;
@@ -2360,7 +2360,7 @@ void Scene2205::update() {
 		_palette->addPalette(0xD00A028D, 0, 256, 0);
 		_background->load(0xD00A028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84);
-		_ssDoorFrame->sendMessage(0x2000, 0, this);
+		sendMessage(_ssDoorFrame, 0x2000, 0);
 		((Mouse433*)_mouseCursor)->load(0xA0289D08);
 		((Mouse433*)_mouseCursor)->updateCursor();
 		_isKlaymanInLight = true;
@@ -2394,7 +2394,7 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x2841369C) {
 			setMessageList(0x004B0630);
 		} else if (param.asInteger() == 0x402064D8) {
-			_klayman->sendEntityMessage(0x1014, _ssLightSwitch, this);
+			sendEntityMessage(_klayman, 0x1014, _ssLightSwitch);
 		}
 		break;
 	case 0x480B:
@@ -2531,7 +2531,7 @@ uint32 Class607::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x4806:
@@ -2555,9 +2555,9 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (getGlobalVar(0x4D080E54)) {
 		fileHash = 0x41983216;
-		_sprite1 = addSprite(new StaticSprite(_vm, 0x2201266A, 100));
-		_sprite2 = addSprite(new StaticSprite(_vm, 0x3406A333, 300));
-		_sprite3 = addSprite(new StaticSprite(_vm, 0x24A223A2, 100));
+		_sprite1 = insertStaticSprite(0x2201266A, 100);
+		_sprite2 = insertStaticSprite(0x3406A333, 300);
+		_sprite3 = insertStaticSprite(0x24A223A2, 100);
 		_sprite4 = addSprite(new Class603(_vm, 0x26133023));
 		_sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
 		_sprite4->getSurface()->getClipRect().y1 = 0;
@@ -2570,9 +2570,9 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class604 = addSprite(new Class604(_vm, 0x085E25E0));
 	} else {
 		fileHash = 0xE0102A45;
-		_sprite1 = addSprite(new StaticSprite(_vm, 0x1C1106B8, 100));
-		_sprite2 = addSprite(new StaticSprite(_vm, 0x020462E0, 300));
-		_sprite3 = addSprite(new StaticSprite(_vm, 0x900626A2, 100));
+		_sprite1 = insertStaticSprite(0x1C1106B8, 100);
+		_sprite2 = insertStaticSprite(0x020462E0, 300);
+		_sprite3 = insertStaticSprite(0x900626A2, 100);
 		_sprite4 = addSprite(new Class603(_vm, 0x544822A8));
 		_sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
 		_sprite4->getSurface()->getClipRect().y1 = 0;
@@ -2644,7 +2644,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asInteger() == 0x800C6694) {
 			sub481B00();
 		} else if (param.asInteger() == 0x402064D8) {
-			_klayman->sendEntityMessage(0x1014, _sprite5, this);
+			sendEntityMessage(_klayman, 0x1014, _sprite5);
 		} else if (param.asInteger() == 0x11C40840) {
 			if (getGlobalVar(0x18890C91))
 				setMessageList(0x004B8948);
@@ -2653,19 +2653,19 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4803:
-		_class604->sendMessage(0x4803, 0, this);
+		sendMessage(_class604, 0x4803, 0);
 		break;
 	case 0x480B:
 		if (sender == _sprite5) {
 			setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1);
 			if (getGlobalVar(0x18890C91))
-				_sprite4->sendMessage(0x4808, 0, this);
+				sendMessage(_sprite4, 0x4808, 0);
 			else
-				_sprite4->sendMessage(0x4809, 0, this);
+				sendMessage(_sprite4, 0x4809, 0);
 		}
 		break;
 	case 0x4826:
-		_klayman->sendEntityMessage(0x1014, _class607, this);
+		sendEntityMessage(_klayman, 0x1014, _class607);
 		setMessageList(0x004B8988);
 		break;
 	case 0x482A:
@@ -2779,7 +2779,7 @@ void AsScene2207Elevator::update() {
 	if (_destPointIndex + _destPointIndexDelta < _pointIndex) {
 		_pointIndex--;
 		if (_pointIndex == 0)
-			_parentScene->sendMessage(0x2003, 0, this);
+			sendMessage(_parentScene, 0x2003, 0);
 		setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
 		_newHashListIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
@@ -2793,15 +2793,15 @@ void AsScene2207Elevator::update() {
 	}
 
 	if (_pointIndex > 20 && _surface->getPriority() != 900) {
-		_parentScene->sendMessage(0x2002, 900, this);
+		sendMessage(_parentScene, 0x2002, 900);
 	} else if (_pointIndex < 20 && _surface->getPriority() != 1100) {
-		_parentScene->sendMessage(0x2002, 1100, this);
+		sendMessage(_parentScene, 0x2002, 1100);
 	}
 	
 	AnimatedSprite::update();
 	
 	if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) {
-		_parentScene->sendMessage(0x2004, 0, this);
+		sendMessage(_parentScene, 0x2004, 0);
 		_isMoving = false;
 	}
 	
@@ -2870,7 +2870,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		_parentScene->sendMessage(0x4826, 0, this);
+		sendMessage(_parentScene, 0x4826, 0);
 		messageResult = 1;
 		break;
 	case 0x3002:
@@ -2884,10 +2884,10 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 		stLeverDown();
 		break;
 	case 0x482A:
-		_parentScene->sendMessage(0x1022, 990, this);
+		sendMessage(_parentScene, 0x1022, 990);
 		break;
 	case 0x482B:
-		_parentScene->sendMessage(0x1022, 1010, this);
+		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	}
 	return messageResult;
@@ -2900,7 +2900,7 @@ void AsScene2207Lever::stLeverDown() {
 }
 
 void AsScene2207Lever::stLeverDownEvent() {
-	_parentScene->sendMessage(0x480F, 0, this);
+	sendMessage(_parentScene, 0x480F, 0);
 }
 
 void AsScene2207Lever::stLeverUp() {
@@ -2911,7 +2911,7 @@ void AsScene2207Lever::stLeverUp() {
 }
 
 void AsScene2207Lever::stLeverUpEvent() {
-	_parentScene->sendMessage(0x4807, 0, this);
+	sendMessage(_parentScene, 0x4807, 0);
 }
 
 AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene)
@@ -3084,9 +3084,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL));
 	
-		_ssMaskPart1 = addSprite(new StaticSprite(_vm, 0xE20A28A0, 1200));
-		_ssMaskPart2 = addSprite(new StaticSprite(_vm, 0x688F62A5, 1100));
-		_ssMaskPart3 = addSprite(new StaticSprite(_vm, 0x0043B038, 1100));
+		_ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200);
+		_ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100);
+		_ssMaskPart3 = insertStaticSprite(0x0043B038, 1100);
 	
 		_asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011));
 		_vm->_collisionMan->addSprite(_asTape); 
@@ -3126,7 +3126,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL));
 
-		_ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200));
+		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
 
 		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
 		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
@@ -3154,9 +3154,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setRectList(0x004B38B8);
 
-	_klayman->sendEntityMessage(0x1014, _asElevator, this);
-	_klayman->sendMessage(0x2001, 0, this);
-	_asElevator->sendMessage(0x2000, 480, this);
+	sendEntityMessage(_klayman, 0x1014, _asElevator);
+	sendMessage(_klayman, 0x2001, 0);
+	sendMessage(_asElevator, 0x2000, 480);
 
 	_soundResource2.load(calcHash("fxFogHornSoft"));
 
@@ -3179,35 +3179,35 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x0014F275) {
 			if (_klaymanAtElevator) {
-				_asElevator->sendMessage(0x2000, _mouseClickPos.y, this);
-				_klayman->sendEntityMessage(0x1014, _asElevator, this);
-				_klayman->sendMessage(0x2001, 0, this);
+				sendMessage(_asElevator, 0x2000, _mouseClickPos.y);
+				sendEntityMessage(_klayman, 0x1014, _asElevator);
+				sendMessage(_klayman, 0x2001, 0);
 			} else {
 				messageList402220();
 			}
 		} else if (param.asInteger() == 0x34569073) {
 			if (_klaymanAtElevator) {
 				_messageListFlag1 = true;
-				_asElevator->sendMessage(0x2000, 0, this);
-				_klayman->sendEntityMessage(0x1014, _asElevator, this);
-				_klayman->sendMessage(0x2001, 0, this);
+				sendMessage(_asElevator, 0x2000, 0);
+				sendEntityMessage(_klayman, 0x1014, _asElevator);
+				sendMessage(_klayman, 0x2001, 0);
 			} else {
 				messageList402220();
 			}
 		} else if (param.asInteger() == 0x4054C877) {
 			if (_klaymanAtElevator) {
-				_asElevator->sendMessage(0x2000, 480, this);
-				_klayman->sendEntityMessage(0x1014, _asElevator, this);
-				_klayman->sendMessage(0x2001, 0, this);
+				sendMessage(_asElevator, 0x2000, 480);
+				sendEntityMessage(_klayman, 0x1014, _asElevator);
+				sendMessage(_klayman, 0x2001, 0);
 			} else {
 				messageList402220();
 			}
 		} else if (param.asInteger() == 0x0CBC6211) {
-			_klayman->sendEntityMessage(0x1014, _asElevator, this);
-			_klayman->sendMessage(0x2001, 0, this);
+			sendEntityMessage(_klayman, 0x1014, _asElevator);
+			sendMessage(_klayman, 0x2001, 0);
 			setRectList(0x004B38B8);
 		} else if (param.asInteger() == 0x402064D8) {
-			_klayman->sendEntityMessage(0x1014, _ssButton, this);
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x231DA241) {
 			if (_ssButton) {
 				setMessageList(0x004B38F0);
@@ -3223,8 +3223,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		_messageListFlag1 = false;
 		break;
 	case 0x4807:
-		_asWallRobotAnimation->sendMessage(0x2007, 0, this);
-		_asWallCannonAnimation->sendMessage(0x2007, 0, this);
+		sendMessage(_asWallRobotAnimation, 0x2007, 0);
+		sendMessage(_asWallCannonAnimation, 0x2007, 0);
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
@@ -3238,22 +3238,22 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x480F:
-		_asWallRobotAnimation->sendMessage(0x2006, 0, this);
-		_asWallCannonAnimation->sendMessage(0x2006, 0, this);
+		sendMessage(_asWallRobotAnimation, 0x2006, 0);
+		sendMessage(_asWallCannonAnimation, 0x2006, 0);
 		_asWallRobotAnimation->getSurface()->setVisible(true);
 		_asWallCannonAnimation->getSurface()->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
 			if (_klayman->getY() == 423) {
-				_klayman->sendEntityMessage(0x1014, _asTape, this);
+				sendEntityMessage(_klayman, 0x1014, _asTape);
 				setMessageList(0x004B3958);
 			}
 		} else if (_klaymanAtElevator) {
 			SetMessageHandler(&Scene2207::handleMessage2);
-			_asElevator->sendMessage(0x2000, 347, this);
-			_klayman->sendEntityMessage(0x1014, _asElevator, this);
-			_klayman->sendMessage(0x2001, 0, this);
+			sendMessage(_asElevator, 0x2000, 347);
+			sendEntityMessage(_klayman, 0x1014, _asElevator);
+			sendMessage(_klayman, 0x2001, 0);
 		}
 		break;
 	}
@@ -3268,8 +3268,8 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Enti
 		break;
 	case 0x2004:
 		SetMessageHandler(&Scene2207::handleMessage);
-		_klayman->sendMessage(0x2005, 0, this);
-		_klayman->sendEntityMessage(0x1014, _asLever, this);
+		sendMessage(_klayman, 0x2005, 0);
+		sendEntityMessage(_klayman, 0x1014, _asLever);
 		setMessageList(0x004B3920);
 		setRectList(0x004B3948);
 		break;
@@ -3421,7 +3421,7 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 40 || param.asPoint().x >= 600) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	}
@@ -3567,7 +3567,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
-			_klayman->sendEntityMessage(0x1014, _asTape, this);
+			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B3D50);
 		}
 		break;
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 6bd10bb..19861ac 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -134,19 +134,9 @@ void Module2300::updateScene2301() {
 			createScene2302(4);
 			_childObject->handleUpdate();
 		} else {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 0) {
-			_parentModule->sendMessage(0x100A, 0, this);
-		}
-		_field24 = -1;
-	}
-	if (_field26 >= 0) {
-		_parentModule->sendMessage(0x1023, 0, this);
-		_field26 = -1;
-	}
 }
 
 void Module2300::updateScene2302() {
@@ -185,9 +175,9 @@ void Module2300::updateScene2302() {
 			createScene2304(1);
 			_childObject->handleUpdate();
 		} else if (_field20 == 5) {
-			_parentModule->sendMessage(0x1009, 3, this);
+			sendMessage(_parentModule, 0x1009, 3);
 		} else {
-			_parentModule->sendMessage(0x1009, 4, this);
+			sendMessage(_parentModule, 0x1009, 4);
 		}
 	}
 }
@@ -199,7 +189,7 @@ void Module2300::updateScene2303() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
-			_parentModule->sendMessage(0x1009, 3, this);
+			sendMessage(_parentModule, 0x1009, 3);
 		} else {
 			createScene2302(5);
 			_childObject->handleUpdate();
@@ -229,24 +219,12 @@ void Module2300::updateScene2304() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_field20 == 1) {
-			_parentModule->sendMessage(0x1009, 2, this);
+			sendMessage(_parentModule, 0x1009, 2);
 		} else {
 			createScene2302(1);
 			_childObject->handleUpdate();
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 0) {
-			_parentModule->sendMessage(0x100A, 2, this);
-		}
-		_field24 = -1;
-	}
-	if (_field26 >= 0) {
-		if (_field26 == 1) {
-			_parentModule->sendMessage(0x1023, 2, this);
-		}
-		_field26 = -1;
-	}
 }
 			
 void Module2300::updateScene2305() {
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 51940ba..2c819a4 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -286,7 +286,7 @@ void Module3000::updateScene3002() {
 				createScene3010(-1);
 				_childObject->handleUpdate();
 			} else if (_moduleDoneStatus == 1) {
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			}
 		} else {
 			if (_moduleDoneStatus == 0) {
@@ -298,7 +298,7 @@ void Module3000::updateScene3002() {
 					_childObject->handleUpdate();
 				}
 			} else if (_moduleDoneStatus == 1) {
-				_parentModule->sendMessage(0x1009, 0, this);
+				sendMessage(_parentModule, 0x1009, 0);
 			}
 		}
 	}
@@ -325,7 +325,7 @@ void Module3000::updateScene3002b() {
 			createScene3009(-1);
 			break;
 		case 11:
-			_parentModule->sendMessage(0x1009, 3, this);
+			sendMessage(_parentModule, 0x1009, 3);
 			break;
 		case 12:
 			createScene3002(0);
@@ -431,7 +431,7 @@ void Module3000::updateScene3005() {
 		delete _childObject;
 		_childObject = NULL;
 		if (_moduleDoneStatus == 0) {
-			_parentModule->sendMessage(0x1009, 1, this);
+			sendMessage(_parentModule, 0x1009, 1);
 		} else if (_moduleDoneStatus == 1) {
 			createScene3008(-1);
 			_childObject->handleUpdate();
@@ -650,7 +650,7 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc
 void SsScene3009FireCannonButton::update() {
 	StaticSprite::update();
 	if (_flag1 && !_soundResource.isPlaying()) {
-		_parentScene->sendMessage(0x2000, 0, this);
+		sendMessage(_parentScene, 0x2000, 0);
 		_surface->setVisible(false);
 	}
 }
@@ -794,7 +794,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
 			_drawRect.width = _spriteResource.getDimensions().width;
 			_drawRect.height = _spriteResource.getDimensions().height;
 			_soundResource.play();
-			_asSymbol->sendMessage(0x2005, _incrDecr, this);
+			sendMessage(_asSymbol, 0x2005, _incrDecr);
 		}
 		messageResult = 1;
 		break;
@@ -827,7 +827,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message
 	switch (messageNum) {
 	case 0x1011:
 		if (_enabled) {
-			_parentScene->sendMessage(0x2002, 0, this);
+			sendMessage(_parentScene, 0x2002, 0);
 		}
 		messageResult = 1;
 		break;
@@ -857,7 +857,7 @@ uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const Messa
 	switch (messageNum) {
 	case 0x1011:
 		if (_enabled) {
-			_parentScene->sendMessage(0x2004, 0, this);
+			sendMessage(_parentScene, 0x2004, 0);
 		}
 		messageResult = 1;
 		break;
@@ -942,9 +942,9 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &para
 		_newHashListIndex = _symbolIndex;
 		setSubVar(0x00000914, _index, _symbolIndex);
 		if (_index / 3 == 0) {
-			_parentScene->sendMessage(0x2001, 0, this);
+			sendMessage(_parentScene, 0x2001, 0);
 		} else {
-			_parentScene->sendMessage(0x2003, 0, this);
+			sendMessage(_parentScene, 0x2003, 0);
 		}
 		messageResult = 1;
 		break;
@@ -1025,7 +1025,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	// DEBUG: Set the correct code
 	for (int i = 0; i < 6; i++)
 		setSubVar(0x00000914, i, _correctSymbols[i]);
-	sendMessage(0x2003, 0, this);
+	sendMessage(this, 0x2003, 0);
 	//setGlobalVar(0x610210B7, 1);   
 
 }
@@ -1108,7 +1108,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 		// TODO: Debug stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) {
 			setGlobalVar(0x20580A86, 0);
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x000D:
@@ -1191,7 +1191,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 void Scene3009::playExtVideo() {
 	setGlobalVar(0x20580A86, _cannonLocation);
 	setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]);
-	_parentModule->sendMessage(0x1009, 1, this);
+	sendMessage(_parentModule, 0x1009, 1);
 }
 
 bool Scene3009::isSymbolsPart1Solved() {
@@ -1303,9 +1303,9 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
 				_soundResource3.play();
 				_surface->setVisible(true);
 				_buttonLocked = true;
-				_parentScene->sendMessage(0x2000, _buttonIndex, this);
+				sendMessage(_parentScene, 0x2000, _buttonIndex);
 			} else {
-				_parentScene->sendMessage(0x2002, _buttonIndex, this);
+				sendMessage(_parentScene, 0x2002, _buttonIndex);
 			}
 			_needRefresh = true;
 			StaticSprite::update();
@@ -1418,7 +1418,7 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) {
 void AsScene3010DeadBolt::stIdleMessage() {
 	setFileHash1();
 	SetMessageHandler(&Sprite::handleMessage);
-	_parentScene->sendMessage(0x2001, _boltIndex, this);
+	sendMessage(_parentScene, 0x2001, _boltIndex);
 }
 
 void AsScene3010DeadBolt::lock() {
@@ -1454,7 +1454,7 @@ void AsScene3010DeadBolt::stDisabled() {
 
 void AsScene3010DeadBolt::stDisabledMessage() {
 	_surface->setVisible(false);
-	_parentScene->sendMessage(0x2003, _boltIndex, this);
+	sendMessage(_parentScene, 0x2003, _boltIndex);
 }
 
 Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1513,7 +1513,7 @@ void Scene3010::update() {
 		_checkUnlocked = false;
 	}
 	if (_countdown != 0 && (--_countdown == 0)) {
-		_parentModule->sendMessage(0x1009, _doorUnlocked ? 1 : 0, this);
+		sendMessage(_parentModule, 0x1009, _doorUnlocked ? 1 : 0);
 	}
 }
 
@@ -1646,7 +1646,7 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam &para
 		if (_countdown == 0) {
 			_surface->setVisible(true);
 			_countdown = 4;
-			_parentScene->sendMessage(0x2000, 0, this);
+			sendMessage(_parentScene, 0x2000, 0);
 			_soundResource.play();
 		}
 		messageResult = 1;
@@ -1797,7 +1797,7 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x2000:
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 7bc1551..6b36571 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -55,7 +55,7 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 
 	_vm->_screen->clear();
 
-	_parentModule->sendMessage(0x100A, _navigationIndex, this);
+	sendMessage(_parentModule, 0x100A, _navigationIndex);
 
 }
 
@@ -68,7 +68,7 @@ int NavigationScene::getNavigationAreaType() {
 	NPoint mousePos;
 	mousePos.x = _mouseCursor->getX();
 	mousePos.y = _mouseCursor->getY();
-	return _mouseCursor->sendPointMessage(0x2064, mousePos, this);
+	return sendPointMessage(_mouseCursor, 0x2064, mousePos);
 }
 
 void NavigationScene::update() {
@@ -80,7 +80,7 @@ void NavigationScene::update() {
 		_smackerFileHash = 0;
 	} else if (_smackerDone) {
 		if (_done) {
-			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		} else {
 			const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
 			createMouseCursor();
@@ -93,7 +93,7 @@ void NavigationScene::update() {
 			_smackerDone = false;
 			_smackerPlayer->open(navigationItem.fileHash, true);
 			_vm->_screen->clear();
-			_parentModule->sendMessage(0x100A, _navigationIndex, this);
+			sendMessage(_parentModule, 0x100A, _navigationIndex);
 		}
 	} 
 	Scene::update();
@@ -103,7 +103,7 @@ uint32 NavigationScene::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x0000:
 		if (_interactive)
-			_mouseCursor->sendMessage(0x4002, param, this);
+			sendMessage(_mouseCursor, 0x4002, param);
 		break;
 	case 0x0001:
 		if (_interactive)
@@ -144,7 +144,7 @@ void NavigationScene::createMouseCursor() {
 	}
 
 	_mouseCursor = addSprite(new NavigationMouse(_vm, mouseCursorFileHash, areaType));
-	_mouseCursor->sendPointMessage(0x4002, _vm->getMousePos(), this);
+	sendPointMessage(_mouseCursor, 0x4002, _vm->getMousePos());
 	
 }
 
@@ -153,7 +153,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 	const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
 	bool oldSoundFlag1 = _soundFlag1;
 	bool oldSoundFlag2 = _soundFlag2;
-	uint32 direction = _mouseCursor->sendPointMessage(0x2064, mousePos, this);
+	uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos);
 	
 	switch (direction) {
 	// TODO: Merge cases 0 and 1?
@@ -170,7 +170,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 			} while (!(*_navigationList)[_navigationIndex].interactive);
 			setGlobalVar(0x4200189E, _navigationIndex);
 		} else {
-			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		}
 		break;
 	case 1:
@@ -186,14 +186,14 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 			} while (!(*_navigationList)[_navigationIndex].interactive);
 			setGlobalVar(0x4200189E, _navigationIndex);
 		} else {
-			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		}
 		break;
 	case 2:
 	case 3:
 	case 4:
 		if (navigationItem.middleFlag) {
-			_parentModule->sendMessage(0x1009, _navigationIndex, this);
+			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		} else if (navigationItem.middleSmackerFileHash != 0) {
 			_smackerFileHash = navigationItem.middleSmackerFileHash;
 			_interactive = false;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 8192216..c6f9f12 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -178,6 +178,18 @@ Background *Scene::addBackground(Background *background) {
 	return background;
 }
 
+void Scene::setBackground(uint32 fileHash, bool dirtyBackground) {
+	_background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0));
+}
+
+void Scene::changeBackground(uint32 fileHash) {
+	_background->load(fileHash);
+}
+
+Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
+	return addSprite(new StaticSprite(_vm, fileHash, surfacePriority));
+}
+
 SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) {
 	addEntity(smackerPlayer);
 	addSurface(smackerPlayer->getSurface());
@@ -202,12 +214,12 @@ void Scene::update() {
 			if (_klayman) {
 				// TODO: Merge later
 				if (_klayman->hasMessageHandler() && 
-					_klayman->sendMessage(0x1008, 0, this) != 0 &&
+					sendMessage(_klayman, 0x1008, 0) != 0 &&
 					_messageListFlag &&
 					queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
 					_mouseClicked = false;
 				} else if (_klayman->hasMessageHandler() && 
-					_klayman->sendMessage(0x1008, 0, this) != 0 &&
+					sendMessage(_klayman, 0x1008, 0) != 0 &&
 					_messageListFlag) {
 					_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
 				}
@@ -230,7 +242,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 	switch (messageNum) {
 	case 0: // mouse moved
 		if (_mouseCursor && _mouseCursor->hasMessageHandler())
-			_mouseCursor->sendMessage(0x4002, param, this);
+			sendMessage(_mouseCursor, 0x4002, param);
 		// TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
 		break;
 	case 1: // mouse clicked
@@ -253,13 +265,13 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 #endif	
 		break;
 	case 6:
-		_parentModule->sendMessage(0x1009, param, this);		
+		sendMessage(_parentModule, 0x1009, param);		
 		break;
 	case 0x1006:
 		if (_messageListFlag1) {
 			_messageListFlag1 = false;
 			if (_messageListIndex == _messageListCount)
-				_klayman->sendMessage(0x4004, 0, this);
+				sendMessage(_klayman, 0x4004, 0);
 			else {
 				runMessageList();
 			}
@@ -269,7 +281,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		if (_messageListFlag1) {
 			_messageListFlag1 = false;
 			_messageList = NULL;
-			_klayman->sendMessage(0x4004, 0, this);
+			sendMessage(_klayman, 0x4004, 0);
 		}
 		break;
 	case 0x101D:
@@ -281,7 +293,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 	case 0x101E:
 		if (_prevVisible && _mouseCursor) {
 			_mouseCursor->getSurface()->setVisible(false);
-			// TODO _mouseCursor->sendMessage(0x4002, g_Screen->_mousePos, this);
+			// TODO sendMessage(_mouseCursor, 0x4002, g_Screen->_mousePos);
 		}
 		break;
 	case 0x1022:
@@ -322,7 +334,7 @@ bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
 	for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) {
 		Sprite *sprite = _vm->_collisionMan->getSprite(i);
 		if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && 
-			sprite->sendPointMessage(0x1011, _mouseClickPos, this) != 0) {
+			sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) {
 			return true;
 		}
 	}
@@ -369,7 +381,7 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool
 	_messageListFlag = messageListFlag;
 	_systemCallbackFlag = systemCallbackFlag;
 	_messageListStatus = 1;
-	_klayman->sendMessage(0x101C, 0, this);
+	sendMessage(_klayman, 0x101C, 0);
 	
 	// DEBUG: Show message list
 	for (uint i = 0; i < messageList->size(); i++) {
@@ -397,7 +409,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 	if (_messageListStatus == 1) {
 		if (messageList != _messageList2) {
 			if (_messageValue >= 0) {
-				_parentModule->sendMessage(0x1023, _messageValue, this);
+				sendMessage(_parentModule, 0x1023, _messageValue);
 				_messageValue = -1;
 			}
 			_messageList2 = messageList;
@@ -407,7 +419,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 	} else if (_messageListStatus == 2) {
 		if (messageList == _messageList2) {
 			if (_messageValue >= 0) {
-				_parentModule->sendMessage(0x1023, _messageValue, this);
+				sendMessage(_parentModule, 0x1023, _messageValue);
 				_messageValue = -1;
 			}
 			_messageList2 = messageList;
@@ -416,7 +428,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 		}
 	} else {
 		if (_messageValue >= 0) {
-			_parentModule->sendMessage(0x1023, _messageValue, this);
+			sendMessage(_parentModule, 0x1023, _messageValue);
 			_messageValue = -1;
 		}
 		_messageList2 = messageList;
@@ -449,22 +461,22 @@ void Scene::runMessageList() {
 			
 			_messageListIndex++;
 			if (_messageListIndex == _messageListCount) {
-				_klayman->sendMessage(0x1021, 0, this);
+				sendMessage(_klayman, 0x1021, 0);
 			}
 			if (_systemCallbackFlag) {
 				messageNum = convertMessageNum(messageNum);
 			}
 			if (messageNum != 0x4003) {
 				if (messageNum == 0x1009 || messageNum == 0x1024) {
-					_parentModule->sendMessage(messageNum, messageParam, this);
+					sendMessage(_parentModule, messageNum, messageParam);
 				} else if (messageNum == 0x100A) {
 					_messageValue = messageParam;
-					_parentModule->sendMessage(messageNum, messageParam, this);
+					sendMessage(_parentModule, messageNum, messageParam);
 				} else if (messageNum == 0x4001) {
 					_messageListFlag1 = true;
-					_klayman->sendPointMessage(0x4001, _mouseClickPos, this);
+					sendPointMessage(_klayman, 0x4001, _mouseClickPos);
 				} else if (messageNum == 0x100D) {
-					if (this->hasMessageHandler() && this->sendMessage(0x100D, messageParam, this) != 0)
+					if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0)
 						continue;
 				} else if (messageNum == 0x101A) {
 					_messageListStatus = 0;
@@ -473,13 +485,13 @@ void Scene::runMessageList() {
 				} else if (messageNum == 0x1020) {
 					_messageListFlag = false;
 				} else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) {
-					if (this->hasMessageHandler() && this->sendMessage(messageNum, messageParam, this) != 0) {
+					if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) {
 						_messageListFlag2 = false;
 						return;
 					}
 				} else {
 					_messageListFlag1 = true;
-					if (_klayman->hasMessageHandler() && _klayman->sendMessage(messageNum, messageParam, this) != 0) {
+					if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) {
 						_messageListFlag1 = false;
 					}
 				} 
@@ -499,7 +511,7 @@ void Scene::messageList402220() {
 	_messageListFlag1 = false;
 	_messageList = NULL;
 	_messageListFlag = true;
-	_klayman->sendMessage(0x4004, 0, this);
+	sendMessage(_klayman, 0x4004, 0);
 }
 
 void Scene::setRectList(uint32 id) {
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index e3ed273..067e86f 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -37,6 +37,8 @@
 
 namespace Neverhood {
 
+#define InsertKlayman(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman)
+
 class Scene : public Entity {
 public:
 	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
@@ -50,6 +52,9 @@ public:
 	void setSurfacePriority(BaseSurface *surface, int priority);
 	void deleteSprite(Sprite **sprite);
 	Background *addBackground(Background *background);
+	void setBackground(uint32 fileHash, bool dirtyBackground = true);
+	void changeBackground(uint32 fileHash);
+	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
 	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
 protected:
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 0ebec5e..9ae7e14 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -176,7 +176,7 @@ void SmackerPlayer::update() {
 		if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
 			// Inform the scene about the end of the video playback
 			if (_scene) {
-				_scene->sendMessage(0x3002, 0, this);
+				sendMessage(_scene, 0x3002, 0);
 			}
 			_flag2 = true;
 		} else {
@@ -194,7 +194,7 @@ void SmackerPlayer::update() {
 	} else if (!_keepLastFrame) {
 		// Inform the scene about the end of the video playback
 		if (_scene) {
-			_scene->sendMessage(0x3002, 0, this);
+			sendMessage(_scene, 0x3002, 0);
 		}
 		_flag2 = true;
 	} else {
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index ace77f9..ae29063 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -73,7 +73,7 @@ void SmackerScene::nextVideo() {
 		uint32 smackerFileHash = _fileHashList[_fileHashListIndex];
 		if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) {
 			// Not a Smacker file
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 			return;
 		}
 		_fieldDF = getSubVar(0x00800410, smackerFileHash);
@@ -89,7 +89,7 @@ void SmackerScene::nextVideo() {
 			_smackerPlayer->open(smackerFileHash, false);
 		}
 	} else {
-		_parentModule->sendMessage(0x1009, 0, this);
+		sendMessage(_parentModule, 0x1009, 0);
 	}
 
 }
@@ -111,7 +111,7 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam &param, En
 		break;
 	case 0x000C:
 		if (_canAbort) {
-			_parentModule->sendMessage(0x1009, 0, this);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 		break;
 	case 0x3002:
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index deb54af..828c0dd 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -392,7 +392,7 @@ void AnimatedSprite::updateFrameIndex() {
 		} else {
 			// Inform self about end of current animation
 			// The caller can then e.g. set a new animation fileHash
-			sendMessage(0x3002, 0, this);
+			sendMessage(this, 0x3002, 0);
 			if (_fileHash1 == 0)
 				_frameIndex = 0;
 		}
@@ -400,7 +400,7 @@ void AnimatedSprite::updateFrameIndex() {
 		if (_frameIndex > 0) {
 			_frameIndex--;
 		} else {
-			sendMessage(0x3002, 0, this);
+			sendMessage(this, 0x3002, 0);
 			if (_fileHash1 == 0)
 				_frameIndex = _frameIndex2;
 		}
@@ -424,7 +424,7 @@ void AnimatedSprite::updateFrameInfo() {
 	_needRefresh = true;
 
 	if (frameInfo.frameHash != 0) {
-		sendMessage(0x100D, frameInfo.frameHash, this);
+		sendMessage(this, 0x100D, frameInfo.frameHash);
 	}
 
 }


Commit: cac9a090e7fad2a9d8951b969816d0199c7133a8
    https://github.com/scummvm/scummvm/commit/cac9a090e7fad2a9d8951b969816d0199c7133a8
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Use insertStaticSprite

Changed paths:
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module3000.cpp



diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 163fc63..5a564cc 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -816,16 +816,16 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011));
 	_vm->_collisionMan->addSprite(_asTape);
 	
-	tempSprite = addSprite(new StaticSprite(_vm, 0x03C82530, 100));
+	tempSprite = insertStaticSprite(0x03C82530, 100);
 	topY1 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x88182069, 200));
+	tempSprite = insertStaticSprite(0x88182069, 200);
 	topY2 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x476014E0, 300));
+	tempSprite = insertStaticSprite(0x476014E0, 300);
 	topY3 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x04063110, 500));
+	tempSprite = insertStaticSprite(0x04063110, 500);
 	topY4 = tempSprite->getY() + 1; 
 
 	_class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1));
@@ -834,12 +834,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class466->getSurface()->getClipRect().x2 = 640;
 	_class466->getSurface()->getClipRect().y2 = 480;
 	
-	addSprite(new StaticSprite(_vm, 0x400B04B0, 1200));
+	insertStaticSprite(0x400B04B0, 1200);
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x40295462, 1200));
+	tempSprite = insertStaticSprite(0x40295462, 1200);
 	x1 = tempSprite->getX();
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0xA29223FA, 1200));
+	tempSprite = insertStaticSprite(0xA29223FA, 1200);
 	x2 = tempSprite->getX() + tempSprite->getSurface()->getDrawRect().width;
 
 	class464 = addSprite(new Class464(_vm));
@@ -892,7 +892,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x000CF819)) {
-		addSprite(new StaticSprite(_vm, 0x10002ED8, 500));
+		insertStaticSprite(0x10002ED8, 500);
 		if (!getGlobalVar(0x0A18CA33)) {
 			AsScene1201TntMan *asTntMan;
 			asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1);
@@ -940,7 +940,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		
 	} else {
 	
-		addSprite(new StaticSprite(_vm, 0x8E8A1981, 900));
+		insertStaticSprite(0x8E8A1981, 900);
 
 		uint32 tntIndex = 0;
 		while (tntIndex < 18) {
@@ -968,7 +968,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		 
 	}
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x63D400BC, 900));
+	tempSprite = insertStaticSprite(0x63D400BC, 900);
 
 	_asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman));
 	_asLeftDoor->getSurface()->getClipRect().x1 = x1;
@@ -1207,7 +1207,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asTntItems[i]);
 	}
 
-	addSprite(new StaticSprite(_vm, 0x8E8419C1, 1100));
+	insertStaticSprite(0x8E8419C1, 1100);
 
 	if (getGlobalVar(0x000CF819)) {
 		SetMessageHandler(&Scene1202::handleMessage453D90);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index b8b7b8b..d148018 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -645,10 +645,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL));
 
 	_class595 = addSprite(new Class595(_vm, this));
-	_sprite1 = addSprite(new StaticSprite(_vm, 0x942FC224, 300));
-	_sprite2 = addSprite(new StaticSprite(_vm, 0x70430830, 1200));
+	_sprite1 = insertStaticSprite(0x942FC224, 300);
+	_sprite2 = insertStaticSprite(0x70430830, 1200);
 	_sprite2->getSurface()->setVisible(false);
-	_sprite3 = addSprite(new StaticSprite(_vm, 0x16E01E20, 1100));
+	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
 
 	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false));
 	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x13206309)));
@@ -875,7 +875,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asBalloon);
 	}
 	
-	_sprite1 = addSprite(new StaticSprite(_vm, 0xA014216B, 1100));
+	_sprite1 = insertStaticSprite(0xA014216B, 1100);
 
 	_klayman = new KmScene1303(_vm, this, 207, 332);
 	addSprite(_klayman);
@@ -958,9 +958,9 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class544 = NULL;
 	}
 
-	_sprite1 = addSprite(new StaticSprite(_vm, 0x0562E621, 1100));
-	addSprite(new StaticSprite(_vm, 0x012AE033, 1100));
-	addSprite(new StaticSprite(_vm, 0x090AF033, 1100));
+	_sprite1 = insertStaticSprite(0x0562E621, 1100);
+	insertStaticSprite(0x012AE033, 1100);
+	insertStaticSprite(0x090AF033, 1100);
 
 	if (which < 0) {
 		_klayman = new KmScene1304(_vm, this, 217, 347);
@@ -1148,9 +1148,9 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asElevator = addSprite(new AsScene1306Elevator(_vm, this, _asElevatorDoor));
 	
-	_sprite1 = addSprite(new StaticSprite(_vm, 0x036A1EE0, 80));
+	_sprite1 = insertStaticSprite(0x036A1EE0, 80);
 	
-	addSprite(new StaticSprite(_vm, 0x00042313, 1100));
+	insertStaticSprite(0x00042313, 1100);
 
 	if (which < 0) {
 		_klayman = new KmScene1306(_vm, this, 380, 440);
@@ -1540,25 +1540,25 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	addEntity(_palette);
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x06204A88, 20, 620));
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3621C, 800));
+	tempSprite = insertStaticSprite(0x00A3621C, 800);
 	_clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x;
 	_clipRects[0].y1 = 0;
 	_clipRects[0].x2 = 640;
 	_clipRects[0].y2 = 480;
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3641C, 600));
+	tempSprite = insertStaticSprite(0x00A3641C, 600);
 	_clipRects[1].x1 = tempSprite->getSurface()->getDrawRect().x;
 	_clipRects[1].y1 = 0;
 	_clipRects[1].x2 = 640;
 	_clipRects[1].y2 = 480;
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3681C, 400));
+	tempSprite = insertStaticSprite(0x00A3681C, 400);
 	_clipRects[2].x1 = tempSprite->getSurface()->getDrawRect().x;
 	_clipRects[2].y1 = 0;
 	_clipRects[2].x2 = 640;
 	_clipRects[2].y2 = 480;
 
-	tempSprite = addSprite(new StaticSprite(_vm, 0x00A3701C, 200));
+	tempSprite = insertStaticSprite(0x00A3701C, 200);
 	_clipRects[3].x1 = tempSprite->getSurface()->getDrawRect().x;
 	_clipRects[3].y1 = 0;
 	_clipRects[3].x2 = 640;
@@ -1866,7 +1866,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		addSprite(new AnimatedSprite(_vm, 0x461A1490, 200, 235, 429));
 	}
 	
-	_sprite1 = addSprite(new StaticSprite(_vm, 0x0A042060, 1100));
+	_sprite1 = insertStaticSprite(0x0A042060, 1100);
 	_class549 = addSprite(new Class549(_vm, this));
 	_class593 = addSprite(new Class593(_vm, this));
 
@@ -1874,28 +1874,28 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1));
 	_class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2));
 
-	_sprite2 = addSprite(new StaticSprite(_vm, 0x40043120, 995));
-	_sprite3 = addSprite(new StaticSprite(_vm, 0x43003100, 995));
+	_sprite2 = insertStaticSprite(0x40043120, 995);
+	_sprite3 = insertStaticSprite(0x43003100, 995);
 	_sprite4 = NULL;
 
 	if (which < 0) {
 		_klayman = new KmScene1308(_vm, this, 380, 440);
 		setMessageList(0x004B57C0);
 		if (getGlobalVar(0x80455A41)) {
-			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			setRectList(0x004B5990);
 		} else {
-			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			_sprite5 = insertStaticSprite(0x080811A0, 100);
 			setRectList(0x004B5980);
 		}
 	} else if (which == 1) {
 		_klayman = new KmScene1308(_vm, this, 640, 440);
 		setMessageList(0x004B57C8);
 		if (getGlobalVar(0x80455A41)) {
-			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			setRectList(0x004B5990);
 		} else {
-			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			_sprite5 = insertStaticSprite(0x080811A0, 100);
 			setRectList(0x004B5980);
 		}
 	} else if (which == 2) {
@@ -1903,10 +1903,10 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B58B0);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite5 = addSprite(new Class592(_vm, this));
-			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			_sprite4->getSurface()->setVisible(false);
 		} else {
-			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			_sprite5 = insertStaticSprite(0x080811A0, 100);
 			setRectList(0x004B5980);
 		}
 	} else {
@@ -1915,10 +1915,10 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		sendMessage(_class549, 0x4808, 0);
 		_sprite1->getSurface()->setVisible(false);
 		if (getGlobalVar(0x80455A41)) {
-			_sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100));
+			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			_klayman->getSurface()->setVisible(false);
 		} else {
-			_sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100));
+			_sprite5 = insertStaticSprite(0x080811A0, 100);
 			_klayman->getSurface()->setVisible(false);
 		}
 	}
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 60e5279..5dc7478 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -769,11 +769,11 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class527 = addSprite(new Class527(_vm, _class525));
 	}
 
-	_sprite3 = addSprite(new StaticSprite(_vm, 0xA82BA811, 1100));
-	addSprite(new StaticSprite(_vm, 0x0A116C60, 1100));
+	_sprite3 = insertStaticSprite(0xA82BA811, 1100);
+	insertStaticSprite(0x0A116C60, 1100);
 	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0));
-	_sprite1 = addSprite(new StaticSprite(_vm, 0x38EA100C, 1005));
-	_sprite2 = addSprite(new StaticSprite(_vm, 0x98D0223C, 1200));
+	_sprite1 = insertStaticSprite(0x38EA100C, 1005);
+	_sprite2 = insertStaticSprite(0x98D0223C, 1200);
 	_sprite2->getSurface()->setVisible(false);
 
 	if (which < 0) {
@@ -1388,7 +1388,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620));
 
 	_asMouse = addSprite(new AsScene1407Mouse(_vm, this));
-	_ssResetButton = addSprite(new StaticSprite(_vm, 0x12006600, 100));
+	_ssResetButton = insertStaticSprite(0x12006600, 100);
 	_ssResetButton->getSurface()->setVisible(false); 
 
 }
@@ -1453,12 +1453,12 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL));
 
-	_class401_1 = addSprite(new StaticSprite(_vm, 0x01102A33, 100));
+	_class401_1 = insertStaticSprite(0x01102A33, 100);
 	_class401_1->getSurface()->setVisible(false);
 
-	_class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995));
+	_class401_2 = insertStaticSprite(0x04442520, 995);
 	
-	_class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995));
+	_class401_3 = insertStaticSprite(0x08742271, 995);
 
 	_asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011);
 	addSprite(_asTape1);
@@ -1583,7 +1583,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_class545);
 	}
 
-	_sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100));
+	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
 
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 14, 1100, 281, 411, 0x9148A011));
 	_vm->_collisionMan->addSprite(_asTape);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index b281b38..30fe952 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -254,7 +254,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1));
 	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2));
 
-	_sprite = addSprite(new StaticSprite(_vm, 0x31313A22, 1100));
+	_sprite = insertStaticSprite(0x31313A22, 1100);
 
 	_class606 = addSprite(new Class606(_vm, this, 15, 1100, 238, 439, 0x02363852));
 	_vm->_collisionMan->addSprite(_class606);
@@ -301,7 +301,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		sendMessage(_klayman, 0x2000, 0);
 		setMessageList(0x004B69F0);
 		sendMessage(this, 0x2000, 0);
-		tempSprite = addSprite(new StaticSprite(_vm, 0x30303822, 1100));
+		tempSprite = insertStaticSprite(0x30303822, 1100);
 		_klayman->getSurface()->getClipRect().x1 = 0;
 		_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 1af7799..ecd4e70 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -139,7 +139,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL));
 
-	_class401 = addSprite(new StaticSprite(_vm, 0x0D641724, 1100));
+	_class401 = insertStaticSprite(0x0D641724, 1100);
 
 	if (which < 0) {
 		_klayman = new KmScene2001(_vm, this, 300, 345);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 2c819a4..009895c 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1000,7 +1000,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	_smackerPlayer->setDrawPos(89, 37);
 	_palette->usePalette();
 
-	addSprite(new StaticSprite(_vm, 0x8540252C, 400));
+	insertStaticSprite(0x8540252C, 400);
 
 	for (int i = 0; i < 2; i++) {
 		_ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i);


Commit: 4a88ce37ddfc66d124e0e7bb8f6e3f87f993083a
    https://github.com/scummvm/scummvm/commit/4a88ce37ddfc66d124e0e7bb8f6e3f87f993083a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:38-07:00

Commit Message:
NEVERHOOD: Use InsertKlayman

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index e0ca57c..7102870 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2125,6 +2125,11 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	
 }
 
+void KmScene1002::init(Sprite *class599, Sprite *ssLadderArch) {
+	_class599 = class599;
+	_ssLadderArch = ssLadderArch;  
+}
+
 void KmScene1002::xUpdate() {
 	if (_x >= 250 && _x <= 435 && _y >= 420) {
 		if (_status == 0) {
@@ -2692,14 +2697,18 @@ void KmScene1004::sub478170() {
 
 // KmScene1201
 
-KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) {
+KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) {
 	
 	// TODO setKlaymanTable(dword_4AEF10, 3);
 	_flagF6 = true;
 	
 }
 
+void KmScene1201::init(Entity *class464) {
+	_class464 = class464; 
+}
+
 uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
@@ -3872,7 +3881,7 @@ void KmScene2001::sub440270() {
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
-KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk)
+KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	// TODO: NRect *rect1, int16 unk in Klayman ctor
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -3880,6 +3889,10 @@ KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	_flagF6 = false;
 }
 
+void KmScene2201::init(NRect *clipRects, int clipRectsCount) {
+	// TODO
+}
+
 uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 23bd110..a25176e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -261,10 +261,7 @@ protected:
 class KmScene1002 : public Klayman {
 public:
 	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-	void init(Sprite *class599, Sprite *ssLadderArch) {
-		_class599 = class599;
-		_ssLadderArch = ssLadderArch;  
-	}
+	void init(Sprite *class599, Sprite *ssLadderArch);
 protected:
 	Sprite *_class599;
 	Sprite *_ssLadderArch;
@@ -310,7 +307,8 @@ protected:
 
 class KmScene1201 : public Klayman {
 public:
-	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y);
+	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	void init(Entity *class464);
 protected:
 	Entity *_class464;
 	int _countdown;
@@ -431,7 +429,8 @@ protected:
 
 class KmScene2201 : public Klayman {
 public:
-	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk);
+	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	void init(NRect *clipRects, int clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 011ea9e..7c3c3ba 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -410,27 +410,26 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (which < 0) {
 		setRectList(0x004B49F0);
-		_klayman = new KmScene1001(_vm, this, 200, 433);
+		InsertKlayman(KmScene1001, 200, 433);
 		setMessageList(0x004B4888);
 	} else if (which == 1) {
 		setRectList(0x004B49F0);
-		_klayman = new KmScene1001(_vm, this, 640, 433);
+		InsertKlayman(KmScene1001, 640, 433);
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
 		setRectList(0x004B49F0);
 		if (getGlobalVar(0xC0418A02)) {
-			_klayman = new KmScene1001(_vm, this, 390, 433);
+			InsertKlayman(KmScene1001, 390, 433);
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new KmScene1001(_vm, this, 300, 433);
+			InsertKlayman(KmScene1001, 300, 433);
 		}
 		setMessageList(0x004B4970);
 	} else {
 		setRectList(0x004B4A00);
-		_klayman = new KmScene1001(_vm, this, 200, 433);
+		InsertKlayman(KmScene1001, 200, 433);
 		setMessageList(0x004B4890);
 	}
-	addSprite(_klayman);
 
 	tempSprite = insertStaticSprite(0x2080A3A8, 1300);
 
@@ -1425,7 +1424,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
-			InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch)); 
+			InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); 
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			_klayman->getSurface()->getClipRect().x1 = 31;
@@ -1435,7 +1434,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
-			InsertKlayman(KmScene1002, 379, 435, (_class599, _ssLadderArch));
+			InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch));
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
 			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
@@ -1445,7 +1444,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		}
 	} else if (which == 1) {
-		InsertKlayman(KmScene1002, 650, 435, (_class599, _ssLadderArch));
+		InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4478);
 		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
@@ -1455,7 +1454,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
-		InsertKlayman(KmScene1002, 68, 645, (_class599, _ssLadderArch));
+		InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4298);
 		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
@@ -1466,7 +1465,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_gameState.field2 = 1;
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
-		InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch));
+		InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4470);
 		_klayman->getSurface()->getClipRect().x1 = 31;
@@ -1766,20 +1765,18 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		setRectList(0x004B7C70);
-		_klayman = new KmScene1004(_vm, this, 330, 327);
+		InsertKlayman(KmScene1004, 330, 327);
 		setMessageList(0x004B7C18);
 	} else if (which == 1) {
 		setRectList(0x004B7C70);
-		_klayman = new KmScene1004(_vm, this, 330, 327);
+		InsertKlayman(KmScene1004, 330, 327);
 		setMessageList(0x004B7C08);
 	} else {
 		loadDataResource(0x01900A04);
-		_klayman = new KmScene1004(_vm, this, _dataResource.getPoint(0x80052A29).x, 27);
+		InsertKlayman(KmScene1004, _dataResource.getPoint(0x80052A29).x, 27);
 		setMessageList(0x004B7BF0);
 	}
 	
-	addSprite(_klayman);
-	
 	updatePaletteArea();
 	
 	_class478 = addSprite(new Class478(_vm, _klayman));
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 5a564cc..212fc87 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -845,29 +845,29 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	class464 = addSprite(new Class464(_vm));
 
 	if (which < 0) {
-		_klayman = new KmScene1201(_vm, this, class464, 364, 333);
+		InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464));
 		setMessageList(0x004AEC08);
 	} else if (which == 3) {
-		_klayman = new KmScene1201(_vm, this, class464, 400, 329);
+		InsertKlaymanInitArgs(KmScene1201, 400, 329, (class464));
 		setMessageList(0x004AEC08);
 	} else if (which == 2) {
 		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
-			_klayman = new KmScene1201(_vm, this, class464, 374, 333);
+			InsertKlaymanInitArgs(KmScene1201, 374, 333, (class464));
 			setMessageList(0x004AEC08);
 		} else {
-			_klayman = new KmScene1201(_vm, this, class464, 640, 329);
+			InsertKlaymanInitArgs(KmScene1201, 640, 329, (class464));
 			setMessageList(0x004AEC20);
 		}
 	} else if (which == 1) {
 		if (getGlobalVar(0xC0418A02)) {
-			_klayman = new KmScene1201(_vm, this, class464, 364, 333);
+			InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464));
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new KmScene1201(_vm, this, class464, 246, 333);
+			InsertKlaymanInitArgs(KmScene1201, 246, 333, (class464));
 		}
 		setMessageList(0x004AEC30);
 	} else {
-		_klayman = new KmScene1201(_vm, this, class464, 0, 336);
+		InsertKlaymanInitArgs(KmScene1201, 0, 336, (class464));
 		setMessageList(0x004AEC10);
 	}
 
@@ -877,8 +877,6 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->getSurface()->getClipRect().y2 = 480;
 	_klayman->setRepl(64, 0);
 	
-	addSprite(_klayman);
-
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
 		_background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0));
 		_palette = new Palette(_vm, 0x4019A2C4);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index d148018..8085eb6 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -664,13 +664,12 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
 
 	if (which < 0) {
-//		_klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364);
+		InsertKlaymanInitArgs(KmScene1002, 380, 364, (_class595, NULL));
 		setMessageList(0x004B0868);
 	} else {
-//		_klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330);
+		InsertKlaymanInitArgs(KmScene1002, 293, 330, (_class595, NULL));
 		setMessageList(0x004B0870);
 	}
-	addSprite(_klayman);
 
 	_klayman->getSurface()->getClipRect().x1 = 0;
 	_klayman->getSurface()->getClipRect().y1 = 0;
@@ -877,8 +876,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_sprite1 = insertStaticSprite(0xA014216B, 1100);
 
-	_klayman = new KmScene1303(_vm, this, 207, 332);
-	addSprite(_klayman);
+	InsertKlayman(KmScene1303, 207, 332);
 	setMessageList(0x004AF9A0);
 
 	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
@@ -963,13 +961,12 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x090AF033, 1100);
 
 	if (which < 0) {
-		_klayman = new KmScene1304(_vm, this, 217, 347);
+		InsertKlayman(KmScene1304, 217, 347);
 		setMessageList(0x004B90E8);
 	} else {
-		_klayman = new KmScene1304(_vm, this, 100, 347);
+		InsertKlayman(KmScene1304, 100, 347);
 		setMessageList(0x004B90F0);
 	}
-	addSprite(_klayman);
 
 	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
 	_klayman->getSurface()->getClipRect().y1 = 0;
@@ -1016,13 +1013,12 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL));
 
 	if (which < 0) {
-		_klayman = new KmScene1305(_vm, this, 212, 441);
+		InsertKlayman(KmScene1305, 212, 441);
 		setMessageList(0x004B6E40);
 	} else {
-		_klayman = new KmScene1305(_vm, this, 212, 441);
+		InsertKlayman(KmScene1305, 212, 441);
 		setMessageList(0x004B6E48);
 	}
-	addSprite(_klayman);
 	
 }
 
@@ -1153,45 +1149,45 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x00042313, 1100);
 
 	if (which < 0) {
-		_klayman = new KmScene1306(_vm, this, 380, 440);
+		InsertKlayman(KmScene1306, 380, 440);
 		setMessageList(0x004AFAD0);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 1) {
-		_klayman = new KmScene1306(_vm, this, 136, 440);
+		InsertKlayman(KmScene1306, 136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFAF0);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			_klayman = new KmScene1306(_vm, this, 515, 440);
+			InsertKlayman(KmScene1306, 515, 440);
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new KmScene1306(_vm, this, 355, 440);
+			InsertKlayman(KmScene1306, 355, 440);
 		}
 		setMessageList(0x004AFBC8);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 3) {
-		_klayman = new KmScene1306(_vm, this, 534, 440);
+		InsertKlayman(KmScene1306, 534, 440);
 		setMessageList(0x004AFC30);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 4) {
-		_klayman = new KmScene1306(_vm, this, 136, 440);
+		InsertKlayman(KmScene1306, 136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFC38);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 5) {
-		_klayman = new KmScene1306(_vm, this, 136, 440);
+		InsertKlayman(KmScene1306, 136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFB00);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else {
-		_klayman = new KmScene1306(_vm, this, 286, 408);
+		InsertKlayman(KmScene1306, 286, 408);
 		setSurfacePriority(_asElevator->getSurface(), 1100);
 		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
 		setSurfacePriority(_sprite1->getSurface(), 1080);
@@ -1200,7 +1196,6 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		clearRectList();
 		sendMessage(_asElevator, 0x4808, 0);
 	}
-	addSprite(_klayman);
 
 }
 	
@@ -1879,7 +1874,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite4 = NULL;
 
 	if (which < 0) {
-		_klayman = new KmScene1308(_vm, this, 380, 440);
+		InsertKlayman(KmScene1308, 380, 440);
 		setMessageList(0x004B57C0);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
@@ -1889,7 +1884,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else if (which == 1) {
-		_klayman = new KmScene1308(_vm, this, 640, 440);
+		InsertKlayman(KmScene1308, 640, 440);
 		setMessageList(0x004B57C8);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
@@ -1899,7 +1894,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else if (which == 2) {
-		_klayman = new KmScene1308(_vm, this, 475, 440);
+		InsertKlayman(KmScene1308, 475, 440);
 		setMessageList(0x004B58B0);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite5 = addSprite(new Class592(_vm, this));
@@ -1910,7 +1905,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else {
-		_klayman = new KmScene1308(_vm, this, 41, 440);
+		InsertKlayman(KmScene1308, 41, 440);
 		setMessageList(0x004B57D0);
 		sendMessage(_class549, 0x4808, 0);
 		_sprite1->getSurface()->setVisible(false);
@@ -1922,7 +1917,6 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->getSurface()->setVisible(false);
 		}
 	}
-	addSprite(_klayman);
 
 	if (_sprite4) {
 		_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 5dc7478..b4f0744 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -777,23 +777,22 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite2->getSurface()->setVisible(false);
 
 	if (which < 0) {
-		_klayman = new KmScene1401(_vm, this, 380, 447);
+		InsertKlayman(KmScene1401, 380, 447);
 		setMessageList(0x004B65C8);
 		_sprite1->getSurface()->setVisible(false);
 	} else if (which == 1) {
-		_klayman = new KmScene1401(_vm, this, 0, 447);
+		InsertKlayman(KmScene1401, 0, 447);
 		setMessageList(0x004B65D0);
 		_sprite1->getSurface()->setVisible(false);
 	} else if (which == 2) {
-		_klayman = new KmScene1401(_vm, this, 660, 447);
+		InsertKlayman(KmScene1401, 660, 447);
 		setMessageList(0x004B65D8);
 		_sprite1->getSurface()->setVisible(false);
 	} else {
-		_klayman = new KmScene1401(_vm, this, 290, 413);
+		InsertKlayman(KmScene1401, 290, 413);
 		setMessageList(0x004B65E8);
 		_sprite1->getSurface()->setVisible(false);
 	}
-	addSprite(_klayman);
 
 	if (getGlobalVar(0x04A105B3) == 2) {
 		_class489 = addSprite(new Class489(_vm, this, _klayman, _class525));
@@ -994,16 +993,16 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B0C98);
 
 	if (which < 0) {
-		_klayman = new KmScene1402(_vm, this, 377, 391);
+		InsertKlayman(KmScene1402, 377, 391);
 		setMessageList(0x004B0B48);
 		if (!getGlobalVar(0x70A1189C)) {
 			_class482 = addSprite(new Class482(_vm, this, 0));
 		}
 	} else if (which == 1) {
-		_klayman = new KmScene1402(_vm, this, 42, 391);
+		InsertKlayman(KmScene1402, 42, 391);
 		setMessageList(0x004B0B50);
 	} else if (which == 2) {
-		_klayman = new KmScene1402(_vm, this, 377, 391);
+		InsertKlayman(KmScene1402, 377, 391);
 		setMessageList(0x004B0B60);
 		_klayman->setDoDeltaX(1);
 		if (getGlobalVar(0x70A1189C)) {
@@ -1015,14 +1014,13 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 			_class482 = addSprite(new Class482(_vm, this, 0));
 		}
 	} else {
-		_klayman = new KmScene1402(_vm, this, 513, 391);
+		InsertKlayman(KmScene1402, 513, 391);
 		setMessageList(0x004B0B58);
 		if (!getGlobalVar(0x70A1189C)) {
 			_class482 = addSprite(new Class482(_vm, this, 2));
 			sub428220();
 		}
 	}
-	addSprite(_klayman);
 
 	if (_class482) {
 		_class482->getSurface()->getClipRect().x1 = 0;
@@ -1471,13 +1469,12 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape2->setRepl(64, 0);
 
 	if (which < 0) {
-		_klayman = new KmScene1403(_vm, this, 380, 463);
+		InsertKlayman(KmScene1403, 380, 463);
 		setMessageList(0x004B1F18);
 	} else {
-		_klayman = new KmScene1403(_vm, this, 640, 463);
+		InsertKlayman(KmScene1403, 640, 463);
 		setMessageList(0x004B1F20);
 	}
-	addSprite(_klayman);
 	_klayman->setRepl(64, 0);
 
 	if (getGlobalVar(0x04A105B3) == 4) {
@@ -1589,24 +1586,23 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape);
 
 	if (which < 0) {
-		_klayman = new KmScene1404(_vm, this, 376, 406);
+		InsertKlayman(KmScene1404, 376, 406);
 		setMessageList(0x004B8C28);
 	} else if (which == 1) {
-		_klayman = new KmScene1404(_vm, this, 376, 406);
+		InsertKlayman(KmScene1404, 376, 406);
 		setMessageList(0x004B8C30);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			_klayman = new KmScene1404(_vm, this, 347, 406);
+			InsertKlayman(KmScene1404, 347, 406);
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new KmScene1404(_vm, this, 187, 406);
+			InsertKlayman(KmScene1404, 187, 406);
 		}
 		setMessageList(0x004B8D28);
 	} else {
-		_klayman = new KmScene1404(_vm, this, 30, 406);
+		InsertKlayman(KmScene1404, 30, 406);
 		setMessageList(0x004B8C38);
 	}
-	addSprite(_klayman);
 
 	if (getGlobalVar(0x04A105B3) == 3) {
 		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 30fe952..43a30f9 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -262,7 +262,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	which = 4;
 
 	if (which < 0) {
-		_klayman = new KmScene1705(_vm, this, 231, 434);
+		InsertKlayman(KmScene1705, 231, 434);
 		setMessageList(0x004B69E8);
 		sendMessage(this, 0x2000, 0);
 		_klayman->getSurface()->getClipRect().x1 = 0;
@@ -270,7 +270,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else if (which == 1) {
-		_klayman = new KmScene1705(_vm, this, 431, 434);
+		InsertKlayman(KmScene1705, 431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A08);
 		sendMessage(this, 0x2000, 1);
@@ -279,7 +279,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else if (which == 2) {
-		_klayman = new KmScene1705(_vm, this, 431, 434);
+		InsertKlayman(KmScene1705, 431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6AA0);
 		sendMessage(this, 0x2000, 1);
@@ -288,7 +288,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else if (which == 3) {
-		_klayman = new KmScene1705(_vm, this, 431, 434);
+		InsertKlayman(KmScene1705, 431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A18);
 		sendMessage(this, 0x2000, 1);
@@ -297,7 +297,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	} else {
-		_klayman = new KmScene1705(_vm, this, 231, 74);
+		InsertKlayman(KmScene1705, 231, 74);
 		sendMessage(_klayman, 0x2000, 0);
 		setMessageList(0x004B69F0);
 		sendMessage(this, 0x2000, 0);
@@ -308,8 +308,6 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->getSurface()->getClipRect().y2 = 480;
 	}
 
-	addSprite(_klayman);
-	
 }
 
 void Scene1705::update() {
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index ecd4e70..bca54eb 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -142,31 +142,30 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class401 = insertStaticSprite(0x0D641724, 1100);
 
 	if (which < 0) {
-		_klayman = new KmScene2001(_vm, this, 300, 345);
+		InsertKlayman(KmScene2001, 300, 345);
 		setMessageList(0x004B3538);
 		sendMessage(this, 0x2000, 0);
 	} else if (which == 1) {
-		_klayman = new KmScene2001(_vm, this, 116, 345);
+		InsertKlayman(KmScene2001, 116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3540);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
-		_klayman = new KmScene2001(_vm, this, 116, 345);
+		InsertKlayman(KmScene2001, 116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B35F0);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
-		_klayman = new KmScene2001(_vm, this, 116, 345);
+		InsertKlayman(KmScene2001, 116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3550);
 		sendMessage(this, 0x2000, 1);
 	} else {
-		_klayman = new KmScene2001(_vm, this, 390, 345);
+		InsertKlayman(KmScene2001, 390, 345);
 		setMessageList(0x004B3530);
 		sendMessage(this, 0x2000, 0);
 		_klayman->setDoDeltaX(1);
 	}
-	addSprite(_klayman);
 	
 	_klayman->getSurface()->getClipRect().x1 = _class401->getSurface()->getDrawRect().x;
 	_klayman->getSurface()->getClipRect().y1 = 0;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 3faad25..27fb21a 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -1547,29 +1547,28 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_doorLightSprite = insertStaticSprite(0xA4062212, 900);
 
 	if (which < 0) {
-		_klayman = new KmScene2201(_vm, this, 300, 427, &_rect1, 2);
+		InsertKlaymanInitArgs(KmScene2201, 300, 427, (&_rect1, 2));
 		setMessageList(0x004B8118);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
 	} else if (which == 1) {
-		_klayman = new KmScene2201(_vm, this, 412, 393, &_rect1, 2);
+		InsertKlaymanInitArgs(KmScene2201, 412, 393, (&_rect1, 2));
 		setMessageList(0x004B8130);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			_klayman = new KmScene2201(_vm, this, 379, 427, &_rect1, 2);
+			InsertKlaymanInitArgs(KmScene2201, 379, 427, (&_rect1, 2));
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new KmScene2201(_vm, this, 261, 427, &_rect1, 2);
+			InsertKlaymanInitArgs(KmScene2201, 261, 427, (&_rect1, 2));
 		}
 		setMessageList(0x004B8178);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
 	} else {
 		NPoint pt = _dataResource.getPoint(0x0304D8DC);
-		_klayman = new KmScene2201(_vm, this, pt.x, pt.y, &_rect1, 2);
+		InsertKlaymanInitArgs(KmScene2201, pt.x, pt.y, (&_rect1, 2));
 		setMessageList(0x004B8120);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true));
 	}
-	addSprite(_klayman);
 	
 	addSprite(new AsScene2201CeilingFan(_vm));
 
@@ -2162,24 +2161,23 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asRightDoor);
 
 	if (which < 0) {
-		_klayman = new KmScene2203(_vm, this, 200, 427);
+		InsertKlayman(KmScene2203, 200, 427);
 		setMessageList(0x004B8340);
 	} else if (which == 1) {
-		_klayman = new KmScene2203(_vm, this, 640, 427);
+		InsertKlayman(KmScene2203, 640, 427);
 		setMessageList(0x004B8350);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			_klayman = new KmScene2203(_vm, this, 362, 427);
+			InsertKlayman(KmScene2203, 362, 427);
 			_klayman->setDoDeltaX(1);
 		} else {
-			_klayman = new KmScene2203(_vm, this, 202, 427);
+			InsertKlayman(KmScene2203, 202, 427);
 		}
 		setMessageList(0x004B8358);
 	} else {
-		_klayman = new KmScene2203(_vm, this, 0, 427);
+		InsertKlayman(KmScene2203, 0, 427);
 		setMessageList(0x004B8348);
 	}
-	addSprite(_klayman); 
 
 	if (getGlobalVar(0x9A500914)) {
 		_ssSmallLeftDoor->getSurface()->setVisible(false);
@@ -2315,25 +2313,24 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm));
 
 	if (which < 0) {
-		_klayman = new KmScene2205(_vm, this, 320, 417);
+		InsertKlayman(KmScene2205, 320, 417);
 		setMessageList(0x004B0658);
 		if (!getGlobalVar(0x4D080E54)) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
 		}
 		_isKlaymanInLight = false;
 	} else if (which == 1) {
-		_klayman = new KmScene2205(_vm, this, 640, 417);
+		InsertKlayman(KmScene2205, 640, 417);
 		setMessageList(0x004B0648);
 		if (!getGlobalVar(0x4D080E54)) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
 		}
 		_isKlaymanInLight = false;
 	} else {
-		_klayman = new KmScene2205(_vm, this, 0, 417);
+		InsertKlayman(KmScene2205, 0, 417);
 		setMessageList(0x004B0640);
 		_isKlaymanInLight = true;
 	}
-	addSprite(_klayman);
 
 	_klayman->getSurface()->getClipRect().x1 = _ssDoorFrame->getSurface()->getDrawRect().x;
 	_klayman->getSurface()->getClipRect().y1 = 0;
@@ -2606,27 +2603,26 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_class607);
 	
 	if (which < 0) {
-		_klayman = new KmScene2206(_vm, this, 200, 430);
+		InsertKlayman(KmScene2206, 200, 430);
 		setMessageList(0x004B88A8);
 	} else if (which == 1) {
-		_klayman = new KmScene2206(_vm, this, 640, 430);
+		InsertKlayman(KmScene2206, 640, 430);
 		setMessageList(0x004B88B8);
 	} else if (which == 2) {
-		_klayman = new KmScene2206(_vm, this, 205, 396);
+		InsertKlayman(KmScene2206, 205, 396);
 		setMessageList(0x004B88C8);
 		_palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
 		sub4819D0();
 		_soundResource.play(0x53B8284A);
 	} else if (which == 3) {
-		_klayman = new KmScene2206(_vm, this, kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
+		InsertKlayman(KmScene2206, kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B8A70);
 	} else {
-		_klayman = new KmScene2206(_vm, this, 0, 430);
+		InsertKlayman(KmScene2206, 0, 430);
 		setMessageList(0x004B88B0);
 	}
-	addSprite(_klayman);
 
 	_klayman->setSoundFlag(true);
 	_klayman->setKlaymanTable2();
@@ -3069,8 +3065,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2207::update);
 	_surfaceFlag = true;
 
-	_klayman = new KmScene2207(_vm, this, 0, 0); // CHECKME: Stack vars are uninitialized?!
-	addSprite(_klayman);
+	InsertKlayman(KmScene2207, 0, 0);
 	_klayman->setRepl(64, 0);
 	
 	setMessageList(0x004B38E8);
@@ -3518,21 +3513,20 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape); 
 
 	if (which < 0) {
-		_klayman = new KmScene2242(_vm, this, 200, 430);
+		InsertKlayman(KmScene2242, 200, 430);
 		setMessageList(0x004B3C18);
 	} else if (which == 1) {
-		_klayman = new KmScene2242(_vm, this, 530, 430);
+		InsertKlayman(KmScene2242, 530, 430);
 		setMessageList(0x004B3D60);
 	} else if (which == 2) {
-		_klayman = new KmScene2242(_vm, this, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430);
+		InsertKlayman(KmScene2242, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430);
 		setMessageList(0x004B3D48);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 	} else {
-		_klayman = new KmScene2242(_vm, this, 0, 430);
+		InsertKlayman(KmScene2242, 0, 430);
 		setMessageList(0x004B3C20);
 	}
-	addSprite(_klayman);
 
 	_klayman->setSoundFlag(true);
 
@@ -3650,21 +3644,20 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 	}
 
 	if (which < 0) {
-		_klayman = new KmHallOfRecords(_vm, this, 200, 430);
+		InsertKlayman(KmHallOfRecords, 200, 430);
 		setMessageList(0x004B2900);
 	} else if (which == 1) {
-		_klayman = new KmHallOfRecords(_vm, this, 640, 430);
+		InsertKlayman(KmHallOfRecords, 640, 430);
 		setMessageList(0x004B2910);
 	} else if (which == 2) {
-		_klayman = new KmHallOfRecords(_vm, this, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
+		InsertKlayman(KmHallOfRecords, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
 		setMessageList(0x004B2B70);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 	} else {
-		_klayman = new KmHallOfRecords(_vm, this, 0, 430);
+		InsertKlayman(KmHallOfRecords, 0, 430);
 		setMessageList(0x004B2908);
 	}
-	addSprite(_klayman);
 
 	_klayman->setSoundFlag(true);
 	_klayman->setKlaymanTable2();
@@ -3748,21 +3741,20 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (which < 0) {
-		_klayman = new KmScene2247(_vm, this, 200, 430);
+		InsertKlayman(KmScene2247, 200, 430);
 		setMessageList(0x004B5428);
 	} else if (which == 1) {
-		_klayman = new KmScene2247(_vm, this, 640, 430);
+		InsertKlayman(KmScene2247, 640, 430);
 		setMessageList(0x004B5438);
 	} else if (which == 2) {
-		_klayman = new KmScene2247(_vm, this, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
+		InsertKlayman(KmScene2247, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B5530);
 	} else {
-		_klayman = new KmScene2247(_vm, this, 0, 430);
+		InsertKlayman(KmScene2247, 0, 430);
 		setMessageList(0x004B5430);
 	}
-	addSprite(_klayman);
 
 	_klayman->setSoundFlag(true);
 	
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 067e86f..9b928bb 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -37,7 +37,8 @@
 
 namespace Neverhood {
 
-#define InsertKlayman(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman)
+#define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman)
+#define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman)
 
 class Scene : public Entity {
 public:


Commit: 5d63bef6a25a990603444026a8cb033108410019
    https://github.com/scummvm/scummvm/commit/5d63bef6a25a990603444026a8cb033108410019
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Use setBackground

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 7c3c3ba..1e5b076 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -403,7 +403,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_vm->_collisionMan->setHitRects(0x004B4860);
 	_surfaceFlag = false;
-	_background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0));
+	setBackground(0x4086520E);
 	_palette = new Palette(_vm, 0x4086520E);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x6520A400, NULL));
@@ -1406,7 +1406,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x12C23307, 0, 0));
+	setBackground(0x12C23307);
 	_palette = new Palette(_vm, 0x12C23307);
 	_palette->usePalette();
 
@@ -1686,7 +1686,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF
 
 	SetMessageHandler(&Class152::handleMessage);
 	
-	_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
+	setBackground(backgroundFileHash);
 	_palette = new Palette(_vm, backgroundFileHash);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620));
@@ -1748,7 +1748,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1004::update);
 	SetMessageHandler(&Scene1004::handleMessage);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x50C03005, 0, 0));
+	setBackground(0x50C03005);
 
 	if (getGlobalVar(0x0D0A14D10)) {
 		palette2 = new Palette2(_vm, 0xA30BA329);
@@ -1850,13 +1850,13 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 	
 	if (getGlobalVar(0xD0A14D10)) {
-		_background = addBackground(new DirtyBackground(_vm, 0x2800E011, 0, 0));
+		setBackground(0x2800E011);
 		_palette = new Palette(_vm, 0x2800E011);
 		_palette->usePalette();
 		insertStaticSprite(0x492D5AD7, 100);
 		_mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620));
 	} else {
-		_background = addBackground(new DirtyBackground(_vm, 0x8870A546, 0, 0));
+		setBackground(0x8870A546);
 		_palette = new Palette(_vm, 0x8870A546);
 		_palette->usePalette();
 		insertStaticSprite(0x40D1E0A9, 100);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 212fc87..a12f1cc 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -878,12 +878,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setRepl(64, 0);
 	
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
-		_background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0));
+		setBackground(0x4019A2C4);
 		_palette = new Palette(_vm, 0x4019A2C4);
 		_palette->usePalette();
 		_asRightDoor = NULL;
 	} else {
-		_background = addBackground(new DirtyBackground(_vm, 0x40206EC5, 0, 0));
+		setBackground(0x40206EC5);
 		_palette = new Palette(_vm, 0x40206EC5);
 		_palette->usePalette();
 		_asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2));
@@ -1188,7 +1188,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x60210ED5, 0, 0));
+	setBackground(0x60210ED5);
 
 	palette2 = new Palette2(_vm, 0x60210ED5);
 	palette2->usePalette();
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 8085eb6..46597e0 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -639,7 +639,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->setHitRects(0x004B0858);
 	setRectList(0x004B0A38);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x420643C4, 0, 0));
+	setBackground(0x420643C4);
 	_palette = new Palette(_vm, 0x420643C4);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL));
@@ -1007,7 +1007,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1305::handleMessage);
 	setRectList(0x004B6E98);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x28801B64, 0, 0));
+	setBackground(0x28801B64);
 	_palette = new Palette(_vm, 0x28801B64);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL));
@@ -1123,7 +1123,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene1306::handleMessage);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x05303114, 0, 0));
+	setBackground(0x05303114);
 	_palette = new Palette(_vm, 0x05303114);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x0311005B, NULL));
@@ -1529,7 +1529,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1307::handleMessage);
 	SetUpdateHandler(&Scene1307::update);
 
-	_background = addBackground(new DirtyBackground(_vm, 0xA8006200, 0, 0));
+	setBackground(0xA8006200);
 	_palette = new Palette(_vm, 0xA8006200);
 	_palette->usePalette();
 	addEntity(_palette);
@@ -1848,7 +1848,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;		
 	SetMessageHandler(&Scene1308::handleMessage);
 	
-	_background = addBackground(new DirtyBackground(_vm, 0x41024202, 0, 0));
+	setBackground(0x41024202);
 	_palette = new Palette(_vm, 0x41024202);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x24206418, NULL));
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index b4f0744..4dac2a7 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -756,7 +756,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B6758);
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x08221FA5, 0, 0));
+	setBackground(0x08221FA5);
 	_palette = new Palette(_vm, 0x08221FA5);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x21FA108A, NULL));
@@ -1380,7 +1380,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1407::handleMessage);
 	SetUpdateHandler(&Scene1407::update);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x00442225, 0, 0));
+	setBackground(0x00442225);
 	_palette = new Palette(_vm, 0x00442225);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620));
@@ -1446,7 +1446,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B1FF8);
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x2110A234, 0, 0));
+	setBackground(0x2110A234);
 	_palette = new Palette(_vm, 0x2110A234);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL));
@@ -1569,7 +1569,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setRectList(0x004B8D80);
 
-	_background = addBackground(new DirtyBackground(_vm, 0xAC0B006F, 0, 0));
+	setBackground(0xAC0B006F);
 	_palette = new Palette(_vm, 0xAC0B006F);
 	_palette->addPalette(0x00801510, 0, 65, 0);
 	_palette->usePalette();
@@ -1784,7 +1784,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->gameModule()->initScene1405Vars();
 	_surfaceFlag = true;
 	
-	_background = addBackground(new DirtyBackground(_vm, 0x0C0C007D, 0, 0));
+	setBackground(0x0C0C007D);
 	_palette = new Palette(_vm, 0x0C0C007D);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse435(_vm, 0xC00790C8, 20, 620));
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 40b15b3..a014844 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -118,7 +118,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 	
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
+	setBackground(backgroundFileHash);
 
 	palette2 = new Palette2(_vm);
 	palette2->usePalette();
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 43a30f9..a36d358 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -239,7 +239,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x03118226, 0, 0));
+	setBackground(0x03118226);
 
 	palette2 = new Palette2(_vm, 0x03118226);
 	palette2->addPalette(0x91D3A391, 0, 64, 0);
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index bca54eb..2b6a647 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -134,7 +134,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2001::handleMessage);
 
-	_background = addBackground(new DirtyBackground(_vm, 0xA6417244, 0, 0));
+	setBackground(0xA6417244);
 	_palette = new Palette(_vm, 0xA6417244);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL));
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 27fb21a..62aec28 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -1507,7 +1507,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	loadDataResource(0x04104242);
 	loadHitRectList();
 
-	_background = addBackground(new DirtyBackground(_vm, 0x40008208, 0, 0));
+	setBackground(0x40008208);
 	_palette = new Palette(_vm, 0x40008208);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x0820C408, NULL));
@@ -1892,7 +1892,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x08100A0C, 0, 0));
+	setBackground(0x08100A0C);
 	palette2 = new Palette2(_vm, 0x08100A0C);
 	_palette = palette2;
 	_palette->usePalette();
@@ -2123,7 +2123,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2203::handleMessage);
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x82C80334, 0, 0));
+	setBackground(0x82C80334);
 	_palette = new Palette(_vm, 0x82C80334);
 	_palette->usePalette();
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x80330824, NULL));
@@ -2288,7 +2288,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(0x4D080E54)) {
 		_isLightOn = true;
-		_background = addBackground(new DirtyBackground(_vm, 0x0008028D, 0, 0));
+		setBackground(0x0008028D);
 		palette2 = new Palette2(_vm, 0x0008028D);
 		_palette = palette2;
 		_palette->usePalette();
@@ -2298,7 +2298,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		addSprite(_ssLightSwitch);
 	} else {
 		_isLightOn = false;
-		_background = addBackground(new DirtyBackground(_vm, 0xD00A028D, 0, 0));
+		setBackground(0xD00A028D);
 		palette2 = new Palette2(_vm, 0xD00A028D);
 		_palette = palette2;
 		_palette->usePalette();
@@ -2587,7 +2587,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class604->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
 	_class604->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
 
-	_background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0));
+	setBackground(fileHash);
 
 	palette2 = new Palette2(_vm, fileHash);
 	_palette = palette2;
@@ -3074,7 +3074,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (getGlobalVar(0x4D080E54)) {
 
-		_background = addBackground(new DirtyBackground(_vm, 0x88C00241, 0, 0));
+		setBackground(0x88C00241);
 		_palette = new Palette(_vm, 0x88C00241);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL));
@@ -3116,7 +3116,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 		setGlobalVar(0x81890D14, 1);
 
-		_background = addBackground(new DirtyBackground(_vm, 0x05C02A55, 0, 0));
+		setBackground(0x05C02A55);
 		_palette = new Palette(_vm, 0x05C02A55);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL));
@@ -3492,13 +3492,13 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2242::update);
 	
 	if (getGlobalVar(0x4D080E54)) {
-		_background = addBackground(new DirtyBackground(_vm, 0x11840E24, 0, 0));
+		setBackground(0x11840E24);
 		_palette = new Palette(_vm, 0x11840E24);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x40E20110, NULL));
 		setRectList(0x004B3DC8);
 	} else {
-		_background = addBackground(new DirtyBackground(_vm, 0x25848E24, 0, 0));
+		setBackground(0x25848E24);
 		palette2 = new Palette2(_vm, 0x25848E24);
 		_palette = palette2;
 		_palette->usePalette();
@@ -3631,13 +3631,13 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 
 	if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) {
 		setRectList(0x004B2BF8);
-		_background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename2, 0, 0));
+		setBackground(_sceneInfo140->bgFilename2);
 		_palette = new Palette(_vm, _sceneInfo140->bgFilename2);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
 	} else {
 		setRectList(0x004B2BB8);
-		_background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename1, 0, 0));
+		setBackground(_sceneInfo140->bgFilename1);
 		_palette = new Palette(_vm, _sceneInfo140->bgFilename1);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL));
@@ -3728,13 +3728,13 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(0x4D080E54)) {
 		setRectList(0x004B5588);
-		_background = addBackground(new DirtyBackground(_vm, 0x40339414, 0, 0));
+		setBackground(0x40339414);
 		_palette = new Palette(_vm, 0x40339414);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL));
 	} else {
 		setRectList(0x004B55C8);
-		_background = addBackground(new DirtyBackground(_vm, 0x071963E5, 0, 0));
+		setBackground(0x071963E5);
 		_palette = new Palette(_vm, 0x071963E5);
 		_palette->usePalette();
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 009895c..cc617a3 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -971,7 +971,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_vm->_screen->clear();
 	
-	_background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0));
+	setBackground(0xD000420C);
 	_palette = new Palette(_vm, 0xD000420C);
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620));
 
@@ -1470,7 +1470,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x80802626, 0, 0));
+	setBackground(0x80802626);
 	_palette = new Palette(_vm, 0x80802626);
 	_palette->usePalette();
 
@@ -1724,7 +1724,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO _vm->gameModule()->initScene3011Vars();
 	_index1 = getGlobalVar(0x2414C2F2);
 
-	_background = addBackground(new DirtyBackground(_vm, 0x92124A04, 0, 0));
+	setBackground(0x92124A04);
 
 	palette2 = new Palette2(_vm, 0xA4070114);
 	addEntity(palette2);


Commit: c30e16628e01b5be671330b24ed73d1294205f6b
    https://github.com/scummvm/scummvm/commit/c30e16628e01b5be671330b24ed73d1294205f6b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Add Module::updateChild and use it (in most places)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 650287b..6ef58e4 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -268,8 +268,8 @@ void GameModule::startup() {
 	//createModule1700(1);
 	//createModule1400(-1);
 #if 1
-	_vm->gameState().sceneNum = 1;
-	createModule1000(-1);
+	_vm->gameState().sceneNum = 0;
+	createModule1200(-1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -296,14 +296,7 @@ void GameModule::createModule1000(int which) {
 }
 
 void GameModule::updateModule1000() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		// TODO _resourceTable3.load();
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createModule2300(0);
 		_childObject->handleUpdate();
 	}
@@ -316,13 +309,7 @@ void GameModule::createModule1200(int which) {
 }
 
 void GameModule::updateModule1200() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			error("// TODO createModule2600(0);");
 			// TODO createModule2600(0);
@@ -341,13 +328,7 @@ void GameModule::createModule1300(int which) {
 }
 
 void GameModule::updateModule1300() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			// TODO _gameState.clear();
 			// TODO GameModule_handleKeyEscape
@@ -365,13 +346,7 @@ void GameModule::createModule1400(int which) {
 }
 
 void GameModule::updateModule1400() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			error("WEIRD!");
 		} else {
@@ -389,13 +364,7 @@ void GameModule::createModule1500(int which) {
 }
 
 void GameModule::updateModule1500() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createModule1000(0);
 		_childObject->handleUpdate();
 	}
@@ -408,13 +377,7 @@ void GameModule::createModule1700(int which) {
 }
 
 void GameModule::updateModule1700() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		debug("Module1700 done; _field20 = %d", _field20);
 		if (_field20 == 1) {
 			// TODO createModule2900(3);
@@ -433,13 +396,7 @@ void GameModule::createModule1800(int which) {
 }
 
 void GameModule::updateModule1800() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			// TODO GameState_clear();
 			// TODO GameModule_handleKeyEscape();
@@ -463,13 +420,7 @@ void GameModule::createModule2000(int which) {
 }
 
 void GameModule::updateModule2000() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		// TODO createModule2900(4);
 		_childObject->handleUpdate();
 	}
@@ -482,13 +433,7 @@ void GameModule::createModule2200(int which) {
 }
 
 void GameModule::updateModule2200() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createModule2300(1);
 		_childObject->handleUpdate();
 	}
@@ -501,40 +446,19 @@ void GameModule::createModule2300(int which) {
 }
 
 void GameModule::updateModule2300() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createModule2200(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createModule1200(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 3) {
 			// TODO createModule2400(0);
-			// TODO _childObject->handleUpdate();
 		} else if (_field20 == 4) {
 			// TODO createModule3000(0);
-			// TODO _childObject->handleUpdate();
 		} else {
 			createModule1000(1);
-			_childObject->handleUpdate();
-		}
-	}
-	if (_field24 >= 0) {
-		if (_field24 == 2) {
-			// TODO _resourceTable4.load();
-		} else if (_field24 == 0) {
-			// TODO _resourceTable3.load();
 		}
-		_field24 = -1;
-	}
-	if (_field26 >= 0) {
-		_field26 = -1;
+		_childObject->handleUpdate();
 	}
 }
 
@@ -549,13 +473,7 @@ void GameModule::createModule3000(int which) {
 }
 
 void GameModule::updateModule3000() {
-	if (!_childObject)
-		return;
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			// TODO createModule1900(0);
 			// TODO _childObject->handleUpdate();
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index c38b96e..6d49838 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -89,4 +89,17 @@ void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1,
 	_childObject = smackerScene;
 }
 
+bool Module::updateChild() {
+	if (_childObject) {
+		_childObject->handleUpdate();
+		if (_done) {
+			_done = false;
+			delete _childObject;
+			_childObject = NULL;
+			return false;
+		}
+	}
+	return true;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 470fe36..a37fd52 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -53,6 +53,7 @@ protected:
 	NavigationScene *navigationScene();
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
 	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
+	bool updateChild();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 1e5b076..51e1d19 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -101,11 +101,7 @@ void Module1000::createScene1005(int which) {
 }
 
 void Module1000::updateScene1001() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 2) {
 			createScene1003(0);
 			_childObject->handleUpdate();
@@ -117,11 +113,7 @@ void Module1000::updateScene1001() {
 }
 
 void Module1000::updateScene1002() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			sendMessage(_parentModule, 0x1009, 0);
 		} else if (_field20 == 2) {
@@ -135,22 +127,14 @@ void Module1000::updateScene1002() {
 }
 			
 void Module1000::updateScene1003() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1001(2);
 		_childObject->handleUpdate();
 	}
 }
 			
 void Module1000::updateScene1004() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene1005(0);
 			_childObject->handleUpdate();
@@ -162,12 +146,8 @@ void Module1000::updateScene1004() {
 }
 			
 void Module1000::updateScene1005() {
-	_childObject->handleUpdate();
-	if (_done) {
+	if (!updateChild()) {
 		// TODO Music18hList_stop(_musicFileHash, 0, 1);
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
 		createScene1004(1);
 		_childObject->handleUpdate();
 	}
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index a12f1cc..fa0bea0 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -25,10 +25,12 @@
 namespace Neverhood {
 
 Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _moduleDone(false) {
+	: Module(vm, parentModule) {
 	
 	// TODO _resourceTable.setResourceList(0x004B3E68);
 	SetMessageHandler(&Module1200::handleMessage);
+
+	debug("Module1200: which = %d", which);
 	
 	if (which < 0) {
 		switch (_vm->gameState().sceneNum) {
@@ -56,17 +58,6 @@ Module1200::~Module1200() {
 	// TODO Music18hList_deleteGroup(0x00478311);
 }
 
-uint32 Module1200::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1009:
-		_moduleDone = true;
-		_moduleDoneStatus = param.asInteger();
-		break;
-	}
-	return messageResult;
-}
-
 void Module1200::createScene1201(int which) {
 	_vm->gameState().sceneNum = 0;
 	_childObject = new Scene1201(_vm, this, which);
@@ -88,41 +79,31 @@ void Module1200::createScene1203(int which) {
 }
 
 void Module1200::updateScene1201() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (_moduleDoneStatus == 1) {
+	if (!updateChild()) {
+		if (_field20 == 1) {
 			createScene1202(0);
 			_childObject->handleUpdate();
-		} else if (_moduleDoneStatus == 2) {
-			sendMessage(_parentModule, 0x1009, 0);
-		} else if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
-			createScene1203(-1);
+		} else if (_field20 == 2) {
+			if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
+				createScene1203(-1);
+			} else {
+				sendMessage(_parentModule, 0x1009, 1);
+			}
 		} else {
-			sendMessage(_parentModule, 0x1009, 1);
+			sendMessage(_parentModule, 0x1009, 0);
 		}
 	}
 }
 
 void Module1200::updateScene1202() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1201(1);
 		_childObject->handleUpdate();
 	}
 }
 			
 void Module1200::updateScene1203() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1201(3);
 		_childObject->handleUpdate();
 		// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
@@ -788,15 +769,6 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	int16 x1, x2;
 	Sprite *tempSprite, *class464;
 
-	// TODO _resourceTable2.setResourceList(ex_sub_41C730(), true);
-	if (getGlobalVar(0x0A18CA33)) {
-		// TODO _resourceTable1.setResourceList(0x004AEA10, true);
-	} else if (getGlobalVar(0x0A310817)) {
-		// TODO _resourceTable1.setResourceList(0x004AEA70, true);
-	} else {
-		// TODO _resourceTable1.setResourceList(0x004AEB18, true);
-	}
-
 	SetUpdateHandler(&Scene1201::update);
 	SetMessageHandler(&Scene1201::handleMessage);
 
@@ -844,6 +816,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	class464 = addSprite(new Class464(_vm));
 
+	debug("Scene1201: which = %d", which);
+
 	if (which < 0) {
 		InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464));
 		setMessageList(0x004AEC08);
@@ -1006,7 +980,6 @@ void Scene1201::update() {
 }
 
 uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Scene1201::handleMessage(%04X)", messageNum);
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index 3ffed44..df1ed41 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -37,9 +37,6 @@ public:
 	virtual ~Module1200();
 protected:
 	// TODO ResourceTable _resourceTable;
-	bool _moduleDone;
-	uint32 _moduleDoneStatus; 
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createScene1201(int which);			
 	void createScene1202(int which);			
 	void createScene1203(int which);			
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 46597e0..149af4a 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -283,11 +283,7 @@ void Module1300::createScene1318(int which) {
 }
 			
 void Module1300::updateScene1302() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene1305(0);
 		} else {
@@ -298,45 +294,28 @@ void Module1300::updateScene1302() {
 }
 
 void Module1300::updateScene1303() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1306(3);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1300::updateScene1304() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1316(0);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1300::updateScene1305() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1317(-1);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1300::updateScene1306() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
-		debug("_field20 = %d", _field20);
+	if (!updateChild()) {
 		if (_field20 == 2) {
 			createScene1309(0);
 			_childObject->handleUpdate();
@@ -353,22 +332,14 @@ void Module1300::updateScene1306() {
 }
 
 void Module1300::updateScene1307() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1308(2);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1300::updateScene1308() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1314(0);
 		} else if (_field20 == 1) {
@@ -381,22 +352,14 @@ void Module1300::updateScene1308() {
 }
 
 void Module1300::updateScene1309() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1306(2);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1300::updateScene1310() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_vm->gameState().sceneNum == 9)
 			createScene1306(0);
 		else
@@ -409,11 +372,7 @@ void Module1300::updateScene1311() {
 }
 
 void Module1300::updateScene1312() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1313(0);
 		} else if (_field20 == 1) {
@@ -424,11 +383,7 @@ void Module1300::updateScene1312() {
 }
 
 void Module1300::updateScene1313() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		switch (_field20) {
 		case 0:
 			createScene1315(1);
@@ -448,11 +403,7 @@ void Module1300::updateScene1313() {
 }
 
 void Module1300::updateScene1314() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1313(2);
 		} else if (_field20 == 1) {
@@ -463,11 +414,7 @@ void Module1300::updateScene1314() {
 }
 
 void Module1300::updateScene1315() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1313(3);
 		} else if (_field20 == 1) {
@@ -478,11 +425,7 @@ void Module1300::updateScene1315() {
 }
 
 void Module1300::updateScene1316() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1313(4);
 		} else if (_field20 == 1) {
@@ -493,11 +436,7 @@ void Module1300::updateScene1316() {
 }
 
 void Module1300::updateScene1317() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1318(-1);
 		_childObject->handleUpdate();
 	}
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 4dac2a7..edc47f5 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -121,11 +121,7 @@ void Module1400::createScene1407(int which) {
 }
 
 void Module1400::updateScene1401() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene1402(0);
 			_childObject->handleUpdate();
@@ -139,14 +135,7 @@ void Module1400::updateScene1401() {
 }
 
 void Module1400::updateScene1402() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
-		
-		debug("Scene1402: _field20 = %d", _field20);
-		
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene1403(0);
 			_childObject->handleUpdate();
@@ -161,23 +150,14 @@ void Module1400::updateScene1402() {
 }
 
 void Module1400::updateScene1403() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1402(1);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1400::updateScene1404() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
-		debug("Scene1404; _field20 = %d", _field20);
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene1405(0);
 			_childObject->handleUpdate();
@@ -192,33 +172,21 @@ void Module1400::updateScene1404() {
 }
 
 void Module1400::updateScene1405() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1404(1);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1400::updateScene1406() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1404(2);
 		_childObject->handleUpdate();
 	}
 }
 
 void Module1400::updateScene1407() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene1402(2);
 		_childObject->handleUpdate();
 	}
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index a014844..b942d8b 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -50,11 +50,7 @@ Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, boo
 }
 
 void Module1500::update() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			createScene1502();
@@ -77,7 +73,6 @@ void Module1500::update() {
 }
 
 void Module1500::createScene1501() {
-	debug("createScene1501");
 	_vm->gameState().sceneNum = 0;
 	_childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48);
 	SetUpdateHandler(&Module1500::update);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index a36d358..528161e 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -100,11 +100,7 @@ void Module1700::createScene1705(int which) {
 }
 
 void Module1700::updateScene1701() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_vm->gameState().sceneNum == 3) {
 			createScene1705(0);
 			_childObject->handleUpdate();
@@ -117,11 +113,7 @@ void Module1700::updateScene1701() {
 }
 
 void Module1700::updateScene1702() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1703(0);
 			_childObject->handleUpdate();
@@ -133,11 +125,7 @@ void Module1700::updateScene1702() {
 }
 
 void Module1700::updateScene1703() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1704(-1);
 			_childObject->handleUpdate();
@@ -156,11 +144,7 @@ void Module1700::updateScene1703() {
 }
 
 void Module1700::updateScene1705() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		sendMessage(_parentModule, 0x1009, 1);
 	}
 }
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index f503848..d3dc4b6 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -146,17 +146,7 @@ void Module1800::createScene1809(int which) {
 }
 
 void Module1800::updateScene1801() {
-	_childObject->handleUpdate();
-#if 0 // TODO
-	NavigationScene *navigationScene = (NavigationScene*)_childObject;
-	if (navigationScene->soundFlag1 && navigationScene->index == 2) {
-		// TODO Sound1ChList_sub_4080B0(false);
-	}
-#endif	
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene1805(0);
 			_childObject->handleUpdate();
@@ -167,6 +157,13 @@ void Module1800::updateScene1801() {
 			createScene1804(0);
 			_childObject->handleUpdate();
 		}
+	} else {
+#if 0 // TODO
+		NavigationScene *navigationScene = (NavigationScene*)_childObject;
+		if (navigationScene->soundFlag1 && navigationScene->index == 2) {
+			// TODO Sound1ChList_sub_4080B0(false);
+		}
+#endif	
 	}
 }
 
@@ -187,11 +184,7 @@ void Module1800::updateScene1802() {
 }
 
 void Module1800::updateScene1803() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 2) {
 			createScene1801(2);
 			_childObject->handleUpdate();
@@ -207,49 +200,33 @@ void Module1800::updateScene1803() {
 }
 
 void Module1800::updateScene1804() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1804b(-1);
-			_childObject->handleUpdate();
 		} else if (_field20 == 1) {
 			createScene1801(1);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
 	}
 }
 
 void Module1800::updateScene1805() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			createScene1807(-1);
-			_childObject->handleUpdate();
 		} else if (_field20 == 1) {
 			createScene1806(0);
-			_childObject->handleUpdate();
 		} else if (_field20 == 2) {
 			createScene1801(3);
-			_childObject->handleUpdate();
 		} else if (_field20 == 3) {
 			createScene1805(3);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
 	}
 }
 
 void Module1800::updateScene1806() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			sendMessage(_parentModule, 0x1009, 2);
 		} else if (_field20 == 1) {
@@ -257,20 +234,10 @@ void Module1800::updateScene1806() {
 			_childObject->handleUpdate();
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 1) {
-			// TODO _resourceTable.setResourceList(ex_sub_42EDA0(0), true);
-		}
-		_field24 = -1;
-	}
 }
 
 void Module1800::updateScene1809() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		sendMessage(_parentModule, 0x1009, 1);
 		// TODO GameState stuff
 	}
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 2b6a647..1302355 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -83,11 +83,7 @@ void Module2000::createScene2003(int which) {
 }
 
 void Module2000::updateScene2001() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			sendMessage(_parentModule, 0x1009, 0);
 		} else {
@@ -97,11 +93,7 @@ void Module2000::updateScene2001() {
 }
 
 void Module2000::updateScene2002() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 0) {
 			if (getGlobalVar(0x98109F12)) {
 				createScene2002(0);
@@ -117,11 +109,7 @@ void Module2000::updateScene2002() {
 }
 
 void Module2000::updateScene2003() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene2002(0);
 	}
 }
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 62aec28..321fab1 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -498,11 +498,7 @@ void Module2200::createScene2248(int which) {
 }
 			
 void Module2200::updateScene2201() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2203(0);
 		} else if (_field20 == 2) {
@@ -514,21 +510,13 @@ void Module2200::updateScene2201() {
 }
 			
 void Module2200::updateScene2202() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene2201(2);
 	}
 }
 
 void Module2200::updateScene2203() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2205(0);
 		} else if (_field20 == 2) {
@@ -541,21 +529,13 @@ void Module2200::updateScene2203() {
 }
 			
 void Module2200::updateScene2204() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene2203(2);
 	}
 }
 			
 void Module2200::updateScene2205() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2206(0);
 		} else if (_field20 == 2) {
@@ -568,11 +548,7 @@ void Module2200::updateScene2205() {
 }
 			
 void Module2200::updateScene2206() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2247(0);
 		} else if (_field20 == 2) {
@@ -587,22 +563,14 @@ void Module2200::updateScene2206() {
 }
 			
 void Module2200::updateScene2207() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene2206(2);
 		_childObject->handleUpdate();
 	}
 }
 			
 void Module2200::updateScene2208() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		// This is madness!
 		switch (_vm->gameState().which) {
 		case 4:
@@ -725,22 +693,14 @@ void Module2200::updateScene2208() {
 }
 			
 void Module2200::updateScene2209() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene2206(3);
 		_childObject->handleUpdate();
 	}
 }
 			
 void Module2200::updateScene2210() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2211(0);
 		} else if (_field20 == 2) {
@@ -753,11 +713,7 @@ void Module2200::updateScene2210() {
 }
 			
 void Module2200::updateScene2211() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2212(0);
 		} else if (_field20 == 2) {
@@ -770,11 +726,7 @@ void Module2200::updateScene2211() {
 }
 			
 void Module2200::updateScene2212() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2213(0);
 		} else if (_field20 == 2) {
@@ -787,11 +739,7 @@ void Module2200::updateScene2212() {
 }
 			
 void Module2200::updateScene2213() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2214(0);
 		} else if (_field20 == 2) {
@@ -804,11 +752,7 @@ void Module2200::updateScene2213() {
 }
 			
 void Module2200::updateScene2214() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2215(0);
 		} else if (_field20 == 2) {
@@ -821,11 +765,7 @@ void Module2200::updateScene2214() {
 }
 			
 void Module2200::updateScene2215() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2216(0);
 		} else if (_field20 == 2) {
@@ -838,11 +778,7 @@ void Module2200::updateScene2215() {
 }
 			
 void Module2200::updateScene2216() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2217(0);
 		} else if (_field20 == 2) {
@@ -855,11 +791,7 @@ void Module2200::updateScene2216() {
 }
 			
 void Module2200::updateScene2217() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2218(0);
 		} else if (_field20 == 2) {
@@ -872,11 +804,7 @@ void Module2200::updateScene2217() {
 }
 			
 void Module2200::updateScene2218() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2219(0);
 		} else if (_field20 == 2) {
@@ -889,11 +817,7 @@ void Module2200::updateScene2218() {
 }
 			
 void Module2200::updateScene2219() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2220(0);
 		} else if (_field20 == 2) {
@@ -906,11 +830,7 @@ void Module2200::updateScene2219() {
 }
 			
 void Module2200::updateScene2220() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2221(0);
 		} else if (_field20 == 2) {
@@ -923,11 +843,7 @@ void Module2200::updateScene2220() {
 }
 			
 void Module2200::updateScene2221() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2222(0);
 		} else if (_field20 == 2) {
@@ -940,11 +856,7 @@ void Module2200::updateScene2221() {
 }
 			
 void Module2200::updateScene2222() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2223(0);
 		} else if (_field20 == 2) {
@@ -957,11 +869,7 @@ void Module2200::updateScene2222() {
 }
 			
 void Module2200::updateScene2223() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2224(0);
 		} else if (_field20 == 2) {
@@ -974,11 +882,7 @@ void Module2200::updateScene2223() {
 }
 			
 void Module2200::updateScene2224() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2225(0);
 		} else if (_field20 == 2) {
@@ -991,11 +895,7 @@ void Module2200::updateScene2224() {
 }
 			
 void Module2200::updateScene2225() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2226(0);
 		} else if (_field20 == 2) {
@@ -1008,11 +908,7 @@ void Module2200::updateScene2225() {
 }
 			
 void Module2200::updateScene2226() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2227(0);
 		} else if (_field20 == 2) {
@@ -1025,11 +921,7 @@ void Module2200::updateScene2226() {
 }
 			
 void Module2200::updateScene2227() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2228(0);
 		} else if (_field20 == 2) {
@@ -1042,11 +934,7 @@ void Module2200::updateScene2227() {
 }
 			
 void Module2200::updateScene2228() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2229(0);
 		} else if (_field20 == 2) {
@@ -1059,11 +947,7 @@ void Module2200::updateScene2228() {
 }
 			
 void Module2200::updateScene2229() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2230(0);
 		} else if (_field20 == 2) {
@@ -1076,11 +960,7 @@ void Module2200::updateScene2229() {
 }
 			
 void Module2200::updateScene2230() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2231(0);
 		} else if (_field20 == 2) {
@@ -1093,11 +973,7 @@ void Module2200::updateScene2230() {
 }
 			
 void Module2200::updateScene2231() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2232(0);
 		} else if (_field20 == 2) {
@@ -1110,11 +986,7 @@ void Module2200::updateScene2231() {
 }
 			
 void Module2200::updateScene2232() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2233(0);
 		} else if (_field20 == 2) {
@@ -1127,11 +999,7 @@ void Module2200::updateScene2232() {
 }
 			
 void Module2200::updateScene2233() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2234(0);
 		} else if (_field20 == 2) {
@@ -1144,11 +1012,7 @@ void Module2200::updateScene2233() {
 }
 			
 void Module2200::updateScene2234() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2235(0);
 		} else if (_field20 == 2) {
@@ -1161,11 +1025,7 @@ void Module2200::updateScene2234() {
 }
 			
 void Module2200::updateScene2235() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2243(0);
 		} else if (_field20 == 2) {
@@ -1178,11 +1038,7 @@ void Module2200::updateScene2235() {
 }
 			
 void Module2200::updateScene2236() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2237(0);
 		} else if (_field20 == 2) {
@@ -1195,11 +1051,7 @@ void Module2200::updateScene2236() {
 }
 			
 void Module2200::updateScene2237() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2238(0);
 		} else if (_field20 == 2) {
@@ -1212,11 +1064,7 @@ void Module2200::updateScene2237() {
 }
 			
 void Module2200::updateScene2238() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2239(0);
 		} else if (_field20 == 2) {
@@ -1229,11 +1077,7 @@ void Module2200::updateScene2238() {
 }
 			
 void Module2200::updateScene2239() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2240(0);
 		} else if (_field20 == 2) {
@@ -1246,11 +1090,7 @@ void Module2200::updateScene2239() {
 }
 			
 void Module2200::updateScene2240() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2241(0);
 		} else if (_field20 == 2) {
@@ -1263,11 +1103,7 @@ void Module2200::updateScene2240() {
 }
 			
 void Module2200::updateScene2241() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2242(0);
 		} else if (_field20 == 2) {
@@ -1280,11 +1116,7 @@ void Module2200::updateScene2241() {
 }
 			
 void Module2200::updateScene2242() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2248(0);
 			_childObject->handleUpdate();
@@ -1299,11 +1131,7 @@ void Module2200::updateScene2242() {
 }
 			
 void Module2200::updateScene2243() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2244(0);
 		} else if (_field20 == 2) {
@@ -1316,11 +1144,7 @@ void Module2200::updateScene2243() {
 }
 			
 void Module2200::updateScene2244() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2245(0);
 		} else if (_field20 == 2) {
@@ -1333,11 +1157,7 @@ void Module2200::updateScene2244() {
 }
 			
 void Module2200::updateScene2245() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2246(0);
 		} else if (_field20 == 2) {
@@ -1350,11 +1170,7 @@ void Module2200::updateScene2245() {
 }
 			
 void Module2200::updateScene2246() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2236(0);
 		} else if (_field20 == 2) {
@@ -1367,11 +1183,7 @@ void Module2200::updateScene2246() {
 }
 			
 void Module2200::updateScene2247() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2210(0);
 		} else if (_field20 == 2) {
@@ -1384,11 +1196,7 @@ void Module2200::updateScene2247() {
 }
 			
 void Module2200::updateScene2248() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene2242(1);
 		_childObject->handleUpdate();
 	}
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 19861ac..60f8134 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -125,11 +125,7 @@ void Module2300::createScene2305(int which) {
 }
 
 void Module2300::updateScene2301() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2302(4);
 			_childObject->handleUpdate();
@@ -140,28 +136,7 @@ void Module2300::updateScene2301() {
 }
 
 void Module2300::updateScene2302() {
-	_childObject->handleUpdate();
-#if 0 // TODO
-	NavigationScene *navigationScene = (NavigationScene*)_childObject; 
-	if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
-		navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
-		_volume++;
-		Sound1ChList_setVolume(0x90F0D1C3, _volume);
-	}
-#endif
-#if 0 // TODO
-	if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
-		navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
-		Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64);
-		Sound1ChList_setVolume(0x48498E46, 70);
-		Sound1ChList_setVolume(0x50399F64, 70);
-	}
-#endif
-	if (_done) {
-		debug("SCENE 2302 DONE; _field20 = %d", _field20);
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			createScene2301(0);
 			_childObject->handleUpdate();
@@ -179,15 +154,28 @@ void Module2300::updateScene2302() {
 		} else {
 			sendMessage(_parentModule, 0x1009, 4);
 		}
+	} else {
+#if 0 // TODO
+		NavigationScene *navigationScene = (NavigationScene*)_childObject; 
+		if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
+			navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
+			_volume++;
+			Sound1ChList_setVolume(0x90F0D1C3, _volume);
+		}
+#endif
+#if 0 // TODO
+		if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
+			navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
+			Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64);
+			Sound1ChList_setVolume(0x48498E46, 70);
+			Sound1ChList_setVolume(0x50399F64, 70);
+		}
+#endif
 	}
 }
 			
 void Module2300::updateScene2303() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			sendMessage(_parentModule, 0x1009, 3);
 		} else {
@@ -195,44 +183,30 @@ void Module2300::updateScene2303() {
 			_childObject->handleUpdate();
 		}
 	}
-	if (_field24 >= 0) {
-		if (_field24 == 1) {
-			// TODO _resourceTable1.setResourceList(ex_sub_479D00(0), true);
-			// TODO _resourceTable2.loadResources();
-		}
-		_field24 = -1;
-	}
 }
 			
 void Module2300::updateScene2304() {
-	_childObject->handleUpdate();
-#if 0 // TODO
-	NavigationScene *navigationScene = (NavigationScene*)_childObject; 
-	if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
-		navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
-		_volume--;
-		Sound1ChList_setVolume(0x90F0D1C3, _volume);
-	}
-#endif
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		if (_field20 == 1) {
 			sendMessage(_parentModule, 0x1009, 2);
 		} else {
 			createScene2302(1);
 			_childObject->handleUpdate();
 		}
+	} else {
+#if 0 // TODO
+		NavigationScene *navigationScene = (NavigationScene*)_childObject; 
+		if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
+			navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
+			_volume--;
+			Sound1ChList_setVolume(0x90F0D1C3, _volume);
+		}
+#endif
 	}
 }
 			
 void Module2300::updateScene2305() {
-	_childObject->handleUpdate();
-	if (_done) {
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		// TODO Sound1ChList_sub_4080B0(false);
 		createScene2302(2);
 		_childObject->handleUpdate();
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index cc617a3..bccc723 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -27,7 +27,7 @@
 namespace Neverhood {
 
 Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _moduleDone(false), _soundVolume(0) {
+	: Module(vm, parentModule), _soundVolume(0) {
 	
 	debug("Create Module3000(%d)", which);
 
@@ -95,25 +95,12 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene3006(1);
 	}
 
-	SetMessageHandler(&Module3000::handleMessage);
-
 }
 
 Module3000::~Module3000() {
 	// TODO Sound1ChList_sub_407A50(0x81293110);
 }
 
-uint32 Module3000::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1009:
-		_moduleDone = true;
-		_moduleDoneStatus = param.asInteger();
-		break;
-	}
-	return messageResult;
-}
-
 void Module3000::createScene3002(int which) {
 	_vm->gameState().sceneNum = 1;
 	if (!getGlobalVar(0x01BA1A52)) {
@@ -276,20 +263,20 @@ void Module3000::updateScene3002() {
 		}
 	}
 #endif
-	if (_moduleDone) {
+	if (_done) {
 		int areaType = navigationScene()->getNavigationAreaType();
-		_moduleDone = false;
+		_done = false;
 		delete _childObject;
 		_childObject = NULL;
 		if (!getGlobalVar(0x01BA1A52)) {
-			if (_moduleDoneStatus == 0) {
+			if (_field20 == 0) {
 				createScene3010(-1);
 				_childObject->handleUpdate();
-			} else if (_moduleDoneStatus == 1) {
+			} else if (_field20 == 1) {
 				sendMessage(_parentModule, 0x1009, 0);
 			}
 		} else {
-			if (_moduleDoneStatus == 0) {
+			if (_field20 == 0) {
 				if (areaType == 2) {
 					createScene3003(0);
 					_childObject->handleUpdate();
@@ -297,7 +284,7 @@ void Module3000::updateScene3002() {
 					//createScene3002b(-1);
 					_childObject->handleUpdate();
 				}
-			} else if (_moduleDoneStatus == 1) {
+			} else if (_field20 == 1) {
 				sendMessage(_parentModule, 0x1009, 0);
 			}
 		}
@@ -305,11 +292,7 @@ void Module3000::updateScene3002() {
 }
 
 void Module3000::updateScene3002b() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 1:
 			if (getGlobalVar(0x01BA1A52)) {
@@ -339,79 +322,51 @@ void Module3000::updateScene3002b() {
 }
 
 void Module3000::updateScene3003() {
-	_childObject->handleUpdate();
-#if 0 // ALL TODO
-	if (navigationScene()->getSoundFlag1()) {
-		uint32 frameNumber = navigationScene()->getFrameNumber();
-		int navigationIndex = navigationScene()->getIndex();
-		if (_flag && _soundVolume > 1 && frameNumber % 2) {
-			_soundVolume--;
-			// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
-		}
-		if (navigationIndex == 0) {
-			if (frameNumber == 35) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
-			}
-		} else if (navigationIndex == 1) {
-			if (frameNumber == 55) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-				// TODO Sound1ChList_setVolume(0x48498E46, 70);
-				// TODO Sound1ChList_setVolume(0x50399F64, 70);
-			}
-		}
-	}
-#endif
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
 		if (_flag) {
 			_soundVolume = 0;
 			// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
 		}
-		if (_moduleDoneStatus == 0) {
+		if (_field20 == 0) {
 			createScene3004(0);
 			_childObject->handleUpdate();
-		} else if (_moduleDoneStatus == 1) {
+		} else if (_field20 == 1) {
 			setGlobalVar(0x01BA1A52, 0);
 			createScene3002(1);
 			_childObject->handleUpdate();
 		}
-	}
-}
-
-void Module3000::updateScene3004() {
-	_childObject->handleUpdate();
+	} else {
 #if 0 // ALL TODO
-	if (navigationScene()->getSoundFlag1()) {
-		uint32 frameNumber = navigationScene()->getFrameNumber();
-		int navigationIndex = navigationScene()->getIndex();
-		if (navigationIndex == 2) {
-			if (frameNumber == 40) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
-			}
-			if (_flag && _soundVolume < 90 && frameNumber % 2) {
-				if (frameNumber == 0)
-					_soundVolume = 40;
-				else
-					_soundVolume++;
+		if (navigationScene()->getSoundFlag1()) {
+			uint32 frameNumber = navigationScene()->getFrameNumber();
+			int navigationIndex = navigationScene()->getIndex();
+			if (_flag && _soundVolume > 1 && frameNumber % 2) {
+				_soundVolume--;
 				// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
 			}
+			if (navigationIndex == 0) {
+				if (frameNumber == 35) {
+					// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+				}
+			} else if (navigationIndex == 1) {
+				if (frameNumber == 55) {
+					// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+					// TODO Sound1ChList_setVolume(0x48498E46, 70);
+					// TODO Sound1ChList_setVolume(0x50399F64, 70);
+				}
+			}
 		}
-	}
 #endif
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
-		
-		debug("_moduleDoneStatus = %d", _moduleDoneStatus);
-		
-		if (_moduleDoneStatus == 1) {
+	}
+}
+
+void Module3000::updateScene3004() {
+	if (!updateChild()) {
+		if (_field20 == 1) {
 			createScene3005(0);
 			_childObject->handleUpdate();
-		} else if (_moduleDoneStatus == 3) {
+		} else if (_field20 == 3) {
 			createScene3011(-1);
 			_childObject->handleUpdate();
 		} else if (getGlobalVar(0x09221A62)) {
@@ -421,54 +376,64 @@ void Module3000::updateScene3004() {
 			createScene3003(1);
 			_childObject->handleUpdate();
 		}
+	} else {
+#if 0 // ALL TODO
+		if (navigationScene()->getSoundFlag1()) {
+			uint32 frameNumber = navigationScene()->getFrameNumber();
+			int navigationIndex = navigationScene()->getIndex();
+			if (navigationIndex == 2) {
+				if (frameNumber == 40) {
+					// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+				}
+				if (_flag && _soundVolume < 90 && frameNumber % 2) {
+					if (frameNumber == 0)
+						_soundVolume = 40;
+					else
+						_soundVolume++;
+					// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+				}
+			}
+		}
+#endif
 	}
 }
 
 void Module3000::updateScene3005() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (_moduleDoneStatus == 0) {
+	if (!updateChild()) {
+		if (_field20 == 0) {
 			sendMessage(_parentModule, 0x1009, 1);
-		} else if (_moduleDoneStatus == 1) {
+		} else if (_field20 == 1) {
 			createScene3008(-1);
 			_childObject->handleUpdate();
-		} else if (_moduleDoneStatus == 2) {
+		} else if (_field20 == 2) {
 			createScene3004(3);
 			_childObject->handleUpdate();
 		}
 	}
-	// NOTE: Skipped resource preloading stuff
 }
 
 void Module3000::updateScene3006() {
-	_childObject->handleUpdate();
-#if 0 // ALL TODO
-	if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
-		// TODO Sound1ChList_sub_4080B0(false);
-	}
-#endif
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (_moduleDoneStatus == 0) {
+	if (!updateChild()) {
+		if (_field20 == 0) {
 			createScene3007(0);
-			_childObject->handleUpdate();
-		} else if (_moduleDoneStatus == 1) {
+		} else if (_field20 == 1) {
 			createScene3004(0);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
+	} else {
+#if 0 // ALL TODO
+		if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
+			// TODO Sound1ChList_sub_4080B0(false);
+		}
+#endif
 	}
 }
 
 void Module3000::updateScene3007() {
 	_childObject->handleUpdate();
-	if (_moduleDone) {
+	if (_done) {
 		int areaType = navigationScene()->getNavigationAreaType();
-		_moduleDone = false;
+		_done = false;
 		delete _childObject;
 		_childObject = NULL;
 		if (areaType == 4) {
@@ -482,14 +447,9 @@ void Module3000::updateScene3007() {
 }
 
 void Module3000::updateScene3009() {
-	_childObject->handleUpdate();
-	// TODO...
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		_flag = getGlobalVar(0x10938830); // CHECKME
-		if (_moduleDoneStatus != 1) {
+		if (_field20 != 1) {
 			// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
 			createScene3005(1);
 			_childObject->handleUpdate();
@@ -505,15 +465,11 @@ void Module3000::updateScene3009() {
 }
 
 void Module3000::updateScene3010() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (_moduleDoneStatus == 0 || _moduleDoneStatus == 2) {
+	if (!updateChild()) {
+		if (_field20 == 0 || _field20 == 2) {
 			createScene3002(0);
 			_childObject->handleUpdate();
-		} else if (_moduleDoneStatus == 1) {
+		} else if (_field20 == 1) {
 			createScene3002b(-1);
 			_childObject->handleUpdate();
 		}
@@ -521,11 +477,7 @@ void Module3000::updateScene3010() {
 }
 
 void Module3000::updateScene3011() {
-	_childObject->handleUpdate();
-	if (_moduleDone) {
-		_moduleDone = false;
-		delete _childObject;
-		_childObject = NULL;
+	if (!updateChild()) {
 		createScene3004(3);
 		_childObject->handleUpdate();
 	}
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 64a4b76..63e5261 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -35,8 +35,6 @@ public:
 	Module3000(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module3000();
 protected:
-	bool _moduleDone;
-	int _moduleDoneStatus;
 	int _soundVolume;
 	bool _flag;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 828c0dd..9dc1d8b 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -117,12 +117,8 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
 	: Sprite(vm, 0), _spriteResource(vm) {
-	
-	debug("StaticSprite::StaticSprite(%08X)", fileHash);
-
 	_name = "StaticSprite"; 
 	init(fileHash, surfacePriority, x, y, width, height);
-
 }
 
 void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 16d7931..ff18304 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -31,8 +31,8 @@
 namespace Neverhood {
 
 #define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback); debug(2, "SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback
-#define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug("SetFilterX(" #callback ")")
-#define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug("SetFilterY(" #callback ")")
+#define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug(2, "SetFilterX(" #callback ")")
+#define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug(2, "SetFilterY(" #callback ")")
 
 const int16 kDefPosition = -32768;
 
@@ -99,9 +99,9 @@ protected:
 	void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 };
 
-#define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback
-#define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback
-#define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug("SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback
+#define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback
+#define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback
+#define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback
 #define AnimationCallback(callback) static_cast <void (AnimatedSprite::*)()> (callback)
 
 class AnimatedSprite : public Sprite {


Commit: fad64afa441b686b721fcba6084b083fa4436529
    https://github.com/scummvm/scummvm/commit/fad64afa441b686b721fcba6084b083fa4436529
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Remove unused resource preloading stuff (probably resource preloading is not needed since the original game ran off slow double/quad-speed cd drives and preloading reduced stuttering while playing back then)

- Add Klayman animation speedup

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6ef58e4..efd191e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -238,20 +238,17 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 		_someFlag1 = true;
 		return messageResult;		
 	case 0x1009:
-		_field24 = -1;
-		_field26 = -1;
-		_field28 = -1;
-		_field20 = param.asInteger();
+		_moduleResult = param.asInteger();
 		_done = true;
 		return messageResult;
 	case 0x100A:
-		_field24 = (int16)param.asInteger();
+		// Unused resource preloading message
 		return messageResult;
 	case 0x101F:
 		_field2C = true;		
 		return messageResult;
 	case 0x1023:
-		_field26 = (int16)param.asInteger();
+		// Unused resource preloading message
 		return messageResult;
 	}
 	return messageResult;
@@ -310,7 +307,7 @@ void GameModule::createModule1200(int which) {
 
 void GameModule::updateModule1200() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			error("// TODO createModule2600(0);");
 			// TODO createModule2600(0);
 			// TODO _childObject->handleUpdate();
@@ -329,7 +326,7 @@ void GameModule::createModule1300(int which) {
 
 void GameModule::updateModule1300() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			// TODO _gameState.clear();
 			// TODO GameModule_handleKeyEscape
 		} else {
@@ -347,7 +344,7 @@ void GameModule::createModule1400(int which) {
 
 void GameModule::updateModule1400() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			error("WEIRD!");
 		} else {
 			// TODO createModule1600(1);
@@ -378,8 +375,8 @@ void GameModule::createModule1700(int which) {
 
 void GameModule::updateModule1700() {
 	if (!updateChild()) {
-		debug("Module1700 done; _field20 = %d", _field20);
-		if (_field20 == 1) {
+		debug("Module1700 done; _moduleResult = %d", _moduleResult);
+		if (_moduleResult == 1) {
 			// TODO createModule2900(3);
 			// TODO _childObject->handleUpdate();
 		} else {
@@ -397,13 +394,13 @@ void GameModule::createModule1800(int which) {
 
 void GameModule::updateModule1800() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			// TODO GameState_clear();
 			// TODO GameModule_handleKeyEscape();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			// TODO createModule2700(0);
 			// TODO _childObject->handleUpdate();
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			// TODO createModule3000(3);
 			// TODO _childObject->handleUpdate();
 		} else {
@@ -447,13 +444,13 @@ void GameModule::createModule2300(int which) {
 
 void GameModule::updateModule2300() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createModule2200(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createModule1200(0);
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			// TODO createModule2400(0);
-		} else if (_field20 == 4) {
+		} else if (_moduleResult == 4) {
 			// TODO createModule3000(0);
 		} else {
 			createModule1000(1);
@@ -474,15 +471,15 @@ void GameModule::createModule3000(int which) {
 
 void GameModule::updateModule3000() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			// TODO createModule1900(0);
 			// TODO _childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			// WEIRD: Sets the errorFlag
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createModule1800(3);
 			_childObject->handleUpdate();
-		} else if (_field20 == 4) {
+		} else if (_moduleResult == 4) {
 			// TODO createModule3000(0);
 			// TODO _childObject->handleUpdate();
 		} else {
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 7102870..b5d266e 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -1340,15 +1340,13 @@ void Klayman::sub41FC40() {
 }
 
 uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam &param, Entity *sender) {
+	int16 speedUpFrameIndex;
 	switch (messageNum) {
 	case 0x1008:
-		debug("case 0x1008");
-#if 0 // TODO
-		if (_frameIndex < getHashListIndexByString("SpeedUp")) {
-			setFileHash(0xAC20C012, getHashListIndexByString("SpeedUp"), -1)
-			_y = 435;
+		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
+		if (_frameIndex < speedUpFrameIndex) {
+			setFileHash(0xAC20C012, speedUpFrameIndex, -1);
 		}
-#endif		
 		return 0;
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -2371,16 +2369,15 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &para
 }
 
 uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender) {
+	int16 speedUpFrameIndex;
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
-		debug("case 0x1008");
-#if 0 // TODO
-		if (_frameIndex < getHashListIndexByString("SpeedUp")) {
-			setFileHash(0x35AA8059, getHashListIndexByString("SpeedUp"), -1)
+		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
+		if (_frameIndex < speedUpFrameIndex) {
+			setFileHash(0x35AA8059, speedUpFrameIndex, -1);
 			_y = 435;
 		}
-#endif		
 		messageResult = 0;
 		break;
 	case 0x100D:
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a25176e..3f15b8f 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -34,6 +34,8 @@ namespace Neverhood {
 
 class Klayman;
 
+const uint32 kKlaymanSpeedUpHash = 0x004A2148;
+
 struct KlaymanTableItem {
 	int value;
 	void (Klayman::*callback)();
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 6d49838..78775ce 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -28,7 +28,7 @@ namespace Neverhood {
 
 Module::Module(NeverhoodEngine *vm, Module *parentModule)
 	: Entity(vm, 0), _parentModule(parentModule), _childObject(NULL),
-	_done(false), _field24(-1), _field26(-1), _field28(-1) {
+	_done(false) {
 	
 	SetMessageHandler(&Module::handleMessage);
 	
@@ -50,20 +50,13 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 			sendMessage(_parentModule, 8, 0);
 		return 0;
 	case 0x1009:
-		_field24 = -1;
-		_field26 = -1;
-		_field28 = -1;
-		_field20 = param.asInteger();
+		_moduleResult = param.asInteger();
 		_done = true;
 		return 0;
 	case 0x100A:
-		_field24 = (int16)param.asInteger();
-		return 0;
 	case 0x1023:
-		_field26 = (int16)param.asInteger();
-		return 0;
 	case 0x1024:
-		_field28 = (int16)param.asInteger();
+		// Unused resource preloading messages
 		return 0;
 	default:
 		if (_childObject && sender == _parentModule)
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index a37fd52..2f272d7 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -47,8 +47,7 @@ protected:
 	Module *_parentModule;
 	Entity *_childObject;
 	bool _done;
-	int16 _field24, _field26, _field28;
-	uint32 _field20;
+	uint32 _moduleResult;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	NavigationScene *navigationScene();
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 51e1d19..8185430 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -102,7 +102,7 @@ void Module1000::createScene1005(int which) {
 
 void Module1000::updateScene1001() {
 	if (!updateChild()) {
-		if (_field20 == 2) {
+		if (_moduleResult == 2) {
 			createScene1003(0);
 			_childObject->handleUpdate();
 		} else {
@@ -114,9 +114,9 @@ void Module1000::updateScene1001() {
 
 void Module1000::updateScene1002() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			sendMessage(_parentModule, 0x1009, 0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1004(0);
 			_childObject->handleUpdate();
 		} else {
@@ -135,7 +135,7 @@ void Module1000::updateScene1003() {
 			
 void Module1000::updateScene1004() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1005(0);
 			_childObject->handleUpdate();
 		} else {
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index fa0bea0..9e198cc 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -80,10 +80,10 @@ void Module1200::createScene1203(int which) {
 
 void Module1200::updateScene1201() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1202(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
 				createScene1203(-1);
 			} else {
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 149af4a..189ee2c 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -284,7 +284,7 @@ void Module1300::createScene1318(int which) {
 			
 void Module1300::updateScene1302() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1305(0);
 		} else {
 			createScene1308(1);
@@ -316,15 +316,15 @@ void Module1300::updateScene1305() {
 
 void Module1300::updateScene1306() {
 	if (!updateChild()) {
-		if (_field20 == 2) {
+		if (_moduleResult == 2) {
 			createScene1309(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createScene1303(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 0) {
+		} else if (_moduleResult == 0) {
 			sendMessage(_parentModule, 0x1009, 0);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1311(-1);
 			_childObject->handleUpdate();
 		}
@@ -340,11 +340,11 @@ void Module1300::updateScene1307() {
 
 void Module1300::updateScene1308() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1314(0);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1302(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1307(0);
 		}
 		_childObject->handleUpdate();
@@ -373,9 +373,9 @@ void Module1300::updateScene1311() {
 
 void Module1300::updateScene1312() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1313(0);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1312(1);
 		}
 		_childObject->handleUpdate();
@@ -384,7 +384,7 @@ void Module1300::updateScene1312() {
 
 void Module1300::updateScene1313() {
 	if (!updateChild()) {
-		switch (_field20) {
+		switch (_moduleResult) {
 		case 0:
 			createScene1315(1);
 			break;
@@ -404,9 +404,9 @@ void Module1300::updateScene1313() {
 
 void Module1300::updateScene1314() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1313(2);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1308(0);
 		}
 		_childObject->handleUpdate();
@@ -415,9 +415,9 @@ void Module1300::updateScene1314() {
 
 void Module1300::updateScene1315() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1313(3);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1310(-1);
 		}
 		_childObject->handleUpdate();
@@ -426,9 +426,9 @@ void Module1300::updateScene1315() {
 
 void Module1300::updateScene1316() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1313(4);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1304(0);
 		}
 		_childObject->handleUpdate();
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index edc47f5..7f55272 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -122,10 +122,10 @@ void Module1400::createScene1407(int which) {
 
 void Module1400::updateScene1401() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1402(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1404(0);
 			_childObject->handleUpdate();
 		} else {
@@ -136,10 +136,10 @@ void Module1400::updateScene1401() {
 
 void Module1400::updateScene1402() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1403(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1407(-1);
 			_childObject->handleUpdate();
 		} else {
@@ -158,10 +158,10 @@ void Module1400::updateScene1403() {
 
 void Module1400::updateScene1404() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1405(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1406(-1);
 			_childObject->handleUpdate();
 		} else {
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 528161e..0aea8d1 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -114,10 +114,10 @@ void Module1700::updateScene1701() {
 
 void Module1700::updateScene1702() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1703(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1702(1);
 			_childObject->handleUpdate();
 		}
@@ -126,13 +126,13 @@ void Module1700::updateScene1702() {
 
 void Module1700::updateScene1703() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1704(-1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1702(1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			if (!_soundResource.isPlaying()) {
 				// TODO _soundResource.setVolume(60);
 				_soundResource.play(0x58B45E58);
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index d3dc4b6..31a1564 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -147,13 +147,13 @@ void Module1800::createScene1809(int which) {
 
 void Module1800::updateScene1801() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene1805(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1802(-1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createScene1804(0);
 			_childObject->handleUpdate();
 		}
@@ -185,15 +185,15 @@ void Module1800::updateScene1802() {
 
 void Module1800::updateScene1803() {
 	if (!updateChild()) {
-		if (_field20 == 2) {
+		if (_moduleResult == 2) {
 			createScene1801(2);
 			_childObject->handleUpdate();
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			sendMessage(_parentModule, 0x1009, 0);
-		} else if (_field20 == 6) {
+		} else if (_moduleResult == 6) {
 			createScene1809(-1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 7) {
+		} else if (_moduleResult == 7) {
 			sendMessage(_parentModule, 0x1009, 3);
 		}
 	}
@@ -201,9 +201,9 @@ void Module1800::updateScene1803() {
 
 void Module1800::updateScene1804() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1804b(-1);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1801(1);
 		}
 		_childObject->handleUpdate();
@@ -212,13 +212,13 @@ void Module1800::updateScene1804() {
 
 void Module1800::updateScene1805() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene1807(-1);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1806(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene1801(3);
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createScene1805(3);
 		}
 		_childObject->handleUpdate();
@@ -227,9 +227,9 @@ void Module1800::updateScene1805() {
 
 void Module1800::updateScene1806() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			sendMessage(_parentModule, 0x1009, 2);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene1805(3);
 			_childObject->handleUpdate();
 		}
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 1302355..bedc9d4 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -84,7 +84,7 @@ void Module2000::createScene2003(int which) {
 
 void Module2000::updateScene2001() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			sendMessage(_parentModule, 0x1009, 0);
 		} else {
 			createScene2002(0);
@@ -94,15 +94,15 @@ void Module2000::updateScene2001() {
 
 void Module2000::updateScene2002() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			if (getGlobalVar(0x98109F12)) {
 				createScene2002(0);
 			} else {
 				createScene2003(-1);
 			}
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene2002(1);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2001(0);
 		}
 	}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 321fab1..2db0eb4 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -499,9 +499,9 @@ void Module2200::createScene2248(int which) {
 			
 void Module2200::updateScene2201() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2203(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2202(0);
 		} else {
 			sendMessage(_parentModule, 0x1009, 0);
@@ -517,9 +517,9 @@ void Module2200::updateScene2202() {
 
 void Module2200::updateScene2203() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2205(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2204(0);
 		} else {
 			createScene2201(1);
@@ -536,9 +536,9 @@ void Module2200::updateScene2204() {
 			
 void Module2200::updateScene2205() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2206(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2205(2);
 		} else {
 			createScene2203(1);
@@ -549,11 +549,11 @@ void Module2200::updateScene2205() {
 			
 void Module2200::updateScene2206() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2247(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2207(0);
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createScene2209(0);
 		} else {
 			createScene2205(1);
@@ -701,9 +701,9 @@ void Module2200::updateScene2209() {
 			
 void Module2200::updateScene2210() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2211(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2247(1);
@@ -714,9 +714,9 @@ void Module2200::updateScene2210() {
 			
 void Module2200::updateScene2211() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2212(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2210(1);
@@ -727,9 +727,9 @@ void Module2200::updateScene2211() {
 			
 void Module2200::updateScene2212() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2213(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2211(1);
@@ -740,9 +740,9 @@ void Module2200::updateScene2212() {
 			
 void Module2200::updateScene2213() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2214(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2212(1);
@@ -753,9 +753,9 @@ void Module2200::updateScene2213() {
 			
 void Module2200::updateScene2214() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2215(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2213(1);
@@ -766,9 +766,9 @@ void Module2200::updateScene2214() {
 			
 void Module2200::updateScene2215() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2216(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2214(1);
@@ -779,9 +779,9 @@ void Module2200::updateScene2215() {
 			
 void Module2200::updateScene2216() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2217(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2215(1);
@@ -792,9 +792,9 @@ void Module2200::updateScene2216() {
 			
 void Module2200::updateScene2217() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2218(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2216(1);
@@ -805,9 +805,9 @@ void Module2200::updateScene2217() {
 			
 void Module2200::updateScene2218() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2219(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2217(1);
@@ -818,9 +818,9 @@ void Module2200::updateScene2218() {
 			
 void Module2200::updateScene2219() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2220(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2218(1);
@@ -831,9 +831,9 @@ void Module2200::updateScene2219() {
 			
 void Module2200::updateScene2220() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2221(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2219(1);
@@ -844,9 +844,9 @@ void Module2200::updateScene2220() {
 			
 void Module2200::updateScene2221() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2222(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2220(1);
@@ -857,9 +857,9 @@ void Module2200::updateScene2221() {
 			
 void Module2200::updateScene2222() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2223(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2221(1);
@@ -870,9 +870,9 @@ void Module2200::updateScene2222() {
 			
 void Module2200::updateScene2223() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2224(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2222(1);
@@ -883,9 +883,9 @@ void Module2200::updateScene2223() {
 			
 void Module2200::updateScene2224() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2225(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2223(1);
@@ -896,9 +896,9 @@ void Module2200::updateScene2224() {
 			
 void Module2200::updateScene2225() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2226(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2224(1);
@@ -909,9 +909,9 @@ void Module2200::updateScene2225() {
 			
 void Module2200::updateScene2226() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2227(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2225(1);
@@ -922,9 +922,9 @@ void Module2200::updateScene2226() {
 			
 void Module2200::updateScene2227() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2228(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2226(1);
@@ -935,9 +935,9 @@ void Module2200::updateScene2227() {
 			
 void Module2200::updateScene2228() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2229(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2227(1);
@@ -948,9 +948,9 @@ void Module2200::updateScene2228() {
 			
 void Module2200::updateScene2229() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2230(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2228(1);
@@ -961,9 +961,9 @@ void Module2200::updateScene2229() {
 			
 void Module2200::updateScene2230() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2231(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2229(1);
@@ -974,9 +974,9 @@ void Module2200::updateScene2230() {
 			
 void Module2200::updateScene2231() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2232(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2230(1);
@@ -987,9 +987,9 @@ void Module2200::updateScene2231() {
 			
 void Module2200::updateScene2232() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2233(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2231(1);
@@ -1000,9 +1000,9 @@ void Module2200::updateScene2232() {
 			
 void Module2200::updateScene2233() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2234(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2232(1);
@@ -1013,9 +1013,9 @@ void Module2200::updateScene2233() {
 			
 void Module2200::updateScene2234() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2235(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2233(1);
@@ -1026,9 +1026,9 @@ void Module2200::updateScene2234() {
 			
 void Module2200::updateScene2235() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2243(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2234(1);
@@ -1039,9 +1039,9 @@ void Module2200::updateScene2235() {
 			
 void Module2200::updateScene2236() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2237(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2246(1);
@@ -1052,9 +1052,9 @@ void Module2200::updateScene2236() {
 			
 void Module2200::updateScene2237() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2238(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2236(1);
@@ -1065,9 +1065,9 @@ void Module2200::updateScene2237() {
 			
 void Module2200::updateScene2238() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2239(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2237(1);
@@ -1078,9 +1078,9 @@ void Module2200::updateScene2238() {
 			
 void Module2200::updateScene2239() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2240(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2238(1);
@@ -1091,9 +1091,9 @@ void Module2200::updateScene2239() {
 			
 void Module2200::updateScene2240() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2241(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2239(1);
@@ -1104,9 +1104,9 @@ void Module2200::updateScene2240() {
 			
 void Module2200::updateScene2241() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2242(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2240(1);
@@ -1117,10 +1117,10 @@ void Module2200::updateScene2241() {
 			
 void Module2200::updateScene2242() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2248(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 			_childObject->handleUpdate();
 		} else {
@@ -1132,9 +1132,9 @@ void Module2200::updateScene2242() {
 			
 void Module2200::updateScene2243() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2244(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2235(1);
@@ -1145,9 +1145,9 @@ void Module2200::updateScene2243() {
 			
 void Module2200::updateScene2244() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2245(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2243(1);
@@ -1158,9 +1158,9 @@ void Module2200::updateScene2244() {
 			
 void Module2200::updateScene2245() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2246(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2244(1);
@@ -1171,9 +1171,9 @@ void Module2200::updateScene2245() {
 			
 void Module2200::updateScene2246() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2236(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2245(1);
@@ -1184,9 +1184,9 @@ void Module2200::updateScene2246() {
 			
 void Module2200::updateScene2247() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2210(0);
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2208(0);
 		} else {
 			createScene2206(1);
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 60f8134..ce9250a 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -126,7 +126,7 @@ void Module2300::createScene2305(int which) {
 
 void Module2300::updateScene2301() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2302(4);
 			_childObject->handleUpdate();
 		} else {
@@ -137,19 +137,19 @@ void Module2300::updateScene2301() {
 
 void Module2300::updateScene2302() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene2301(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene2303(1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createScene2302(3);
 			_childObject->handleUpdate();
-		} else if (_field20 == 4) {
+		} else if (_moduleResult == 4) {
 			createScene2304(1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 5) {
+		} else if (_moduleResult == 5) {
 			sendMessage(_parentModule, 0x1009, 3);
 		} else {
 			sendMessage(_parentModule, 0x1009, 4);
@@ -176,7 +176,7 @@ void Module2300::updateScene2302() {
 			
 void Module2300::updateScene2303() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			sendMessage(_parentModule, 0x1009, 3);
 		} else {
 			createScene2302(5);
@@ -187,7 +187,7 @@ void Module2300::updateScene2303() {
 			
 void Module2300::updateScene2304() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			sendMessage(_parentModule, 0x1009, 2);
 		} else {
 			createScene2302(1);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index bccc723..cfcacaf 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -269,14 +269,14 @@ void Module3000::updateScene3002() {
 		delete _childObject;
 		_childObject = NULL;
 		if (!getGlobalVar(0x01BA1A52)) {
-			if (_field20 == 0) {
+			if (_moduleResult == 0) {
 				createScene3010(-1);
 				_childObject->handleUpdate();
-			} else if (_field20 == 1) {
+			} else if (_moduleResult == 1) {
 				sendMessage(_parentModule, 0x1009, 0);
 			}
 		} else {
-			if (_field20 == 0) {
+			if (_moduleResult == 0) {
 				if (areaType == 2) {
 					createScene3003(0);
 					_childObject->handleUpdate();
@@ -284,7 +284,7 @@ void Module3000::updateScene3002() {
 					//createScene3002b(-1);
 					_childObject->handleUpdate();
 				}
-			} else if (_field20 == 1) {
+			} else if (_moduleResult == 1) {
 				sendMessage(_parentModule, 0x1009, 0);
 			}
 		}
@@ -328,10 +328,10 @@ void Module3000::updateScene3003() {
 			_soundVolume = 0;
 			// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
 		}
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene3004(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			setGlobalVar(0x01BA1A52, 0);
 			createScene3002(1);
 			_childObject->handleUpdate();
@@ -363,10 +363,10 @@ void Module3000::updateScene3003() {
 
 void Module3000::updateScene3004() {
 	if (!updateChild()) {
-		if (_field20 == 1) {
+		if (_moduleResult == 1) {
 			createScene3005(0);
 			_childObject->handleUpdate();
-		} else if (_field20 == 3) {
+		} else if (_moduleResult == 3) {
 			createScene3011(-1);
 			_childObject->handleUpdate();
 		} else if (getGlobalVar(0x09221A62)) {
@@ -400,12 +400,12 @@ void Module3000::updateScene3004() {
 
 void Module3000::updateScene3005() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			sendMessage(_parentModule, 0x1009, 1);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene3008(-1);
 			_childObject->handleUpdate();
-		} else if (_field20 == 2) {
+		} else if (_moduleResult == 2) {
 			createScene3004(3);
 			_childObject->handleUpdate();
 		}
@@ -414,9 +414,9 @@ void Module3000::updateScene3005() {
 
 void Module3000::updateScene3006() {
 	if (!updateChild()) {
-		if (_field20 == 0) {
+		if (_moduleResult == 0) {
 			createScene3007(0);
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene3004(0);
 		}
 		_childObject->handleUpdate();
@@ -449,7 +449,7 @@ void Module3000::updateScene3007() {
 void Module3000::updateScene3009() {
 	if (!updateChild()) {
 		_flag = getGlobalVar(0x10938830); // CHECKME
-		if (_field20 != 1) {
+		if (_moduleResult != 1) {
 			// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
 			createScene3005(1);
 			_childObject->handleUpdate();
@@ -466,13 +466,12 @@ void Module3000::updateScene3009() {
 
 void Module3000::updateScene3010() {
 	if (!updateChild()) {
-		if (_field20 == 0 || _field20 == 2) {
+		if (_moduleResult == 0 || _moduleResult == 2) {
 			createScene3002(0);
-			_childObject->handleUpdate();
-		} else if (_field20 == 1) {
+		} else if (_moduleResult == 1) {
 			createScene3002b(-1);
-			_childObject->handleUpdate();
 		}
+		_childObject->handleUpdate();
 	}
 }
 
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index ff18304..f17b2d4 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -114,6 +114,7 @@ public:
 	void clearRepl();
 	uint32 getCurrAnimFileHash() const { return _currAnimFileHash; }
 	int16 getFrameIndex() const { return _frameIndex; }
+	int16 getFrameIndex(uint32 frameHash) { return _animResource.getFrameIndex(frameHash); }
 	void setNewHashListIndex(int value) { _newHashListIndex = value; }
 	void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4);
 protected:


Commit: 02fe0bc65de94217afdc856c181be8dd761870cf
    https://github.com/scummvm/scummvm/commit/02fe0bc65de94217afdc856c181be8dd761870cf
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Merge scene-specific createSceneXXX/updateSceneXXX methods into createScene and updateScene (for Module2200 only so far)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index efd191e..abe61d2 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -264,7 +264,7 @@ void GameModule::startup() {
 	//createModule1700(-1);
 	//createModule1700(1);
 	//createModule1400(-1);
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 0;
 	createModule1200(-1);
 #endif
@@ -276,8 +276,8 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule2000(-1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 0;
+#if 1
+	_vm->gameState().sceneNum = 2;
 	createModule2200(-1);
 #endif
 #if 0
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 2db0eb4..c8eca78 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -36,1172 +36,592 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO: Music18hList_add(0x11391412, 0x601C908C); 
 
 	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else {
+		createScene(0, 0);
+	}
+
+}
+
+Module2200::~Module2200() {
+	// TODO Sound1ChList_sub_407A50(0x11391412);
+}
+
+void Module2200::createScene(int sceneNum, int which) {
+	// CHECKME if this can be used regardless of the new sceneNum
+	if (sceneNum == 7 && which >= 0)
+		_vm->gameState().which = _vm->gameState().sceneNum; 
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_childObject = new Scene2201(_vm, this, which);
+		break;
+	case 1:
+		// TODO Music18hList_play(0x601C908C, 0, 2, 1);
+		_childObject = new Scene2202(_vm, this, which);
+		break;
+	case 2:
+		// TODO Music18hList_play(0x601C908C, 0, 2, 1);
+		_childObject = new Scene2203(_vm, this, which);
+		break;
+	case 3:
+		// TODO Music18hList_stop(0x601C908C, 0, 2);
+		_childObject = new DiskplayerScene(_vm, this, 3);
+		break;
+	case 4:
+		// TODO Music18hList_stop(0x601C908C, 0, 2);
+		_childObject = new Scene2205(_vm, this, which);
+		break;
+	case 5:
+		// TODO Music18hList_stop(0x601C908C, 0, 2);
+		_childObject = new Scene2206(_vm, this, which);
+		break;
+	case 6:
+		_childObject = new Scene2207(_vm, this, which);
+		break;
+	case 7:
+		_childObject = new Scene2208(_vm, this, which);
+		break;
+	case 8:
+		_childObject = new Scene2208(_vm, this, which);
+		break;
+	case 9:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180);
+		break;
+	case 10:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198);
+		break;
+	case 11:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0);
+		break;
+	case 12:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8);
+		break;
+	case 13:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0);
+		break;
+	case 14:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8);
+		break;
+	case 15:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210);
+		break;
+	case 16:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228);
+		break;
+	case 17:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240);
+		break;
+	case 18:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258);
+		break;
+	case 19:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270);
+		break;
+	case 20:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288);
+		break;
+	case 21:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0);
+		break;
+	case 22:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8);
+		break;
+	case 23:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0);
+		break;
+	case 24:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8);
+		break;
+	case 25:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300);
+		break;
+	case 26:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318);
+		break;
+	case 27:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330);
+		break;
+	case 28:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348);
+		break;
+	case 29:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360);
+		break;
+	case 30:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378);
+		break;
+	case 31:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390);
+		break;
+	case 32:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8);
+		break;
+	case 33:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0);
+		break;
+	case 34:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8);
+		break;
+	case 35:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0);
+		break;
+	case 36:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408);
+		break;
+	case 37:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420);
+		break;
+	case 38:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438);
+		break;
+	case 39:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450);
+		break;
+	case 40:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468);
+		break;
+	case 41:
+		_childObject = new Scene2242(_vm, this, which);
+		break;
+	case 42:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480);
+		break;
+	case 43:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498);
+		break;
+	case 44:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0);
+		break;
+	case 45:
+		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8);
+		break;
+	case 46:
+		_childObject = new Scene2247(_vm, this, which);
+		break;
+	case 47:
+		if (!getGlobalVar(0x98109F12)) {
+			if (getGlobalVar(0x4D080E54))
+				_childObject = new Class152(_vm, this, 0x83110287, 0x10283839);
+			else
+				_childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C);
+		} else {
+			if (getGlobalVar(0x4D080E54))
+				_childObject = new Class152(_vm, this, 0x48632087, 0x3208348E);
+			else
+				_childObject = new Class152(_vm, this, 0x08C74886, 0x74882084);
+		}
+		break;
+	}
+	SetUpdateHandler(&Module2200::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2200::updateScene() {
+	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
-		default:
-			createScene2201(-1);
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(2, 0);
+			} else if (_moduleResult == 2) {
+				createScene(1, 0);
+			} else {
+				sendMessage(_parentModule, 0x1009, 0);
+			}
 			break;
 		case 1:
-			createScene2202(-1);
+			createScene(0, 2);
 			break;
 		case 2:
-			createScene2203(-1);
+			if (_moduleResult == 1) {
+				createScene(4, 0);
+			} else if (_moduleResult == 2) {
+				createScene(3, 0);
+			} else {
+				createScene(0, 1);
+			}
 			break;
 		case 3:
-			createScene2204(-1);
+			createScene(2, 2);
 			break;
 		case 4:
-			createScene2205(-1);
+			if (_moduleResult == 1) {
+				createScene(5, 0);
+			} else if (_moduleResult == 2) {
+				createScene(4, 2);
+			} else {
+				createScene(2, 1);
+			}
 			break;
 		case 5:
-			createScene2206(-1);
+			if (_moduleResult == 1) {
+				createScene(46, 0);
+			} else if (_moduleResult == 2) {
+				createScene(6, 0);
+			} else if (_moduleResult == 3) {
+				createScene(8, 0);
+			} else {
+				createScene(4, 1);
+			}
 			break;
 		case 6:
-			createScene2207(-1);
+			createScene(5, 2);
 			break;
 		case 7:
-			createScene2208(-1);
+			createScene(_vm->gameState().which, 2);
 			break;
 		case 8:
-			createScene2209(-1);
+			createScene(5, 3);
 			break;
 		case 9:
-			createScene2210(-1);
+			if (_moduleResult == 1) {
+				createScene(10, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(46, 1);
+			}
 			break;
 		case 10:
-			createScene2211(-1);
+			if (_moduleResult == 1) {
+				createScene(11, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(9, 1);
+			}
 			break;
 		case 11:
-			createScene2212(-1);
+			if (_moduleResult == 1) {
+				createScene(12, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(10, 1);
+			}
 			break;
 		case 12:
-			createScene2213(-1);
+			if (_moduleResult == 1) {
+				createScene(13, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(11, 1);
+			}
 			break;
 		case 13:
-			createScene2214(-1);
+			if (_moduleResult == 1) {
+				createScene(14, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(12, 1);
+			}
 			break;
 		case 14:
-			createScene2215(-1);
+			if (_moduleResult == 1) {
+				createScene(15, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(13, 1);
+			}
 			break;
 		case 15:
-			createScene2216(-1);
+			if (_moduleResult == 1) {
+				createScene(16, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(14, 1);
+			}
 			break;
 		case 16:
-			createScene2217(-1);
+			if (_moduleResult == 1) {
+				createScene(17, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(15, 1);
+			}
 			break;
 		case 17:
-			createScene2218(-1);
+			if (_moduleResult == 1) {
+				createScene(18, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(16, 1);
+			}
 			break;
 		case 18:
-			createScene2219(-1);
+			if (_moduleResult == 1) {
+				createScene(19, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(17, 1);
+			}
 			break;
 		case 19:
-			createScene2220(-1);
+			if (_moduleResult == 1) {
+				createScene(20, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(18, 1);
+			}
 			break;
 		case 20:
-			createScene2221(-1);
+			if (_moduleResult == 1) {
+				createScene(21, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(19, 1);
+			}
 			break;
 		case 21:
-			createScene2222(-1);
+			if (_moduleResult == 1) {
+				createScene(22, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(20, 1);
+			}
 			break;
 		case 22:
-			createScene2223(-1);
+			if (_moduleResult == 1) {
+				createScene(23, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(21, 1);
+			}
 			break;
 		case 23:
-			createScene2224(-1);
+			if (_moduleResult == 1) {
+				createScene(24, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(22, 1);
+			}
 			break;
 		case 24:
-			createScene2225(-1);
+			if (_moduleResult == 1) {
+				createScene(25, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(23, 1);
+			}
 			break;
 		case 25:
-			createScene2226(-1);
+			if (_moduleResult == 1) {
+				createScene(26, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(24, 1);
+			}
 			break;
 		case 26:
-			createScene2227(-1);
+			if (_moduleResult == 1) {
+				createScene(27, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(25, 1);
+			}
 			break;
 		case 27:
-			createScene2228(-1);
+			if (_moduleResult == 1) {
+				createScene(28, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(26, 1);
+			}
 			break;
 		case 28:
-			createScene2229(-1);
+			if (_moduleResult == 1) {
+				createScene(29, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(27, 1);
+			}
 			break;
 		case 29:
-			createScene2230(-1);
+			if (_moduleResult == 1) {
+				createScene(30, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(28, 1);
+			}
 			break;
 		case 30:
-			createScene2231(-1);
+			if (_moduleResult == 1) {
+				createScene(31, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(29, 1);
+			}
 			break;
 		case 31:
-			createScene2232(-1);
+			if (_moduleResult == 1) {
+				createScene(32, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(30, 1);
+			}
 			break;
 		case 32:
-			createScene2233(-1);
+			if (_moduleResult == 1) {
+				createScene(33, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(31, 1);
+			}
 			break;
 		case 33:
-			createScene2234(-1);
+			if (_moduleResult == 1) {
+				createScene(34, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(32, 1);
+			}
 			break;
 		case 34:
-			createScene2235(-1);
+			if (_moduleResult == 1) {
+				createScene(42, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(33, 1);
+			}
 			break;
 		case 35:
-			createScene2236(-1);
+			if (_moduleResult == 1) {
+				createScene(36, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(45, 1);
+			}
 			break;
 		case 36:
-			createScene2237(-1);
+			if (_moduleResult == 1) {
+				createScene(37, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(35, 1);
+			}
 			break;
 		case 37:
-			createScene2238(-1);
+			if (_moduleResult == 1) {
+				createScene(38, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(36, 1);
+			}
 			break;
 		case 38:
-			createScene2239(-1);
+			if (_moduleResult == 1) {
+				createScene(39, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(37, 1);
+			}
 			break;
 		case 39:
-			createScene2240(-1);
+			if (_moduleResult == 1) {
+				createScene(40, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(38, 1);
+			}
 			break;
 		case 40:
-			createScene2241(-1);
+			if (_moduleResult == 1) {
+				createScene(41, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(39, 1);
+			}
 			break;
 		case 41:
-			createScene2242(-1);
+			if (_moduleResult == 1) {
+				createScene(47, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(40, 1);
+			}
 			break;
 		case 42:
-			createScene2243(-1);
+			if (_moduleResult == 1) {
+				createScene(43, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(34, 1);
+			}
 			break;
 		case 43:
-			createScene2244(-1);
+			if (_moduleResult == 1) {
+				createScene(44, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(42, 1);
+			}
 			break;
 		case 44:
-			createScene2245(-1);
+			if (_moduleResult == 1) {
+				createScene(45, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(43, 1);
+			}
 			break;
 		case 45:
-			createScene2246(-1);
+			if (_moduleResult == 1) {
+				createScene(35, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(44, 1);
+			}
 			break;
 		case 46:
-			createScene2247(-1);
+			if (_moduleResult == 1) {
+				createScene(9, 0);
+			} else if (_moduleResult == 2) {
+				createScene(7, 0);
+			} else {
+				createScene(5, 1);
+			}
 			break;
 		case 47:
-			createScene2248(-1);
+			createScene(41, 1);
 			break;
 		}
-	} else {
-		createScene2201(0);
 	}
-
-}
-
-Module2200::~Module2200() {
-	// TODO Sound1ChList_sub_407A50(0x11391412);
-}
-
-void Module2200::createScene2201(int which) {
-	_vm->gameState().sceneNum = 0;
-	_childObject = new Scene2201(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2201);
-}
-
-void Module2200::createScene2202(int which) {
-	// TODO Music18hList_play(0x601C908C, 0, 2, 1);
-	_vm->gameState().sceneNum = 1;
-	_childObject = new Scene2202(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2202);
-}
-
-void Module2200::createScene2203(int which) {
-	// TODO Music18hList_play(0x601C908C, 0, 2, 1);
-	_vm->gameState().sceneNum = 2;
-	_childObject = new Scene2203(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2203);
-}
-
-void Module2200::createScene2204(int which) {
-	_vm->gameState().sceneNum = 3;
-	// TODO Music18hList_stop(0x601C908C, 0, 2);
-	_childObject = new DiskplayerScene(_vm, this, 3);
-	SetUpdateHandler(&Module2200::updateScene2204);
-}
-			
-void Module2200::createScene2205(int which) {
-	_vm->gameState().sceneNum = 4;
-	// TODO Music18hList_stop(0x601C908C, 0, 2);
-	_childObject = new Scene2205(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2205);
-}
-			
-void Module2200::createScene2206(int which) {
-	_vm->gameState().sceneNum = 5;
-	// TODO Music18hList_stop(0x601C908C, 0, 2);
-	_childObject = new Scene2206(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2206);
-}
-			
-void Module2200::createScene2207(int which) {
-	_vm->gameState().sceneNum = 6;
-	_childObject = new Scene2207(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2207);
-}
-			
-void Module2200::createScene2208(int which) {
-	if (which >= 0)
-		_vm->gameState().which = _vm->gameState().sceneNum; 
-	_vm->gameState().sceneNum = 7;
-	_childObject = new Scene2208(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2208);
-}
-			
-void Module2200::createScene2209(int which) {
-	_vm->gameState().sceneNum = 8;
-	_childObject = new Scene2208(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2209);
-}
-			
-void Module2200::createScene2210(int which) {
-	_vm->gameState().sceneNum = 9;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180);
-	SetUpdateHandler(&Module2200::updateScene2210);
-}
-			
-void Module2200::createScene2211(int which) {
-	_vm->gameState().sceneNum = 10;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198);
-	SetUpdateHandler(&Module2200::updateScene2211);
-}
-			
-void Module2200::createScene2212(int which) {
-	_vm->gameState().sceneNum = 11;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0);
-	SetUpdateHandler(&Module2200::updateScene2212);
-}
-			
-void Module2200::createScene2213(int which) {
-	_vm->gameState().sceneNum = 12;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8);
-	SetUpdateHandler(&Module2200::updateScene2213);
-}
-
-void Module2200::createScene2214(int which) {
-	_vm->gameState().sceneNum = 13;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0);
-	SetUpdateHandler(&Module2200::updateScene2214);
-}
-			
-void Module2200::createScene2215(int which) {
-	_vm->gameState().sceneNum = 14;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8);
-	SetUpdateHandler(&Module2200::updateScene2215);
-}
-			
-void Module2200::createScene2216(int which) {
-	_vm->gameState().sceneNum = 15;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210);
-	SetUpdateHandler(&Module2200::updateScene2216);
-}
-			
-void Module2200::createScene2217(int which) {
-	_vm->gameState().sceneNum = 16;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228);
-	SetUpdateHandler(&Module2200::updateScene2217);
-}
-			
-void Module2200::createScene2218(int which) {
-	_vm->gameState().sceneNum = 17;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240);
-	SetUpdateHandler(&Module2200::updateScene2218);
-}
-			
-void Module2200::createScene2219(int which) {
-	_vm->gameState().sceneNum = 18;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258);
-	SetUpdateHandler(&Module2200::updateScene2219);
-}
-			
-void Module2200::createScene2220(int which) {
-	_vm->gameState().sceneNum = 19;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270);
-	SetUpdateHandler(&Module2200::updateScene2220);
-}
-			
-void Module2200::createScene2221(int which) {
-	_vm->gameState().sceneNum = 20;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288);
-	SetUpdateHandler(&Module2200::updateScene2221);
-}
-			
-void Module2200::createScene2222(int which) {
-	_vm->gameState().sceneNum = 21;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0);
-	SetUpdateHandler(&Module2200::updateScene2222);
-}
-			
-void Module2200::createScene2223(int which) {
-	_vm->gameState().sceneNum = 22;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8);
-	SetUpdateHandler(&Module2200::updateScene2223);
-}
-			
-void Module2200::createScene2224(int which) {
-	_vm->gameState().sceneNum = 23;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0);
-	SetUpdateHandler(&Module2200::updateScene2224);
-}
-			
-void Module2200::createScene2225(int which) {
-	_vm->gameState().sceneNum = 24;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8);
-	SetUpdateHandler(&Module2200::updateScene2225);
-}
-			
-void Module2200::createScene2226(int which) {
-	_vm->gameState().sceneNum = 25;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300);
-	SetUpdateHandler(&Module2200::updateScene2226);
-}
-			
-void Module2200::createScene2227(int which) {
-	_vm->gameState().sceneNum = 26;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318);
-	SetUpdateHandler(&Module2200::updateScene2227);
-}
-			
-void Module2200::createScene2228(int which) {
-	_vm->gameState().sceneNum = 27;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330);
-	SetUpdateHandler(&Module2200::updateScene2228);
-}
-			
-void Module2200::createScene2229(int which) {
-	_vm->gameState().sceneNum = 28;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348);
-	SetUpdateHandler(&Module2200::updateScene2229);
-}
-			
-void Module2200::createScene2230(int which) {
-	_vm->gameState().sceneNum = 29;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360);
-	SetUpdateHandler(&Module2200::updateScene2230);
-}
-			
-void Module2200::createScene2231(int which) {
-	_vm->gameState().sceneNum = 30;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378);
-	SetUpdateHandler(&Module2200::updateScene2231);
-}
-			
-void Module2200::createScene2232(int which) {
-	_vm->gameState().sceneNum = 31;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390);
-	SetUpdateHandler(&Module2200::updateScene2232);
-}
-			
-void Module2200::createScene2233(int which) {
-	_vm->gameState().sceneNum = 32;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8);
-	SetUpdateHandler(&Module2200::updateScene2233);
-}
-			
-void Module2200::createScene2234(int which) {
-	_vm->gameState().sceneNum = 33;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0);
-	SetUpdateHandler(&Module2200::updateScene2234);
-}
-			
-void Module2200::createScene2235(int which) {
-	_vm->gameState().sceneNum = 34;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8);
-	SetUpdateHandler(&Module2200::updateScene2235);
-}
-			
-void Module2200::createScene2236(int which) {
-	_vm->gameState().sceneNum = 35;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0);
-	SetUpdateHandler(&Module2200::updateScene2236);
-}
-			
-void Module2200::createScene2237(int which) {
-	_vm->gameState().sceneNum = 36;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408);
-	SetUpdateHandler(&Module2200::updateScene2237);
-}
-			
-void Module2200::createScene2238(int which) {
-	_vm->gameState().sceneNum = 37;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420);
-	SetUpdateHandler(&Module2200::updateScene2238);
-}
-			
-void Module2200::createScene2239(int which) {
-	_vm->gameState().sceneNum = 38;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438);
-	SetUpdateHandler(&Module2200::updateScene2239);
-}
-			
-void Module2200::createScene2240(int which) {
-	_vm->gameState().sceneNum = 39;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450);
-	SetUpdateHandler(&Module2200::updateScene2240);
-}
-			
-void Module2200::createScene2241(int which) {
-	_vm->gameState().sceneNum = 40;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468);
-	SetUpdateHandler(&Module2200::updateScene2241);
-}
-			
-void Module2200::createScene2242(int which) {
-	_vm->gameState().sceneNum = 41;
-	_childObject = new Scene2242(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2242);
-}
-			
-void Module2200::createScene2243(int which) {
-	_vm->gameState().sceneNum = 42;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480);
-	SetUpdateHandler(&Module2200::updateScene2243);
-}
-			
-void Module2200::createScene2244(int which) {
-	_vm->gameState().sceneNum = 43;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498);
-	SetUpdateHandler(&Module2200::updateScene2244);
-}
-			
-void Module2200::createScene2245(int which) {
-	_vm->gameState().sceneNum = 44;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0);
-	SetUpdateHandler(&Module2200::updateScene2245);
-}
-			
-void Module2200::createScene2246(int which) {
-	_vm->gameState().sceneNum = 45;
-	_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8);
-	SetUpdateHandler(&Module2200::updateScene2246);
-}
-			
-void Module2200::createScene2247(int which) {
-	_vm->gameState().sceneNum = 46;
-	_childObject = new Scene2247(_vm, this, which);
-	SetUpdateHandler(&Module2200::updateScene2247);
 }
 			
-void Module2200::createScene2248(int which) {
-	_vm->gameState().sceneNum = 47;
-	if (!getGlobalVar(0x98109F12)) {
-		if (getGlobalVar(0x4D080E54))
-			_childObject = new Class152(_vm, this, 0x83110287, 0x10283839);
-		else
-			_childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C);
-	} else {
-		if (getGlobalVar(0x4D080E54))
-			_childObject = new Class152(_vm, this, 0x48632087, 0x3208348E);
-		else
-			_childObject = new Class152(_vm, this, 0x08C74886, 0x74882084);
-	}
-	SetUpdateHandler(&Module2200::updateScene2248);
-}
-			
-void Module2200::updateScene2201() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2203(0);
-		} else if (_moduleResult == 2) {
-			createScene2202(0);
-		} else {
-			sendMessage(_parentModule, 0x1009, 0);
-		}
-	}
-}
-			
-void Module2200::updateScene2202() {
-	if (!updateChild()) {
-		createScene2201(2);
-	}
-}
-
-void Module2200::updateScene2203() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2205(0);
-		} else if (_moduleResult == 2) {
-			createScene2204(0);
-		} else {
-			createScene2201(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2204() {
-	if (!updateChild()) {
-		createScene2203(2);
-	}
-}
-			
-void Module2200::updateScene2205() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2206(0);
-		} else if (_moduleResult == 2) {
-			createScene2205(2);
-		} else {
-			createScene2203(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2206() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2247(0);
-		} else if (_moduleResult == 2) {
-			createScene2207(0);
-		} else if (_moduleResult == 3) {
-			createScene2209(0);
-		} else {
-			createScene2205(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2207() {
-	if (!updateChild()) {
-		createScene2206(2);
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2208() {
-	if (!updateChild()) {
-		// This is madness!
-		switch (_vm->gameState().which) {
-		case 4:
-			createScene2205(2);
-			break;
-		case 9:
-			createScene2210(2);
-			break;
-		case 10:
-			createScene2211(2);
-			break;
-		case 11:
-			createScene2212(2);
-			break;
-		case 12:
-			createScene2213(2);
-			break;
-		case 13:
-			createScene2214(2);
-			break;
-		case 14:
-			createScene2215(2);
-			break;
-		case 15:
-			createScene2216(2);
-			break;
-		case 16:
-			createScene2217(2);
-			break;
-		case 17:
-			createScene2218(2);
-			break;
-		case 18:
-			createScene2219(2);
-			break;
-		case 19:
-			createScene2220(2);
-			break;
-		case 20:
-			createScene2221(2);
-			break;
-		case 21:
-			createScene2222(2);
-			break;
-		case 22:
-			createScene2223(2);
-			break;
-		case 23:
-			createScene2224(2);
-			break;
-		case 24:
-			createScene2225(2);
-			break;
-		case 25:
-			createScene2226(2);
-			break;
-		case 26:
-			createScene2227(2);
-			break;
-		case 27:
-			createScene2228(2);
-			break;
-		case 28:
-			createScene2229(2);
-			break;
-		case 29:
-			createScene2230(2);
-			break;
-		case 30:
-			createScene2231(2);
-			break;
-		case 31:
-			createScene2232(2);
-			break;
-		case 32:
-			createScene2233(2);
-			break;
-		case 33:
-			createScene2234(2);
-			break;
-		case 34:
-			createScene2235(2);
-			break;
-		case 35:
-			createScene2236(2);
-			break;
-		case 36:
-			createScene2237(2);
-			break;
-		case 37:
-			createScene2238(2);
-			break;
-		case 38:
-			createScene2239(2);
-			break;
-		case 39:
-			createScene2240(2);
-			break;
-		case 40:
-			createScene2241(2);
-			break;
-		case 41:
-			createScene2242(2);
-			break;
-		case 42:
-			createScene2243(2);
-			break;
-		case 43:
-			createScene2244(2);
-			break;
-		case 44:
-			createScene2245(2);
-			break;
-		case 46:
-			createScene2247(2);
-			break;
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2209() {
-	if (!updateChild()) {
-		createScene2206(3);
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2210() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2211(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2247(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2211() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2212(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2210(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2212() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2213(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2211(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2213() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2214(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2212(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2214() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2215(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2213(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2215() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2216(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2214(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2216() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2217(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2215(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2217() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2218(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2216(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2218() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2219(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2217(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2219() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2220(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2218(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2220() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2221(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2219(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2221() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2222(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2220(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2222() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2223(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2221(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2223() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2224(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2222(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2224() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2225(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2223(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2225() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2226(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2224(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2226() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2227(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2225(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2227() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2228(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2226(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2228() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2229(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2227(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2229() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2230(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2228(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2230() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2231(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2229(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2231() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2232(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2230(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2232() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2233(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2231(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2233() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2234(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2232(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2234() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2235(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2233(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2235() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2243(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2234(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2236() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2237(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2246(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2237() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2238(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2236(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2238() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2239(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2237(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2239() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2240(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2238(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2240() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2241(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2239(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2241() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2242(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2240(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2242() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2248(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-			_childObject->handleUpdate();
-		} else {
-			createScene2241(1);
-			_childObject->handleUpdate();
-		}
-	}
-}
-			
-void Module2200::updateScene2243() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2244(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2235(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2244() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2245(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2243(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2245() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2246(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2244(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2246() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2236(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2245(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2247() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2210(0);
-		} else if (_moduleResult == 2) {
-			createScene2208(0);
-		} else {
-			createScene2206(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module2200::updateScene2248() {
-	if (!updateChild()) {
-		createScene2242(1);
-		_childObject->handleUpdate();
-	}
-}
-
 // Scene2201
 
 AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 4dfd827..76a5950 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -38,102 +38,8 @@ public:
 	Module2200(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2200();
 protected:
-	void createScene2201(int which);			
-	void createScene2202(int which);			
-	void createScene2203(int which);			
-	void createScene2204(int which);			
-	void createScene2205(int which);			
-	void createScene2206(int which);			
-	void createScene2207(int which);			
-	void createScene2208(int which);			
-	void createScene2209(int which);			
-	void createScene2210(int which);			
-	void createScene2211(int which);			
-	void createScene2212(int which);			
-	void createScene2213(int which);			
-	void createScene2214(int which);			
-	void createScene2215(int which);			
-	void createScene2216(int which);			
-	void createScene2217(int which);			
-	void createScene2218(int which);			
-	void createScene2219(int which);			
-	void createScene2220(int which);			
-	void createScene2221(int which);			
-	void createScene2222(int which);			
-	void createScene2223(int which);			
-	void createScene2224(int which);			
-	void createScene2225(int which);			
-	void createScene2226(int which);			
-	void createScene2227(int which);			
-	void createScene2228(int which);			
-	void createScene2229(int which);			
-	void createScene2230(int which);			
-	void createScene2231(int which);			
-	void createScene2232(int which);			
-	void createScene2233(int which);			
-	void createScene2234(int which);			
-	void createScene2235(int which);			
-	void createScene2236(int which);			
-	void createScene2237(int which);			
-	void createScene2238(int which);			
-	void createScene2239(int which);			
-	void createScene2240(int which);			
-	void createScene2241(int which);			
-	void createScene2242(int which);			
-	void createScene2243(int which);			
-	void createScene2244(int which);			
-	void createScene2245(int which);			
-	void createScene2246(int which);			
-	void createScene2247(int which);			
-	void createScene2248(int which);			
-	void updateScene2201();			
-	void updateScene2202();			
-	void updateScene2203();			
-	void updateScene2204();			
-	void updateScene2205();			
-	void updateScene2206();			
-	void updateScene2207();			
-	void updateScene2208();			
-	void updateScene2209();			
-	void updateScene2210();			
-	void updateScene2211();			
-	void updateScene2212();			
-	void updateScene2213();			
-	void updateScene2214();			
-	void updateScene2215();			
-	void updateScene2216();			
-	void updateScene2217();			
-	void updateScene2218();			
-	void updateScene2219();			
-	void updateScene2220();			
-	void updateScene2221();			
-	void updateScene2222();			
-	void updateScene2223();			
-	void updateScene2224();			
-	void updateScene2225();			
-	void updateScene2226();			
-	void updateScene2227();			
-	void updateScene2228();			
-	void updateScene2229();			
-	void updateScene2230();			
-	void updateScene2231();			
-	void updateScene2232();			
-	void updateScene2233();			
-	void updateScene2234();			
-	void updateScene2235();			
-	void updateScene2236();			
-	void updateScene2237();			
-	void updateScene2238();			
-	void updateScene2239();			
-	void updateScene2240();			
-	void updateScene2241();			
-	void updateScene2242();			
-	void updateScene2243();			
-	void updateScene2244();			
-	void updateScene2245();			
-	void updateScene2246();			
-	void updateScene2247();			
-	void updateScene2248();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene2201


Commit: 67fe73352b5de401b184a54195beba2438da5b8d
    https://github.com/scummvm/scummvm/commit/67fe73352b5de401b184a54195beba2438da5b8d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Merge createSceneXXX/updateSceneXXX methods into createScene and updateScene for Module1000

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index abe61d2..1c76027 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -276,13 +276,13 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule2000(-1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 2;
 	createModule2200(-1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 5;
-	createModule1300(-1);
+#if 1
+	_vm->gameState().sceneNum = 0;
+	createModule1000(-1);
 #endif
 }
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 8185430..22bc5cc 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -35,27 +35,11 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Music18hList_add(0x03294419, _musicFileHash);
 
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 0:
-			createScene1001(-1);
-			break;
-		case 1:
-			createScene1002(-1);
-			break;
-		case 2:
-			createScene1003(-1);
-			break;
-		case 3:
-			createScene1004(-1);
-			break;
-		case 4:
-			createScene1005(-1);
-			break;
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 0) {
-		createScene1001(0);
+		createScene(0, 0);
 	} else if (which == 1) {
-		createScene1002(1);
+		createScene(1, 1);
 	}
 
 }
@@ -64,95 +48,73 @@ Module1000::~Module1000() {
 	// TODO Music18hList_deleteGroup(0x03294419);
 }
 
-void Module1000::createScene1001(int which) {
-	_vm->gameState().sceneNum = 0;
-	_childObject = new Scene1001(_vm, this, which);
-	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
-	SetUpdateHandler(&Module1000::updateScene1001);
-}
-			
-void Module1000::createScene1002(int which) {
-	_vm->gameState().sceneNum = 1;
-	_childObject = new Scene1002(_vm, this, which);
-	// TODO Music18hList_play(0x061880C6, 0, 0, 1);
-	SetUpdateHandler(&Module1000::updateScene1002);
-}
-
-void Module1000::createScene1003(int which) {
-	_vm->gameState().sceneNum = 2;
-	_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
-	SetUpdateHandler(&Module1000::updateScene1003);
-	// TODO Music18hList_play(0x061880C6, 0, 0);
-}
-
-void Module1000::createScene1004(int which) {
-	_vm->gameState().sceneNum = 3;
-	_childObject = new Scene1004(_vm, this, which);
-	SetUpdateHandler(&Module1000::updateScene1004);
-	// TODO Music18hList_stop(0x061880C6, 0, 2);
-}
-
-void Module1000::createScene1005(int which) {
-	_vm->gameState().sceneNum = 4;
-	_childObject = new Scene1005(_vm, this, which);
-	// TODO Music18hList_stop(0x061880C6, 0, 0);
-	// TODO Music18hList_play(_musicFileHash, 0, 0, 1);
-	SetUpdateHandler(&Module1000::updateScene1005);
-}
-
-void Module1000::updateScene1001() {
-	if (!updateChild()) {
-		if (_moduleResult == 2) {
-			createScene1003(0);
-			_childObject->handleUpdate();
-		} else {
-			createScene1002(0);
-			_childObject->handleUpdate();
-		}
+void Module1000::createScene(int sceneNum, int which) {
+	debug("Module1000::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		// TODO Music18hList_play(0x061880C6, 0, 0, 1);
+		_childObject = new Scene1001(_vm, this, which);
+		break;
+	case 1:
+		// TODO Music18hList_play(0x061880C6, 0, 0, 1);
+		_childObject = new Scene1002(_vm, this, which);
+		break;
+	case 2:
+		// TODO Music18hList_play(0x061880C6, 0, 0);
+		_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
+		break;
+	case 3:
+		// TODO Music18hList_stop(0x061880C6, 0, 2);
+		_childObject = new Scene1004(_vm, this, which);
+		break;
+	case 4:
+		// TODO Music18hList_stop(0x061880C6, 0, 0);
+		// TODO Music18hList_play(_musicFileHash, 0, 0, 1);
+		_childObject = new Scene1005(_vm, this, which);
+		break;
 	}
+	SetUpdateHandler(&Module1000::updateScene);
+	_childObject->handleUpdate();
 }
 
-void Module1000::updateScene1002() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			sendMessage(_parentModule, 0x1009, 0);
-		} else if (_moduleResult == 2) {
-			createScene1004(0);
-			_childObject->handleUpdate();
-		} else {
-			createScene1001(1);
-			_childObject->handleUpdate();
-		}
-	}
-}
-			
-void Module1000::updateScene1003() {
-	if (!updateChild()) {
-		createScene1001(2);
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module1000::updateScene1004() {
+void Module1000::updateScene() {
 	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1005(0);
-			_childObject->handleUpdate();
-		} else {
-			createScene1002(2);
-			_childObject->handleUpdate();
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 2) {
+				createScene(2, 0);
+			} else {
+				createScene(1, 0);
+			}
+			break;
+		case 1:
+			if (_moduleResult == 1) {
+				sendMessage(_parentModule, 0x1009, 0);
+			} else if (_moduleResult == 2) {
+				createScene(3, 0);
+			} else {
+				createScene(0, 1);
+			}
+			break;
+		case 2:
+			createScene(0, 2);
+			break;
+		case 3:
+			if (_moduleResult == 1) {
+				createScene(4, 0);
+			} else {
+				createScene(1, 2);
+			}
+			break;
+		case 4:
+			// TODO Music18hList_stop(_musicFileHash, 0, 1);
+			createScene(3, 1);
+			break;
 		}
 	}
 }
-			
-void Module1000::updateScene1005() {
-	if (!updateChild()) {
-		// TODO Music18hList_stop(_musicFileHash, 0, 1);
-		createScene1004(1);
-		_childObject->handleUpdate();
-	}
-}
-			
+
 // Scene1001			
 
 AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 385ac10..a7046ce 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -37,20 +37,8 @@ public:
 	virtual ~Module1000();
 protected:
 	uint32 _musicFileHash;
-	// TODO ResourceTable _resourceTable1;
-	// TODO ResourceTable _resourceTable2;
-	// TODO ResourceTable _resourceTable3;
-	// TODO ResourceTable _resourceTable4;
-	void createScene1001(int which);			
-	void createScene1002(int which);			
-	void createScene1003(int which);			
-	void createScene1004(int which);			
-	void createScene1005(int which);			
-	void updateScene1001();			
-	void updateScene1002();			
-	void updateScene1003();			
-	void updateScene1004();			
-	void updateScene1005();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene1001


Commit: d24907d1bb1650093e4ff7f0d008ce87350226b6
    https://github.com/scummvm/scummvm/commit/d24907d1bb1650093e4ff7f0d008ce87350226b6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Rename Palette2::addPalette to addBasePalette to prepare the merge of the Palette/Palette2 classes

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 1c76027..103d53d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -276,11 +276,11 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule2000(-1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 2;
+#if 1
+	_vm->gameState().sceneNum = 4;
 	createModule2200(-1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 0;
 	createModule1000(-1);
 #endif
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 22bc5cc..77620b8 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1694,10 +1694,10 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(0x0D0A14D10)) {
 		palette2 = new Palette2(_vm, 0xA30BA329);
-		palette2->addPalette(0xA30BA329, 0, 256, 0);
+		palette2->addBasePalette(0xA30BA329, 0, 256, 0);
 	} else {
 		palette2 = new Palette2(_vm, 0x50C03005);
-		palette2->addPalette(0x50C03005, 0, 256, 0);
+		palette2->addBasePalette(0x50C03005, 0, 256, 0);
 	}
 	_palette = palette2;
 	_palette->usePalette();
@@ -1770,13 +1770,13 @@ void Scene1004::updatePaletteArea() {
 	if (_klayman->getY() < 150) {
 		if (_paletteAreaStatus != 0) {
 			_paletteAreaStatus = 0;
-			((Palette2*)_palette)->addPalette(0x406B0D10, 0, 64, 0);
+			((Palette2*)_palette)->addBasePalette(0x406B0D10, 0, 64, 0);
 			((Palette2*)_palette)->startFadeToPalette(12);
 		}
 	} else {
 		if (_paletteAreaStatus != 1) {
 			_paletteAreaStatus = 1;
-			((Palette2*)_palette)->addPalette(0x24332243, 0, 64, 0);
+			((Palette2*)_palette)->addBasePalette(0x24332243, 0, 64, 0);
 			((Palette2*)_palette)->startFadeToPalette(12);
 		}
 	}
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index b942d8b..5735f24 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -119,7 +119,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 	palette2->usePalette();
 	_palette = palette2; 
 	addEntity(_palette);
-	palette2->addPalette(backgroundFileHash, 0, 256, 0);
+	palette2->addBasePalette(backgroundFileHash, 0, 256, 0);
 	palette2->startFadeToPalette(12);
 
 	/*	
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 0aea8d1..baa37d0 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -226,7 +226,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x03118226);
 
 	palette2 = new Palette2(_vm, 0x03118226);
-	palette2->addPalette(0x91D3A391, 0, 64, 0);
+	palette2->addBasePalette(0x91D3A391, 0, 64, 0);
 	palette2->copyBasePalette(0, 256, 0);
 	palette2->usePalette();
 	_palette = palette2;
@@ -297,11 +297,11 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene1705::update() {
 	Scene::update();
 	if (_klayman->getX() < 224 && _paletteArea != 0) {
-		((Palette2*)_palette)->addPalette(0xF2210C15, 0, 64, 0);
+		((Palette2*)_palette)->addBasePalette(0xF2210C15, 0, 64, 0);
 		((Palette2*)_palette)->startFadeToPalette(12);
 		_paletteArea = 0;
 	} else if (_klayman->getX() >= 224 && _paletteArea == 0) {
-		((Palette2*)_palette)->addPalette(0x91D3A391, 0, 64, 0);
+		((Palette2*)_palette)->addBasePalette(0x91D3A391, 0, 64, 0);
 		((Palette2*)_palette)->startFadeToPalette(12);
 		_paletteArea = 1;
 	}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index c8eca78..b637a39 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -1536,7 +1536,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		addSprite(_ssLightSwitch);
 	}
 
-	palette2->addPalette(0xD00A028D, 0, 256, 0);
+	palette2->addBasePalette(0xD00A028D, 0, 256, 0);
 	
 	_ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm));
 
@@ -1598,11 +1598,11 @@ void Scene2205::update() {
 
 	if (!getGlobalVar(0x4D080E54)) {
 		if (_isKlaymanInLight && _klayman->getX() > 85) {
-			((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0);
+			((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0);
 			((Palette2*)_palette)->startFadeToPalette(12);
 			_isKlaymanInLight = false;
 		} else if (!_isKlaymanInLight && _klayman->getX() <= 85) {
-			((Palette2*)_palette)->addPalette(0xD00A028D, 0, 65, 0);
+			((Palette2*)_palette)->addBasePalette(0xD00A028D, 0, 65, 0);
 			((Palette2*)_palette)->startFadeToPalette(12);
 			_isKlaymanInLight = true;
 		}
@@ -1822,7 +1822,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	addEntity(palette2);
 
-	palette2->addPalette(fileHash, 0, 256, 0);
+	palette2->addBasePalette(fileHash, 0, 256, 0);
 
 	if (!getGlobalVar(0x4D080E54)) {
 		_palette->addPalette(0x0263D144, 0, 65, 0);
@@ -1904,7 +1904,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 
 void Scene2206::sub481950() {
 	if (getGlobalVar(0x4D080E54)) {
-		((Palette2*)_palette)->addPalette(0x41983216, 0, 65, 0);
+		((Palette2*)_palette)->addBasePalette(0x41983216, 0, 65, 0);
 		((Palette2*)_palette)->startFadeToPalette(12);
 	}
 	setSurfacePriority(_sprite1->getSurface(), 100);
@@ -1919,7 +1919,7 @@ void Scene2206::sub481950() {
 
 void Scene2206::sub4819D0() {
 	if (!getGlobalVar(0x4D080E54)) {
-		((Palette2*)_palette)->addPalette(0xB103B604, 0, 65, 0);
+		((Palette2*)_palette)->addBasePalette(0xB103B604, 0, 65, 0);
 		((Palette2*)_palette)->startFadeToPalette(12);
 	}
 	setSurfacePriority(_sprite1->getSurface(), 1100);
@@ -2767,11 +2767,11 @@ Scene2242::~Scene2242() {
 void Scene2242::update() {
 	if (!getGlobalVar(0x4D080E54)) {
 		if (_isKlaymanInLight && _klayman->getX() < 440) {
-			((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0);
+			((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0);
 			((Palette2*)_palette)->startFadeToPalette(12);
 			_isKlaymanInLight = false;
 		} else if (!_isKlaymanInLight && _klayman->getX() >= 440) {
-			((Palette2*)_palette)->addPalette(0x25848E24, 0, 65, 0);
+			((Palette2*)_palette)->addBasePalette(0x25848E24, 0, 65, 0);
 			((Palette2*)_palette)->startFadeToPalette(12);
 			_isKlaymanInLight = true;
 		}
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index cfcacaf..7c4ed1a 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1762,13 +1762,13 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam &param, Entit
 
 void Scene3011::fadeIn() {
 	Palette2 *palette2 = (Palette2*)_palette;
-	palette2->addPalette(0x92124A04, 0, 256, 0);
+	palette2->addBasePalette(0x92124A04, 0, 256, 0);
 	palette2->startFadeToPalette(24);
 }
 
 void Scene3011::fadeOut() {
 	Palette2 *palette2 = (Palette2*)_palette;
-	palette2->addPalette(0xA4070114, 0, 256, 0);
+	palette2->addBasePalette(0xA4070114, 0, 256, 0);
 	palette2->startFadeToPalette(24);
 }
 
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index bd1d6b2..a060a41 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -70,7 +70,7 @@ void Palette::usePalette() {
 }
 
 void Palette::addPalette(const char *filename, int toIndex, int count, int fromIndex) {
-	// TODO: addPalette(calcHash(filename), toIndex, count, fromIndex);
+	addPalette(calcHash(filename), toIndex, count, fromIndex);
 }
 
 void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
@@ -179,7 +179,7 @@ void Palette2::copyBasePalette(int toIndex, int count, int fromIndex) {
 	memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4);		
 }
 
-void Palette2::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
+void Palette2::addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
 	PaletteResource paletteResource(_vm);
 	if (toIndex + count > 256)
 		count = 256 - toIndex;
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 01f63e8..9d2a7bc 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -62,7 +62,7 @@ public:
 	Palette2(NeverhoodEngine *vm, uint32 fileHash);
 	virtual ~Palette2();
 	void copyBasePalette(int toIndex, int count, int fromIndex);
-	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
+	void addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex);
 	void startFadeToPalette(int counter);
 public:
 	byte *_basePalette;


Commit: 71ea4d5877a58809b994fb906d81516541c6e8e6
    https://github.com/scummvm/scummvm/commit/71ea4d5877a58809b994fb906d81516541c6e8e6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Merge Palette2 class into Palette

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 77620b8..cf21536 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1682,7 +1682,6 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa
 Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _paletteAreaStatus(-1) {
 
-	Palette2 *palette2;
 	Sprite *tempSprite;
 	
 	_surfaceFlag = true;
@@ -1693,13 +1692,12 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x50C03005);
 
 	if (getGlobalVar(0x0D0A14D10)) {
-		palette2 = new Palette2(_vm, 0xA30BA329);
-		palette2->addBasePalette(0xA30BA329, 0, 256, 0);
+		_palette = new Palette(_vm, 0xA30BA329);
+		_palette->addBasePalette(0xA30BA329, 0, 256, 0);
 	} else {
-		palette2 = new Palette2(_vm, 0x50C03005);
-		palette2->addBasePalette(0x50C03005, 0, 256, 0);
+		_palette = new Palette(_vm, 0x50C03005);
+		_palette->addBasePalette(0x50C03005, 0, 256, 0);
 	}
-	_palette = palette2;
 	_palette->usePalette();
 	addEntity(_palette);
 
@@ -1770,14 +1768,14 @@ void Scene1004::updatePaletteArea() {
 	if (_klayman->getY() < 150) {
 		if (_paletteAreaStatus != 0) {
 			_paletteAreaStatus = 0;
-			((Palette2*)_palette)->addBasePalette(0x406B0D10, 0, 64, 0);
-			((Palette2*)_palette)->startFadeToPalette(12);
+			_palette->addBasePalette(0x406B0D10, 0, 64, 0);
+			_palette->startFadeToPalette(12);
 		}
 	} else {
 		if (_paletteAreaStatus != 1) {
 			_paletteAreaStatus = 1;
-			((Palette2*)_palette)->addBasePalette(0x24332243, 0, 64, 0);
-			((Palette2*)_palette)->startFadeToPalette(12);
+			_palette->addBasePalette(0x24332243, 0, 64, 0);
+			_palette->startFadeToPalette(12);
 		}
 	}
 }
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 9e198cc..3901f83 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -1154,8 +1154,6 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_soundResource2(vm), _soundResource3(vm), _soundResource4(vm),
 	_flag(true), _soundFlag(false), _counter(0), _index(-1) {
 
-	Palette2 *palette2;
-
 	SetMessageHandler(&Scene1202::handleMessage453C10);
 	SetUpdateHandler(&Scene1202::update);
 
@@ -1163,9 +1161,8 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x60210ED5);
 
-	palette2 = new Palette2(_vm, 0x60210ED5);
-	palette2->usePalette();
-	_palette = palette2;
+	_palette = new Palette(_vm, 0x60210ED5);
+	_palette->usePalette();
 	addEntity(_palette);
 
 	_paletteResource.load(0x60250EB5);
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 5735f24..7c03e9b 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -106,8 +106,6 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 
 	debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3);
 	
-	Palette2 *palette2;
-
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
 	
@@ -115,12 +113,11 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 
 	setBackground(backgroundFileHash);
 
-	palette2 = new Palette2(_vm);
-	palette2->usePalette();
-	_palette = palette2; 
+	_palette = new Palette(_vm);
+	_palette->usePalette();
 	addEntity(_palette);
-	palette2->addBasePalette(backgroundFileHash, 0, 256, 0);
-	palette2->startFadeToPalette(12);
+	_palette->addBasePalette(backgroundFileHash, 0, 256, 0);
+	_palette->startFadeToPalette(12);
 
 	/*	
 	if (soundFileHash != 0) {
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index baa37d0..33e6908 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -210,7 +210,6 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam &param, Entity
 Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _paletteArea(1) {
 
-	Palette2 *palette2;
 	Sprite *tempSprite;
 	
 	setGlobalVar(0xE7498218, 1);
@@ -225,11 +224,10 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x03118226);
 
-	palette2 = new Palette2(_vm, 0x03118226);
-	palette2->addBasePalette(0x91D3A391, 0, 64, 0);
-	palette2->copyBasePalette(0, 256, 0);
-	palette2->usePalette();
-	_palette = palette2;
+	_palette = new Palette(_vm, 0x03118226);
+	_palette->addBasePalette(0x91D3A391, 0, 64, 0);
+	_palette->copyBasePalette(0, 256, 0);
+	_palette->usePalette();
 	addEntity(_palette);
 
 	_mouseCursor = addSprite(new Mouse433(_vm, 0x18222039, NULL));
@@ -297,12 +295,12 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene1705::update() {
 	Scene::update();
 	if (_klayman->getX() < 224 && _paletteArea != 0) {
-		((Palette2*)_palette)->addBasePalette(0xF2210C15, 0, 64, 0);
-		((Palette2*)_palette)->startFadeToPalette(12);
+		_palette->addBasePalette(0xF2210C15, 0, 64, 0);
+		_palette->startFadeToPalette(12);
 		_paletteArea = 0;
 	} else if (_klayman->getX() >= 224 && _paletteArea == 0) {
-		((Palette2*)_palette)->addBasePalette(0x91D3A391, 0, 64, 0);
-		((Palette2*)_palette)->startFadeToPalette(12);
+		_palette->addBasePalette(0x91D3A391, 0, 64, 0);
+		_palette->startFadeToPalette(12);
 		_paletteArea = 1;
 	}
 }
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index b637a39..2219679 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -1112,8 +1112,6 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
 	_isSolved(false), _leaveScene(false), _isTileMoving(false), _movingTileSprite(NULL), _doneMovingTileSprite(NULL) {
 
-	Palette2 *palette2;
-
 	// TODO initScene2201Vars();
 	SetMessageHandler(&Scene2202::handleMessage);
 	SetUpdateHandler(&Scene2202::update);
@@ -1121,10 +1119,9 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x08100A0C);
-	palette2 = new Palette2(_vm, 0x08100A0C);
-	_palette = palette2;
+	_palette = new Palette(_vm, 0x08100A0C);
 	_palette->usePalette();
-	addEntity(palette2);
+	addEntity(_palette);
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x00A08089, 20, 620));
 
 	//DEBUG!
@@ -1506,8 +1503,6 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p
 Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	Palette2 *palette2;
-	
 	SetMessageHandler(&Scene2205::handleMessage);
 	SetUpdateHandler(&Scene2205::update);
 	
@@ -1517,26 +1512,24 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0x4D080E54)) {
 		_isLightOn = true;
 		setBackground(0x0008028D);
-		palette2 = new Palette2(_vm, 0x0008028D);
-		_palette = palette2;
+		_palette = new Palette(_vm, 0x0008028D);
 		_palette->usePalette();
-		addEntity(palette2);
+		addEntity(_palette);
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x80289008, NULL));
 		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0);
 		addSprite(_ssLightSwitch);
 	} else {
 		_isLightOn = false;
 		setBackground(0xD00A028D);
-		palette2 = new Palette2(_vm, 0xD00A028D);
-		_palette = palette2;
+		_palette = new Palette(_vm, 0xD00A028D);
 		_palette->usePalette();
-		addEntity(palette2);
+		addEntity(_palette);
 		_mouseCursor = addSprite(new Mouse433(_vm, 0xA0289D08, NULL));
 		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0);
 		addSprite(_ssLightSwitch);
 	}
 
-	palette2->addBasePalette(0xD00A028D, 0, 256, 0);
+	_palette->addBasePalette(0xD00A028D, 0, 256, 0);
 	
 	_ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm));
 
@@ -1598,12 +1591,12 @@ void Scene2205::update() {
 
 	if (!getGlobalVar(0x4D080E54)) {
 		if (_isKlaymanInLight && _klayman->getX() > 85) {
-			((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0);
-			((Palette2*)_palette)->startFadeToPalette(12);
+			_palette->addBasePalette(0x68033B1C, 0, 65, 0);
+			_palette->startFadeToPalette(12);
 			_isKlaymanInLight = false;
 		} else if (!_isKlaymanInLight && _klayman->getX() <= 85) {
-			((Palette2*)_palette)->addBasePalette(0xD00A028D, 0, 65, 0);
-			((Palette2*)_palette)->startFadeToPalette(12);
+			_palette->addBasePalette(0xD00A028D, 0, 65, 0);
+			_palette->startFadeToPalette(12);
 			_isKlaymanInLight = true;
 		}
 	}
@@ -1772,7 +1765,6 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource(vm) {
 
 	uint32 fileHash;
-	Palette2 *palette2;
 	
 	SetUpdateHandler(&Scene::update);
 	SetMessageHandler(&Scene2206::handleMessage);
@@ -1817,12 +1809,11 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(fileHash);
 
-	palette2 = new Palette2(_vm, fileHash);
-	_palette = palette2;
+	_palette = new Palette(_vm, fileHash);
 	_palette->usePalette();
-	addEntity(palette2);
+	addEntity(_palette);
 
-	palette2->addBasePalette(fileHash, 0, 256, 0);
+	_palette->addBasePalette(fileHash, 0, 256, 0);
 
 	if (!getGlobalVar(0x4D080E54)) {
 		_palette->addPalette(0x0263D144, 0, 65, 0);
@@ -1904,8 +1895,8 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 
 void Scene2206::sub481950() {
 	if (getGlobalVar(0x4D080E54)) {
-		((Palette2*)_palette)->addBasePalette(0x41983216, 0, 65, 0);
-		((Palette2*)_palette)->startFadeToPalette(12);
+		_palette->addBasePalette(0x41983216, 0, 65, 0);
+		_palette->startFadeToPalette(12);
 	}
 	setSurfacePriority(_sprite1->getSurface(), 100);
 	setSurfacePriority(_sprite2->getSurface(), 300);
@@ -1919,8 +1910,8 @@ void Scene2206::sub481950() {
 
 void Scene2206::sub4819D0() {
 	if (!getGlobalVar(0x4D080E54)) {
-		((Palette2*)_palette)->addBasePalette(0xB103B604, 0, 65, 0);
-		((Palette2*)_palette)->startFadeToPalette(12);
+		_palette->addBasePalette(0xB103B604, 0, 65, 0);
+		_palette->startFadeToPalette(12);
 	}
 	setSurfacePriority(_sprite1->getSurface(), 1100);
 	setSurfacePriority(_sprite2->getSurface(), 1300);
@@ -2713,8 +2704,6 @@ static const uint32 kScene2242MessageListIds1[] = {
 Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _isKlaymanInLight(false) {
 
-	Palette2 *palette2;
-	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2242::handleMessage);
 	SetUpdateHandler(&Scene2242::update);
@@ -2727,11 +2716,10 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B3DC8);
 	} else {
 		setBackground(0x25848E24);
-		palette2 = new Palette2(_vm, 0x25848E24);
-		_palette = palette2;
+		_palette = new Palette(_vm, 0x25848E24);
 		_palette->usePalette();
-		addEntity(palette2);
-		((Palette2*)_palette)->copyBasePalette(0, 256, 0);
+		addEntity(_palette);
+		_palette->copyBasePalette(0, 256, 0);
 		_palette->addPalette(0x68033B1C, 0, 65, 0);
 		_mouseCursor = addSprite(new Mouse433(_vm, 0x48E20250, NULL));
 		setRectList(0x004B3E18);
@@ -2767,12 +2755,12 @@ Scene2242::~Scene2242() {
 void Scene2242::update() {
 	if (!getGlobalVar(0x4D080E54)) {
 		if (_isKlaymanInLight && _klayman->getX() < 440) {
-			((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0);
-			((Palette2*)_palette)->startFadeToPalette(12);
+			_palette->addBasePalette(0x68033B1C, 0, 65, 0);
+			_palette->startFadeToPalette(12);
 			_isKlaymanInLight = false;
 		} else if (!_isKlaymanInLight && _klayman->getX() >= 440) {
-			((Palette2*)_palette)->addBasePalette(0x25848E24, 0, 65, 0);
-			((Palette2*)_palette)->startFadeToPalette(12);
+			_palette->addBasePalette(0x25848E24, 0, 65, 0);
+			_palette->startFadeToPalette(12);
 			_isKlaymanInLight = true;
 		}
 	}
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 7c4ed1a..9bcd79a 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1668,8 +1668,6 @@ void AsScene3011Symbol::change(int index, bool flag) {
 Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) {
 
-	Palette2 *palette2;
-	
 	_surfaceFlag = true;
 
 	// TODO _vm->gameModule()->initScene3011Vars();
@@ -1677,10 +1675,9 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x92124A04);
 
-	palette2 = new Palette2(_vm, 0xA4070114);
-	addEntity(palette2);
-	palette2->usePalette();
-	_palette = palette2;
+	_palette = new Palette(_vm, 0xA4070114);
+	_palette->usePalette();
+	addEntity(_palette);
 
 	_mouseCursor = addSprite(new Mouse435(_vm, 0x24A00929, 20, 620));
 
@@ -1761,15 +1758,13 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 void Scene3011::fadeIn() {
-	Palette2 *palette2 = (Palette2*)_palette;
-	palette2->addBasePalette(0x92124A04, 0, 256, 0);
-	palette2->startFadeToPalette(24);
+	_palette->addBasePalette(0x92124A04, 0, 256, 0);
+	_palette->startFadeToPalette(24);
 }
 
 void Scene3011::fadeOut() {
-	Palette2 *palette2 = (Palette2*)_palette;
-	palette2->addBasePalette(0xA4070114, 0, 256, 0);
-	palette2->startFadeToPalette(24);
+	_palette->addBasePalette(0xA4070114, 0, 256, 0);
+	_palette->startFadeToPalette(24);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index a060a41..481e0e5 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -29,32 +29,28 @@ namespace Neverhood {
 // Palette
 
 Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) {
-	_status = 0;
-	_palette = new byte[1024];
+	init();
 	memset(_palette, 0, 1024);
 	SetUpdateHandler(&Palette::update);
 }
 
 Palette::Palette(NeverhoodEngine *vm, byte *palette) : Entity(vm, 0) {
-	_status = 0;
-	_palette = new byte[1024];
+	init();
 	memcpy(_palette, palette, 1024);
 	SetUpdateHandler(&Palette::update);
 }
 
 Palette::Palette(NeverhoodEngine *vm, const char *filename) : Entity(vm, 0) {
 	PaletteResource paletteResource(_vm);
-	_status = 0;
-	_palette = new byte[1024];
-	// TODO: paletteResource.load(calcHash(filename));
-	// paletteResource.copyPalette(_palette);
+	init();
+	paletteResource.load(calcHash(filename));
+	paletteResource.copyPalette(_palette);
 	SetUpdateHandler(&Palette::update);
 }
 
 Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) {
 	PaletteResource paletteResource(_vm);
-	_status = 0;
-	_palette = new byte[1024];
+	init();
 	paletteResource.load(fileHash);
 	paletteResource.copyPalette(_palette);
 	SetUpdateHandler(&Palette::update);
@@ -63,6 +59,13 @@ Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) {
 Palette::~Palette() {
 	_vm->_screen->unsetPaletteData(_palette);
 	delete[] _palette;
+	delete[] _basePalette;
+}
+
+void Palette::init() {
+	_status = 0;
+	_palette = new byte[1024];
+	_basePalette = new byte[1024];
 }
 
 void Palette::usePalette() {
@@ -82,6 +85,14 @@ void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex)
 	_vm->_screen->testPalette(_palette);
 }
 
+void Palette::addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
+	PaletteResource paletteResource(_vm);
+	if (toIndex + count > 256)
+		count = 256 - toIndex;
+	paletteResource.load(fileHash);
+	memcpy(_basePalette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4);		
+}
+
 void Palette::copyPalette(const byte *palette, int toIndex, int count, int fromIndex) {
 	if (toIndex + count > 256)
 		count = 256 - toIndex;
@@ -89,8 +100,14 @@ void Palette::copyPalette(const byte *palette, int toIndex, int count, int fromI
 	_vm->_screen->testPalette(_palette);
 }
 
+void Palette::copyBasePalette(int toIndex, int count, int fromIndex) {
+	if (toIndex + count > 256)
+		count = 256 - toIndex;
+	memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4);		
+}
+
 void Palette::startFadeToBlack(int counter) {
-	debug("Palette::startFadeToBlack(%d)", counter);
+	debug(2, "Palette::startFadeToBlack(%d)", counter);
 	if (counter == 0)
 		counter = 1;
 	_fadeToR = 0;
@@ -102,7 +119,7 @@ void Palette::startFadeToBlack(int counter) {
 }
 
 void Palette::startFadeToWhite(int counter) {
-	debug("Palette::startFadeToWhite(%d)", counter);
+	debug(2, "Palette::startFadeToWhite(%d)", counter);
 	if (counter == 0)
 		counter = 1;
 	_fadeToR = 255;
@@ -113,6 +130,15 @@ void Palette::startFadeToWhite(int counter) {
 	_status = 1;			
 }
 
+void Palette::startFadeToPalette(int counter) {
+	debug(2, "Palette::startFadeToPalette(%d)", counter);
+	if (counter == 0)
+		counter = 1;
+	_palCounter = counter;
+	_fadeStep = 255 / counter;
+	_status = 2;			
+}
+
 void Palette::update() {
 	debug(2, "Palette::update() _status = %d", _status);
 	if (_status == 1) {
@@ -126,39 +152,6 @@ void Palette::update() {
 			memset(_palette, 0, 1024);
 			_status = 0;
 		}
-	}
-}
-
-void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) {
-	#define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep)
-	FADE(rgb[0], toR);
-	FADE(rgb[1], toG);
-	FADE(rgb[2], toB);
-	#undef FADE
-}
-
-// Palette2
-
-Palette2::Palette2(NeverhoodEngine *vm)
-	: Palette(vm) {
-	_basePalette = new byte[1024];
-	SetUpdateHandler(&Palette2::update);
-}
-
-Palette2::Palette2(NeverhoodEngine *vm, uint32 fileHash)
-	: Palette(vm, fileHash) {
-	_basePalette = new byte[1024];
-	SetUpdateHandler(&Palette2::update);
-}
-
-Palette2::~Palette2() {
-	delete _basePalette;
-}
-
-void Palette2::update() {
-	debug("Palette2::update() _status = %d", _status);
-	if (_status == 1) {
-		Palette::update();
 	} else if (_status == 2) {
 		if (_palCounter > 1) {
 			for (int i = 0; i < 256; i++) {
@@ -173,27 +166,12 @@ void Palette2::update() {
 	}
 }
 
-void Palette2::copyBasePalette(int toIndex, int count, int fromIndex) {
-	if (toIndex + count > 256)
-		count = 256 - toIndex;
-	memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4);		
-}
-
-void Palette2::addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex) {
-	PaletteResource paletteResource(_vm);
-	if (toIndex + count > 256)
-		count = 256 - toIndex;
-	paletteResource.load(fileHash);
-	memcpy(_basePalette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4);		
-}
-
-void Palette2::startFadeToPalette(int counter) {
-	debug("Palette2::startFadeToPalette(%d)", counter);
-	if (counter == 0)
-		counter = 1;
-	_palCounter = counter;
-	_fadeStep = 255 / counter;
-	_status = 2;			
+void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) {
+	#define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep)
+	FADE(rgb[0], toR);
+	FADE(rgb[1], toG);
+	FADE(rgb[2], toB);
+	#undef FADE
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 9d2a7bc..7966013 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -39,15 +39,20 @@ public:
 	// Create from resource with fileHash
 	Palette(NeverhoodEngine *vm, uint32 fileHash);
 	virtual ~Palette();
+	void init();
 	void usePalette();
 	void addPalette(const char *filename, int toIndex, int count, int fromIndex);
 	void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex);
+	void addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex);
 	void copyPalette(const byte *palette, int toIndex, int count, int fromIndex);
+	void copyBasePalette(int toIndex, int count, int fromIndex);
 	void startFadeToBlack(int counter);
 	void startFadeToWhite(int counter);
+	void startFadeToPalette(int counter);
 protected:
 	int _status;
 	byte *_palette;
+	byte *_basePalette;
 	int _palCounter;
 	byte _fadeToR, _fadeToG, _fadeToB;
 	int _fadeStep;
@@ -55,20 +60,6 @@ protected:
 	void fadeColor(byte *rgb, byte toR, byte toG, byte toB);
 };
 
-class Palette2 : public Palette {
-public:
-	Palette2(NeverhoodEngine *vm);
-	// TODO: Other ctors
-	Palette2(NeverhoodEngine *vm, uint32 fileHash);
-	virtual ~Palette2();
-	void copyBasePalette(int toIndex, int count, int fromIndex);
-	void addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex);
-	void startFadeToPalette(int counter);
-public:
-	byte *_basePalette;
-	void update();
-};
-
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_PALETTE_H */


Commit: 0ec039c5b05d03d470ae120e008c1577279ff6ed
    https://github.com/scummvm/scummvm/commit/0ec039c5b05d03d470ae120e008c1577279ff6ed
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Merge the three mouse classes into Mouse, introduce insertMouse433 etc. methods and use them

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/mouse.cpp
    engines/neverhood/mouse.h
    engines/neverhood/navigationscene.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 3eeef92..d0d7ec2 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -391,8 +391,8 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	_class650 = new DiskplayerSlot(_vm, this, 20, 0);
 	addEntity(_class650);
 
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x000408A8, 20, 620));
-	_mouseCursor->getSurface()->setVisible(false);
+	insertMouse435(0x000408A8, 20, 620);
+	showMouse(false);
 
 	_smackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true);
 	addEntity(_smackerPlayer);
@@ -457,7 +457,7 @@ void DiskplayerScene::update() {
 			}
 			_diskIndex = 0;
 			stop();
-			_mouseCursor->getSurface()->setVisible(true);
+			showMouse(true);
 			_flag3 = false;
 		}
 	}
@@ -480,7 +480,7 @@ void DiskplayerScene::update() {
 				_playButton->press();
 				_tuneInCountdown = 2;
 			} else {
-				_mouseCursor->getSurface()->setVisible(true);
+				showMouse(true);
 				_diskSlots[_diskIndex]->activate();
 			}
 		}
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index cf21536..4539b37 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -348,7 +348,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x4086520E);
 	_palette = new Palette(_vm, 0x4086520E);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x6520A400, NULL));
+	insertMouse433(0x6520A400);
 	
 	if (which < 0) {
 		setRectList(0x004B49F0);
@@ -1421,7 +1421,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_gameState.field2 = 0;
 	}
 
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL));
+	insertMouse433(0x23303124);
 
 	tempSprite = insertStaticSprite(0xB3242310, 825);
 	tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x;
@@ -1631,7 +1631,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF
 	setBackground(backgroundFileHash);
 	_palette = new Palette(_vm, backgroundFileHash);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620));
+	insertMouse435(cursorFileHash, 20, 620);
 }
 
 uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1701,7 +1701,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	addEntity(_palette);
 
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x03001504, NULL));
+	insertMouse433(0x03001504);
 
 	if (which < 0) {
 		setRectList(0x004B7C70);
@@ -1794,14 +1794,14 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette = new Palette(_vm, 0x2800E011);
 		_palette->usePalette();
 		insertStaticSprite(0x492D5AD7, 100);
-		_mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620));
+		insertMouse435(0x0E015288, 20, 620);
 	} else {
 		setBackground(0x8870A546);
 		_palette = new Palette(_vm, 0x8870A546);
 		_palette->usePalette();
 		insertStaticSprite(0x40D1E0A9, 100);
 		insertStaticSprite(0x149C00A6, 100);
-		_mouseCursor = addSprite(new Mouse435(_vm, 0x0A54288F, 20, 620));
+		insertMouse435(0x0A54288F, 20, 620);
 	}
 
 	drawTextToBackground();
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 3901f83..c050abc 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -783,7 +783,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x9A2C0409, NULL));
+	insertMouse433(0x9A2C0409);
 	
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011));
 	_vm->_collisionMan->addSprite(_asTape);
@@ -1168,7 +1168,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_paletteResource.load(0x60250EB5);
 	_paletteResource.copyPalette(_paletteData);
 
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x10ED160A, 20, 620));
+	insertMouse435(0x10ED160A, 20, 620);
 
 	for (int i = 0; i < 18; i++) {
 		_asTntItems[i] = addSprite(new AsScene1202TntItem(_vm, this, i));
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 189ee2c..af2390c 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -581,7 +581,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x420643C4);
 	_palette = new Palette(_vm, 0x420643C4);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL));
+	insertMouse433(0x643C0428);
 
 	_class595 = addSprite(new Class595(_vm, this));
 	_sprite1 = insertStaticSprite(0x942FC224, 300);
@@ -806,7 +806,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x01581A9C);
 	_palette = new Palette(_vm, 0x01581A9C);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x81A9801D, NULL));
+	insertMouse433(0x81A9801D);
 
 	if (!getGlobalVar(0xAC00C0D0)) {
 		_asBalloon = addSprite(new AsScene1303Balloon(_vm, this));
@@ -878,7 +878,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x062C0214);
 	_palette = new Palette(_vm, 0x062C0214);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL));
+	insertMouse433(0xC021006A);
 	
 	if (getGlobalVar(0xAC00C0D0)) {
 		_class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347));
@@ -949,7 +949,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x28801B64);
 	_palette = new Palette(_vm, 0x28801B64);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL));
+	insertMouse433(0x01B60280);
 
 	if (which < 0) {
 		InsertKlayman(KmScene1305, 212, 441);
@@ -1065,7 +1065,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x05303114);
 	_palette = new Palette(_vm, 0x05303114);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x0311005B, NULL));
+	insertMouse433(0x0311005B);
 
 	if (!getGlobalVar(0x13382860)) {
 		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 435, 445));
@@ -1472,7 +1472,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette = new Palette(_vm, 0xA8006200);
 	_palette->usePalette();
 	addEntity(_palette);
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x06204A88, 20, 620));
+	insertMouse435(0x06204A88, 20, 620);
 
 	tempSprite = insertStaticSprite(0x00A3621C, 800);
 	_clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x;
@@ -1790,7 +1790,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x41024202);
 	_palette = new Palette(_vm, 0x41024202);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x24206418, NULL));
+	insertMouse433(0x24206418);
 
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011));
 	_vm->_collisionMan->addSprite(_asTape);
@@ -1978,8 +1978,8 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	SetMessageHandler(&Scene1317::handleMessage);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x08284011, NULL));
-	_mouseCursor->getSurface()->setVisible(false);
+	insertMouse433(0x08284011);
+	showMouse(false);
 	_smackerFileHash = 0;
 	_smackerFlag1 = false;
 }
@@ -2086,7 +2086,7 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *
 }
 
 void Scene1317::stChooseKing() {
-	_mouseCursor->getSurface()->setVisible(true);
+	showMouse(true);
 	SetMessageHandler(&Scene1317::hmChooseKing);
 	SetUpdateHandler(&Scene1317::upChooseKing);
 	_smackerFileHash = 0x10982841;
@@ -2097,7 +2097,7 @@ void Scene1317::stChooseKing() {
 }
 
 void Scene1317::stNoDecisionYet() {
-	_mouseCursor->getSurface()->setVisible(false);
+	showMouse(false);
 	SetMessageHandler(&Scene1317::hmNoDecisionYet);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x20982841;
@@ -2105,7 +2105,7 @@ void Scene1317::stNoDecisionYet() {
 }
 
 void Scene1317::stHoborgAsKing() {
-	_mouseCursor->getSurface()->setVisible(false);
+	showMouse(false);
 	SetMessageHandler(&Scene1317::hmHoborgAsKing);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x40982841;
@@ -2113,7 +2113,7 @@ void Scene1317::stHoborgAsKing() {
 }
 
 void Scene1317::stKlaymanAsKing() {
-	_mouseCursor->getSurface()->setVisible(false);
+	showMouse(false);
 	SetMessageHandler(&Scene1317::hmKlaymanAsKing);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x80982841;
@@ -2121,7 +2121,7 @@ void Scene1317::stKlaymanAsKing() {
 }
 
 void Scene1317::stEndMovie() {
-	_mouseCursor->getSurface()->setVisible(false);
+	showMouse(false);
 	SetMessageHandler(&Scene1317::hmEndMovie);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x40800711;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 7f55272..d59cbd8 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -727,7 +727,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x08221FA5);
 	_palette = new Palette(_vm, 0x08221FA5);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x21FA108A, NULL));
+	insertMouse433(0x21FA108A);
 	
 	// TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0));
 	_class525 = addSprite(new Class525(_vm));
@@ -949,7 +949,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette = new Palette(_vm, 0x231482F0);
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x482F4239, NULL));
+	insertMouse433(0x482F4239);
 
 	_class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100));
 	_class454_2 = addSprite(new Class454(_vm, 0x10A02120, 1100));
@@ -976,7 +976,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(0x70A1189C)) {
 			_class482 = addSprite(new Class482(_vm, this, 1));
 			clearRectList();
-			_mouseCursor->getSurface()->setVisible(false);
+			showMouse(false);
 			sub428220();
 		} else {
 			_class482 = addSprite(new Class482(_vm, this, 0));
@@ -1056,7 +1056,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 			} else {
 				clearRectList();
 				_klayman->getSurface()->setVisible(false);
-				_mouseCursor->getSurface()->setVisible(false);
+				showMouse(false);
 				sendMessage(_class482, 0x2002, 0);
 				sub428220();
 			}
@@ -1071,7 +1071,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2000:
 		sub428230();
-		_mouseCursor->getSurface()->setVisible(true);
+		showMouse(true);
 		setRectList(0x004B0C48);
 		break;
 	case 0x2001:
@@ -1351,7 +1351,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x00442225);
 	_palette = new Palette(_vm, 0x00442225);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620));
+	insertMouse435(0x4222100C, 20, 620);
 
 	_asMouse = addSprite(new AsScene1407Mouse(_vm, this));
 	_ssResetButton = insertStaticSprite(0x12006600, 100);
@@ -1397,7 +1397,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 		// The mouse got the cheese (nomnom)
 		setGlobalVar(0x70A1189C, 1);
 		_soundResource.play(0x68E25540);
-		_mouseCursor->getSurface()->setVisible(false);
+		showMouse(false);
 		_puzzleSolvedCountdown = 72;
 		break;
 	}
@@ -1417,7 +1417,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x2110A234);
 	_palette = new Palette(_vm, 0x2110A234);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL));
+	insertMouse433(0x0A230219);
 
 	_class401_1 = insertStaticSprite(0x01102A33, 100);
 	_class401_1->getSurface()->setVisible(false);
@@ -1541,7 +1541,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette = new Palette(_vm, 0xAC0B006F);
 	_palette->addPalette(0x00801510, 0, 65, 0);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL));
+	insertMouse433(0xB006BAC8);
 
 	if (getGlobalVar(0x13382860) == 5) {
 		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411));
@@ -1755,7 +1755,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x0C0C007D);
 	_palette = new Palette(_vm, 0x0C0C007D);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse435(_vm, 0xC00790C8, 20, 620));
+	insertMouse435(0xC00790C8, 20, 620);
 	
 	// TODO: Some debug code: Leave two matching tiles open
 	for (int i = 0; i < 48; i++)
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 33e6908..2b0f25d 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -230,7 +230,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	addEntity(_palette);
 
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x18222039, NULL));
+	insertMouse433(0x18222039);
 
 	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0));
 	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1));
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index bedc9d4..cf7256b 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -125,7 +125,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0xA6417244);
 	_palette = new Palette(_vm, 0xA6417244);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL));
+	insertMouse433(0x17240A6C);
 
 	_class401 = insertStaticSprite(0x0D641724, 1100);
 
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 2219679..3bc3797 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -738,7 +738,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x40008208);
 	_palette = new Palette(_vm, 0x40008208);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x0820C408, NULL));
+	insertMouse433(0x0820C408);
 
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011));
 	_vm->_collisionMan->addSprite(_asTape); 
@@ -1122,7 +1122,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette = new Palette(_vm, 0x08100A0C);
 	_palette->usePalette();
 	addEntity(_palette);
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x00A08089, 20, 620));
+	insertMouse435(0x00A08089, 20, 620);
 
 	//DEBUG!
 	for (uint32 index = 0; index < 9; index++)
@@ -1351,7 +1351,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x82C80334);
 	_palette = new Palette(_vm, 0x82C80334);
 	_palette->usePalette();
-	_mouseCursor = addSprite(new Mouse433(_vm, 0x80330824, NULL));
+	insertMouse433(0x80330824);
 
 	_vm->_collisionMan->setHitRects(0x004B8320);
 
@@ -1515,7 +1515,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette = new Palette(_vm, 0x0008028D);
 		_palette->usePalette();
 		addEntity(_palette);
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x80289008, NULL));
+		insertMouse433(0x80289008);
 		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0);
 		addSprite(_ssLightSwitch);
 	} else {
@@ -1524,7 +1524,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette = new Palette(_vm, 0xD00A028D);
 		_palette->usePalette();
 		addEntity(_palette);
-		_mouseCursor = addSprite(new Mouse433(_vm, 0xA0289D08, NULL));
+		insertMouse433(0xA0289D08);
 		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0);
 		addSprite(_ssLightSwitch);
 	}
@@ -1571,16 +1571,14 @@ void Scene2205::update() {
 		_background->load(0x0008028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030);
 		sendMessage(_ssDoorFrame, 0x2000, 0);
-		((Mouse433*)_mouseCursor)->load(0x80289008);
-		((Mouse433*)_mouseCursor)->updateCursor();
+		changeMouseCursor(0x80289008);
 		_isLightOn = true;
 	} else if (_isLightOn && !getGlobalVar(0x4D080E54)) {
 		_palette->addPalette(0xD00A028D, 0, 256, 0);
 		_background->load(0xD00A028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84);
 		sendMessage(_ssDoorFrame, 0x2000, 0);
-		((Mouse433*)_mouseCursor)->load(0xA0289D08);
-		((Mouse433*)_mouseCursor)->updateCursor();
+		changeMouseCursor(0xA0289D08);
 		_isKlaymanInLight = true;
 		if (_klayman->getX() > 85) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
@@ -1782,7 +1780,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite4->getSurface()->getClipRect().y2 = 480;
 		setRectList(0x004B8AF8);
 		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0));
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x83212411, NULL));
+		insertMouse433(0x83212411);
 		_class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x5E00E262));
 		_class604 = addSprite(new Class604(_vm, 0x085E25E0));
 	} else {
@@ -1797,7 +1795,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite4->getSurface()->getClipRect().y2 = 480;
 		setRectList(0x004B8B58);
 		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0));
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x02A41E09, NULL));
+		insertMouse433(0x02A41E09);
 		_class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x52032563));
 		_class604 = addSprite(new Class604(_vm, 0x317831A0));
 	}
@@ -2296,7 +2294,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x88C00241);
 		_palette = new Palette(_vm, 0x88C00241);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL));
+		insertMouse433(0x00245884);
 	
 		_ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200);
 		_ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100);
@@ -2338,7 +2336,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x05C02A55);
 		_palette = new Palette(_vm, 0x05C02A55);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL));
+		insertMouse433(0x02A51054);
 
 		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
 
@@ -2537,7 +2535,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	addEntity(_palette); // Why?
 
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x0028D089, 40, 600));
+	insertMouse435(0x0028D089, 40, 600);
 	
 	createFontSurface();
 	
@@ -2712,7 +2710,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x11840E24);
 		_palette = new Palette(_vm, 0x11840E24);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x40E20110, NULL));
+		insertMouse433(0x40E20110);
 		setRectList(0x004B3DC8);
 	} else {
 		setBackground(0x25848E24);
@@ -2721,7 +2719,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 		addEntity(_palette);
 		_palette->copyBasePalette(0, 256, 0);
 		_palette->addPalette(0x68033B1C, 0, 65, 0);
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x48E20250, NULL));
+		insertMouse433(0x48E20250);
 		setRectList(0x004B3E18);
 	}
 
@@ -2850,13 +2848,13 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 		setBackground(_sceneInfo140->bgFilename2);
 		_palette = new Palette(_vm, _sceneInfo140->bgFilename2);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
+		insertMouse433(0x14320138);
 	} else {
 		setRectList(0x004B2BB8);
 		setBackground(_sceneInfo140->bgFilename1);
 		_palette = new Palette(_vm, _sceneInfo140->bgFilename1);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL));
+		insertMouse433(0x63A40028);
 	}
 
 	if (which < 0) {
@@ -2947,13 +2945,13 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x40339414);
 		_palette = new Palette(_vm, 0x40339414);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL));
+		insertMouse433(0x3941040B);
 	} else {
 		setRectList(0x004B55C8);
 		setBackground(0x071963E5);
 		_palette = new Palette(_vm, 0x071963E5);
 		_palette->usePalette();
-		_mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL));
+		insertMouse433(0x14320138);
 	}
 
 	if (which < 0) {
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 9bcd79a..c28d0eb 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -924,7 +924,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0xD000420C);
 	_palette = new Palette(_vm, 0xD000420C);
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620));
+	insertMouse435(0x04208D08, 20, 620);
 
 	_ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this));
 	_vm->_collisionMan->addSprite(_ssFireCannonButton);
@@ -1438,7 +1438,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (which == 0) {
-		_mouseCursor = addSprite(new Mouse435(_vm, 0x02622800, 20, 620));
+		insertMouse435(0x02622800, 20, 620);
 	}
 
 	_soundResource.load(0x68E25540);
@@ -1475,7 +1475,7 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
 		// TODO: Debug stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) {
 			if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) {
-				_mouseCursor->getSurface()->setVisible(false);
+				showMouse(false);
 				if (!_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) {
 					_countdown = 1;
 				} else {
@@ -1679,7 +1679,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->usePalette();
 	addEntity(_palette);
 
-	_mouseCursor = addSprite(new Mouse435(_vm, 0x24A00929, 20, 620));
+	insertMouse435(0x24A00929, 20, 620);
 
 	for (int i = 0; i < 12; i++) {
 		_asSymbols[i] = new AsScene3011Symbol(_vm, i, true);
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 1eaf0cb..03b1478 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -26,146 +26,66 @@ namespace Neverhood {
 
 // TODO: Use CursorMan
 
-Mouse433::Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect)
-	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0) {
+Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect)
+	: StaticSprite(vm, 2000), _mouseType(kMouseType433), 
+	_mouseCursorResource(vm), _frameNum(0) {
 	
-	debug(7, "Mouse433::Mouse433(%08X)", fileHash);
-	
-	if (mouseRect) {
-		_mouseRect = *mouseRect;
-	} else {
-		_mouseRect.x1 = -1;
-		_mouseRect.y1 = -1;
-		_mouseRect.x2 = -1;
-		_mouseRect.y2 = -1;
-	}
-	_mouseCursorResource.load(fileHash);
-	_x = _vm->getMouseX();	
-	_y = _vm->getMouseY();	
+	_mouseRect = mouseRect;
+	init(fileHash);
 	if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 &&
 		_y >= _mouseRect.y1 && _y <= _mouseRect.y2) {
 		_mouseCursorResource.setCursorNum(1);
 	} else {
 		_mouseCursorResource.setCursorNum(4);
 	}
-	createSurface(2000, 32, 32);
-	SetUpdateHandler(&Mouse433::update);
-	SetMessageHandler(&Mouse433::handleMessage);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = 32;
-	_drawRect.height = 32;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = 32;
-	_deltaRect.height = 32;
-	processDelta();
-	_needRefresh = true;
 	updateCursor();
 }
 
-void Mouse433::load(uint32 fileHash) {
-	_mouseCursorResource.load(fileHash);
-	_needRefresh = true;
-}
-
-void Mouse433::update() {
-	debug(7, "Mouse433::update()");
-	updateCursor();
-	_frameNum++;
-	if (_frameNum >= 6)
-		_frameNum = 0;
-	_needRefresh = _frameNum % 2 == 0;		
-}
-
-uint32 Mouse433::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug(7, "Mouse433::handleMessage(%04X)", messageNum);
-	uint32 messageResult = 0;
-	if (messageNum != 5) {
-		messageResult = Sprite::handleMessage(messageNum, param, sender);
-		switch (messageNum) {
-		case 0x4002:
-			_x = param.asPoint().x;
-			_y = param.asPoint().y;
-			if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 &&
-				_y >= _mouseRect.y1 && _y <= _mouseRect.y2) {
-				_mouseCursorResource.setCursorNum(1);
-			} else {
-				_mouseCursorResource.setCursorNum(4);
-			}
-			processDelta();
-			break;
-		}
-	} else {
-		// TODO: Debug stuff
-	}
-	return messageResult;
-}
-
-void Mouse433::updateCursor() {
-	debug(7, "Mouse433::updateCursor()");
+Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
+	: StaticSprite(vm, 2000), _mouseType(kMouseType435),
+	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
 	
-	if (!_surface)
-		return;
-
-	if (_doDeltaX) {
-		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
-	} else {
-		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
-	}
-
-	if (_doDeltaY) {
-		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
+	init(fileHash);
+	if (_x <= _x1) {
+		_mouseCursorResource.setCursorNum(6);
+	} else if (_x >= _x2) {
+		_mouseCursorResource.setCursorNum(5);
 	} else {
-		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+		_mouseCursorResource.setCursorNum(4);
 	}
+	updateCursor();
+}
 
-	if (_needRefresh) {
-		_needRefresh = false;
-		_drawRect = _mouseCursorResource.getRect();
-		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
-	}
+Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int type)
+	: StaticSprite(vm, 2000), _mouseType(kMouseTypeNavigation),
+	_mouseCursorResource(vm), _type(type), _frameNum(0) {
 
+	init(fileHash);
+	_mouseCursorResource.setCursorNum(0);
 }
 
-Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
-	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
-	
-	debug(7, "Mouse435::Mouse435(%08X)", fileHash);
-	
+void Mouse::init(uint32 fileHash) {
 	_mouseCursorResource.load(fileHash);
 	_x = _vm->getMouseX();	
-	_y = _vm->getMouseY();
-	if (_x <= _x1) {
-		_mouseCursorResource.setCursorNum(6);
-	} else if (_x >= _x2) {
-		_mouseCursorResource.setCursorNum(5);
-	} else {
-		_mouseCursorResource.setCursorNum(4);
-	}
+	_y = _vm->getMouseY();	
 	createSurface(2000, 32, 32);
-	SetUpdateHandler(&Mouse435::update);
-	SetMessageHandler(&Mouse435::handleMessage);
+	SetUpdateHandler(&Mouse::update);
+	SetMessageHandler(&Mouse::handleMessage);
 	_drawRect.x = 0;
 	_drawRect.y = 0;
 	_drawRect.width = 32;
 	_drawRect.height = 32;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = 32;
-	_deltaRect.height = 32;
+	_deltaRect = _drawRect;
 	processDelta();
 	_needRefresh = true;
-	updateCursor();
 }
 
-void Mouse435::load(uint32 fileHash) {
+void Mouse::load(uint32 fileHash) {
 	_mouseCursorResource.load(fileHash);
 	_needRefresh = true;
 }
 
-void Mouse435::update() {
-	debug(7, "Mouse435::update()");
+void Mouse::update() {
 	updateCursor();
 	_frameNum++;
 	if (_frameNum >= 6)
@@ -173,22 +93,61 @@ void Mouse435::update() {
 	_needRefresh = _frameNum % 2 == 0;		
 }
 
-uint32 Mouse435::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug(7, "Mouse435::handleMessage(%04X)", messageNum);
+uint32 Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug(7, "Mouse::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	if (messageNum != 5) {
 		messageResult = Sprite::handleMessage(messageNum, param, sender);
 		switch (messageNum) {
-		case 0x4002:
+		case 0x2064:
 			_x = param.asPoint().x;
 			_y = param.asPoint().y;
-			if (_x <= _x1) {
-				_mouseCursorResource.setCursorNum(6);
-			} else if (_x >= _x2) {
-				_mouseCursorResource.setCursorNum(5);
-			} else {
-				_mouseCursorResource.setCursorNum(4);
+			switch (_type) {
+			case 1:
+				if (_x >= 320)
+					messageResult = 1;
+				else				
+					messageResult = 0;
+				break;
+			case 2:
+			default:
+				if (_x < 100)
+					messageResult = 0;
+				else if (_x > 540)				
+					messageResult = 1;
+				else				
+					messageResult = 2;
+				break;
+			case 3:
+				if (_x < 100)
+					messageResult = 0;
+				else if (_x > 540)				
+					messageResult = 1;
+				else				
+					messageResult = 4;
+				break;
+			case 4:
+				if (_x < 100)
+					messageResult = 0;
+				else if (_x > 540)				
+					messageResult = 1;
+				else if (_y >= 150)				
+					messageResult = 2;
+				else				
+					messageResult = 3;
+				break;
+			case 5:
+				if (_y >= 240)
+					messageResult = 4;
+				else				
+					messageResult = 3;
+				break;
 			}
+			break;
+		case 0x4002:
+			_x = param.asPoint().x;
+			_y = param.asPoint().y;
+			updateCursorNum();
 			processDelta();
 			break;
 		}
@@ -198,8 +157,7 @@ uint32 Mouse435::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Mouse435::updateCursor() {
-	debug(7, "Mouse435::updateCursor()");
+void Mouse::updateCursor() {
 	
 	if (!_surface)
 		return;
@@ -224,91 +182,26 @@ void Mouse435::updateCursor() {
 
 }
 
-// NavigationMouse
-
-NavigationMouse::NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type)
-	: StaticSprite(vm, 2000), _mouseCursorResource(vm), _type(type), _frameNum(0) {
-
-	_mouseCursorResource.load(fileHash);
-	_mouseCursorResource.setCursorNum(0);
-	_x = _vm->getMouseX();	
-	_y = _vm->getMouseY();
-	createSurface(2000, 32, 32);
-	SetUpdateHandler(&NavigationMouse::update);
-	SetMessageHandler(&NavigationMouse::handleMessage);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = 32;
-	_drawRect.height = 32;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = 32;
-	_deltaRect.height = 32;
-	processDelta();
-	_needRefresh = true;
-	updateCursor();
-}
-
-void NavigationMouse::update() {
-	updateCursor();
-	_frameNum++;
-	if (_frameNum >= 6)
-		_frameNum = 0;
-	_needRefresh = _frameNum % 2 == 0;		
-}
-
-uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("NavigationMouse: _type = %d", _type);
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2064:
-		_x = param.asPoint().x;
-		_y = param.asPoint().y;
-		switch (_type) {
-		case 1:
-			if (_x >= 320)
-				messageResult = 1;
-			else				
-				messageResult = 0;
-			break;
-		case 2:
-		default:
-			if (_x < 100)
-				messageResult = 0;
-			else if (_x > 540)				
-				messageResult = 1;
-			else				
-				messageResult = 2;
-			break;
-		case 3:
-			if (_x < 100)
-				messageResult = 0;
-			else if (_x > 540)				
-				messageResult = 1;
-			else				
-				messageResult = 4;
-			break;
-		case 4:
-			if (_x < 100)
-				messageResult = 0;
-			else if (_x > 540)				
-				messageResult = 1;
-			else if (_y >= 150)				
-				messageResult = 2;
-			else				
-				messageResult = 3;
-			break;
-		case 5:
-			if (_y >= 240)
-				messageResult = 4;
-			else				
-				messageResult = 3;
-			break;
+void Mouse::updateCursorNum() {
+	switch (_mouseType) {
+	case kMouseType433:
+		if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 &&
+			_y >= _mouseRect.y1 && _y <= _mouseRect.y2) {
+			_mouseCursorResource.setCursorNum(1);
+		} else {
+			_mouseCursorResource.setCursorNum(4);
 		}
 		break;
-	case 0x4002:
-		_x = param.asPoint().x;
-		_y = param.asPoint().y;
+	case kMouseType435:
+		if (_x <= _x1) {
+			_mouseCursorResource.setCursorNum(6);
+		} else if (_x >= _x2) {
+			_mouseCursorResource.setCursorNum(5);
+		} else {
+			_mouseCursorResource.setCursorNum(4);
+		}
+		break;
+	case kMouseTypeNavigation:
 		switch (_type) {
 		case 1:
 			if (_x >= 320)
@@ -348,36 +241,9 @@ uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam &param,
 				_mouseCursorResource.setCursorNum(3);
 			break;
 		}
-		_needRefresh = true;
-		processDelta();
 		break;
 	}
-	return messageResult;
-}
-
-void NavigationMouse::updateCursor() {
-
-	if (!_surface)
-		return;
-
-	if (_doDeltaX) {
-		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
-	} else {
-		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
-	}
-
-	if (_doDeltaY) {
-		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
-	} else {
-		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
-	}
-
-	if (_needRefresh) {
-		_needRefresh = false;
-		_drawRect = _mouseCursorResource.getRect();
-		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
-	}
-
+	
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index 65dcb27..0b4f6b8 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -30,43 +30,30 @@
 
 namespace Neverhood {
 
-class Mouse433 : public StaticSprite {
-public:
-	Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect);
-	void load(uint32 fileHash);
-	void updateCursor();
-protected:
-	MouseCursorResource _mouseCursorResource;
-	int _frameNum;
-	NRect _mouseRect;	
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+enum MouseType {
+	kMouseType433,
+	kMouseType435,
+	kMouseTypeNavigation
 };
 
-class Mouse435 : public StaticSprite {
+class Mouse : public StaticSprite {
 public:
-	Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2);
+	Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect);
+	Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2);
+	Mouse(NeverhoodEngine *vm, uint32 fileHash, int _type);
 	void load(uint32 fileHash);
 	void updateCursor();
 protected:
+	MouseType _mouseType;
 	MouseCursorResource _mouseCursorResource;
 	int _frameNum;
+	NRect _mouseRect;
 	int16 _x1;
 	int16 _x2;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class NavigationMouse : public StaticSprite {
-public:
-	NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type);
-	void load(uint32 fileHash);
-	void updateCursor();
-protected:
-	MouseCursorResource _mouseCursorResource;
-	int _frameNum;
 	int _type;
+	void init(uint32 fileHash);	
 	void update();
+	void updateCursorNum();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 6b36571..7a3161c 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -73,7 +73,7 @@ int NavigationScene::getNavigationAreaType() {
 
 void NavigationScene::update() {
 	if (_smackerFileHash != 0) {
-		_mouseCursor->getSurface()->setVisible(false);
+		showMouse(false);
 		_smackerPlayer->open(_smackerFileHash, false);
 		_vm->_screen->clear();
 		_smackerDone = false;
@@ -84,7 +84,7 @@ void NavigationScene::update() {
 		} else {
 			const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
 			createMouseCursor();
-			_mouseCursor->getSurface()->setVisible(true);
+			showMouse(true);
 			_soundFlag2 = false;
 			_soundFlag1 = false;
 			_interactive = true;
@@ -127,7 +127,7 @@ void NavigationScene::createMouseCursor() {
 	int areaType;
 
 	if (_mouseCursor) {
-		deleteSprite(&_mouseCursor);
+		deleteSprite((Sprite**)&_mouseCursor);
 	}
 
 	mouseCursorFileHash = navigationItem.mouseCursorFileHash;
@@ -143,7 +143,7 @@ void NavigationScene::createMouseCursor() {
 		areaType = 1;
 	}
 
-	_mouseCursor = addSprite(new NavigationMouse(_vm, mouseCursorFileHash, areaType));
+	insertNavigationMouse(mouseCursorFileHash, areaType);
 	sendPointMessage(_mouseCursor, 0x4002, _vm->getMousePos());
 	
 }
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index c6f9f12..5072d53 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -190,6 +190,33 @@ Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
 	return addSprite(new StaticSprite(_vm, fileHash, surfacePriority));
 }
 
+void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) {
+	NRect rect(-1, -1, -1, -1);
+	if (mouseRect)
+		rect = *mouseRect;
+	_mouseCursor = new Mouse(_vm, 0x0820C408, rect);
+	addSprite(_mouseCursor);
+}
+
+void Scene::insertMouse435(uint32 fileHash, int16 x1, int16 x2) {
+	_mouseCursor = new Mouse(_vm, fileHash, x1, x2);
+	addSprite(_mouseCursor);
+}
+
+void Scene::insertNavigationMouse(uint32 fileHash, int type) {
+	_mouseCursor = new Mouse(_vm, fileHash, type);
+	addSprite(_mouseCursor);
+}
+
+void Scene::showMouse(bool visible) {
+	_mouseCursor->getSurface()->setVisible(visible);
+}
+
+void Scene::changeMouseCursor(uint32 fileHash) {
+	_mouseCursor->load(fileHash);
+	_mouseCursor->updateCursor();
+}
+
 SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) {
 	addEntity(smackerPlayer);
 	addSurface(smackerPlayer->getSurface());
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 9b928bb..31dd61d 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -56,6 +56,11 @@ public:
 	void setBackground(uint32 fileHash, bool dirtyBackground = true);
 	void changeBackground(uint32 fileHash);
 	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
+	void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL);
+	void insertMouse435(uint32 fileHash, int16 x1, int16 x2);
+	void insertNavigationMouse(uint32 fileHash, int type);
+	void showMouse(bool visible);
+	void changeMouseCursor(uint32 fileHash);
 	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
 protected:
@@ -74,7 +79,7 @@ protected:
 	HitRectList _hitRectList;
 	int _rectType;
 	// TODO 0000008E field_8E		dw ?
-	Sprite *_mouseCursor;
+	Mouse *_mouseCursor;
 	Klayman *_klayman;
 	Palette *_palette;
 	Background *_background;


Commit: a4c34cedd5b7e97104cfb53b90f9808c4204dcf1
    https://github.com/scummvm/scummvm/commit/a4c34cedd5b7e97104cfb53b90f9808c4204dcf1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Merge createSceneXXX/updateSceneXXX methods into createScene and updateScene for Module1200

Changed paths:
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h



diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index c050abc..ff04937 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -33,21 +33,11 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
 	debug("Module1200: which = %d", which);
 	
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 0:
-			createScene1201(-1);
-			break;
-		case 1:
-			createScene1202(-1);
-			break;
-		case 2:
-			createScene1203(-1);
-			break;
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 1) {
-		createScene1201(2);
+		createScene(0, 2);
 	} else {
-		createScene1201(0);
+		createScene(0, 0);
 	}
 
 	// TODO Music18hList_add(0x00478311, 0x62222CAE);
@@ -58,58 +48,53 @@ Module1200::~Module1200() {
 	// TODO Music18hList_deleteGroup(0x00478311);
 }
 
-void Module1200::createScene1201(int which) {
-	_vm->gameState().sceneNum = 0;
-	_childObject = new Scene1201(_vm, this, which);
-	SetUpdateHandler(&Module1200::updateScene1201);
-}
-			
-void Module1200::createScene1202(int which) {
-	_vm->gameState().sceneNum = 1;
-	_childObject = new Scene1202(_vm, this, which);
-	SetUpdateHandler(&Module1200::updateScene1202);
-}
-
-void Module1200::createScene1203(int which) {
-	_vm->gameState().sceneNum = 2;
-	// TODO Music18hList_stop(0x62222CAE, 0, 0);
-	createSmackerScene(0x31890001, true, true, false);
-	setGlobalVar(0x2A02C07B, 1);
-	SetUpdateHandler(&Module1200::updateScene1203);
+void Module1200::createScene(int sceneNum, int which) {
+	debug("Module1200::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_childObject = new Scene1201(_vm, this, which);
+		break;
+	case 1:
+		_childObject = new Scene1202(_vm, this, which);
+		break;
+	case 2:
+		// TODO Music18hList_stop(0x62222CAE, 0, 0);
+		createSmackerScene(0x31890001, true, true, false);
+		setGlobalVar(0x2A02C07B, 1);
+		break;
+	}
+	SetUpdateHandler(&Module1200::updateScene);
+	_childObject->handleUpdate();
 }
 
-void Module1200::updateScene1201() {
+void Module1200::updateScene() {
 	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1202(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
-				createScene1203(-1);
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(1, 0);
+			} else if (_moduleResult == 2) {
+				if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
+					createScene(2, -1);
+				} else {
+					sendMessage(_parentModule, 0x1009, 1);
+				}
 			} else {
-				sendMessage(_parentModule, 0x1009, 1);
+				sendMessage(_parentModule, 0x1009, 0);
 			}
-		} else {
-			sendMessage(_parentModule, 0x1009, 0);
+			break;
+		case 1:
+			createScene(0, 1);
+			break;
+		case 2:
+			// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
+			createScene(0, 3);
+			break;
 		}
 	}
 }
 
-void Module1200::updateScene1202() {
-	if (!updateChild()) {
-		createScene1201(1);
-		_childObject->handleUpdate();
-	}
-}
-			
-void Module1200::updateScene1203() {
-	if (!updateChild()) {
-		createScene1201(3);
-		_childObject->handleUpdate();
-		// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
-	}
-}
-
 // Scene1201
 
 static const uint32 kScene1201InitArray[] = {
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index df1ed41..a34bd95 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -36,13 +36,8 @@ public:
 	Module1200(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1200();
 protected:
-	// TODO ResourceTable _resourceTable;
-	void createScene1201(int which);			
-	void createScene1202(int which);			
-	void createScene1203(int which);			
-	void updateScene1201();			
-	void updateScene1202();			
-	void updateScene1203();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene1201


Commit: 17ad070a9c6c0fd86d1f60d90b331eb59b19cf7b
    https://github.com/scummvm/scummvm/commit/17ad070a9c6c0fd86d1f60d90b331eb59b19cf7b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:39-07:00

Commit Message:
NEVERHOOD: Move createSceneXXX/updateSceneXXX methods

They are merged into createScene and updateScene for the other already
implemented modules (I hope I didn't break too much :)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h
    engines/neverhood/module1500.cpp
    engines/neverhood/module1500.h
    engines/neverhood/module1700.cpp
    engines/neverhood/module1700.h
    engines/neverhood/module1800.cpp
    engines/neverhood/module1800.h
    engines/neverhood/module2000.cpp
    engines/neverhood/module2000.h
    engines/neverhood/module2300.cpp
    engines/neverhood/module2300.h
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 103d53d..e6bd99e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -276,7 +276,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule2000(-1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 4;
 	createModule2200(-1);
 #endif
@@ -284,6 +284,10 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule1000(-1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 12;
+	createModule3000(-1);
+#endif
 }
 
 void GameModule::createModule1000(int which) {
@@ -375,7 +379,6 @@ void GameModule::createModule1700(int which) {
 
 void GameModule::updateModule1700() {
 	if (!updateChild()) {
-		debug("Module1700 done; _moduleResult = %d", _moduleResult);
 		if (_moduleResult == 1) {
 			// TODO createModule2900(3);
 			// TODO _childObject->handleUpdate();
@@ -401,8 +404,8 @@ void GameModule::updateModule1800() {
 			// TODO createModule2700(0);
 			// TODO _childObject->handleUpdate();
 		} else if (_moduleResult == 3) {
-			// TODO createModule3000(3);
-			// TODO _childObject->handleUpdate();
+			createModule3000(3);
+			_childObject->handleUpdate();
 		} else {
 			// TODO createModule2800(0);
 			// TODO _childObject->handleUpdate();
@@ -451,7 +454,7 @@ void GameModule::updateModule2300() {
 		} else if (_moduleResult == 3) {
 			// TODO createModule2400(0);
 		} else if (_moduleResult == 4) {
-			// TODO createModule3000(0);
+			createModule3000(0);
 		} else {
 			createModule1000(1);
 		}
@@ -480,8 +483,8 @@ void GameModule::updateModule3000() {
 			createModule1800(3);
 			_childObject->handleUpdate();
 		} else if (_moduleResult == 4) {
-			// TODO createModule3000(0);
-			// TODO _childObject->handleUpdate();
+			createModule3000(0);
+			_childObject->handleUpdate();
 		} else {
 			createModule2300(4);
 			_childObject->handleUpdate();
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 78775ce..c58c924 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -28,7 +28,7 @@ namespace Neverhood {
 
 Module::Module(NeverhoodEngine *vm, Module *parentModule)
 	: Entity(vm, 0), _parentModule(parentModule), _childObject(NULL),
-	_done(false) {
+	_done(false), _sceneType(kSceneTypeNormal) {
 	
 	SetMessageHandler(&Module::handleMessage);
 	
@@ -71,11 +71,13 @@ NavigationScene *Module::navigationScene() {
 }
 
 void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes) {
+	_sceneType = kSceneTypeNavigation;
 	_childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes);
 }
 
 void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort) {
 	SmackerScene *smackerScene;
+	_sceneType = kSceneTypeSmacker;
 	smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort);
 	smackerScene->setFileHash(fileHash);
 	smackerScene->nextVideo();
@@ -87,8 +89,12 @@ bool Module::updateChild() {
 		_childObject->handleUpdate();
 		if (_done) {
 			_done = false;
+			// Save the last area type if it's a NavigationScene for further processing
+			if (_sceneType == kSceneTypeNavigation)
+				_navigationAreaType = navigationScene()->getNavigationAreaType();
 			delete _childObject;
 			_childObject = NULL;
+			_sceneType = kSceneTypeNormal;
 			return false;
 		}
 	}
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 2f272d7..c0fdaa7 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -38,6 +38,12 @@ namespace Neverhood {
 
 class NavigationScene;
 
+enum SceneType {
+	kSceneTypeNormal,
+	kSceneTypeSmacker,
+	kSceneTypeNavigation
+};
+
 class Module : public Entity {
 public:
 	Module(NeverhoodEngine *vm, Module *parentModule);
@@ -48,6 +54,8 @@ protected:
 	Entity *_childObject;
 	bool _done;
 	uint32 _moduleResult;
+	SceneType _sceneType;
+	int _navigationAreaType;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	NavigationScene *navigationScene();
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index af2390c..518568c 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -35,8 +35,6 @@ namespace Neverhood {
 Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	debug("Create Module1300(%d)", which);
-
 	// TODO Music18hList_add(0x61C090, 0x203197);
 	// TODO Sound1ChList_addSoundResources(0x61C090, dword_4B2868, true);
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, 0, 50, 600, 20, 150);
@@ -45,406 +43,250 @@ Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Sound1ChList_setVolume(0x50399F64, 70);
 
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
+		if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17)
+			createScene(_vm->gameState().sceneNum, -1);
+		else			
+			createScene(11, 0);
+	} else {
+		switch (which) {
+		case 0:
+			createScene(11, 0);
+			break;
 		case 1:
-			createScene1302(-1);
+			createScene(13, 0);
 			break;
 		case 2:
-			createScene1303(-1);
+			createScene(14, 0);
 			break;
 		case 3:
-			createScene1304(-1);
+			createScene(15, 0);
 			break;
 		case 4:
-			createScene1305(-1);
+			createScene(7, 0);
 			break;
 		case 5:
-			createScene1306(-1);
+			createScene(5, 1);
 			break;
 		case 6:
-			createScene1307(-1);
+			createScene(5, 5);
 			break;
 		case 7:
-			createScene1308(-1);
+			createScene(3, 0);
 			break;
 		case 8:
-			createScene1309(-1);
+			createScene(1, 0);
 			break;
 		case 9:
-			createScene1310(-1);
+			createScene(2, 0);
 			break;
 		case 10:
-			createScene1311(-1);
+			createScene(6, 0);
 			break;
 		case 11:
-			createScene1312(-1);
-			break;
-		case 12:
-			createScene1313(-1);
-			break;
-		case 13:
-			createScene1314(-1);
-			break;
-		case 14:
-			createScene1315(-1);
-			break;
-		case 15:
-			createScene1316(-1);
-			break;
-		case 16:
-			createScene1317(-1);
-			break;
-		case 17:
-			createScene1318(-1);
+			createScene(4, 0);
 			break;
 		default:
-			createScene1312(0);
-		}
-	} else {
-		switch (which) {
-		case 0:
-			createScene1312(0);
+			createScene(12, 0);
 			break;
+		}
+	}
+	
+}
+
+Module1300::~Module1300() {
+	// TODO Sound1ChList_sub_407A50(0x61C090);
+}
+
+void Module1300::createScene(int sceneNum, int which) {
+	debug("Module1300::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 1:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		_childObject = new Scene1302(_vm, this, which);
+		break;
+	case 2:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		_childObject = new Scene1303(_vm, this, which);
+		break;
+	case 3:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		_childObject = new Scene1304(_vm, this, which);
+		break;
+	case 4:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		_childObject = new Scene1305(_vm, this, which);
+		break;
+	case 5:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		_childObject = new Scene1306(_vm, this, which);
+		break;
+	case 6:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		_childObject = new Scene1307(_vm, this, which);
+		break;
+	case 7:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		_childObject = new Scene1308(_vm, this, which);
+		break;
+	case 8:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		_childObject = new DiskplayerScene(_vm, this, 1);
+		break;
+	case 9:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createSmackerScene(0x20082818, true, true, false);
+		break;
+	case 10:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createSmackerScene(0x20082828, true, true, false);
+		break;
+	case 11:
+		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createNavigationScene(0x004B27A8, which);
+		break;
+	case 12:
+		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createNavigationScene(0x004B2718, which);
+		break;
+	case 13:
+		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createNavigationScene(0x004B27D8, which);
+		break;
+	case 14:
+		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createNavigationScene(0x004B2808, which);
+		break;
+	case 15:
+		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		createNavigationScene(0x004B2838, which);
+		break;
+	case 16:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO Music18hList_stop(0x203197, 0, 2);
+		_childObject = new Scene1317(_vm, this, which);
+		break;
+	case 17:
+		// TODO: Credits scene
+		break;
+	}
+	SetUpdateHandler(&Module1300::updateScene);
+	_childObject->handleUpdate();
+}
+			
+void Module1300::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
 		case 1:
-			createScene1314(0);
+			if (_moduleResult == 1) {
+				createScene(4, 0);
+			} else {
+				createScene(7, 1);
+			}
 			break;
 		case 2:
-			createScene1315(0);
+			createScene(5, 3);
 			break;
 		case 3:
-			createScene1316(0);
+			createScene(15, 0);
 			break;
 		case 4:
-			createScene1308(0);
+			createScene(16, -1);
 			break;
 		case 5:
-			createScene1306(1);
+			if (_moduleResult == 2) {
+				createScene(8, 0);
+			} else if (_moduleResult == 3) {
+				createScene(2, 0);
+			} else if (_moduleResult == 0) {
+				sendMessage(_parentModule, 0x1009, 0);
+			} else if (_moduleResult == 1) {
+				createScene(10, -1);
+			}
 			break;
 		case 6:
-			createScene1306(5);
+			createScene(7, 2);
 			break;
 		case 7:
-			createScene1304(0);
+			if (_moduleResult == 0) {
+				createScene(13, 0);
+			} else if (_moduleResult == 1) {
+				createScene(1, 0);
+			} else if (_moduleResult == 2) {
+				createScene(6, 0);
+			}
 			break;
 		case 8:
-			createScene1302(0);
+			createScene(5, 2);
 			break;
 		case 9:
-			createScene1303(0);
+			createScene(5, 0);
 			break;
 		case 10:
-			createScene1307(0);
+			createScene(14, 0);
 			break;
 		case 11:
-			createScene1305(0);
+			if (_moduleResult == 0)
+				createScene(12, 0);
+			else if (_moduleResult == 1)
+				createScene(11, 1);
 			break;
-		default:
-			createScene1313(0);
+		case 12:
+			if (_moduleResult == 0) 
+				createScene(14, 1);
+			else if (_moduleResult == 1)
+				createScene(15, 1);
+			else if (_moduleResult == 3)
+				createScene(11, 1);
+			else if (_moduleResult == 5)
+				createScene(13, 1);
 			break;
-		}
-	}
-	
-}
-
-Module1300::~Module1300() {
-	// TODO Sound1ChList_sub_407A50(0x61C090);
-}
-
-void Module1300::createScene1302(int which) {
-	_vm->gameState().sceneNum = 1;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_play(0x203197, 0, 2, 1);
-	_childObject = new Scene1302(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1302);
-}
-			
-void Module1300::createScene1303(int which) {
-	_vm->gameState().sceneNum = 2;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-	_childObject = new Scene1303(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1303);
-}
-			
-void Module1300::createScene1304(int which) {
-	_vm->gameState().sceneNum = 3;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-	_childObject = new Scene1304(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1304);
-}
-			
-void Module1300::createScene1305(int which) {
-	_vm->gameState().sceneNum = 4;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_play(0x203197, 0, 2, 1);
-	_childObject = new Scene1305(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1305);
-}
-			
-void Module1300::createScene1306(int which) {
-	_vm->gameState().sceneNum = 5;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_play(0x203197, 0, 2, 1);
-	_childObject = new Scene1306(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1306);
-}
-			
-void Module1300::createScene1307(int which) {
-	_vm->gameState().sceneNum = 6;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_play(0x203197, 0, 2, 1);
-	_childObject = new Scene1307(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1307);
-}
-			
-void Module1300::createScene1308(int which) {
-	_vm->gameState().sceneNum = 7;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_play(0x203197, 0, 2, 1);
-	_childObject = new Scene1308(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1308);
-}
-			
-void Module1300::createScene1309(int which) {
-	_vm->gameState().sceneNum = 8;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-	_childObject = new DiskplayerScene(_vm, this, 1);
-	SetUpdateHandler(&Module1300::updateScene1309);
-}
-			
-void Module1300::createScene1310(int which) {
-	_vm->gameState().sceneNum = 9;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-	createSmackerScene(0x20082818, true, true, false);
-	SetUpdateHandler(&Module1300::updateScene1310);
-}
-			
-void Module1300::createScene1311(int which) {
-	_vm->gameState().sceneNum = 10;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-	createSmackerScene(0x20082828, true, true, false);
-	SetUpdateHandler(&Module1300::updateScene1310);
-}
-			
-void Module1300::createScene1312(int which) {
-	_vm->gameState().sceneNum = 11;
-	createNavigationScene(0x004B27A8, which);
-	SetUpdateHandler(&Module1300::updateScene1312);
-	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-}
-			
-void Module1300::createScene1313(int which) {
-	_vm->gameState().sceneNum = 12;
-	createNavigationScene(0x004B2718, which);
-	SetUpdateHandler(&Module1300::updateScene1313);
-	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-}
-			
-void Module1300::createScene1314(int which) {
-	_vm->gameState().sceneNum = 13;
-	createNavigationScene(0x004B27D8, which);
-	SetUpdateHandler(&Module1300::updateScene1314);
-	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-}
-			
-void Module1300::createScene1315(int which) {
-	_vm->gameState().sceneNum = 14;
-	createNavigationScene(0x004B2808, which);
-	SetUpdateHandler(&Module1300::updateScene1315);
-	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-}
-			
-void Module1300::createScene1316(int which) {
-	_vm->gameState().sceneNum = 15;
-	createNavigationScene(0x004B2838, which);
-	SetUpdateHandler(&Module1300::updateScene1316);
-	// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-}
-			
-void Module1300::createScene1317(int which) {
-	_vm->gameState().sceneNum = 16;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-	// TODO Music18hList_stop(0x203197, 0, 2);
-	_childObject = new Scene1317(_vm, this, which);
-	SetUpdateHandler(&Module1300::updateScene1317);
-}
-			
-void Module1300::createScene1318(int which) {
-	// TODO: Credits scene
-}
-			
-void Module1300::updateScene1302() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1305(0);
-		} else {
-			createScene1308(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1303() {
-	if (!updateChild()) {
-		createScene1306(3);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1304() {
-	if (!updateChild()) {
-		createScene1316(0);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1305() {
-	if (!updateChild()) {
-		createScene1317(-1);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1306() {
-	if (!updateChild()) {
-		if (_moduleResult == 2) {
-			createScene1309(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 3) {
-			createScene1303(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 0) {
-			sendMessage(_parentModule, 0x1009, 0);
-		} else if (_moduleResult == 1) {
-			createScene1311(-1);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void Module1300::updateScene1307() {
-	if (!updateChild()) {
-		createScene1308(2);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1308() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1314(0);
-		} else if (_moduleResult == 1) {
-			createScene1302(0);
-		} else if (_moduleResult == 2) {
-			createScene1307(0);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1309() {
-	if (!updateChild()) {
-		createScene1306(2);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1310() {
-	if (!updateChild()) {
-		if (_vm->gameState().sceneNum == 9)
-			createScene1306(0);
-		else
-			createScene1315(0);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1311() {
-}
-
-void Module1300::updateScene1312() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1313(0);
-		} else if (_moduleResult == 1) {
-			createScene1312(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1313() {
-	if (!updateChild()) {
-		switch (_moduleResult) {
-		case 0:
-			createScene1315(1);
+		case 13:
+			if (_moduleResult == 0) {
+				createScene(12, 2);
+			} else if (_moduleResult == 1) {
+				createScene(7, 0);
+			}
 			break;
-		case 1:
-			createScene1316(1);
+		case 14:
+			if (_moduleResult == 0) {
+				createScene(12, 3);
+			} else if (_moduleResult == 1) {
+				createScene(9, -1);
+			}
 			break;
-		case 3:
-			createScene1312(1);
+		case 15:
+			if (_moduleResult == 0) {
+				createScene(12, 4);
+			} else if (_moduleResult == 1) {
+				createScene(3, 0);
+			}
 			break;
-		case 5:
-			createScene1314(1);
+		case 16:
+			createScene(17, -1);
+			break;
+		case 17:
+			// TODO
 			break;
 		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1314() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1313(2);
-		} else if (_moduleResult == 1) {
-			createScene1308(0);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1315() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1313(3);
-		} else if (_moduleResult == 1) {
-			createScene1310(-1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1316() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1313(4);
-		} else if (_moduleResult == 1) {
-			createScene1304(0);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1300::updateScene1317() {
-	if (!updateChild()) {
-		createScene1318(-1);
-		_childObject->handleUpdate();
 	}
 }
 
-void Module1300::updateScene1318() {
-}
-
 AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene) {
 
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 0e9837c..27e2540 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -38,40 +38,8 @@ public:
 	virtual ~Module1300();
 protected:
 	uint32 _musicFileHash;
-	void createScene1302(int which);			
-	void createScene1303(int which);			
-	void createScene1304(int which);			
-	void createScene1305(int which);			
-	void createScene1306(int which);			
-	void createScene1307(int which);			
-	void createScene1308(int which);			
-	void createScene1309(int which);			
-	void createScene1310(int which);			
-	void createScene1311(int which);			
-	void createScene1312(int which);			
-	void createScene1313(int which);			
-	void createScene1314(int which);			
-	void createScene1315(int which);			
-	void createScene1316(int which);			
-	void createScene1317(int which);			
-	void createScene1318(int which);			
-	void updateScene1302();			
-	void updateScene1303();			
-	void updateScene1304();			
-	void updateScene1305();			
-	void updateScene1306();			
-	void updateScene1307();			
-	void updateScene1308();			
-	void updateScene1309();			
-	void updateScene1310();			
-	void updateScene1311();			
-	void updateScene1312();			
-	void updateScene1313();			
-	void updateScene1314();			
-	void updateScene1315();			
-	void updateScene1316();			
-	void updateScene1317();			
-	void updateScene1318();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 class AsScene1302Bridge : public AnimatedSprite {
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index d59cbd8..32918b1 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -31,36 +31,13 @@ namespace Neverhood {
 Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	debug("Create Module1400(%d)", which);
-
 	// TODO Music18hList_add(0x00AD0012, 0x06333232);
 	// TODO Music18hList_add(0x00AD0012, 0x624A220E);
 
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 1:
-			createScene1402(-1);
-			break;
-		case 2:
-			createScene1403(-1);
-			break;
-		case 3:
-			createScene1404(-1);
-			break;
-		case 4:
-			createScene1405(-1);
-			break;
-		case 5:
-			createScene1406(-1);
-			break;
-		case 6:
-			createScene1407(-1);
-			break;
-		default:
-			createScene1401(-1);
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else {
-		createScene1401(0);
+		createScene(0, 0);
 	}
 
 }
@@ -69,129 +46,91 @@ Module1400::~Module1400() {
 	// TODO Music18hList_deleteGroup(0x00AD0012);
 }
 
-void Module1400::createScene1401(int which) {
-	_vm->gameState().sceneNum = 0;
-	// TODO Music18hList_play(0x06333232, 0, 2, 1);
-	_childObject = new Scene1401(_vm, this, which);
-	SetUpdateHandler(&Module1400::updateScene1401);
-}
-
-void Module1400::createScene1402(int which) {
-	_vm->gameState().sceneNum = 1;
-	// TODO Music18hList_stop(0x06333232, 0, 2);
-	// TODO Music18hList_stop(0x624A220E, 0, 2);
-	_childObject = new Scene1402(_vm, this, which);
-	SetUpdateHandler(&Module1400::updateScene1402);
-}
-
-void Module1400::createScene1403(int which) {
-	_vm->gameState().sceneNum = 2;
-	// TODO Music18hList_stop(0x06333232, 0, 2);
-	// TODO Music18hList_play(0x624A220E, 0, 2, 1);
-	_childObject = new Scene1403(_vm, this, which);
-	SetUpdateHandler(&Module1400::updateScene1403);
-}
-
-void Module1400::createScene1404(int which) {
-	_vm->gameState().sceneNum = 3;
-	// TODO Music18hList_play(0x06333232, 0, 2, 1);
-	_childObject = new Scene1404(_vm, this, which);
-	SetUpdateHandler(&Module1400::updateScene1404);
-}
-
-void Module1400::createScene1405(int which) {
-	_vm->gameState().sceneNum = 4;
-	// TODO Music18hList_play(0x06333232, 0, 2, 1);
-	_childObject = new Scene1405(_vm, this, which);
-	SetUpdateHandler(&Module1400::updateScene1405);
-}
-
-void Module1400::createScene1406(int which) {
-	_vm->gameState().sceneNum = 5;
-	// TODO Music18hList_stop(0x06333232, 0, 2);
-	_childObject = new DiskplayerScene(_vm, this, 2);
-	SetUpdateHandler(&Module1400::updateScene1406);
-}
-
-void Module1400::createScene1407(int which) {
-	_vm->gameState().sceneNum = 6;
-	// TODO Music18hList_stop(0x06333232, 0, 2);
-	_childObject = new Scene1407(_vm, this, which);
-	SetUpdateHandler(&Module1400::updateScene1407);
-}
-
-void Module1400::updateScene1401() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1402(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene1404(0);
-			_childObject->handleUpdate();
-		} else {
-			sendMessage(_parentModule, 0x1009, 0);
-		}
-	}
-}
-
-void Module1400::updateScene1402() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1403(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene1407(-1);
-			_childObject->handleUpdate();
-		} else {
-			createScene1401(1);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void Module1400::updateScene1403() {
-	if (!updateChild()) {
-		createScene1402(1);
-		_childObject->handleUpdate();
+void Module1400::createScene(int sceneNum, int which) {
+	debug("Module1400::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		// TODO Music18hList_play(0x06333232, 0, 2, 1);
+		_childObject = new Scene1401(_vm, this, which);
+		break;
+	case 1:
+		// TODO Music18hList_stop(0x06333232, 0, 2);
+		// TODO Music18hList_stop(0x624A220E, 0, 2);
+		_childObject = new Scene1402(_vm, this, which);
+		break;
+	case 2:
+		// TODO Music18hList_stop(0x06333232, 0, 2);
+		// TODO Music18hList_play(0x624A220E, 0, 2, 1);
+		_childObject = new Scene1403(_vm, this, which);
+		break;
+	case 3:
+		// TODO Music18hList_play(0x06333232, 0, 2, 1);
+		_childObject = new Scene1404(_vm, this, which);
+		break;
+	case 4:
+		// TODO Music18hList_play(0x06333232, 0, 2, 1);
+		_childObject = new Scene1405(_vm, this, which);
+		break;
+	case 5:
+		// TODO Music18hList_stop(0x06333232, 0, 2);
+		_childObject = new DiskplayerScene(_vm, this, 2);
+		break;
+	case 6:
+		// TODO Music18hList_stop(0x06333232, 0, 2);
+		_childObject = new Scene1407(_vm, this, which);
+		break;
 	}
+	SetUpdateHandler(&Module1400::updateScene);
+	_childObject->handleUpdate();
 }
 
-void Module1400::updateScene1404() {
+void Module1400::updateScene() {
 	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1405(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene1406(-1);
-			_childObject->handleUpdate();
-		} else {
-			createScene1401(2);
-			_childObject->handleUpdate();
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(1, 0);
+			} else if (_moduleResult == 2) {
+				createScene(3, 0);
+			} else {
+				sendMessage(_parentModule, 0x1009, 0);
+			}
+			break;
+		case 1:
+			if (_moduleResult == 1) {
+				createScene(2, 0);
+			} else if (_moduleResult == 2) {
+				createScene(6, -1);
+			} else {
+				createScene(0, 1);
+			}
+			break;
+		case 2:
+			createScene(1, 1);
+			break;
+		case 3:
+			if (_moduleResult == 1) {
+				createScene(4, 0);
+			} else if (_moduleResult == 2) {
+				createScene(5, -1);
+			} else {
+				createScene(0, 2);
+			}
+			break;
+		case 4:
+			createScene(3, 1);
+			break;
+		case 5:
+			createScene(3, 2);
+			break;
+		case 6:
+			createScene(1, 2);
+			break;
 		}
 	}
 }
 
-void Module1400::updateScene1405() {
-	if (!updateChild()) {
-		createScene1404(1);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1400::updateScene1406() {
-	if (!updateChild()) {
-		createScene1404(2);
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1400::updateScene1407() {
-	if (!updateChild()) {
-		createScene1402(2);
-		_childObject->handleUpdate();
-	}
-}
-
 // Scene1401
 
 Class525::Class525(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 72afb4f..7b4d957 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -35,20 +35,8 @@ public:
 	Module1400(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1400();
 protected:
-	void createScene1401(int which);
-	void createScene1402(int which);
-	void createScene1403(int which);
-	void createScene1404(int which);
-	void createScene1405(int which);
-	void createScene1406(int which);
-	void createScene1407(int which);
-	void updateScene1401();			
-	void updateScene1402();			
-	void updateScene1403();			
-	void updateScene1404();			
-	void updateScene1405();			
-	void updateScene1406();			
-	void updateScene1407();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene1401
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 7c03e9b..09567f5 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -27,43 +27,51 @@ namespace Neverhood {
 Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag)
 	: Module(vm, parentModule), _flag(flag) {
 	
-	debug("Create Module1500(%d)", which);
-
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 1:
-			createScene1502();
-			break;
-		case 2:
-			createScene1503();
-			break;
-		case 3:
-			createScene1504();
-			break;
-		default:
-			createScene1501();			
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else {
-		createScene1504();
+		createScene(3, -1);
 	}
 
 }
 
-void Module1500::update() {
+void Module1500::createScene(int sceneNum, int which) {
+	debug("Module1500::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48);
+		break;
+	case 1:
+		_childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48);
+		break;
+	case 2:
+		sendMessage(_parentModule, 0x0800, 0);
+		createSmackerScene(0x001A0005, true, true, true);
+		break;
+	case 3:
+		_childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48);
+		break;
+	}
+	SetUpdateHandler(&Module1500::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module1500::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			createScene1502();
+			createScene(1, -1);
 			break;
 		case 1:
 			if (_flag) {
-				createScene1503();
+				createScene(2, -1);
 			} else {
 				sendMessage(_parentModule, 0x1009, 0);
 			}
 			break;
 		case 3:
-			createScene1501();
+			createScene(0, -1);
 			break;
 		default:
 			sendMessage(_parentModule, 0x1009, 0);
@@ -72,40 +80,12 @@ void Module1500::update() {
 	}
 }
 
-void Module1500::createScene1501() {
-	_vm->gameState().sceneNum = 0;
-	_childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48);
-	SetUpdateHandler(&Module1500::update);
-}
-			
-void Module1500::createScene1502() {
-	debug("createScene1502");
-	_vm->gameState().sceneNum = 1;
-	_childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48);
-	SetUpdateHandler(&Module1500::update);
-}
-
-void Module1500::createScene1503() {
-	sendMessage(_parentModule, 0x0800, 0);
-	_vm->gameState().sceneNum = 2;
-	createSmackerScene(0x001A0005, true, true, true);
-	SetUpdateHandler(&Module1500::update);
-}
-
-void Module1500::createScene1504() {
-	_vm->gameState().sceneNum = 3;
-	_childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48);
-	SetUpdateHandler(&Module1500::update);
-}
-
 // Scene1501
 
 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3)
 	: Scene(vm, parentModule, true), _soundResource(vm), 
 	_countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) {
 
-	debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3);
-	
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
 	
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
index 87b2a0b..eeabec0 100644
--- a/engines/neverhood/module1500.h
+++ b/engines/neverhood/module1500.h
@@ -37,11 +37,8 @@ public:
 	Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag);
 protected:
 	bool _flag;
-	void update();
-	void createScene1501();			
-	void createScene1502();
-	void createScene1503();
-	void createScene1504();
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 class Scene1501 : public Scene {
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 2b0f25d..9188dab 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -27,36 +27,19 @@ namespace Neverhood {
 Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource(vm) {
 	
-	debug("Create Module1700(%d)", which);
-
 	// TODO Music18hList_add(0x04212331);
 	// TODO Sound1ChList_addSoundResources(0x04212331, dword_4AE930, true);
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 50, 600, 5, 150);
 	// TODO Sound1ChList_sub_407C70(0x04212331, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 0:
-			createScene1701(-1);
-			break;
-		case 1:
-			createScene1702(-1);
-			break;
-		case 2:
-			createScene1703(-1);
-			break;
-		case 3:
-			createScene1704(-1);
-			break;
-		default:
-			createScene1705(-1);
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 0) {
-		createScene1701(-1);
+		createScene(0, -1);
 	} else if (which == 1) {
-		createScene1705(1);
+		createScene(4, 1);
 	} else {
-		createScene1705(3);
+		createScene(4, 3);
 	}
 
 }
@@ -65,90 +48,71 @@ Module1700::~Module1700() {
 	// TODO Sound1ChList_sub_407A50(0x04212331);
 }
 
-void Module1700::createScene1701(int which) {
-	_vm->gameState().sceneNum = 0;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
-	createSmackerScene(0x3028A005, true, true, false);
-	SetUpdateHandler(&Module1700::updateScene1701);
-}
-
-void Module1700::createScene1702(int which) {
-	_vm->gameState().sceneNum = 1;
-	createNavigationScene(0x004AE8B8, which);
-	SetUpdateHandler(&Module1700::updateScene1702);
-}
-
-void Module1700::createScene1703(int which) {
-	_vm->gameState().sceneNum = 2;
-	createNavigationScene(0x004AE8E8, which);
-	SetUpdateHandler(&Module1700::updateScene1703);
-}
-
-void Module1700::createScene1704(int which) {
-	_vm->gameState().sceneNum = 3;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
-	createSmackerScene(0x01190041, true, true, false);
-	SetUpdateHandler(&Module1700::updateScene1701);
-}
-
-void Module1700::createScene1705(int which) {
-	_vm->gameState().sceneNum = 4;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
-	// TODO Music18hList_play(0x31114225, 0, 2, 1);
-	_childObject = new Scene1705(_vm, this, which);
-	SetUpdateHandler(&Module1700::updateScene1705);
-}
-
-void Module1700::updateScene1701() {
-	if (!updateChild()) {
-		if (_vm->gameState().sceneNum == 3) {
-			createScene1705(0);
-			_childObject->handleUpdate();
-		} else {
-			// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0);
-			createScene1702(0);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void Module1700::updateScene1702() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1703(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 1) {
-			createScene1702(1);
-			_childObject->handleUpdate();
-		}
+void Module1700::createScene(int sceneNum, int which) {
+	debug("Module1700::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+		createSmackerScene(0x3028A005, true, true, false);
+		break;
+	case 1:
+		createNavigationScene(0x004AE8B8, which);
+		break;
+	case 2:
+		createNavigationScene(0x004AE8E8, which);
+		break;
+	case 3:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+		createSmackerScene(0x01190041, true, true, false);
+		break;
+	case 4:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+		// TODO Music18hList_play(0x31114225, 0, 2, 1);
+		_childObject = new Scene1705(_vm, this, which);
+		break;
 	}
+	SetUpdateHandler(&Module1700::updateScene);
+	_childObject->handleUpdate();
 }
 
-void Module1700::updateScene1703() {
+void Module1700::updateScene() {
 	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1704(-1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 1) {
-			createScene1702(1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			if (!_soundResource.isPlaying()) {
-				// TODO _soundResource.setVolume(60);
-				_soundResource.play(0x58B45E58);
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0);
+			createScene(1, 0);
+			break;
+		case 1:
+			if (_moduleResult == 0) {
+				createScene(2, 0);
+			} else if (_moduleResult == 1) {
+				createScene(1, 1);
+			}
+			break;
+		case 2:
+			if (_moduleResult == 0) {
+				createScene(3, -1);
+			} else if (_moduleResult == 1) {
+				createScene(1, 1);
+			} else if (_moduleResult == 2) {
+				if (!_soundResource.isPlaying()) {
+					// TODO _soundResource.setVolume(60);
+					_soundResource.play(0x58B45E58);
+				}
+				createScene(2, 2);
 			}
-			createScene1703(2);
-			_childObject->handleUpdate();
+			break;
+		case 3:
+			createScene(4, 0);
+			break;
+		case 4:
+			sendMessage(_parentModule, 0x1009, 1);
+			break;
 		}
 	}
 }
-
-void Module1700::updateScene1705() {
-	if (!updateChild()) {
-		sendMessage(_parentModule, 0x1009, 1);
-	}
-}
-
+		
 // Scene1705
 
 static const uint32 kScene1705FileHashes[] = {
diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h
index 0fefa72..f738848 100644
--- a/engines/neverhood/module1700.h
+++ b/engines/neverhood/module1700.h
@@ -36,16 +36,8 @@ public:
 	virtual ~Module1700();
 protected:
 	SoundResource _soundResource;
-	void update();
-	void createScene1701(int which);
-	void createScene1702(int which);
-	void createScene1703(int which);
-	void createScene1704(int which);
-	void createScene1705(int which);
-	void updateScene1701();			
-	void updateScene1702();			
-	void updateScene1703();			
-	void updateScene1705();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene1705
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 31a1564..d5aa789 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -28,218 +28,143 @@ namespace Neverhood {
 Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	debug("Create Module1800(%d)", which);
-
 	// TODO Sound1ChList_addSoundResources(0x04A14718, dword_4AFE70);
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 1, 50, 600, 10, 150);
 	// TODO Sound1ChList_sub_407C70(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
 
 	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else if (which == 2) {
+		createScene(5, 0);
+	} else if (which == 3) {
+		createScene(0, 0);
+	} else {
+		createScene(3, 1);
+	} 
+
+}
+
+Module1800::~Module1800() {
+	// TODO Sound1ChList_sub_407A50(0x04A14718);
+}
+
+void Module1800::createScene(int sceneNum, int which) {
+	static const byte kNavigationTypes00[] = {1, 0, 2, 0};
+	static const byte kNavigationTypes01[] = {5};
+	debug("Module1800::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		createNavigationScene(0x004AFD38, which, kNavigationTypes00);
+		break;
+	case 1:
+		createNavigationScene(0x004AFD98, which, kNavigationTypes01);
+		break;
+	case 2:
+		createSmackerScene(0x006C0085, true, true, false);
+		break;
+	case 3:
+		createNavigationScene(0x004AFDB0, which);
+		break;
+	case 4:
+		createNavigationScene(0x004AFDE0, which);
+		break;
+	case 5:
+		createNavigationScene(0x004AFE40, which);
+		break;
+	case 6:
+		// TODO Sound1ChList_sub_407A50(0x04A14718);
+		createSmackerScene(0x08D84010, true, true, false);
+		break;
+	case 7:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0);
+		createSmackerScene(0x0168B121, true, true, false);
+		break;
+	case 8:
+		// TODO _childObject = new CreditsScene(_vm, this, 0);
+		break;
+	case 9:
+		// NOTE: Newly introduced sceneNum 9 (was duplicate 3 with own update handler)
+		createSmackerScene(0x0A840C01, true, true, false);
+		break;
+	}
+	SetUpdateHandler(&Module1800::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module1800::updateScene() {
+	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			createScene1801(-1);
+			if (_moduleResult == 1) {
+				createScene(4, 0);
+			} else if (_moduleResult == 2) {
+				createScene(1, -1);
+			} else if (_moduleResult == 3) {
+				createScene(3, 0);
+			}
 			break;
 		case 1:
-			createScene1802(-1);
+			if (_navigationAreaType == 3) {
+				createScene(7, -1);
+			} else {
+				createScene(2, -1);
+			}
 			break;
 		case 2:
-			createScene1803(-1);
+			createScene(0, 2);
 			break;
-		default:
 		case 3:
-			createScene1804(-1);
+			if (_moduleResult == 0) {
+				createScene(9, -1);
+			} else if (_moduleResult == 1) {
+				createScene(0, 1);
+			}
 			break;
 		case 4:
-			createScene1805(-1);
+			if (_moduleResult == 0) {
+				createScene(6, -1);
+			} else if (_moduleResult == 1) {
+				createScene(5, 0);
+			} else if (_moduleResult == 2) {
+				createScene(0, 3);
+			} else if (_moduleResult == 3) {
+				createScene(4, 3);
+			}
 			break;
 		case 5:
-			createScene1806(-1);
+			if (_moduleResult == 0) {
+				sendMessage(_parentModule, 0x1009, 2);
+			} else if (_moduleResult == 1) {
+				createScene(4, 3);
+			}
 			break;
 		case 6:
-			createScene1807(-1);
+			createScene(8, -1);
 			break;
 		case 7:
-			createScene1808(-1);
+			sendMessage(_parentModule, 0x1009, 3);
 			break;
 		case 8:
-			createScene1809(-1);
+			sendMessage(_parentModule, 0x1009, 1);
+			// TODO GameState stuff
+			break;
+		case 9:
+			sendMessage(_parentModule, 0x1009, 0);
 			break;
-		}
-	} else if (which == 2) {
-		createScene1806(0);
-	} else if (which == 3) {
-		createScene1801(0);
-	} else {
-		createScene1804(1);
-	} 
-
-}
-
-Module1800::~Module1800() {
-	// TODO Sound1ChList_sub_407A50(0x04A14718);
-}
-
-void Module1800::createScene1801(int which) {
-	static const byte kNavigationTypes[] = {1, 0, 2, 0};
-	_vm->gameState().sceneNum = 0;
-	createNavigationScene(0x004AFD38, which, kNavigationTypes);
-	SetUpdateHandler(&Module1800::updateScene1801);
-}
-			
-void Module1800::createScene1802(int which) {
-	static const byte kNavigationTypes[] = {5};
-	_vm->gameState().sceneNum = 1;
-	createNavigationScene(0x004AFD98, which, kNavigationTypes);
-	SetUpdateHandler(&Module1800::updateScene1802);
-}
-
-void Module1800::createScene1803(int which) {
-	_vm->gameState().sceneNum = 2;
-	createSmackerScene(0x006C0085, true, true, false);
-	SetUpdateHandler(&Module1800::updateScene1803);
-}
-			
-void Module1800::createScene1804(int which) {
-	_vm->gameState().sceneNum = 3;
-	createNavigationScene(0x004AFDB0, which);
-	SetUpdateHandler(&Module1800::updateScene1804);
-}
-
-void Module1800::createScene1804b(int which) {
-	_vm->gameState().sceneNum = 3;
-	createSmackerScene(0x0A840C01, true, true, false);
-	SetUpdateHandler(&Module1800::updateScene1803);
-}
-			
-void Module1800::createScene1805(int which) {
-	_vm->gameState().sceneNum = 4;
-	createNavigationScene(0x004AFDE0, which);
-	SetUpdateHandler(&Module1800::updateScene1805);
-}
-
-void Module1800::createScene1806(int which) {
-	_vm->gameState().sceneNum = 5;
-	createNavigationScene(0x004AFE40, which);
-	SetUpdateHandler(&Module1800::updateScene1806);
-}
-
-void Module1800::createScene1807(int which) {
-	_vm->gameState().sceneNum = 6;
-	createSmackerScene(0x08D84010, true, true, false);
-	SetUpdateHandler(&Module1800::updateScene1803);
-	// TODO Sound1ChList_sub_407A50(0x04A14718);
-}
-			
-void Module1800::createScene1808(int which) {
-	_vm->gameState().sceneNum = 7;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0);
-	createSmackerScene(0x0168B121, true, true, false);
-	SetUpdateHandler(&Module1800::updateScene1803);
-}
-			
-void Module1800::createScene1809(int which) {
-#if 0 // TODO
-	_vm->gameState().sceneNum = 8;
-	_childObject = new CreditsScene(_vm, this, 0);
-	SetUpdateHandler(&Module1800::updateScene1809);
-#endif	
-}
-
-void Module1800::updateScene1801() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene1805(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene1802(-1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 3) {
-			createScene1804(0);
-			_childObject->handleUpdate();
 		}
 	} else {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
 #if 0 // TODO
-		NavigationScene *navigationScene = (NavigationScene*)_childObject;
-		if (navigationScene->soundFlag1 && navigationScene->index == 2) {
-			// TODO Sound1ChList_sub_4080B0(false);
-		}
+			NavigationScene *navigationScene = (NavigationScene*)_childObject;
+			if (navigationScene->soundFlag1 && navigationScene->index == 2) {
+				// TODO Sound1ChList_sub_4080B0(false);
+			}
 #endif	
-	}
-}
-
-void Module1800::updateScene1802() {
-	_childObject->handleUpdate();
-	if (_done) {
-		int areaType = navigationScene()->getNavigationAreaType();
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (areaType == 3) {
-			createScene1808(-1);
-		} else {
-			createScene1803(-1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1800::updateScene1803() {
-	if (!updateChild()) {
-		if (_moduleResult == 2) {
-			createScene1801(2);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 3) {
-			sendMessage(_parentModule, 0x1009, 0);
-		} else if (_moduleResult == 6) {
-			createScene1809(-1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 7) {
-			sendMessage(_parentModule, 0x1009, 3);
-		}
-	}
-}
-
-void Module1800::updateScene1804() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1804b(-1);
-		} else if (_moduleResult == 1) {
-			createScene1801(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1800::updateScene1805() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene1807(-1);
-		} else if (_moduleResult == 1) {
-			createScene1806(0);
-		} else if (_moduleResult == 2) {
-			createScene1801(3);
-		} else if (_moduleResult == 3) {
-			createScene1805(3);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module1800::updateScene1806() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			sendMessage(_parentModule, 0x1009, 2);
-		} else if (_moduleResult == 1) {
-			createScene1805(3);
-			_childObject->handleUpdate();
+			break;
 		}
 	}
 }
-
-void Module1800::updateScene1809() {
-	if (!updateChild()) {
-		sendMessage(_parentModule, 0x1009, 1);
-		// TODO GameState stuff
-	}
-}
+		
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h
index 13d4790..8ec8dfe 100644
--- a/engines/neverhood/module1800.h
+++ b/engines/neverhood/module1800.h
@@ -36,26 +36,8 @@ public:
 	Module1800(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1800();
 protected:
-	// TODO ResourceTable _resourceTable;
-	void createScene1801(int which);			
-	void createScene1802(int which);			
-	void createScene1803(int which);			
-	void createScene1804(int which);
-	void createScene1804b(int which);			
-	void createScene1805(int which);			
-	void createScene1806(int which);			
-	void createScene1807(int which);			
-	void createScene1808(int which);			
-	void createScene1809(int which);			
-	void updateScene1801();			
-	void updateScene1802();			
-	void updateScene1803();			
-	void updateScene1804();			
-	void updateScene1805();			
-	void updateScene1806();			
-	void updateScene1807();			
-	void updateScene1808();			
-	void updateScene1809();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index cf7256b..a30bb93 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -29,24 +29,12 @@ namespace Neverhood {
 Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	debug("Create Module2000(%d)", which);
-
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 0:
-			createScene2001(-1);
-			break;
-		case 2:
-			createScene2003(-1);
-			break;
-		default:
-			createScene2002(-1);
-			break;
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 0) {
-		createScene2001(3);
+		createScene(0, 3);
 	} else if (which == 1) {
-		createScene2001(1);
+		createScene(0, 1);
 	}
 
 }
@@ -55,65 +43,56 @@ Module2000::~Module2000() {
 	// TODO Sound1ChList_sub_407A50(0x81293110);
 }
 
-void Module2000::createScene2001(int which) {
-	_vm->gameState().sceneNum = 0;
-	_childObject = new Scene2001(_vm, this, which);
-	SetUpdateHandler(&Module2000::updateScene2001);
-	_childObject->handleUpdate();
-}
-
-void Module2000::createScene2002(int which) {
-	_vm->gameState().sceneNum = 1;
-	if (getGlobalVar(0x98109F12)) {
-		createNavigationScene(0x004B7B48, which);
-	} else {
-		createNavigationScene(0x004B7B00, which);
+void Module2000::createScene(int sceneNum, int which) {
+	debug("Module2000::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_childObject = new Scene2001(_vm, this, which);
+		break;
+	case 1:
+		createNavigationScene(getGlobalVar(0x98109F12) ? 0x004B7B48 : 0x004B7B00, which);
+		break;
+	case 2:
+		setGlobalVar(0x98109F12, 1);
+		setSubVar(0x2C145A98, 1, 1);
+		createSmackerScene(0x204B2031, true, true, false);
+		break;
 	}
-	SetUpdateHandler(&Module2000::updateScene2002);
+	SetUpdateHandler(&Module2000::updateScene);
 	_childObject->handleUpdate();
 }
 
-void Module2000::createScene2003(int which) {
-	_vm->gameState().sceneNum = 2;
-	setGlobalVar(0x98109F12, 1);
-	setSubVar(0x2C145A98, 1, 1);
-	createSmackerScene(0x204B2031, true, true, false);
-	SetUpdateHandler(&Module2000::updateScene2003);
-	_childObject->handleUpdate();
-}
-
-void Module2000::updateScene2001() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			sendMessage(_parentModule, 0x1009, 0);
-		} else {
-			createScene2002(0);
-		}
-	}
-}
-
-void Module2000::updateScene2002() {
+void Module2000::updateScene() {
 	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			if (getGlobalVar(0x98109F12)) {
-				createScene2002(0);
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				sendMessage(_parentModule, 0x1009, 0);
 			} else {
-				createScene2003(-1);
+				createScene(1, 0);
+			}
+			break;
+		case 1:
+			if (_moduleResult == 0) {
+				if (getGlobalVar(0x98109F12)) {
+					createScene(1, 0);
+				} else {
+					createScene(2, -1);
+				}
+			} else if (_moduleResult == 1) {
+				createScene(1, 1);
+			} else if (_moduleResult == 2) {
+				createScene(0, 0);
 			}
-		} else if (_moduleResult == 1) {
-			createScene2002(1);
-		} else if (_moduleResult == 2) {
-			createScene2001(0);
+			break;
+		case 2:
+			createScene(1, 0);
+			break;
 		}
 	}
 }
 
-void Module2000::updateScene2003() {
-	if (!updateChild()) {
-		createScene2002(0);
-	}
-}
-
 // Scene2001
 
 Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h
index 23ac8a8..8e741b3 100644
--- a/engines/neverhood/module2000.h
+++ b/engines/neverhood/module2000.h
@@ -36,12 +36,8 @@ public:
 	virtual ~Module2000();
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createScene2001(int which);
-	void createScene2002(int which);
-	void createScene2003(int which);
-	void updateScene2001();			
-	void updateScene2002();			
-	void updateScene2003();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene2001
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index ce9250a..dd4144f 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -27,8 +27,6 @@ namespace Neverhood {
 Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _volume(0) {
 	
-	debug("Create Module2300(%d)", which);
-
 	// TODO Sound1ChList_addSoundResources(0x1A214010, dword_4B6938, true);
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4B6938, true, 50, 600, 10, 10, 150);
 
@@ -45,33 +43,17 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Sound1ChList_sub_407C70(0x1A214010, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		case 0:
-			createScene2301(-1);
-			break;
-		case 1:
-			createScene2302(-1);
-			break;
-		case 2:
-			createScene2303(-1);
-			break;
-		case 3:
-			createScene2304(-1);
-			break;
-		case 4:
-			createScene2305(-1);
-			break;
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 1) {
-		createScene2303(0);
+		createScene(2, 0);
 	} else if (which == 2) {
-		createScene2304(0);
+		createScene(3, 0);
 	} else if (which == 3) {
-		createScene2305(-1);
+		createScene(4, -1);
 	} else if (which == 4) {
-		createScene2302(3);
+		createScene(1, 3);
 	} else {
-		createScene2301(1);
+		createScene(0, 1);
 	}
 
 }
@@ -80,136 +62,119 @@ Module2300::~Module2300() {
 	// TODO Sound1ChList_sub_407A50(0x1A214010);
 }
 
-void Module2300::createScene2301(int which) {
-	_vm->gameState().sceneNum = 0;
-	createNavigationScene(0x004B67B8, which);
-	SetUpdateHandler(&Module2300::updateScene2301);
-}
-			
-void Module2300::createScene2302(int which) {
-	_vm->gameState().sceneNum = 1;
-	createNavigationScene(0x004B67E8, which);
-	SetUpdateHandler(&Module2300::updateScene2302);
-	if (_flag) {
-		_volume = 15;
-		// TODO Sound1ChList_setVolume(0x90F0D1C3, 15);
-	}
-}
-
-void Module2300::createScene2303(int which) {
-	_vm->gameState().sceneNum = 2;
-	createNavigationScene(0x004B6878, which);
-	SetUpdateHandler(&Module2300::updateScene2303);
-}
-
-void Module2300::createScene2304(int which) {
-	_vm->gameState().sceneNum = 3;
-	if (getGlobalVar(0x10938830)) {
-		createNavigationScene(0x004B68F0, which);
-	} else {
-		// TODO Sound1ChList_setVolume(0x90F0D1C3, _volume);
-		createNavigationScene(0x004B68A8, which);
+void Module2300::createScene(int sceneNum, int which) {
+	debug("Module2300::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		createNavigationScene(0x004B67B8, which);
+		break;
+	case 1:
+		createNavigationScene(0x004B67E8, which);
 		if (_flag) {
-			_volume = 87;
-			// TODO Sound1ChList_setVolume(0x90F0D1C3, 87);
+			_volume = 15;
+			// TODO Sound1ChList_setVolume(0x90F0D1C3, 15);
 		}
-	}
-	SetUpdateHandler(&Module2300::updateScene2304);
-}
-
-void Module2300::createScene2305(int which) {
-	_vm->gameState().sceneNum = 4;
-	// TODO Sound1ChList_sub_4080B0(true);
-	createSmackerScene(0x20080A0B, true, true, false);
-	SetUpdateHandler(&Module2300::updateScene2305);
-}
-
-void Module2300::updateScene2301() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2302(4);
-			_childObject->handleUpdate();
+		break;
+	case 2:
+		createNavigationScene(0x004B6878, which);
+		break;
+	case 3:
+		if (getGlobalVar(0x10938830)) {
+			createNavigationScene(0x004B68F0, which);
 		} else {
-			sendMessage(_parentModule, 0x1009, 0);
+			// TODO Sound1ChList_setVolume(0x90F0D1C3, _volume);
+			createNavigationScene(0x004B68A8, which);
+			if (_flag) {
+				_volume = 87;
+				// TODO Sound1ChList_setVolume(0x90F0D1C3, 87);
+			}
 		}
+		break;
+	case 4:
+		// TODO Sound1ChList_sub_4080B0(true);
+		createSmackerScene(0x20080A0B, true, true, false);
+		break;
 	}
+	SetUpdateHandler(&Module2300::updateScene);
+	_childObject->handleUpdate();
 }
 
-void Module2300::updateScene2302() {
+void Module2300::updateScene() {
 	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene2301(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene2303(1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 3) {
-			createScene2302(3);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 4) {
-			createScene2304(1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 5) {
-			sendMessage(_parentModule, 0x1009, 3);
-		} else {
-			sendMessage(_parentModule, 0x1009, 4);
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(1, 4);
+			} else {
+				sendMessage(_parentModule, 0x1009, 0);
+			}
+			break;
+		case 1:
+			if (_moduleResult == 1) {
+				createScene(0, 0);
+			} else if (_moduleResult == 2) {
+				createScene(2, 1);
+			} else if (_moduleResult == 3) {
+				createScene(1, 3);
+			} else if (_moduleResult == 4) {
+				createScene(3, 1);
+			} else if (_moduleResult == 5) {
+				sendMessage(_parentModule, 0x1009, 3);
+			} else {
+				sendMessage(_parentModule, 0x1009, 4);
+			}
+			break;
+		case 2:
+			if (_moduleResult == 1) {
+				sendMessage(_parentModule, 0x1009, 3);
+			} else {
+				createScene(1, 5);
+			}
+			break;
+		case 3:
+			if (_moduleResult == 1) {
+				sendMessage(_parentModule, 0x1009, 2);
+			} else {
+				createScene(1, 1);
+			}
+			break;
+		case 4:
+			// TODO Sound1ChList_sub_4080B0(false);
+			createScene(1, 2);
+			break;
 		}
 	} else {
+		switch (_vm->gameState().sceneNum) {
+		case 1:
 #if 0 // TODO
-		NavigationScene *navigationScene = (NavigationScene*)_childObject; 
-		if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
-			navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
-			_volume++;
-			Sound1ChList_setVolume(0x90F0D1C3, _volume);
-		}
+			NavigationScene *navigationScene = (NavigationScene*)_childObject; 
+			if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
+				navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
+				_volume++;
+				Sound1ChList_setVolume(0x90F0D1C3, _volume);
+			}
 #endif
 #if 0 // TODO
-		if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
-			navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
-			Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64);
-			Sound1ChList_setVolume(0x48498E46, 70);
-			Sound1ChList_setVolume(0x50399F64, 70);
-		}
+			if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
+				navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
+				Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64);
+				Sound1ChList_setVolume(0x48498E46, 70);
+				Sound1ChList_setVolume(0x50399F64, 70);
+			}
 #endif
-	}
-}
-			
-void Module2300::updateScene2303() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			sendMessage(_parentModule, 0x1009, 3);
-		} else {
-			createScene2302(5);
-			_childObject->handleUpdate();
-		}
-	}
-}
-			
-void Module2300::updateScene2304() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			sendMessage(_parentModule, 0x1009, 2);
-		} else {
-			createScene2302(1);
-			_childObject->handleUpdate();
-		}
-	} else {
+			break;
+		case 3:
 #if 0 // TODO
-		NavigationScene *navigationScene = (NavigationScene*)_childObject; 
-		if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
-			navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
-			_volume--;
-			Sound1ChList_setVolume(0x90F0D1C3, _volume);
-		}
+			NavigationScene *navigationScene = (NavigationScene*)_childObject; 
+			if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
+				navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
+				_volume--;
+				Sound1ChList_setVolume(0x90F0D1C3, _volume);
+			}
 #endif
-	}
-}
-			
-void Module2300::updateScene2305() {
-	if (!updateChild()) {
-		// TODO Sound1ChList_sub_4080B0(false);
-		createScene2302(2);
-		_childObject->handleUpdate();
+			break;
+		}
 	}
 }
 			
diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h
index 9f705db..7222559 100644
--- a/engines/neverhood/module2300.h
+++ b/engines/neverhood/module2300.h
@@ -36,20 +36,10 @@ public:
 	Module2300(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2300();
 protected:
-	// TODO ResourceTable _resourceTable1;
-	// TODO ResourceTable _resourceTable2;
 	bool _flag;
 	int _volume;
-	void createScene2301(int which);			
-	void createScene2302(int which);			
-	void createScene2303(int which);			
-	void createScene2304(int which);			
-	void createScene2305(int which);			
-	void updateScene2301();			
-	void updateScene2302();			
-	void updateScene2303();			
-	void updateScene2304();			
-	void updateScene2305();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index c28d0eb..219f595 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -29,8 +29,6 @@ namespace Neverhood {
 Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundVolume(0) {
 	
-	debug("Create Module3000(%d)", which);
-
 	// TODO Sound1ChList_addSoundResources(0x81293110, dword_4B7FC8, true);
 	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 1, 50, 600, 5, 150);
 	// TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
@@ -46,53 +44,15 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (which < 0) {
-		switch (_vm->gameState().sceneNum) {
-		default:
-		case 1:
-			createScene3002(-1);
-			break;
-		case 2:
-			createScene3003(-1);
-			break;
-		case 3:
-			createScene3004(-1);
-			break;
-		case 4:
-			createScene3005(-1);
-			break;
-		case 5:
-			createScene3006(-1);
-			break;
-		case 6:
-			createScene3007(-1);
-			break;
-		case 7:
-			createScene3008(-1);
-			break;
-		case 8:
-			createScene3009(-1);
-			break;
-		case 9:
-			createScene3010(-1);
-			break;
-		case 10:
-			createScene3011(-1);
-			break;
-		case 11:
-			createScene3012(-1);
-			break;
-		case 12:
-			createScene3013(-1);
-			break;
-		}
+		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 0) {
-		createScene3002(0);
+		createScene(1, 0);
 	} else if (which == 1) {
-		createScene3005(2);
+		createScene(4, 2);
 	} else if (which == 2) {
-		createScene3005(1);
+		createScene(4, 1);
 	} else if (which == 3) {
-		createScene3006(1);
+		createScene(5, 1);
 	}
 
 }
@@ -101,384 +61,296 @@ Module3000::~Module3000() {
 	// TODO Sound1ChList_sub_407A50(0x81293110);
 }
 
-void Module3000::createScene3002(int which) {
-	_vm->gameState().sceneNum = 1;
-	if (!getGlobalVar(0x01BA1A52)) {
-		createNavigationScene(0x004B7C80, which);
-	} else if (getGlobalVar(0x10938830)) {
-		createNavigationScene(0x004B7CE0, which);
-	} else {
-		createNavigationScene(0x004B7CB0, which);
-	}
-	SetUpdateHandler(&Module3000::updateScene3002);
-}
-
-void Module3000::createScene3002b(int which) {
-	_vm->gameState().sceneNum = 1;
-	if (!getGlobalVar(0x01BA1A52)) {
-		if (getGlobalVar(0x10938830)) {
-			createSmackerScene(0x00940021, true, true, false);
+void Module3000::createScene(int sceneNum, int which) {
+	static const byte kNavigationTypes05[] = {3, 0};
+	static const byte kNavigationTypes06[] = {5};
+	debug("Module3000::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 1:
+		if (!getGlobalVar(0x01BA1A52)) {
+			createNavigationScene(0x004B7C80, which);
+		} else if (getGlobalVar(0x10938830)) {
+			createNavigationScene(0x004B7CE0, which);
 		} else {
-			createSmackerScene(0x01140021, true, true, false);
+			createNavigationScene(0x004B7CB0, which);
+		}
+		break;
+	case 2:
+		// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+		if (_flag) {
+			_soundVolume = 90;
+			// TODO Sound1ChList_setVolume(0x90F0D1C3, 90);
 		}
-	} else {
 		if (getGlobalVar(0x10938830)) {
-			createSmackerScene(0x001011B1, true, true, false);
+			createNavigationScene(0x004B7D58, which);
 		} else {
-			createSmackerScene(0x001021B1, true, true, false);
+			createNavigationScene(0x004B7D10, which);
 		}
+		break;
+	case 3:
+		if (getGlobalVar(0x09221A62))
+			createNavigationScene(0x004B7E60, which);
+		else if (getGlobalVar(0x10938830))
+			createNavigationScene(0x004B7DA0, which);
+		else
+			createNavigationScene(0x004B7E00, which);
+		break;
+	case 4:
+		if (getGlobalVar(0x09221A62))
+			createNavigationScene(0x004B7F20, which);
+		else
+			createNavigationScene(0x004B7EC0, which);
+		break;
+	case 5:
+		createNavigationScene(0x004B7F80, which, kNavigationTypes05);
+		break;
+	case 6:
+		createNavigationScene(0x004B7FB0, which, kNavigationTypes06);
+		break;
+	case 7:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
+		if (!getSubVar(0x40050052, 0x089809C2)) {
+			setSubVar(0x40050052, 0x089809C2, 1);
+			createSmackerScene(0x90022001, true, true, false);
+		} else
+			createSmackerScene(0x98022001, true, true, false);
+		break;
+	case 8:
+		_childObject = new Scene3009(_vm, this, which);
+		break;
+	case 9:
+		_childObject = new Scene3010(_vm, this, 0);
+		break;
+	case 10:
+		_childObject = new Scene3011(_vm, this, 0);
+		break;
+	case 11:
+		// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
+		if (!getSubVar(0x40050052, 0x10130993)) {
+			setSubVar(0x40050052, 0x10130993, 1);
+			createSmackerScene(0x31093019, true, true, false);
+		} else
+			createSmackerScene(0x20093019, true, true, false);
+		break;
+	case 12:
+		_childObject = new Scene3010(_vm, this, 1);
+		break;
+	// NOTE: Newly introduced sceneNums
+	case 1001:
+		if (!getGlobalVar(0x01BA1A52))
+			if (getGlobalVar(0x10938830))
+				createSmackerScene(0x00940021, true, true, false);
+			else
+				createSmackerScene(0x01140021, true, true, false);
+		else
+			if (getGlobalVar(0x10938830))
+				createSmackerScene(0x001011B1, true, true, false);
+			else
+				createSmackerScene(0x001021B1, true, true, false);
+		setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1);
+		break;
+	case 1006:
+		createSmackerScene(0x080810C5, true, true, false);
+		break;
+	case 1008:
+		createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false);
+		break;
 	}
-	SetUpdateHandler(&Module3000::updateScene3002b);
-	setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1);
-}
-
-void Module3000::createScene3003(int which) {
-	_vm->gameState().sceneNum = 2;
-	// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
-	if (_flag) {
-		_soundVolume = 90;
-		// TODO Sound1ChList_setVolume(0x90F0D1C3, 90);
-	}
-	if (getGlobalVar(0x10938830)) {
-		createNavigationScene(0x004B7D58, which);
-	} else {
-		createNavigationScene(0x004B7D10, which);
-	}
-	SetUpdateHandler(&Module3000::updateScene3003);
-}
-
-void Module3000::createScene3004(int which) {
-	_vm->gameState().sceneNum = 3;
-	if (getGlobalVar(0x09221A62)) {
-		createNavigationScene(0x004B7E60, which);
-	} else if (getGlobalVar(0x10938830)) {
-		createNavigationScene(0x004B7DA0, which);
-	} else {
-		createNavigationScene(0x004B7E00, which);
-	}
-	SetUpdateHandler(&Module3000::updateScene3004);
-}
-
-void Module3000::createScene3005(int which) {
-	_vm->gameState().sceneNum = 4;
-	if (getGlobalVar(0x09221A62)) {
-		createNavigationScene(0x004B7F20, which);
-	} else {
-		createNavigationScene(0x004B7EC0, which);
-	}
-	SetUpdateHandler(&Module3000::updateScene3005);
-}
-
-void Module3000::createScene3006(int which) {
-	static const byte kNavigationTypes[] = {3, 0};
-	_vm->gameState().sceneNum = 5;
-	createNavigationScene(0x004B7F80, which, kNavigationTypes);
-	SetUpdateHandler(&Module3000::updateScene3006);
-}
-
-void Module3000::createScene3007(int which) {
-	static const byte kNavigationTypes[] = {5};
-	_vm->gameState().sceneNum = 6;
-	createNavigationScene(0x004B7FB0, which, kNavigationTypes);
-	SetUpdateHandler(&Module3000::updateScene3007);
-}
-
-void Module3000::createScene3008(int which) {
-	_vm->gameState().sceneNum = 7;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
-	if (!getSubVar(0x40050052, 0x089809C2)) {
-		setSubVar(0x40050052, 0x089809C2, 1);
-		createSmackerScene(0x90022001, true, true, false);
-	} else {
-		createSmackerScene(0x98022001, true, true, false);
-	}
-	SetUpdateHandler(&Module3000::updateScene3002b);
-}
-
-void Module3000::createScene3009(int which) {
-	_vm->gameState().sceneNum = 8;
-	_childObject = new Scene3009(_vm, this, which);
-	SetUpdateHandler(&Module3000::updateScene3009);
-}
-
-void Module3000::createScene3010(int which) {
-	_vm->gameState().sceneNum = 9;
-	_childObject = new Scene3010(_vm, this, 0);
-	SetUpdateHandler(&Module3000::updateScene3010);
-}
-
-void Module3000::createScene3011(int which) {
-	_vm->gameState().sceneNum = 10;
-	_childObject = new Scene3011(_vm, this, 0);
-	SetUpdateHandler(&Module3000::updateScene3011);
-}
-
-void Module3000::createScene3012(int which) {
-	_vm->gameState().sceneNum = 11;
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
-	if (!getSubVar(0x40050052, 0x10130993)) {
-		setSubVar(0x40050052, 0x10130993, 1);
-		createSmackerScene(0x31093019, true, true, false);
-	} else {
-		createSmackerScene(0x20093019, true, true, false);
-	}
-	SetUpdateHandler(&Module3000::updateScene3002b);
-}
-
-void Module3000::createScene3013(int which) {
-	_vm->gameState().sceneNum = 12;
-	_childObject = new Scene3010(_vm, this, 1);
-	SetUpdateHandler(&Module3000::updateScene3002b);
-}
-
-void Module3000::updateScene3002() {
+	SetUpdateHandler(&Module3000::updateScene);
 	_childObject->handleUpdate();
-#if 0 // ALL TODO
-	if (navigationScene()->getSoundFlag1()) {
-		uint32 frameNumber = navigationScene()->getFrameNumber();
-		int navigationIndex = navigationScene()->getIndex();
-		if (navigationIndex == 1) {
-			if (frameNumber == 0) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-				// TODO Sound1ChList_setVolume(0x48498E46, 70);
-				// TODO Sound1ChList_setVolume(0x50399F64, 70);
-			} else if (frameNumber == 100) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
-			}
-		} else if (navigationIndex == 0) {
-			if (frameNumber == 0) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-				// TODO Sound1ChList_setVolume(0x48498E46, 70);
-				// TODO Sound1ChList_setVolume(0x50399F64, 70);
-			} else if (frameNumber == 10) {
-				// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
-			}
-			if (_flag && _soundVolume < 90 && frameNumber % 2) {
-				if (frameNumber == 0)
-					_soundVolume = 40;
-				else
-					_soundVolume++;
-				// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
-			}
-		}
-	}
-#endif
-	if (_done) {
-		int areaType = navigationScene()->getNavigationAreaType();
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (!getGlobalVar(0x01BA1A52)) {
-			if (_moduleResult == 0) {
-				createScene3010(-1);
-				_childObject->handleUpdate();
-			} else if (_moduleResult == 1) {
-				sendMessage(_parentModule, 0x1009, 0);
-			}
-		} else {
-			if (_moduleResult == 0) {
-				if (areaType == 2) {
-					createScene3003(0);
-					_childObject->handleUpdate();
-				} else {
-					//createScene3002b(-1);
-					_childObject->handleUpdate();
-				}
-			} else if (_moduleResult == 1) {
-				sendMessage(_parentModule, 0x1009, 0);
-			}
-		}
-	}
 }
 
-void Module3000::updateScene3002b() {
+void Module3000::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 1:
-			if (getGlobalVar(0x01BA1A52)) {
-				createScene3002(0);
-				_childObject->handleUpdate();
+			if (!getGlobalVar(0x01BA1A52)) {
+				if (_moduleResult == 0)
+					createScene(9, -1);
+				else if (_moduleResult == 1)
+					sendMessage(_parentModule, 0x1009, 0);
 			} else {
-				createScene3013(-1);
-				_childObject->handleUpdate();
+				if (_moduleResult == 0)
+					if (_navigationAreaType == 2)
+						createScene(2, 0);
+					else
+						createScene(1001, -1);
+				else if (_moduleResult == 1)
+					sendMessage(_parentModule, 0x1009, 0);
 			}
 			break;
+		case 2:
+			// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+			if (_flag) {
+				_soundVolume = 0;
+				// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
+			}
+			if (_moduleResult == 0) {
+				createScene(3, 0);
+			} else if (_moduleResult == 1) {
+				setGlobalVar(0x01BA1A52, 0);
+				createScene(1, 1);
+			}
+			break;
+		case 3:
+			if (_moduleResult == 1)
+				createScene(4, 0);
+			else if (_moduleResult == 3)
+				createScene(10, -1);
+			else if (getGlobalVar(0x09221A62))
+				createScene(5, 0);
+			else
+				createScene(2, 1);
+			break;
+		case 4:
+			if (_moduleResult == 0)
+				sendMessage(_parentModule, 0x1009, 1);
+			else if (_moduleResult == 1)
+				createScene(7, -1);
+			else if (_moduleResult == 2)
+				createScene(3, 3);
+			break;
+		case 5:
+			if (_moduleResult == 0)
+				createScene(6, 0);
+			else if (_moduleResult == 1)
+				createScene(3, 0);
+			break;
+		case 6:
+			if (_navigationAreaType == 4)
+				createScene(11, -1);
+			else
+				createScene(1006, -1);
+			break;
 		case 7:
+			createScene(8, -1);
+			break;
 		case 8:
-			createScene3009(-1);
+			_flag = getGlobalVar(0x10938830); // CHECKME
+			if (_moduleResult != 1) {
+				// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
+				createScene(4, 1);
+			} else if (getGlobalVar(0xF0402B0A)) {
+				createScene(1008, -1);
+			} else {
+				// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0);
+				createScene(4, 1);
+			}
+			break;
+		case 9:
+			if (_moduleResult == 0 || _moduleResult == 2)
+				createScene(1, 0);
+			else if (_moduleResult == 1)
+				createScene(1001, -1);
+			break;
+		case 10:
+			createScene(3, 3);
 			break;
 		case 11:
 			sendMessage(_parentModule, 0x1009, 3);
 			break;
 		case 12:
-			createScene3002(0);
-			_childObject->handleUpdate();
+			createScene(1, 0);
 			break;
-		default:
-			createScene3006(0);
+		case 1001:
+			if (getGlobalVar(0x01BA1A52))
+				createScene(1, 0);
+			else
+				createScene(12, -1);
+			break;
+		case 1006:
+			createScene(5, 0);
+			break;
+		case 1008:
+			createScene(8, -1);
 			break;
-		}
-	}
-}
-
-void Module3000::updateScene3003() {
-	if (!updateChild()) {
-		// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
-		if (_flag) {
-			_soundVolume = 0;
-			// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
-		}
-		if (_moduleResult == 0) {
-			createScene3004(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 1) {
-			setGlobalVar(0x01BA1A52, 0);
-			createScene3002(1);
-			_childObject->handleUpdate();
 		}
 	} else {
+		switch (_vm->gameState().sceneNum) {
+		case 1:
 #if 0 // ALL TODO
-		if (navigationScene()->getSoundFlag1()) {
-			uint32 frameNumber = navigationScene()->getFrameNumber();
-			int navigationIndex = navigationScene()->getIndex();
-			if (_flag && _soundVolume > 1 && frameNumber % 2) {
-				_soundVolume--;
-				// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+			if (navigationScene()->getSoundFlag1()) {
+				uint32 frameNumber = navigationScene()->getFrameNumber();
+				int navigationIndex = navigationScene()->getIndex();
+				if (navigationIndex == 1) {
+					if (frameNumber == 0) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+						// TODO Sound1ChList_setVolume(0x48498E46, 70);
+						// TODO Sound1ChList_setVolume(0x50399F64, 70);
+					} else if (frameNumber == 100) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+					}
+				} else if (navigationIndex == 0) {
+					if (frameNumber == 0) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+						// TODO Sound1ChList_setVolume(0x48498E46, 70);
+						// TODO Sound1ChList_setVolume(0x50399F64, 70);
+					} else if (frameNumber == 10) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+					}
+					if (_flag && _soundVolume < 90 && frameNumber % 2) {
+						if (frameNumber == 0)
+							_soundVolume = 40;
+						else
+							_soundVolume++;
+						// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+					}
+				}
 			}
-			if (navigationIndex == 0) {
-				if (frameNumber == 35) {
-					// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+#endif
+			break;
+		case 2:
+#if 0 // ALL TODO
+			if (navigationScene()->getSoundFlag1()) {
+				uint32 frameNumber = navigationScene()->getFrameNumber();
+				int navigationIndex = navigationScene()->getIndex();
+				if (_flag && _soundVolume > 1 && frameNumber % 2) {
+					_soundVolume--;
+					// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
 				}
-			} else if (navigationIndex == 1) {
-				if (frameNumber == 55) {
-					// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-					// TODO Sound1ChList_setVolume(0x48498E46, 70);
-					// TODO Sound1ChList_setVolume(0x50399F64, 70);
+				if (navigationIndex == 0) {
+					if (frameNumber == 35) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+					}
+				} else if (navigationIndex == 1) {
+					if (frameNumber == 55) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
+						// TODO Sound1ChList_setVolume(0x48498E46, 70);
+						// TODO Sound1ChList_setVolume(0x50399F64, 70);
+					}
 				}
 			}
-		}
 #endif
-	}
-}
-
-void Module3000::updateScene3004() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createScene3005(0);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 3) {
-			createScene3011(-1);
-			_childObject->handleUpdate();
-		} else if (getGlobalVar(0x09221A62)) {
-			createScene3006(0);
-			_childObject->handleUpdate();
-		} else {
-			createScene3003(1);
-			_childObject->handleUpdate();
-		}
-	} else {
+			break;
+		case 3:
 #if 0 // ALL TODO
-		if (navigationScene()->getSoundFlag1()) {
-			uint32 frameNumber = navigationScene()->getFrameNumber();
-			int navigationIndex = navigationScene()->getIndex();
-			if (navigationIndex == 2) {
-				if (frameNumber == 40) {
-					// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
-				}
-				if (_flag && _soundVolume < 90 && frameNumber % 2) {
-					if (frameNumber == 0)
-						_soundVolume = 40;
-					else
-						_soundVolume++;
-					// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+			if (navigationScene()->getSoundFlag1()) {
+				uint32 frameNumber = navigationScene()->getFrameNumber();
+				int navigationIndex = navigationScene()->getIndex();
+				if (navigationIndex == 2) {
+					if (frameNumber == 40) {
+						// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+					}
+					if (_flag && _soundVolume < 90 && frameNumber % 2) {
+						if (frameNumber == 0)
+							_soundVolume = 40;
+						else
+							_soundVolume++;
+						// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+					}
 				}
 			}
-		}
 #endif
-	}
-}
-
-void Module3000::updateScene3005() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			sendMessage(_parentModule, 0x1009, 1);
-		} else if (_moduleResult == 1) {
-			createScene3008(-1);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			createScene3004(3);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void Module3000::updateScene3006() {
-	if (!updateChild()) {
-		if (_moduleResult == 0) {
-			createScene3007(0);
-		} else if (_moduleResult == 1) {
-			createScene3004(0);
-		}
-		_childObject->handleUpdate();
-	} else {
+			break;
+		case 5:
 #if 0 // ALL TODO
-		if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
-			// TODO Sound1ChList_sub_4080B0(false);
-		}
+			if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
+				// TODO Sound1ChList_sub_4080B0(false);
+			}
 #endif
-	}
-}
-
-void Module3000::updateScene3007() {
-	_childObject->handleUpdate();
-	if (_done) {
-		int areaType = navigationScene()->getNavigationAreaType();
-		_done = false;
-		delete _childObject;
-		_childObject = NULL;
-		if (areaType == 4) {
-			createScene3012(-1);
-			_childObject->handleUpdate();
-		} else {
-			createSmackerScene(0x080810C5, true, true, false);
-			SetUpdateHandler(&Module3000::updateScene3002b);
-		}
-	}
-}
-
-void Module3000::updateScene3009() {
-	if (!updateChild()) {
-		_flag = getGlobalVar(0x10938830); // CHECKME
-		if (_moduleResult != 1) {
-			// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
-			createScene3005(1);
-			_childObject->handleUpdate();
-		} else if (getGlobalVar(0xF0402B0A)) {
-			createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false);
-			SetUpdateHandler(&Module3000::updateScene3002b);
-		} else {
-			// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0);
-			createScene3005(1);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void Module3000::updateScene3010() {
-	if (!updateChild()) {
-		if (_moduleResult == 0 || _moduleResult == 2) {
-			createScene3002(0);
-		} else if (_moduleResult == 1) {
-			createScene3002b(-1);
+			break;
 		}
-		_childObject->handleUpdate();
-	}
-}
-
-void Module3000::updateScene3011() {
-	if (!updateChild()) {
-		createScene3004(3);
-		_childObject->handleUpdate();
 	}
 }
 
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 63e5261..2764c83 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -37,30 +37,8 @@ public:
 protected:
 	int _soundVolume;
 	bool _flag;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createScene3002(int which);
-	void createScene3002b(int which);
-	void createScene3003(int which);
-	void createScene3004(int which);
-	void createScene3005(int which);
-	void createScene3006(int which);
-	void createScene3007(int which);
-	void createScene3008(int which);
-	void createScene3009(int which);
-	void createScene3010(int which);
-	void createScene3011(int which);
-	void createScene3012(int which);
-	void createScene3013(int which);
-	void updateScene3002();			
-	void updateScene3002b();			
-	void updateScene3003();			
-	void updateScene3004();			
-	void updateScene3005();			
-	void updateScene3006();			
-	void updateScene3007();			
-	void updateScene3009();			
-	void updateScene3010();			
-	void updateScene3011();			
+	void createScene(int sceneNum, int which);
+	void updateScene();
 };
 
 // Scene3009
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index ae29063..c24bf6a 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -81,9 +81,7 @@ void SmackerScene::nextVideo() {
 			setSubVar(0x00800410, smackerFileHash, 1);
 		}
 		if (_fileHashListIndex == 0) {
-			_smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false);
-			addEntity(_smackerPlayer);
-			addSurface(_smackerPlayer->getSurface());
+			_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false));
 			// TODO? Screen.hSmack = _smackerPlayer;
 		} else {
 			_smackerPlayer->open(smackerFileHash, false);


Commit: 10ff1590305eff85e97ad84f33a0397b54d1341d
    https://github.com/scummvm/scummvm/commit/10ff1590305eff85e97ad84f33a0397b54d1341d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Move createModuleXXX/updateModuleXXX methods

There are merged into createModule and updateModule in the GameModule class

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e6bd99e..8cdd98e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -38,31 +38,22 @@
 namespace Neverhood {
 
 GameModule::GameModule(NeverhoodEngine *vm)
-	: Module(vm, NULL) {
+	: Module(vm, NULL), _moduleNum(-1) {
 	
 	// Other initializations moved to actual engine class
-	
 	// TODO
-
 	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
-	
 	SetMessageHandler(&GameModule::handleMessage);
-
 }
 
 GameModule::~GameModule() {
 
 	// TODO Sound1ChList_sub_407AF0(0x2D0031);
-
 	delete _childObject;
 	_childObject = NULL;
-
 	// TODO: Set palette to black but probably not neccessary
-	
 	// TODO Sound1ChList_sub_408480();
-	
 	// TODO Set debug vars (maybe)
-
 }
 
 void GameModule::handleMouseMove(int16 x, int16 y) {
@@ -87,6 +78,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 
 void GameModule::initScene1307Vars() {
 
+	// Exit if it's already initialized
 	if (getSubVar(0x40050052, 0x25400B10))
 		return;
 
@@ -256,238 +248,171 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
-//	createModule1500(0); // Logos and intro video //Real
-//	createModule1000(-1);
-//	createModule2300(2);
-	//createModule1200(-1);
-	//createModule1800(-1);
-	//createModule1700(-1);
-	//createModule1700(1);
-	//createModule1400(-1);
+//	createModule(1500, 0); // Logos and intro video //Real
 #if 0
 	_vm->gameState().sceneNum = 0;
-	createModule1200(-1);
+	createModule(1200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
-	createModule1800(-1);
+	createModule(1800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
-	createModule2000(-1);
+	createModule(2000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 4;
-	createModule2200(-1);
+	createModule(2200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
-	createModule1000(-1);
+	createModule(1000, -1);
 #endif
 #if 1
 	_vm->gameState().sceneNum = 12;
-	createModule3000(-1);
+	createModule(3000, -1);
 #endif
 }
 
-void GameModule::createModule1000(int which) {
-	setGlobalVar(0x91080831, 0x03294419);
-	_childObject = new Module1000(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1000);
-}
-
-void GameModule::updateModule1000() {
-	if (!updateChild()) {
-		createModule2300(0);
-		_childObject->handleUpdate();
-	}
-}
-
-void GameModule::createModule1200(int which) {
-	setGlobalVar(0x91080831, 0x00478311);
-	_childObject = new Module1200(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1200);
-}
-
-void GameModule::updateModule1200() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			error("// TODO createModule2600(0);");
-			// TODO createModule2600(0);
-			// TODO _childObject->handleUpdate();
-		} else {
-			createModule2300(2);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void GameModule::createModule1300(int which) {
-	setGlobalVar(0x91080831, 0x0061C090);
-	_childObject = new Module1300(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1300);
-}
-
-void GameModule::updateModule1300() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			// TODO _gameState.clear();
-			// TODO GameModule_handleKeyEscape
-		} else {
-			// TODO createModule2900(0);
-			_childObject->handleUpdate();
-		}
-	}
-}
-
-void GameModule::createModule1400(int which) {
-	setGlobalVar(0x91080831, 0x00AD0012);
-	_childObject = new Module1400(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1400);
-}
-
-void GameModule::updateModule1400() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			error("WEIRD!");
-		} else {
-			// TODO createModule1600(1);
-			// TODO _childObject->handleUpdate();
-		}
-	}
-}
-
-void GameModule::createModule1500(int which) {
-	_someFlag1 = false;
-	setGlobalVar(0x91080831, 0x00F10114);
-	_childObject = new Module1500(_vm, this, which, true);
-	SetUpdateHandler(&GameModule::updateModule1500);
-}
-
-void GameModule::updateModule1500() {
-	if (!updateChild()) {
-		createModule1000(0);
-		_childObject->handleUpdate();
-	}
-}
-
-void GameModule::createModule1700(int which) {
-	setGlobalVar(0x91080831, 0x04212331);
-	_childObject = new Module1700(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1700);
-}
-
-void GameModule::updateModule1700() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			// TODO createModule2900(3);
-			// TODO _childObject->handleUpdate();
-		} else {
-			// TODO createModule1600(2);
-			// TODO _childObject->handleUpdate();
-		}
-	}
-}
-
-void GameModule::createModule1800(int which) {
-	setGlobalVar(0x91080831, 0x04A14718);
-	_childObject = new Module1800(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule1800);
-}
-
-void GameModule::updateModule1800() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			// TODO GameState_clear();
-			// TODO GameModule_handleKeyEscape();
-		} else if (_moduleResult == 2) {
-			// TODO createModule2700(0);
-			// TODO _childObject->handleUpdate();
-		} else if (_moduleResult == 3) {
-			createModule3000(3);
-			_childObject->handleUpdate();
-		} else {
-			// TODO createModule2800(0);
-			// TODO _childObject->handleUpdate();
-		}
-	}
-}
-
-void GameModule::createModule2000(int which) {
-	setGlobalVar(0x91080831, 0x08250000);
-	_childObject = new Module2000(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule2000);
-}
-
-void GameModule::updateModule2000() {
-	if (!updateChild()) {
-		// TODO createModule2900(4);
-		_childObject->handleUpdate();
-	}
-}
-
-void GameModule::createModule2200(int which) {
-	setGlobalVar(0x91080831, 0x11391412);
-	_childObject = new Module2200(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule2200);
-}
-
-void GameModule::updateModule2200() {
-	if (!updateChild()) {
-		createModule2300(1);
-		_childObject->handleUpdate();
+void GameModule::createModule(int moduleNum, int which) {
+	debug("GameModule::createModule(%d, %d)", moduleNum, which);
+	_moduleNum = moduleNum;
+	switch (_moduleNum) {
+	case 1000:
+		setGlobalVar(0x91080831, 0x03294419);
+		_childObject = new Module1000(_vm, this, which);
+		break;
+	case 1200:
+		setGlobalVar(0x91080831, 0x00478311);
+		_childObject = new Module1200(_vm, this, which);
+		break;
+	case 1300:
+		setGlobalVar(0x91080831, 0x0061C090);
+		_childObject = new Module1300(_vm, this, which);
+		break;
+	case 1400:
+		setGlobalVar(0x91080831, 0x00AD0012);
+		_childObject = new Module1400(_vm, this, which);
+		break;
+	case 1500:
+		_someFlag1 = false;
+		setGlobalVar(0x91080831, 0x00F10114);
+		_childObject = new Module1500(_vm, this, which, true);
+		break;
+	case 1700:
+		setGlobalVar(0x91080831, 0x04212331);
+		_childObject = new Module1700(_vm, this, which);
+		break;
+	case 1800:
+		setGlobalVar(0x91080831, 0x04A14718);
+		_childObject = new Module1800(_vm, this, which);
+		break;
+	case 2000:
+		setGlobalVar(0x91080831, 0x08250000);
+		_childObject = new Module2000(_vm, this, which);
+		break;
+	case 2200:
+		setGlobalVar(0x91080831, 0x11391412);
+		_childObject = new Module2200(_vm, this, which);
+		break;
+	case 2300:
+		setGlobalVar(0x91080831, 0x1A214010);
+		_childObject = new Module2300(_vm, this, which);
+		break;
+	case 3000:
+		setGlobalVar(0x91080831, 0x81293110);
+		_childObject = new Module3000(_vm, this, which);
+		break;
+	default:
+		error("GameModule::createModule() Could not create module %d", moduleNum);
 	}
+	SetUpdateHandler(&GameModule::updateModule);
+	_childObject->handleUpdate();
 }
 
-void GameModule::createModule2300(int which) {
-	setGlobalVar(0x91080831, 0x1A214010);
-	_childObject = new Module2300(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule2300);
-}
-
-void GameModule::updateModule2300() {
+void GameModule::updateModule() {
 	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			createModule2200(0);
-		} else if (_moduleResult == 2) {
-			createModule1200(0);
-		} else if (_moduleResult == 3) {
-			// TODO createModule2400(0);
-		} else if (_moduleResult == 4) {
-			createModule3000(0);
-		} else {
-			createModule1000(1);
-		}
-		_childObject->handleUpdate();
-	}
-}
-
-void GameModule::createModule2400(int which) {
-	error("createModule2400");
-}
-
-void GameModule::createModule3000(int which) {
-	setGlobalVar(0x91080831, 0x81293110);
-	_childObject = new Module3000(_vm, this, which);
-	SetUpdateHandler(&GameModule::updateModule3000);
-}
-
-void GameModule::updateModule3000() {
-	if (!updateChild()) {
-		if (_moduleResult == 1) {
-			// TODO createModule1900(0);
-			// TODO _childObject->handleUpdate();
-		} else if (_moduleResult == 2) {
-			// WEIRD: Sets the errorFlag
-		} else if (_moduleResult == 3) {
-			createModule1800(3);
-			_childObject->handleUpdate();
-		} else if (_moduleResult == 4) {
-			createModule3000(0);
-			_childObject->handleUpdate();
-		} else {
-			createModule2300(4);
-			_childObject->handleUpdate();
+		switch (_moduleNum) {
+		case 1000:
+			createModule(2300, 0);
+			break;
+		case 1200:
+			if (_moduleResult == 1) {
+				createModule(2600, 0);
+			} else {
+				createModule(2300, 2);
+			}
+			break;
+		case 1300:
+			if (_moduleResult == 1) {
+				// TODO _gameState.clear();
+				// TODO GameModule_handleKeyEscape
+			} else {
+				createModule(2900, 0);
+			}
+			break;
+		case 1400:
+			if (_moduleResult == 1) {
+				error("WEIRD!");
+			} else {
+				createModule(1600, 1);
+			}
+			break;
+		case 1500:
+			createModule(1000, 0);
+			break;
+		case 1700:
+			if (_moduleResult == 1) {
+				createModule(2900, 3);
+			} else {
+				createModule(1600, 2);
+			}
+			break;
+		case 1800:
+			if (_moduleResult == 1) {
+				// TODO GameState_clear();
+				// TODO GameModule_handleKeyEscape();
+			} else if (_moduleResult == 2) {
+				createModule(2700, 0);
+			} else if (_moduleResult == 3) {
+				createModule(3000, 3);
+			} else {
+				createModule(2800, 0);
+			}
+			break;
+		case 2000:
+			createModule(2900, 4);
+			break;
+		case 2200:
+			createModule(2300, 1);
+			break;
+		case 2300:
+			if (_moduleResult == 1) {
+				createModule(2200, 0);
+			} else if (_moduleResult == 2) {
+				createModule(1200, 0);
+			} else if (_moduleResult == 3) {
+				createModule(2400, 0);
+			} else if (_moduleResult == 4) {
+				createModule(3000, 0);
+			} else {
+				createModule(1000, 1);
+			}
+			break;
+		case 3000:
+			if (_moduleResult == 1) {
+				createModule(1900, 0);
+			} else if (_moduleResult == 2) {
+				// WEIRD: Sets the errorFlag
+			} else if (_moduleResult == 3) {
+				createModule(1800, 3);
+			} else if (_moduleResult == 4) {
+				createModule(3000, 0);
+			} else {
+				createModule(2300, 4);
+			}
+			break;
 		}
 	}
 }
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 02f16c5..6da7123 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -45,36 +45,10 @@ protected:
 	bool _someFlag1;
 	bool _field2C;
 	uint32 _counter;
-	/* TODO
-	ResourceTable _resourceTable1;
-	ResourceTable _resourceTable2;
-	ResourceTable _resourceTable3;
-	ResourceTable _resourceTable4;
-	*/
+	int _moduleNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createModule1000(int which);
-	void updateModule1000();
-	void createModule1200(int which);
-	void updateModule1200();
-	void createModule1300(int which);
-	void updateModule1300();
-	void createModule1400(int which);
-	void updateModule1400();
-	void createModule1500(int which);
-	void updateModule1500();
-	void createModule1700(int which);
-	void updateModule1700();
-	void createModule1800(int which);
-	void updateModule1800();
-	void createModule2000(int which);
-	void updateModule2000();
-	void createModule2200(int which);
-	void updateModule2200();
-	void createModule2300(int which);
-	void updateModule2300();
-	void createModule2400(int which);
-	void createModule3000(int which);
-	void updateModule3000();
+	void createModule(int moduleNum, int which);
+	void updateModule();
 };
 
 } // End of namespace Neverhood


Commit: fa695229bed037257099e6c082f7e50be1119882
    https://github.com/scummvm/scummvm/commit/fa695229bed037257099e6c082f7e50be1119882
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Add Sprite::setVisible and use it instead of direct access to the surface member

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 4539b37..1cc4b43 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -174,7 +174,7 @@ void AsScene1001Door::callback1() {
 		break;
 	case 3:
 		setFileHash1();
-		_surface->setVisible(false);
+		setVisible(false);
 		break;
 	default:
 		setFileHash(0x624C0498, 0, -1);
@@ -193,7 +193,7 @@ void AsScene1001Door::callback2() {
 void AsScene1001Door::callback3() {
 	_soundResource1.play();
 	setFileHash1();
-	_surface->setVisible(false);	
+	setVisible(false);	
 }
 	
 AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
@@ -255,7 +255,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 	case 0x3002:
 		SetMessageHandler(NULL);
 		setGlobalVar(0x03C698DA, 1);
-		_surface->setVisible(false);
+		setVisible(false);
 		break;
 	}
 	return 0;
@@ -310,14 +310,14 @@ SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentSce
 
 	_priority = 1100;
 	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; 
-	_surface->setVisible(false);
+	setVisible(false);
 	SetUpdateHandler(&SsCommonButtonSprite::update);
 	SetMessageHandler(&SsCommonButtonSprite::handleMessage);
 }
 	
 void SsCommonButtonSprite::update() {
 	if (_countdown != 0 && (--_countdown) == 0) {
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 	
@@ -326,7 +326,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x480B:
 		sendMessage(_parentScene, 0x480B, 0);
-		_surface->setVisible(true);
+		setVisible(true);
 		_countdown = 8;
 		_soundResource.play(_soundFileHash);
 		break;
@@ -740,7 +740,7 @@ Class505::Class505(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1400) {
 
 	createSurface(1025, 88, 165);
-	_surface->setVisible(false);
+	setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class505::handleMessage);	
 }
@@ -752,11 +752,11 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam &param, Entity
 		_x = ((Sprite*)sender)->getX() - 98;
 		_y = ((Sprite*)sender)->getY() - 111;
 		setFileHash(0x0422255A, 0, -1);
-		_surface->setVisible(true);
+		setVisible(true);
 		break;
 	case 0x3002:
 		setFileHash1();
-		_surface->setVisible(false);
+		setVisible(false);
 		break;
 	}
 	return messageResult;
@@ -844,7 +844,7 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 
-	_surface->setVisible(false);
+	setVisible(false);
 	_needRefresh = true;
 	
 	SetUpdateHandler(&Class426::update);
@@ -906,7 +906,7 @@ void Class426::update() {
 			_countdown = 4;
 		} else if (_status == 3) {
 			_status = 0;
-			_surface->setVisible(false);
+			setVisible(false);
 		}
 	}
 }
@@ -918,7 +918,7 @@ uint32 Class426::handleMessage(int messageNum, const MessageParam &param, Entity
 		sendMessage(_parentScene, 0x480B, 0);
 		_status = 1;
 		_countdown = 4;
-		_surface->setVisible(true);
+		setVisible(true);
 		_soundResource.play(_soundFileHash);
 		break;
 	}
@@ -1195,7 +1195,7 @@ Class506::Class506(NeverhoodEngine *vm)
 		setFileHash(0x004A4495, -1, -1);
 		_newHashListIndex = -2;
 	} else {
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 	SetUpdateHandler(&Class506::update);
 	SetMessageHandler(&Class506::handleMessage4491B0);	
@@ -1241,7 +1241,7 @@ void Class506::sub449250() {
 	setFileHash(0x004A4495, 0, -1);
 	SetMessageHandler(&Class506::handleMessage4491B0);
 	_newHashListIndex = -2;
-	_surface->setVisible(true);
+	setVisible(true);
 }
 
 void Class506::sub449280() {
@@ -1249,11 +1249,11 @@ void Class506::sub449280() {
 	_playBackwards = true;
 	SetMessageHandler(&Class506::handleMessage449210);
 	SetAnimationCallback3(&Class506::sub4492C0);
-	_surface->setVisible(true);
+	setVisible(true);
 }
 
 void Class506::sub4492C0() {
-	_surface->setVisible(false);
+	setVisible(false);
 	setFileHash1();
 }
 
@@ -1263,26 +1263,26 @@ Class478::Class478(NeverhoodEngine *vm, Klayman *klayman)
 	createSurface(1200, 40, 163);
 	SetUpdateHandler(&Class478::update);
 	SetMessageHandler(&Sprite::handleMessage);
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void Class478::update() {
 	if (_klayman->getCurrAnimFileHash() == 0x3A292504) {
 		setFileHash(0xBA280522, _frameIndex, -1);
 		_newHashListIndex = _klayman->getFrameIndex();
-		_surface->setVisible(true);
+		setVisible(true);
 		_x = _klayman->getX(); 
 		_y = _klayman->getY(); 
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
 	} else if (_klayman->getCurrAnimFileHash() == 0x122D1505) {
 		setFileHash(0x1319150C, _frameIndex, -1);
 		_newHashListIndex = _klayman->getFrameIndex();
-		_surface->setVisible(true);
+		setVisible(true);
 		_x = _klayman->getX(); 
 		_y = _klayman->getY(); 
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
 	} else {
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 	AnimatedSprite::update();
 }
@@ -1294,19 +1294,19 @@ Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman)
 	SetUpdateHandler(&Class479::update);
 	SetMessageHandler(&Class479::handleMessage);
 	createSurface(1000, 33, 41);
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void Class479::update() {
 	if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) {
 		setFileHash(0x9820C913, _klayman->getFrameIndex(), -1);
 		_newHashListIndex = _klayman->getFrameIndex();
-		_surface->setVisible(true);
+		setVisible(true);
 		_x = _klayman->getX();
 		_y = _klayman->getY();
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
 	} else {
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 	AnimatedSprite::update();
 }
@@ -1656,7 +1656,7 @@ AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm)
 	createSurface(800, 56, 50);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1004TrashCan::handleMessage);
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1669,11 +1669,11 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa
 		break;
 	case 0x2002:
 		setFileHash(0xEB312C11, 0, -1);
-		_surface->setVisible(true);
+		setVisible(true);
 		break;
 	case 0x3002:
 		setFileHash1();
-		_surface->setVisible(false);
+		setVisible(false);
 		break;
 	}
 	return 0;
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index ff04937..9cab544 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -202,7 +202,7 @@ AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32
 	if (!getSubVar(0x02038314, _nameHash) && !getSubVar(0x02720344, _nameHash)) {
 		SetMessageHandler(&AsScene1201Tape::handleMessage);
 	} else {
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 	}
 }
@@ -216,7 +216,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
 		break;
 	case 0x4806:
 		setSubVar(0x02038314, _nameHash, 1);
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 		break;
 	}
@@ -283,7 +283,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 		_countdown = 25;
 	} else {
 		setFileHash1();
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -310,21 +310,21 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p
 void AsScene1201RightDoor::sub40D7E0() {
 	setFileHash(0xD088AC30, 0, -1);
 	_newHashListIndex = -2;
-	_surface->setVisible(true);
+	setVisible(true);
 	_soundResource.play(calcHash("fxDoorOpen20"));
 }
 
 void AsScene1201RightDoor::sub40D830() {
 	setFileHash(0xD088AC30, -1, -1);
 	_playBackwards = true;
-	_surface->setVisible(true);
+	setVisible(true);
 	_soundResource.play(calcHash("fxDoorClose20"));
 	SetAnimationCallback3(&AsScene1201RightDoor::sub40D880);
 }
 
 void AsScene1201RightDoor::sub40D880() {
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 		
 Class464::Class464(NeverhoodEngine *vm)
@@ -334,7 +334,7 @@ Class464::Class464(NeverhoodEngine *vm)
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class464::handleMessage);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -344,11 +344,11 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity
 		_x = 436;
 		_y = 339;
 		setFileHash(0xA060C599, 0, -1);
-		_surface->setVisible(true);
+		setVisible(true);
 		break;
 	case 0x3002:
 		setFileHash1();
-		_surface->setVisible(false);
+		setVisible(false);
 		removeCallbacks();
 		break;
 	}
@@ -447,7 +447,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
 	SetMessageHandler(&Sprite::handleMessage);
 	SetSpriteCallback(&Class465::spriteUpdate40D150);
 	setFileHash(0x828C0411, 0, -1);
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 Class465::~Class465() {
@@ -457,7 +457,7 @@ Class465::~Class465() {
 void Class465::update() {
 	AnimatedSprite::update();
 	if (getGlobalVar(0x20A0C516)) {
-		_surface->setVisible(true);
+		setVisible(true);
 		SetUpdateHandler(&AnimatedSprite::update);
 		// TODO Sound1ChList_addSoundResource(0x041080A4, 0x460A1050, true);
 		// TODO Sound1ChList_playLooping(0x460A1050);
@@ -540,7 +540,7 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam
 		messageResult = 1;
 		break;
 	case 0x4806:
-		_surface->setVisible(false);
+		setVisible(false);
 		setGlobalVar(0x0112090A, 3);
 		break;
 	}
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 518568c..f27952f 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -428,7 +428,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class595 = addSprite(new Class595(_vm, this));
 	_sprite1 = insertStaticSprite(0x942FC224, 300);
 	_sprite2 = insertStaticSprite(0x70430830, 1200);
-	_sprite2->getSurface()->setVisible(false);
+	_sprite2->setVisible(false);
 	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
 
 	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false));
@@ -533,7 +533,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2032:
-		_sprite2->getSurface()->setVisible(true);
+		_sprite2->setVisible(true);
 		break;
 	case 0x4806:
 		sendMessage(_parentModule, 0x1024, 2);
@@ -555,7 +555,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _asRing2) {
 			sendMessage(_asBridge, 0x4809, 0);
 			setGlobalVar(0x13206309, 0);
-			_sprite2->getSurface()->setVisible(false);
+			_sprite2->setVisible(false);
 		} else if (sender == _asRing4) {
 			sendMessage(_ssFence, 0x4809, 0);
 			setGlobalVar(0x80101B1E, 0);
@@ -627,7 +627,7 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p
 		_soundResource.play(0x470007EE);
 		setFileHash1();
 		SetMessageHandler(NULL);
-		_surface->setVisible(false);
+		setVisible(false);
 		break;
 	}
 	return messageResult;
@@ -687,7 +687,7 @@ Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority,
 	: AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) {
 	
 	if (getGlobalVar(0x31C63C51)) {
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 	} else {
 		SetMessageHandler(&Class544::handleMessage);
@@ -703,7 +703,7 @@ uint32 Class544::handleMessage(int messageNum, const MessageParam &param, Entity
 		break;
 	case 0x4806:
 		setGlobalVar(0x31C63C51, 1);
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 		break;
 	}
@@ -830,14 +830,14 @@ void AsScene1306Elevator::update() {
 	AnimatedSprite::update();
 	if (_frameIndex == 7) {
 		_soundResource3.play();
-		_asElevatorDoor->getSurface()->setVisible(false);
+		_asElevatorDoor->setVisible(false);
 	}
 }
 
 void AsScene1306Elevator::upGoingDown() {
 	AnimatedSprite::update();
 	if (_frameIndex == 5) {
-		_asElevatorDoor->getSurface()->setVisible(true);
+		_asElevatorDoor->setVisible(true);
 	}
 }
 
@@ -861,7 +861,7 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa
 }
 
 void AsScene1306Elevator::stGoingUp() {
-	_surface->setVisible(true);
+	setVisible(true);
 	_isDown = false;
 	SetUpdateHandler(&AsScene1306Elevator::update);
 	setFileHash(0x043B0270, 0, -1);
@@ -875,13 +875,13 @@ void AsScene1306Elevator::cbGoingUpEvent() {
 	_isUp = true;
 	_countdown = 144;
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void AsScene1306Elevator::stGoingDown() {
 	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
 	_isUp = false;
-	_surface->setVisible(true);
+	setVisible(true);
 	setFileHash(0x043B0270, -1, -1);
 	_playBackwards = true;
 	SetAnimationCallback3(&AsScene1306Elevator::cbGoingDownEvent);
@@ -1466,7 +1466,7 @@ Class549::Class549(NeverhoodEngine *vm, Scene *parentScene)
 	_parentScene(parentScene) {
 	
 	SetMessageHandler(&Class549::handleMessage);
-	_surface->setVisible(false);
+	setVisible(false);
 	setFileHash1();
 }
 
@@ -1488,7 +1488,7 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity
 
 void Class549::sub455470() {
 	setFileHash(0xBA0AE050, 0, -1);
-	_surface->setVisible(true);
+	setVisible(true);
 	SetAnimationCallback3(&Class549::hide);
 	_soundResource.play(calcHash("fxDoorOpen38"));
 }
@@ -1496,13 +1496,13 @@ void Class549::sub455470() {
 void Class549::hide() {
 	sendMessage(_parentScene, 0x2000, 0);
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void Class549::sub4554F0() {
 	setFileHash(0xBA0AE050, -1, -1);
 	_playBackwards = true;
-	_surface->setVisible(true);
+	setVisible(true);
 	SetAnimationCallback3(&Class549::sub455550);
 	_soundResource.play(calcHash("fxDoorClose38"));
 }
@@ -1541,14 +1541,14 @@ void Class592::sub455710() {
 void Class592::sub455740() {
 	sendMessage(_parentScene, 0x2004, 0);
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 Class593::Class593(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) {
 	
 	SetMessageHandler(&Class593::handleMessage);
-	_surface->setVisible(false);
+	setVisible(false);
 	setFileHash1();
 	Entity::_priority = 1200;
 }
@@ -1570,7 +1570,7 @@ uint32 Class593::handleMessage(int messageNum, const MessageParam &param, Entity
 
 void Class593::sub4558F0() {
 	setFileHash(0x80180A10, 0, -1);
-	_surface->setVisible(false);
+	setVisible(false);
 	_newHashListIndex = -2;
 }
 
@@ -1583,13 +1583,13 @@ void Class593::sub455920() {
 void Class593::sub455950() {
 	sendMessage(_parentScene, 0x2003, 0);
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index)
 	: StaticSprite(vm, fileHash, 100) {
 	
-	_surface->setVisible(false);
+	setVisible(false);
 	_x = _spriteResource.getPosition().x + index * 20;
 	StaticSprite::update();
 }
@@ -1680,7 +1680,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(0x80455A41)) {
 			_sprite5 = addSprite(new Class592(_vm, this));
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
-			_sprite4->getSurface()->setVisible(false);
+			_sprite4->setVisible(false);
 		} else {
 			_sprite5 = insertStaticSprite(0x080811A0, 100);
 			setRectList(0x004B5980);
@@ -1689,13 +1689,13 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		InsertKlayman(KmScene1308, 41, 440);
 		setMessageList(0x004B57D0);
 		sendMessage(_class549, 0x4808, 0);
-		_sprite1->getSurface()->setVisible(false);
+		_sprite1->setVisible(false);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
-			_klayman->getSurface()->setVisible(false);
+			_klayman->setVisible(false);
 		} else {
 			_sprite5 = insertStaticSprite(0x080811A0, 100);
-			_klayman->getSurface()->setVisible(false);
+			_klayman->setVisible(false);
 		}
 	}
 
@@ -1744,8 +1744,8 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x4AC68808) {
 			clearRectList();
 			sendMessage(_class549, 0x4809, 0);
-			_sprite1->getSurface()->setVisible(false);
-			_klayman->getSurface()->setVisible(false);
+			_sprite1->setVisible(false);
+			_klayman->setVisible(false);
 		}
 		break;
 	case 0x1022:
@@ -1763,19 +1763,19 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			setRectList(0x004B5980);
 		}
 		setMessageList(0x004B57E8);
-		_sprite1->getSurface()->setVisible(true);
-		_klayman->getSurface()->setVisible(true);
+		_sprite1->setVisible(true);
+		_klayman->setVisible(true);
 		break;
 	case 0x2001:
 		sendMessage(_parentModule, 0x1009, 0);
 		break;
 	case 0x2003:
-		_class601_1->getSurface()->setVisible(false);
-		_class601_2->getSurface()->setVisible(false);
-		_class601_3->getSurface()->setVisible(false);
+		_class601_1->setVisible(false);
+		_class601_2->setVisible(false);
+		_class601_3->setVisible(false);
 		break;
 	case 0x2004:
-		_sprite4->getSurface()->setVisible(true);
+		_sprite4->setVisible(true);
 		setRectList(0x004B5990);
 		break;
 	case 0x4807:
@@ -1783,9 +1783,9 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480F:
 		sendMessage(_class593, 0x2002, 0);
-		_class601_1->getSurface()->setVisible(true);
-		_class601_2->getSurface()->setVisible(true);
-		_class601_3->getSurface()->setVisible(true);
+		_class601_1->setVisible(true);
+		_class601_2->setVisible(true);
+		_class601_3->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _class489) {
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 32918b1..f50fb25 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -259,7 +259,7 @@ void Class526::spriteUpdate466720() {
 		setFileHash1();
 		SetSpriteCallback(NULL);
 		SetMessageHandler(NULL);
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -297,7 +297,7 @@ void Class527::spriteUpdate466920() {
 		setFileHash1();
 		SetSpriteCallback(NULL);
 		SetMessageHandler(NULL);
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -322,7 +322,7 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 	} else {
 		_flag = false;
 		setFileHash1();
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -356,7 +356,7 @@ uint32 Class528::handleMessage(int messageNum, const MessageParam &param, Entity
 
 void Class528::sub466BF0() {
 	_flag = true;
-	_surface->setVisible(true);
+	setVisible(true);
 	setFileHash(0x04551900, 0, -1);
 	_newHashListIndex = -2;
 	_soundResource.play(calcHash("fxDoorOpen24"));
@@ -364,7 +364,7 @@ void Class528::sub466BF0() {
 
 void Class528::sub466C50() {
 	_flag = false;
-	_surface->setVisible(true);
+	setVisible(true);
 	setFileHash(0x04551900, -1, -1);
 	_soundResource.play(calcHash("fxDoorClose24"));
 	_playBackwards = true;
@@ -373,7 +373,7 @@ void Class528::sub466C50() {
 
 void Class528::sub466CB0() {
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 static const Class489Item kClass489Items[] = {
@@ -577,7 +577,7 @@ void Class489::sub434D80() {
 		setFileHash1();
 		SetMessageHandler(&Sprite::handleMessage);
 		SetSpriteCallback(NULL);
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -681,24 +681,24 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0));
 	_sprite1 = insertStaticSprite(0x38EA100C, 1005);
 	_sprite2 = insertStaticSprite(0x98D0223C, 1200);
-	_sprite2->getSurface()->setVisible(false);
+	_sprite2->setVisible(false);
 
 	if (which < 0) {
 		InsertKlayman(KmScene1401, 380, 447);
 		setMessageList(0x004B65C8);
-		_sprite1->getSurface()->setVisible(false);
+		_sprite1->setVisible(false);
 	} else if (which == 1) {
 		InsertKlayman(KmScene1401, 0, 447);
 		setMessageList(0x004B65D0);
-		_sprite1->getSurface()->setVisible(false);
+		_sprite1->setVisible(false);
 	} else if (which == 2) {
 		InsertKlayman(KmScene1401, 660, 447);
 		setMessageList(0x004B65D8);
-		_sprite1->getSurface()->setVisible(false);
+		_sprite1->setVisible(false);
 	} else {
 		InsertKlayman(KmScene1401, 290, 413);
 		setMessageList(0x004B65E8);
-		_sprite1->getSurface()->setVisible(false);
+		_sprite1->setVisible(false);
 	}
 
 	if (getGlobalVar(0x04A105B3) == 2) {
@@ -737,10 +737,10 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene1401::update() {
 	Scene::update();
 	if (_class489 && !_flag && _class489->getY() < 360) {
-		_sprite2->getSurface()->setVisible(true);
+		_sprite2->setVisible(true);
 		_flag = true;
 	} else {
-		_sprite2->getSurface()->setVisible(false);
+		_sprite2->setVisible(false);
 	}
 }
 
@@ -793,13 +793,13 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		}						
 		break;
 	case 0x482A:
-		_sprite1->getSurface()->setVisible(true);
+		_sprite1->setVisible(true);
 		if (_class489) {
 			sendMessage(_class489, 0x482B, 0);
 		}
 		break;
 	case 0x482B:
-		_sprite1->getSurface()->setVisible(false);
+		_sprite1->setVisible(false);
 		if (_class489) {
 			sendMessage(_class489, 0x482A, 0);
 		}
@@ -863,13 +863,13 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 void Class482::sub428500() {
 	sendMessage(_parentScene, 0x2000, 0);
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void Class482::sub428530() {
 	sendMessage(_parentScene, 0x2001, 0);
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void Class482::sub428560() {
@@ -994,7 +994,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 				sendMessage(_parentModule, 0x1009, 0);
 			} else {
 				clearRectList();
-				_klayman->getSurface()->setVisible(false);
+				_klayman->setVisible(false);
 				showMouse(false);
 				sendMessage(_class482, 0x2002, 0);
 				sub428220();
@@ -1258,7 +1258,7 @@ void AsScene1407Mouse::stGoThroughHole() {
 	SetMessageHandler(NULL);
 	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
 	SetAnimationCallback3(&AsScene1407Mouse::stArriveAtHole);
-	_surface->setVisible(false);
+	setVisible(false);
 	_countdown = 12;
 }
 
@@ -1270,11 +1270,11 @@ void AsScene1407Mouse::stArriveAtHole() {
 		sendMessage(_parentScene, 0x2000, 0);
 		_walkDestX = 512;
 		stWalkToDest();
-		_surface->setVisible(true);
+		setVisible(true);
 	} else {
 		_walkDestX = _x + 14;
 		stWalkToDest();
-		_surface->setVisible(true);
+		setVisible(true);
 	}
 }
 
@@ -1294,7 +1294,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asMouse = addSprite(new AsScene1407Mouse(_vm, this));
 	_ssResetButton = insertStaticSprite(0x12006600, 100);
-	_ssResetButton->getSurface()->setVisible(false); 
+	_ssResetButton->setVisible(false); 
 
 }
 
@@ -1303,7 +1303,7 @@ void Scene1407::update() {
 	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) {
 		sendMessage(_parentModule, 0x1009, 1);
 	} else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) {
-		_ssResetButton->getSurface()->setVisible(false);
+		_ssResetButton->setVisible(false);
 	}
 }
 
@@ -1320,7 +1320,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 				param.asPoint().y >= 62 && param.asPoint().y <= 90) {
 				// The reset button was clicked
 				sendMessage(_asMouse, 0x2001, 0);
-				_ssResetButton->getSurface()->setVisible(true);
+				_ssResetButton->setVisible(true);
 				_soundResource.play(0x44045000);
 				_resetButtonCountdown = 12;
 			} else {
@@ -1359,7 +1359,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x0A230219);
 
 	_class401_1 = insertStaticSprite(0x01102A33, 100);
-	_class401_1->getSurface()->setVisible(false);
+	_class401_1->setVisible(false);
 
 	_class401_2 = insertStaticSprite(0x04442520, 995);
 	
@@ -1431,10 +1431,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4807:
-		_class401_1->getSurface()->setVisible(false);
+		_class401_1->setVisible(false);
 		break;
 	case 0x480F:
-		_class401_1->getSurface()->setVisible(true);
+		_class401_1->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _class489) {
@@ -1634,7 +1634,7 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui
 	_x = kAsScene1405TileItemPositions[_index].x;
 	_y = kAsScene1405TileItemPositions[_index].y;
 	createSurface1(0x844B805C, 1100);
-	_surface->setVisible(false);
+	setVisible(false);
 	if (getSubVar(0xCCE0280F, _index))
 		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
 	SetUpdateHandler(&AsScene1405Tile::update);
@@ -1672,7 +1672,7 @@ void AsScene1405Tile::show() {
 	if (!_flag) {
 		_flag = true;
 		_soundResource.play();
-		_surface->setVisible(true);
+		setVisible(true);
 	}
 }
 
@@ -1680,7 +1680,7 @@ void AsScene1405Tile::hide() {
 	if (_flag) {
 		_flag = false;
 		_soundResource.play();
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 9188dab..58fc835 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -144,7 +144,7 @@ Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfa
 	if (!getSubVar(0x02038314, _index) && !getSubVar(0x02720344, _index)) {
 		SetMessageHandler(&Class606::handleMessage);
 	} else {
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 	}
 	_deltaRect = _drawRect;
@@ -164,7 +164,7 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam &param, Entity
 		break;
 	case 0x4806:
 		setSubVar(0x02038314, _index, 1);
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 		break;		
 	}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 3bc3797..1f118a4 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -650,7 +650,7 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *
 	} else {
 		setFileHash(0xE2CB0412, 0, -1);
 		_newHashListIndex = 0;
-		_doorLightSprite->getSurface()->setVisible(false);
+		_doorLightSprite->setVisible(false);
 	}
 }
 
@@ -667,10 +667,10 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 	case 0x100D:
 		if (param.asInteger() == 0x11001090) {
 			if (_doorOpen)
-				_doorLightSprite->getSurface()->setVisible(true);
+				_doorLightSprite->setVisible(true);
 		} else if (param.asInteger() == 0x11283090) {
 			if (!_doorOpen)
-				_doorLightSprite->getSurface()->setVisible(false);
+				_doorLightSprite->setVisible(false);
 		}
 		break;
 	case 0x2000:
@@ -1254,7 +1254,7 @@ Class545::Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfa
 	if (!getSubVar(0x0090EA95, _index) && !getSubVar(0x08D0AB11, _index)) {
 		SetMessageHandler(&Class545::handleMessage);
 	} else {
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 	}
 }
@@ -1268,7 +1268,7 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam &param, Entity
 		break;
 	case 0x4806:
 		setSubVar(0x0090EA95, _index, 1);
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 	}
 	return messageResult;
@@ -1405,10 +1405,10 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x9A500914)) {
-		_ssSmallLeftDoor->getSurface()->setVisible(false);
+		_ssSmallLeftDoor->setVisible(false);
 		_klayman->getSurface()->getClipRect() = _rightDoorClipRect;
 	} else {
-		_ssSmallRightDoor->getSurface()->setVisible(false);
+		_ssSmallRightDoor->setVisible(false);
 		_klayman->getSurface()->getClipRect() = _leftDoorClipRect;
 	}
 	
@@ -1440,17 +1440,17 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2003:
 		if (sender == _asLeftDoor) {
-			_ssSmallLeftDoor->getSurface()->setVisible(false);
+			_ssSmallLeftDoor->setVisible(false);
 		} else {
-			_ssSmallRightDoor->getSurface()->setVisible(false);
+			_ssSmallRightDoor->setVisible(false);
 		}
 		break;
 	case 0x4808:
 		if (sender == _asLeftDoor) {
-			_ssSmallLeftDoor->getSurface()->setVisible(true);
+			_ssSmallLeftDoor->setVisible(true);
 			_klayman->getSurface()->getClipRect() = _leftDoorClipRect;
 		} else {
-			_ssSmallRightDoor->getSurface()->setVisible(true);
+			_ssSmallRightDoor->setVisible(true);
 			_klayman->getSurface()->getClipRect() = _rightDoorClipRect;
 		}
 		break;
@@ -1734,7 +1734,7 @@ Class607::Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority,
 	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) {
 
 	if (getGlobalVar(0x45080C38)) {
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 	} else {
 		SetMessageHandler(&Class607::handleMessage);
@@ -1752,7 +1752,7 @@ uint32 Class607::handleMessage(int messageNum, const MessageParam &param, Entity
 		break;
 	case 0x4806:
 		setGlobalVar(0x45080C38, 1);
-		_surface->setVisible(false);
+		setVisible(false);
 		SetMessageHandler(NULL);
 		break;
 	}
@@ -2191,7 +2191,7 @@ void AsScene2207WallRobotAnimation::stStartAnimation() {
 	} else {
 		setFileHash(0xCCFD6090, 0, -1);
 		_idle = false;
-		_surface->setVisible(true);
+		setVisible(true);
 	}
 }
 
@@ -2207,7 +2207,7 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() {
 	_soundResource4.stop();
 	// TODO Sound1ChList_deleteSoundByHash(0x12121943);
 	_idle = true;
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm)
@@ -2242,7 +2242,7 @@ void AsScene2207WallCannonAnimation::stStartAnimation() {
 	if (!_idle) {
 		SetAnimationCallback3(NULL);
 	} else {
-		_surface->setVisible(true);
+		setVisible(true);
 		setFileHash(0x8CAA0099, 0, -1);
 		_idle = false;
 	}
@@ -2254,7 +2254,7 @@ void AsScene2207WallCannonAnimation::stStopAnimation() {
 
 void AsScene2207WallCannonAnimation::cbStopAnimation() {
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 	_idle = true;
 }
 
@@ -2309,8 +2309,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this));
 		_asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm));
 		
-		_asWallRobotAnimation->getSurface()->setVisible(false);
-		_asWallCannonAnimation->getSurface()->setVisible(false);
+		_asWallRobotAnimation->setVisible(false);
+		_asWallCannonAnimation->setVisible(false);
 
 		_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0));
 	
@@ -2452,8 +2452,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x480F:
 		sendMessage(_asWallRobotAnimation, 0x2006, 0);
 		sendMessage(_asWallCannonAnimation, 0x2006, 0);
-		_asWallRobotAnimation->getSurface()->setVisible(true);
-		_asWallCannonAnimation->getSurface()->setVisible(true);
+		_asWallRobotAnimation->setVisible(true);
+		_asWallCannonAnimation->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 219f595..82bcc54 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -462,7 +462,7 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc
 	_deltaRect.y = 0;
 	_deltaRect.width = _spriteResource.getDimensions().width;
 	_deltaRect.height = _spriteResource.getDimensions().height;
-	_surface->setVisible(false);
+	setVisible(false);
 	processDelta();
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3009FireCannonButton::update);
@@ -474,7 +474,7 @@ void SsScene3009FireCannonButton::update() {
 	StaticSprite::update();
 	if (_flag1 && !_soundResource.isPlaying()) {
 		sendMessage(_parentScene, 0x2000, 0);
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -484,7 +484,7 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP
 	case 0x1011:
 		if (!_flag1 && !_parentScene->sub462E90()) {
 			_flag1 = true;
-			_surface->setVisible(true);
+			setVisible(true);
 			_soundResource.play();
 		}
 		messageResult = 1;
@@ -516,9 +516,9 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
 void SsScene3009SymbolEdges::update() {
 	if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) {
 		if (_blinkToggle) {
-			_surface->setVisible(true);
+			setVisible(true);
 		} else {
-			_surface->setVisible(false);
+			setVisible(false);
 		}
 		StaticSprite::update();
 		_blinkCountdown = 3;
@@ -527,19 +527,19 @@ void SsScene3009SymbolEdges::update() {
 }
 
 void SsScene3009SymbolEdges::show() {
-	_surface->setVisible(true);
+	setVisible(true);
 	StaticSprite::update();
 	_blinkCountdown = 0;
 }
 
 void SsScene3009SymbolEdges::hide() {
-	_surface->setVisible(false);
+	setVisible(false);
 	StaticSprite::update();
 	_blinkCountdown = 0;
 }
 
 void SsScene3009SymbolEdges::startBlinking() {
-	_surface->setVisible(true);
+	setVisible(true);
 	StaticSprite::update();
 	_blinkCountdown = 3;
 	_blinkToggle = true;
@@ -556,12 +556,12 @@ SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
 	_drawRect.y = 0;
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
-	_surface->setVisible(false);
+	setVisible(false);
 	_needRefresh = true;
 }
 
 void SsScene3009TargetLine::show() {
-	_surface->setVisible(true);
+	setVisible(true);
 	StaticSprite::update();
 }
 
@@ -589,7 +589,7 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy
 
 void SsScene3009SymbolArrow::hide() {
 	_enabled = false;
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void SsScene3009SymbolArrow::update() {
@@ -633,14 +633,14 @@ AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm,
 	createSurface1(0xC2463913, 1200);
 	_needRefresh = true;
 	updatePosition();
-	_surface->setVisible(false);
+	setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage);
 }
 
 void AsScene3009VerticalIndicator::show() {
 	setFileHash(0xC2463913, 0, -1);
-	_surface->setVisible(true);
+	setVisible(true);
 	updatePosition();
 	_enabled = true;
 }
@@ -666,7 +666,7 @@ AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *
 	createSurface1(0xC0C12954, 1200);
 	_needRefresh = true;
 	updatePosition();
-	_surface->setVisible(false);
+	setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage);
 	if (varValue == 8 || varValue == 9 || varValue == 10) {
@@ -706,7 +706,7 @@ void AsScene3009HorizontalIndicator::suMoveRight() {
 
 void AsScene3009HorizontalIndicator::show() {
 	setFileHash(0xC0C12954, 0, -1);
-	_surface->setVisible(true);
+	setVisible(true);
 	updatePosition();
 	_enabled = true;
 }
@@ -1105,12 +1105,12 @@ void SsScene3010DeadBoltButton::update() {
 
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		_soundResource1.play();
-		_surface->setVisible(false);
+		setVisible(false);
 		setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
 	}
 
 	if (_countdown2 != 0 && (--_countdown2 == 0)) {
-		_surface->setVisible(true);
+		setVisible(true);
 		setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
 	}
 
@@ -1124,7 +1124,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
 			if (_buttonEnabled) {
 				_soundResource2.play();
 				_soundResource3.play();
-				_surface->setVisible(true);
+				setVisible(true);
 				_buttonLocked = true;
 				sendMessage(_parentScene, 0x2000, _buttonIndex);
 			} else {
@@ -1142,7 +1142,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
 void SsScene3010DeadBoltButton::disableButton() {
 	_buttonLocked = true;
 	setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
-	_surface->setVisible(true);
+	setVisible(true);
 }
 
 void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
@@ -1185,7 +1185,7 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene
 		_soundResource2.load(0x420073DC);
 	}
 	
-	_surface->setVisible(false);
+	setVisible(false);
 	stIdle();
 	if (initUnlocked)
 		unlock(true);
@@ -1222,7 +1222,7 @@ void AsScene3010DeadBolt::stIdle() {
 
 void AsScene3010DeadBolt::unlock(bool skipAnim) {
 	if (!_unlocked) {
-		_surface->setVisible(true);
+		setVisible(true);
 		if (skipAnim) {
 			setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0);
 			_newHashListIndex = -2;
@@ -1247,7 +1247,7 @@ void AsScene3010DeadBolt::stIdleMessage() {
 void AsScene3010DeadBolt::lock() {
 	if (!_locked) {
 		_locked = true;
-		_surface->setVisible(true);
+		setVisible(true);
 		setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
 		SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
 		setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage));
@@ -1266,7 +1266,7 @@ void AsScene3010DeadBolt::setCountdown(int count) {
 }
 
 void AsScene3010DeadBolt::stDisabled() {
-	_surface->setVisible(true);
+	setVisible(true);
 	setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 	SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
 	setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage));
@@ -1276,7 +1276,7 @@ void AsScene3010DeadBolt::stDisabled() {
 }
 
 void AsScene3010DeadBolt::stDisabledMessage() {
-	_surface->setVisible(false);
+	setVisible(false);
 	sendMessage(_parentScene, 0x2003, _boltIndex);
 }
 
@@ -1447,7 +1447,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo
 	_deltaRect.y = 0;
 	_deltaRect.width = _spriteResource.getDimensions().width;
 	_deltaRect.height = _spriteResource.getDimensions().height;
-	_surface->setVisible(false);
+	setVisible(false);
 	processDelta();
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3011Button::update);
@@ -1457,7 +1457,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo
 void SsScene3011Button::update() {
 	StaticSprite::update();
 	if (_countdown != 0 && (--_countdown == 0)) {
-		_surface->setVisible(false);
+		setVisible(false);
 	}
 }
 
@@ -1467,7 +1467,7 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x1011:
 		if (_countdown == 0) {
-			_surface->setVisible(true);
+			setVisible(true);
 			_countdown = 4;
 			sendMessage(_parentScene, 0x2000, 0);
 			_soundResource.play();
@@ -1496,7 +1496,7 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
 		_soundResource1.load(0x64428609);
 		_soundResource2.load(0x7080023B);
 	}
-	_surface->setVisible(false);
+	setVisible(false);
 	_needRefresh = true;
 	SetUpdateHandler(&AnimatedSprite::update);
 }
@@ -1504,7 +1504,7 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
 void AsScene3011Symbol::show(bool flag) {
 	_flag2 = flag;
 	setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1);
-	_surface->setVisible(true);
+	setVisible(true);
 	if (flag) {
 		_soundResource2.play();
 	} else {
@@ -1514,7 +1514,7 @@ void AsScene3011Symbol::show(bool flag) {
 
 void AsScene3011Symbol::hide() {
 	setFileHash1();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 void AsScene3011Symbol::stopSound() {
@@ -1529,7 +1529,7 @@ void AsScene3011Symbol::change(int index, bool flag) {
 	_index = index;
 	_flag2 = flag;
 	setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1);
-	_surface->setVisible(true);
+	setVisible(true);
 	if (flag) {
 		_soundResource2.play();
 	} else {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index f17b2d4..1c4008e 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -57,6 +57,7 @@ public:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void loadDataResource(uint32 fileHash);
 	int16 defFilterY(int16 y);
+	void setVisible(bool value) { _surface->setVisible(value); }
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	Common::String _spriteUpdateCbName; // For debugging purposes


Commit: 2f670690bc1febbd402a5743f400c4463af7ebc7
    https://github.com/scummvm/scummvm/commit/2f670690bc1febbd402a5743f400c4463af7ebc7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Add Scene::setPalette for simpled palette creation and use it

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/entity.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index d0d7ec2..ace2b5b 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -353,8 +353,8 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	
 	_surfaceFlag = true;
 
-	_background = addBackground(new DirtyBackground(_vm, 0x8A000044, 0, 0));
-	_palette = new Palette(_vm, kDiskplayerPaletteFileHashes[_which]);
+	setBackground(0x8A000044);
+	setPalette(kDiskplayerPaletteFileHashes[_which]);
 	_playButton = new DiskplayerPlayButton(_vm, this);
 	addSprite(_playButton);
 	_vm->_collisionMan->addSprite(_playButton);
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 582e93f..924a7a7 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -103,16 +103,16 @@ public:
 	// NOTE: These were overloaded before for the various message parameter types
 	// it caused some problems so each type gets its own sendMessage variant now
 	uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam &param) {
-		return receiver->receiveMessage(messageNum, param, this);
+		return receiver ? receiver->receiveMessage(messageNum, param, this) : 0;
 	}
 	uint32 sendMessage(Entity *receiver, int messageNum, uint32 param) {
-		return receiver->receiveMessage(messageNum, MessageParam(param), this);
+		return sendMessage(receiver, messageNum, MessageParam(param));
 	}
 	uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint &param) {
-		return receiver->receiveMessage(messageNum, MessageParam(param), this);
+		return sendMessage(receiver, messageNum, MessageParam(param));
 	}
 	uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param) {
-		return receiver->receiveMessage(messageNum, MessageParam((Entity*)param), this);
+		return sendMessage(receiver, messageNum, MessageParam((Entity*)param));
 	}
 	int getPriority() const { return _priority; }
 	// Shortcuts for game variable access
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 1cc4b43..8dda9ed 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -82,30 +82,27 @@ void Module1000::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			if (_moduleResult == 2) {
+			if (_moduleResult == 2)
 				createScene(2, 0);
-			} else {
+			else
 				createScene(1, 0);
-			}
 			break;
 		case 1:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				sendMessage(_parentModule, 0x1009, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(3, 0);
-			} else {
+			else
 				createScene(0, 1);
-			}
 			break;
 		case 2:
 			createScene(0, 2);
 			break;
 		case 3:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(4, 0);
-			} else {
+			else
 				createScene(1, 2);
-			}
 			break;
 		case 4:
 			// TODO Music18hList_stop(_musicFileHash, 0, 1);
@@ -213,9 +210,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x00352100) {
-			if (_asDoor) {
-				sendMessage(_asDoor, 0x2000, 0);
-			}
+			sendMessage(_asDoor, 0x2000, 0);
 		} else if (param.asInteger() == 0x0A1A0109) {
 			_soundResource.play(0x66410886);
 		}
@@ -309,7 +304,7 @@ SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentSce
 	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _soundResource(vm), _countdown(0) {
 
 	_priority = 1100;
-	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; 
+	_soundFileHash = soundFileHash ? soundFileHash : 0x44141000; 
 	setVisible(false);
 	SetUpdateHandler(&SsCommonButtonSprite::update);
 	SetMessageHandler(&SsCommonButtonSprite::handleMessage);
@@ -346,8 +341,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->setHitRects(0x004B4860);
 	_surfaceFlag = false;
 	setBackground(0x4086520E);
-	_palette = new Palette(_vm, 0x4086520E);
-	_palette->usePalette();
+	setPalette(0x4086520E);
 	insertMouse433(0x6520A400);
 	
 	if (which < 0) {
@@ -1349,8 +1343,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x12C23307);
-	_palette = new Palette(_vm, 0x12C23307);
-	_palette->usePalette();
+	setPalette(0x12C23307);
 
 	_flag = false;
 
@@ -1629,8 +1622,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF
 	SetMessageHandler(&Class152::handleMessage);
 	
 	setBackground(backgroundFileHash);
-	_palette = new Palette(_vm, backgroundFileHash);
-	_palette->usePalette();
+	setPalette(backgroundFileHash);
 	insertMouse435(cursorFileHash, 20, 620);
 }
 
@@ -1692,13 +1684,12 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x50C03005);
 
 	if (getGlobalVar(0x0D0A14D10)) {
-		_palette = new Palette(_vm, 0xA30BA329);
+		setPalette(0xA30BA329);
 		_palette->addBasePalette(0xA30BA329, 0, 256, 0);
 	} else {
-		_palette = new Palette(_vm, 0x50C03005);
+		setPalette(0x50C03005);
 		_palette->addBasePalette(0x50C03005, 0, 256, 0);
 	}
-	_palette->usePalette();
 	addEntity(_palette);
 
 	insertMouse433(0x03001504);
@@ -1791,14 +1782,12 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (getGlobalVar(0xD0A14D10)) {
 		setBackground(0x2800E011);
-		_palette = new Palette(_vm, 0x2800E011);
-		_palette->usePalette();
+		setPalette(0x2800E011);
 		insertStaticSprite(0x492D5AD7, 100);
 		insertMouse435(0x0E015288, 20, 620);
 	} else {
 		setBackground(0x8870A546);
-		_palette = new Palette(_vm, 0x8870A546);
-		_palette->usePalette();
+		setPalette(0x8870A546);
 		insertStaticSprite(0x40D1E0A9, 100);
 		insertStaticSprite(0x149C00A6, 100);
 		insertMouse435(0x0A54288F, 20, 620);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 9cab544..81e61c7 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -838,13 +838,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
 		setBackground(0x4019A2C4);
-		_palette = new Palette(_vm, 0x4019A2C4);
-		_palette->usePalette();
+		setPalette(0x4019A2C4);
 		_asRightDoor = NULL;
 	} else {
 		setBackground(0x40206EC5);
-		_palette = new Palette(_vm, 0x40206EC5);
-		_palette->usePalette();
+		setPalette(0x40206EC5);
 		_asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2));
 	}
 
@@ -1146,8 +1144,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x60210ED5);
 
-	_palette = new Palette(_vm, 0x60210ED5);
-	_palette->usePalette();
+	setPalette(0x60210ED5);
 	addEntity(_palette);
 
 	_paletteResource.load(0x60250EB5);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index f27952f..8f3483a 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -421,8 +421,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B0A38);
 
 	setBackground(0x420643C4);
-	_palette = new Palette(_vm, 0x420643C4);
-	_palette->usePalette();
+	setPalette(0x420643C4);
 	insertMouse433(0x643C0428);
 
 	_class595 = addSprite(new Class595(_vm, this));
@@ -646,8 +645,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004AF9E8);
 	
 	setBackground(0x01581A9C);
-	_palette = new Palette(_vm, 0x01581A9C);
-	_palette->usePalette();
+	setPalette(0x01581A9C);
 	insertMouse433(0x81A9801D);
 
 	if (!getGlobalVar(0xAC00C0D0)) {
@@ -718,8 +716,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B91A8);
 
 	setBackground(0x062C0214);
-	_palette = new Palette(_vm, 0x062C0214);
-	_palette->usePalette();
+	setPalette(0x062C0214);
 	insertMouse433(0xC021006A);
 	
 	if (getGlobalVar(0xAC00C0D0)) {
@@ -789,8 +786,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B6E98);
 
 	setBackground(0x28801B64);
-	_palette = new Palette(_vm, 0x28801B64);
-	_palette->usePalette();
+	setPalette(0x28801B64);
 	insertMouse433(0x01B60280);
 
 	if (which < 0) {
@@ -905,8 +901,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1306::handleMessage);
 
 	setBackground(0x05303114);
-	_palette = new Palette(_vm, 0x05303114);
-	_palette->usePalette();
+	setPalette(0x05303114);
 	insertMouse433(0x0311005B);
 
 	if (!getGlobalVar(0x13382860)) {
@@ -1311,8 +1306,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1307::update);
 
 	setBackground(0xA8006200);
-	_palette = new Palette(_vm, 0xA8006200);
-	_palette->usePalette();
+	setPalette(0xA8006200);
 	addEntity(_palette);
 	insertMouse435(0x06204A88, 20, 620);
 
@@ -1630,8 +1624,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1308::handleMessage);
 	
 	setBackground(0x41024202);
-	_palette = new Palette(_vm, 0x41024202);
-	_palette->usePalette();
+	setPalette(0x41024202);
 	insertMouse433(0x24206418);
 
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011));
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index f50fb25..3f61ceb 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -664,8 +664,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x08221FA5);
-	_palette = new Palette(_vm, 0x08221FA5);
-	_palette->usePalette();
+	setPalette(0x08221FA5);
 	insertMouse433(0x21FA108A);
 	
 	// TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0));
@@ -885,9 +884,8 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	_background = addBackground(new Background(_vm, 0x231482F0, 0, 0));
 	_background->getSurface()->getDrawRect().y = -10;
 	// TODO g_screen->field_26 = 0;
-	_palette = new Palette(_vm, 0x231482F0);
+	setPalette(0x231482F0);
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
-	_palette->usePalette();
 	insertMouse433(0x482F4239);
 
 	_class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100));
@@ -1288,8 +1286,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1407::update);
 
 	setBackground(0x00442225);
-	_palette = new Palette(_vm, 0x00442225);
-	_palette->usePalette();
+	setPalette(0x00442225);
 	insertMouse435(0x4222100C, 20, 620);
 
 	_asMouse = addSprite(new AsScene1407Mouse(_vm, this));
@@ -1354,8 +1351,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x2110A234);
-	_palette = new Palette(_vm, 0x2110A234);
-	_palette->usePalette();
+	setPalette(0x2110A234);
 	insertMouse433(0x0A230219);
 
 	_class401_1 = insertStaticSprite(0x01102A33, 100);
@@ -1477,9 +1473,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B8D80);
 
 	setBackground(0xAC0B006F);
-	_palette = new Palette(_vm, 0xAC0B006F);
+	setPalette(0xAC0B006F);
 	_palette->addPalette(0x00801510, 0, 65, 0);
-	_palette->usePalette();
 	insertMouse433(0xB006BAC8);
 
 	if (getGlobalVar(0x13382860) == 5) {
@@ -1692,8 +1687,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 	
 	setBackground(0x0C0C007D);
-	_palette = new Palette(_vm, 0x0C0C007D);
-	_palette->usePalette();
+	setPalette(0x0C0C007D);
 	insertMouse435(0xC00790C8, 20, 620);
 	
 	// TODO: Some debug code: Leave two matching tiles open
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 09567f5..54a4685 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -93,8 +93,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 
 	setBackground(backgroundFileHash);
 
-	_palette = new Palette(_vm);
-	_palette->usePalette();
+	setPalette();
 	addEntity(_palette);
 	_palette->addBasePalette(backgroundFileHash, 0, 256, 0);
 	_palette->startFadeToPalette(12);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 58fc835..f551911 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -188,10 +188,9 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x03118226);
 
-	_palette = new Palette(_vm, 0x03118226);
+	setPalette(0x03118226);
 	_palette->addBasePalette(0x91D3A391, 0, 64, 0);
 	_palette->copyBasePalette(0, 256, 0);
-	_palette->usePalette();
 	addEntity(_palette);
 
 	insertMouse433(0x18222039);
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index a30bb93..b2e9a0e 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -102,8 +102,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2001::handleMessage);
 
 	setBackground(0xA6417244);
-	_palette = new Palette(_vm, 0xA6417244);
-	_palette->usePalette();
+	setPalette(0xA6417244);
 	insertMouse433(0x17240A6C);
 
 	_class401 = insertStaticSprite(0x0D641724, 1100);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 1f118a4..a0db788 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -736,8 +736,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	loadHitRectList();
 
 	setBackground(0x40008208);
-	_palette = new Palette(_vm, 0x40008208);
-	_palette->usePalette();
+	setPalette(0x40008208);
 	insertMouse433(0x0820C408);
 
 	_asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011));
@@ -1119,8 +1118,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x08100A0C);
-	_palette = new Palette(_vm, 0x08100A0C);
-	_palette->usePalette();
+	setPalette(0x08100A0C);
 	addEntity(_palette);
 	insertMouse435(0x00A08089, 20, 620);
 
@@ -1349,8 +1347,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x82C80334);
-	_palette = new Palette(_vm, 0x82C80334);
-	_palette->usePalette();
+	setPalette(0x82C80334);
 	insertMouse433(0x80330824);
 
 	_vm->_collisionMan->setHitRects(0x004B8320);
@@ -1512,8 +1509,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0x4D080E54)) {
 		_isLightOn = true;
 		setBackground(0x0008028D);
-		_palette = new Palette(_vm, 0x0008028D);
-		_palette->usePalette();
+		setPalette(0x0008028D);
 		addEntity(_palette);
 		insertMouse433(0x80289008);
 		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0);
@@ -1521,8 +1517,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else {
 		_isLightOn = false;
 		setBackground(0xD00A028D);
-		_palette = new Palette(_vm, 0xD00A028D);
-		_palette->usePalette();
+		setPalette(0xD00A028D);
 		addEntity(_palette);
 		insertMouse433(0xA0289D08);
 		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0);
@@ -1807,8 +1802,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(fileHash);
 
-	_palette = new Palette(_vm, fileHash);
-	_palette->usePalette();
+	setPalette(fileHash);
 	addEntity(_palette);
 
 	_palette->addBasePalette(fileHash, 0, 256, 0);
@@ -2292,8 +2286,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0x4D080E54)) {
 
 		setBackground(0x88C00241);
-		_palette = new Palette(_vm, 0x88C00241);
-		_palette->usePalette();
+		setPalette(0x88C00241);
 		insertMouse433(0x00245884);
 	
 		_ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200);
@@ -2334,8 +2327,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		setGlobalVar(0x81890D14, 1);
 
 		setBackground(0x05C02A55);
-		_palette = new Palette(_vm, 0x05C02A55);
-		_palette->usePalette();
+		setPalette(0x05C02A55);
 		insertMouse433(0x02A51054);
 
 		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
@@ -2531,8 +2523,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	_background->getSpriteResource().getPosition().y = 480;
 	addBackground(_background);
 	
-	_palette = new Palette(_vm, 0x08100289);
-	_palette->usePalette();
+	setPalette(0x08100289);
 	addEntity(_palette); // Why?
 
 	insertMouse435(0x0028D089, 40, 600);
@@ -2708,14 +2699,12 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (getGlobalVar(0x4D080E54)) {
 		setBackground(0x11840E24);
-		_palette = new Palette(_vm, 0x11840E24);
-		_palette->usePalette();
+		setPalette(0x11840E24);
 		insertMouse433(0x40E20110);
 		setRectList(0x004B3DC8);
 	} else {
 		setBackground(0x25848E24);
-		_palette = new Palette(_vm, 0x25848E24);
-		_palette->usePalette();
+		setPalette(0x25848E24);
 		addEntity(_palette);
 		_palette->copyBasePalette(0, 256, 0);
 		_palette->addPalette(0x68033B1C, 0, 65, 0);
@@ -2846,14 +2835,12 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 	if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) {
 		setRectList(0x004B2BF8);
 		setBackground(_sceneInfo140->bgFilename2);
-		_palette = new Palette(_vm, _sceneInfo140->bgFilename2);
-		_palette->usePalette();
+		setPalette(_sceneInfo140->bgFilename2);
 		insertMouse433(0x14320138);
 	} else {
 		setRectList(0x004B2BB8);
 		setBackground(_sceneInfo140->bgFilename1);
-		_palette = new Palette(_vm, _sceneInfo140->bgFilename1);
-		_palette->usePalette();
+		setPalette(_sceneInfo140->bgFilename1);
 		insertMouse433(0x63A40028);
 	}
 
@@ -2943,14 +2930,12 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0x4D080E54)) {
 		setRectList(0x004B5588);
 		setBackground(0x40339414);
-		_palette = new Palette(_vm, 0x40339414);
-		_palette->usePalette();
+		setPalette(0x40339414);
 		insertMouse433(0x3941040B);
 	} else {
 		setRectList(0x004B55C8);
 		setBackground(0x071963E5);
-		_palette = new Palette(_vm, 0x071963E5);
-		_palette->usePalette();
+		setPalette(0x071963E5);
 		insertMouse433(0x14320138);
 	}
 
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 82bcc54..e7714c0 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -795,7 +795,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_screen->clear();
 	
 	setBackground(0xD000420C);
-	_palette = new Palette(_vm, 0xD000420C);
+	setPalette(0xD000420C);
 	insertMouse435(0x04208D08, 20, 620);
 
 	_ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this));
@@ -821,7 +821,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo));
 	_smackerPlayer->setDrawPos(89, 37);
-	_palette->usePalette();
+	_palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage
 
 	insertStaticSprite(0x8540252C, 400);
 
@@ -1032,7 +1032,7 @@ bool Scene3009::isSymbolsPart2Solved() {
 }
 
 bool Scene3009::sub462E90() {
-	return /*_flag3 || */_flag4;
+	return _flag4;
 }
 
 // Scene3010
@@ -1153,10 +1153,7 @@ void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
 	_drawRect.y = 0;
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = _spriteResource.getDimensions().width;
-	_deltaRect.height = _spriteResource.getDimensions().height;
+	_deltaRect = _drawRect;
 	processDelta();
 	_needRefresh = true;
 	StaticSprite::update();
@@ -1294,8 +1291,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 
 	setBackground(0x80802626);
-	_palette = new Palette(_vm, 0x80802626);
-	_palette->usePalette();
+	setPalette(0x80802626);
 
 	for (int i = 0; i < 3; i++) {
 		_asDeadBolts[i] = new AsScene3010DeadBolt(_vm, this, i, which == 1);//CHECKME
@@ -1443,10 +1439,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo
 	_drawRect.y = 0;
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = _spriteResource.getDimensions().width;
-	_deltaRect.height = _spriteResource.getDimensions().height;
+	_deltaRect = _drawRect;
 	setVisible(false);
 	processDelta();
 	_needRefresh = true;
@@ -1546,9 +1539,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	_index1 = getGlobalVar(0x2414C2F2);
 
 	setBackground(0x92124A04);
-
-	_palette = new Palette(_vm, 0xA4070114);
-	_palette->usePalette();
+	setPalette(0xA4070114);
 	addEntity(_palette);
 
 	insertMouse435(0x24A00929, 20, 620);
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 5072d53..f1ee554 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -186,6 +186,11 @@ void Scene::changeBackground(uint32 fileHash) {
 	_background->load(fileHash);
 }
 
+void Scene::setPalette(uint32 fileHash) {
+	_palette = fileHash ? new Palette(_vm, fileHash) : new Palette(_vm);
+	_palette->usePalette();
+}
+
 Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
 	return addSprite(new StaticSprite(_vm, fileHash, surfacePriority));
 }
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 31dd61d..bcae324 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -55,6 +55,7 @@ public:
 	Background *addBackground(Background *background);
 	void setBackground(uint32 fileHash, bool dirtyBackground = true);
 	void changeBackground(uint32 fileHash);
+	void setPalette(uint32 fileHash = 0);
 	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
 	void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL);
 	void insertMouse435(uint32 fileHash, int16 x1, int16 x2);


Commit: 1b2d496d186c6f838526f51f7d0b3eea70a8b322
    https://github.com/scummvm/scummvm/commit/1b2d496d186c6f838526f51f7d0b3eea70a8b322
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Try to clean up the clipRect stuff a little

Changed paths:
    engines/neverhood/graphics.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/scene.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 36bd95e..08fa1f5 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -44,14 +44,29 @@ struct NRect {
 	int16 x1, y1, x2, y2;
 	NRect() : x1(0), y1(0), x2(0), y2(0) {}
 	NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {}
+	void set(int16 x01, int16 y01, int16 x02, int16 y02) {
+		x1 = x01;
+		y1 = y01;
+		x2 = x02;
+		y2 = y02;
+	}
 };
 
 typedef Common::Array<NRect> NRectArray;
 
+// TODO: Use Common::Rect 
 struct NDrawRect {
 	int16 x, y, width, height;
 	NDrawRect() : x(0), y(0), width(0), height(0) {}
 	NDrawRect(int16 x0, int16 y0, int16 width0, int16 height0) : x(x0), y(y0), width(width0), height(height0) {}
+	int16 x2() { return x + width; } 
+	int16 y2() { return y + height; }
+	void set(int16 x0, int16 y0, int16 width0, int16 height0) {
+		x = x0;
+		y = y0;
+		width = width0;
+		height = height0;
+	}
 };
 
 class AnimResource;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 8dda9ed..ddd3e0a 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -369,18 +369,11 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	tempSprite = insertStaticSprite(0x2080A3A8, 1300);
 
-	// TODO: This sucks somehow, find a better way
-	_klayman->getSurface()->getClipRect().x1 = 0;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	
 	if (getGlobalVar(0xD217189D) == 0) {
 		_asDoor = addSprite(new AsScene1001Door(_vm));
-		_asDoor->getSurface()->getClipRect().x1 = 0;
-		_asDoor->getSurface()->getClipRect().y1 = 0;
-		_asDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
-		_asDoor->getSurface()->getClipRect().y2 = 480;
+		_asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	} else {
 		_asDoor = NULL;
 	}
@@ -395,10 +388,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0x03C698DA) == 0) {
 		tempSprite = insertStaticSprite(0x8C066150, 200);
 		_asWindow = addSprite(new AsScene1001Window(_vm));
-		_asWindow->getSurface()->getClipRect().x1 = tempSprite->getSurface()->getDrawRect().x;
-		_asWindow->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
-		_asWindow->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
-		_asWindow->getSurface()->getClipRect().y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
+		_asWindow->setClipRect(tempSprite->getDrawRect());
 	} else {
 		_asWindow = NULL;
 	}
@@ -526,12 +516,7 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f
 		SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
 	}
 
-	debug("clipY1 = %d", clipY1);
-
-	_surface->getClipRect().x1 = 0;
-	_surface->getClipRect().y1 = clipY1;
-	_surface->getClipRect().x2 = 640;
-	_surface->getClipRect().y2 = 480;
+    setClipRect(0, clipY1, 640, 480);
 
 	_x = x;
 	_y = y;
@@ -664,7 +649,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 	
 	_spriteResource.load2(0x1052370F);
 	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_surface->getClipRect() = clipRect;
+	setClipRect(clipRect);
 
 	_x = 526;
 	
@@ -764,7 +749,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
 	SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0);
 	createSurface(800, 136, 147);
-	_surface->getClipRect() = clipRect;
+	setClipRect(clipRect);
 	spriteUpdate448AA0();
 	_soundResource.load(0xC0C40298);
 	setFileHash(0x586C1D48, 0, 0);
@@ -803,17 +788,14 @@ void AsScene1002DoorSpy::spriteUpdate448AA0() {
 }
 
 void AsScene1002DoorSpy::sub448AC0() {
-	_surface->getClipRect() = _rect;
+	setClipRect(_rect);
 	_parentScene->setSurfacePriority(getSurface(), 800);
 	setFileHash(0x586C1D48, 0, 0);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
 }
 
 void AsScene1002DoorSpy::sub448B10() {
-	_surface->getClipRect().x1 = 0;
-	_surface->getClipRect().y1 = 0;
-	_surface->getClipRect().x2 = 640;
-	_surface->getClipRect().y2 = 480;
+	setClipRect(0, 0, 640, 480);
 	_parentScene->setSurfacePriority(getSurface(), 1200);
 	setFileHash(0x586C1D48, 1, -1);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60);
@@ -1313,14 +1295,11 @@ uint32 Class479::handleMessage(int messageNum, const MessageParam &param, Entity
 			sendMessage(_parentScene, 0x1022, 1200);
 			_flag1 = true;
 			_savedClipRect = _surface->getClipRect();
-			_surface->getClipRect().x1 = 0;
-			_surface->getClipRect().y1 = 0;
-			_surface->getClipRect().x2 = 640;
-			_surface->getClipRect().y2 = 480;
+			setClipRect(0, 0, 640, 480);
 		} else if (param.asInteger() == 0x88001184) {
 			sendMessage(_parentScene, 0x1022, 1000);
 			if (_flag1) {
-				_surface->getClipRect() = _savedClipRect;
+				setClipRect(_savedClipRect);
 			}
 		}
 		break;
@@ -1362,54 +1341,39 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); 
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
-			_klayman->getSurface()->getClipRect().x1 = 31;
-			_klayman->getSurface()->getClipRect().y1 = 0;
-			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height;
+			_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
 			InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch));
 			_class478 = addSprite(new Class478(_vm, _klayman));
 			setMessageList(0x004B4270);
-			_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
-			_klayman->getSurface()->getClipRect().y1 = 0;
-			_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-			_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
-			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+			_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
+			_class478->setClipRect(_klayman->getClipRect());
 		}
 	} else if (which == 1) {
 		InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4478);
-		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
-		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
+		_class478->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
 		InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4298);
-		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
-		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
+		_class478->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
 		InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch));
 		_class478 = addSprite(new Class478(_vm, _klayman));
 		setMessageList(0x004B4470);
-		_klayman->getSurface()->getClipRect().x1 = 31;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height;
-		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
+		_class478->setClipRect(_klayman->getClipRect());
 		_class479 = addSprite(new Class479(_vm, this, _klayman));
-		_class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_class479->setClipRect(_klayman->getClipRect());
 		_klayman->setRepl(64, 0);
 		_vm->_gameState.field2 = 0;
 	}
@@ -1417,16 +1381,14 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x23303124);
 
 	tempSprite = insertStaticSprite(0xB3242310, 825);
-	tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x;
-	tempClipRect.y1 = tempSprite->getSurface()->getDrawRect().y;
-	tempClipRect.x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-	tempClipRect.y2 = _ssLadderArchPart2->getSurface()->getDrawRect().y + _ssLadderArchPart2->getSurface()->getDrawRect().height;
+	tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y,
+		_ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2());
 
-	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false));
-	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false));
-	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0));
-	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false));
-	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false));
+	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getDrawRect().y, false));
+	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getDrawRect().y, false));
+	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0));
+	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getDrawRect().y, false));
+	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getDrawRect().y, false));
 
 	_asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect));
 	
@@ -1456,11 +1418,8 @@ Scene1002::~Scene1002() {
 void Scene1002::update() {
 	Scene::update();
 	if (!_flag1B4 && _klayman->getY() > 230) {
-		_klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height;
-		_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
+		_class478->setClipRect(_klayman->getClipRect());
 		deleteSprite(&_ssLadderArchPart3);
 		_klayman->clearRepl();
 		_flag1B4 = true;
@@ -1480,6 +1439,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
+		// Debug stuff (original)
 		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
 			setGlobalVar(0x8306F218, 1);
 			setGlobalVar(0x1B144052, 3);
@@ -1487,6 +1447,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x000D:
+		// Debug stuff (original)
 		if (param.asInteger() == 0x48848178) {
 			setGlobalVar(0x8306F218, 1);
 			setGlobalVar(0x1B144052, 3);
@@ -1499,15 +1460,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (getGlobalVar(0x8306F218)) {
 				setMessageList(0x004B4428);
 			} else {
-				// TODO _resourceTable3.load();
 				setMessageList(0x004B4448);
 			}
 			messageResult = 1;
 		} else if (param.asInteger() == 0x4A845A00) {
-			// TODO _resourceTable4.load();
 			sendEntityMessage(_klayman, 0x1014, _asRing1);
 		} else if (param.asInteger() == 0x43807801) {
-			// TODO _resourceTable4.load();
 			sendEntityMessage(_klayman, 0x1014, _asRing2);
 		} else if (param.asInteger() == 0x46C26A01) {
 			if (getGlobalVar(0x8306F218)) {
@@ -1518,27 +1476,19 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 					setGlobalVar(0x2B514304, 1);
 					setMessageList(0x004B44A8);
 				} else {
-					// TODO _resourceTable5.load();
 					setMessageList(0x004B44A0);
 				}
 			}
 			messageResult = 1;
 		} else if (param.asInteger() == 0x468C7B11) {
-			// TODO _resourceTable4.load();
 			sendEntityMessage(_klayman, 0x1014, _asRing4);
 		} else if (param.asInteger() == 0x42845B19) {
-			// TODO _resourceTable4.load();
 			sendEntityMessage(_klayman, 0x1014, _asRing5);
 		} else if (param.asInteger() == 0xC0A07458) {
 			sendEntityMessage(_klayman, 0x1014, _class426);
 		}
 		break;
 	case 0x1024:
-		if (param.asInteger() == 1) {
-			// TODO _resourceTable3.load();
-		} else if (param.asInteger() == 3) {
-			// TODO _resourceTable2.load();
-		}
 		sendMessage(_parentModule, 0x1024, param.asInteger());
 		break;
 	case 0x2000:
@@ -1717,11 +1667,8 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x3060222E, 1300);
 	tempSprite = insertStaticSprite(0x0E002004, 1300);
 	
-	_klayman->getSurface()->getClipRect().x1 = 0;
-	_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
-	_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+	_klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480);
+	_class478->setClipRect(_klayman->getClipRect());
 
 	_asTrashCan = addSprite(new AsScene1004TrashCan(_vm));
 
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index a7046ce..47b1a91 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -267,14 +267,6 @@ public:
 	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Scene1002();
 protected:
-	// TODO ResourceTable _resourceTable1;
-	// TODO ResourceTable _resourceTable2;
-	// TODO ResourceTable _resourceTable3;
-	// TODO ResourceTable _resourceTable4;
-	// TODO ResourceTable _resourceTable5;
-	// TODO ResourceTable _resourceTable6;
-	// TODO ResourceTable _resourceTable7;
-	// TODO ResourceTable _resourceTable8;
 	Sprite *_asRing1;
 	Sprite *_asRing2;
 	Sprite *_asRing3;
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 81e61c7..62462fc 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -27,7 +27,6 @@ namespace Neverhood {
 Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO _resourceTable.setResourceList(0x004B3E68);
 	SetMessageHandler(&Module1200::handleMessage);
 
 	debug("Module1200: which = %d", which);
@@ -188,10 +187,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 	
 	}
 	createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_surface->getClipRect().x1 = 0;
-	_surface->getClipRect().y1 = 0;
-	_surface->getClipRect().x2 = 640;
-	_surface->getClipRect().y2 = clipY2;
+	setClipRect(0, 0, 640, clipY2);
 	_needRefresh = true;
 	StaticSprite::update();
 }
@@ -774,22 +770,19 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape);
 	
 	tempSprite = insertStaticSprite(0x03C82530, 100);
-	topY1 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
+	topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; 
 
 	tempSprite = insertStaticSprite(0x88182069, 200);
-	topY2 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
+	topY2 = tempSprite->getY() + tempSprite->getDrawRect().height; 
 
 	tempSprite = insertStaticSprite(0x476014E0, 300);
-	topY3 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; 
+	topY3 = tempSprite->getY() + tempSprite->getDrawRect().height; 
 
 	tempSprite = insertStaticSprite(0x04063110, 500);
 	topY4 = tempSprite->getY() + 1; 
 
 	_class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1));
-	_class466->getSurface()->getClipRect().x1 = 0;
-	_class466->getSurface()->getClipRect().y1 = topY4;
-	_class466->getSurface()->getClipRect().x2 = 640;
-	_class466->getSurface()->getClipRect().y2 = 480;
+	_class466->setClipRect(0, topY4, 640, 480);
 	
 	insertStaticSprite(0x400B04B0, 1200);
 
@@ -797,7 +790,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	x1 = tempSprite->getX();
 
 	tempSprite = insertStaticSprite(0xA29223FA, 1200);
-	x2 = tempSprite->getX() + tempSprite->getSurface()->getDrawRect().width;
+	x2 = tempSprite->getX() + tempSprite->getDrawRect().width;
 
 	class464 = addSprite(new Class464(_vm));
 
@@ -830,10 +823,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AEC10);
 	}
 
-	_klayman->getSurface()->getClipRect().x1 = x1;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = x2;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(x1, 0, x2, 480);
 	_klayman->setRepl(64, 0);
 	
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
@@ -851,17 +841,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (!getGlobalVar(0x0A18CA33)) {
 			AsScene1201TntMan *asTntMan;
 			asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1);
-			asTntMan->getSurface()->getClipRect().x1 = x1;
-			asTntMan->getSurface()->getClipRect().y1 = 0;
-			asTntMan->getSurface()->getClipRect().x2 = x2;
-			asTntMan->getSurface()->getClipRect().y2 = 480;
+			asTntMan->setClipRect(x1, 0, x2, 480);
 			_vm->_collisionMan->addSprite(asTntMan);
 			_asTntMan = addSprite(asTntMan);
 			tempSprite = addSprite(new Class465(_vm, _asTntMan));
-			tempSprite->getSurface()->getClipRect().x1 = x1;
-			tempSprite->getSurface()->getClipRect().y1 = 0;
-			tempSprite->getSurface()->getClipRect().x2 = x2;
-			tempSprite->getSurface()->getClipRect().y2 = 480;
+			tempSprite->setClipRect(x1, 0, x2, 480);
 			asTntMan->setRepl(64, 0);
 		}
 		
@@ -926,10 +910,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x63D400BC, 900);
 
 	_asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman));
-	_asLeftDoor->getSurface()->getClipRect().x1 = x1;
-	_asLeftDoor->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
-	_asLeftDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width;
-	_asLeftDoor->getSurface()->getClipRect().y2 = 480;
+	_asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480);
 
 	if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) {
 		setGlobalVar(0x0112090A, 1);
@@ -944,10 +925,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
 		_asCreature = addSprite(new AsScene1201Creature(_vm, this, _klayman));
-		_asCreature->getSurface()->getClipRect().x1 = x1;
-		_asCreature->getSurface()->getClipRect().y1 = 0;
-		_asCreature->getSurface()->getClipRect().x2 = x2;
-		_asCreature->getSurface()->getClipRect().y2 = 480;
+		_asCreature->setClipRect(x1, 0, x2, 480);
 	}
 
 }
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 8f3483a..48a8b54 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -430,18 +430,15 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite2->setVisible(false);
 	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
 
-	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false));
-	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x13206309)));
-	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getSurface()->getDrawRect().y, false));
-	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x80101B1E)));
-	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getSurface()->getDrawRect().y, false));
+	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getDrawRect().y, false));
+	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309)));
+	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false));
+	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E)));
+	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false));
 
 	_asBridge = addSprite(new AsScene1302Bridge(_vm, this));
 	_ssFence = addSprite(new SsScene1302Fence(_vm));
-	_ssFence->getSurface()->getClipRect().x1 = 0;
-	_ssFence->getSurface()->getClipRect().y1 = 0;
-	_ssFence->getSurface()->getClipRect().x2 = 640;
-	_ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
+	_ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2());
 
 	if (which < 0) {
 		InsertKlaymanInitArgs(KmScene1002, 380, 364, (_class595, NULL));
@@ -451,10 +448,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B0870);
 	}
 
-	_klayman->getSurface()->getClipRect().x1 = 0;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480);
 
 	_asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true));
 	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
@@ -658,10 +652,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	InsertKlayman(KmScene1303, 207, 332);
 	setMessageList(0x004AF9A0);
 
-	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 
 }
 
@@ -746,10 +737,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B90F0);
 	}
 
-	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 
 }
 
@@ -1236,7 +1224,7 @@ void AsScene1307Key::stRemoveKey() {
 void AsScene1307Key::stInsertKey() {
 	_pointIndex = 0;
 	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]);
-	_surface->getClipRect() = _clipRects[getSubVar(0xA010B810, _index) % 4];
+	setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]);
 	SetSpriteCallback(&AsScene1307Key::suInsertKey);
 	_newHashListIndex = -2;
 }
@@ -1246,10 +1234,7 @@ void AsScene1307Key::stMoveKey() {
 	int16 newX = pt.x + kAsScene1307KeyXDelta;
 	int16 newY = pt.y + kAsScene1307KeyYDelta;
 	sendMessage(_parentScene, 0x1022, 1000);
-	_surface->getClipRect().x1 = 0;
-	_surface->getClipRect().y1 = 0;
-	_surface->getClipRect().x2 = 640;
-	_surface->getClipRect().y2 = 480;
+	setClipRect(0, 0, 640, 480);
 	_prevX = _x;
 	_prevY = _y;
 	if (newX == _x && newY == _y) {
@@ -1311,28 +1296,16 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse435(0x06204A88, 20, 620);
 
 	tempSprite = insertStaticSprite(0x00A3621C, 800);
-	_clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x;
-	_clipRects[0].y1 = 0;
-	_clipRects[0].x2 = 640;
-	_clipRects[0].y2 = 480;
+	_clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480);
 
 	tempSprite = insertStaticSprite(0x00A3641C, 600);
-	_clipRects[1].x1 = tempSprite->getSurface()->getDrawRect().x;
-	_clipRects[1].y1 = 0;
-	_clipRects[1].x2 = 640;
-	_clipRects[1].y2 = 480;
+	_clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480);
 
 	tempSprite = insertStaticSprite(0x00A3681C, 400);
-	_clipRects[2].x1 = tempSprite->getSurface()->getDrawRect().x;
-	_clipRects[2].y1 = 0;
-	_clipRects[2].x2 = 640;
-	_clipRects[2].y2 = 480;
+	_clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480);
 
 	tempSprite = insertStaticSprite(0x00A3701C, 200);
-	_clipRects[3].x1 = tempSprite->getSurface()->getDrawRect().x;
-	_clipRects[3].y1 = 0;
-	_clipRects[3].x2 = 640;
-	_clipRects[3].y2 = 480;
+	_clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480);
 
 	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 		if (getSubVar(0x08D0AB11, keyIndex)) {
@@ -1693,25 +1666,16 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (_sprite4) {
-		_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _sprite4->getSurface()->getDrawRect().x + _sprite4->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480);
 	} else {
-		_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = 640;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 	}
 
 	if (getGlobalVar(0x04A105B3) == 4) {
 		_class489 = new Class489(_vm, this, _klayman, 0);
 		addSprite(_class489);
 		_vm->_collisionMan->addSprite(_class489);
-		_class489->getSurface()->getClipRect().x1 = 0;
-		_class489->getSurface()->getClipRect().y1 = 0;
-		_class489->getSurface()->getClipRect().x2 = 0;
-		_class489->getSurface()->getClipRect().y2 = _sprite2->getSurface()->getDrawRect().y + _sprite2->getSurface()->getDrawRect().height;
+		_class489->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
 		_class489->setRepl(64, 0);
 	} else {
 		_class489 = NULL;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 3f61ceb..7bff294 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -714,16 +714,10 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->processDelta();
 			setMessageList(0x004B6670);
 		}
-		_class489->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x;
-		_class489->getSurface()->getClipRect().y1 = _sprite2->getSurface()->getDrawRect().y;
-		_class489->getSurface()->getClipRect().x2 = 640;
-		_class489->getSurface()->getClipRect().y2 = 480;
+		_class489->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480);
 	}
 	
-	_klayman->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480);
 
 	if (which == 0 && _class489 && _class489->hasMessageHandler()) {
 		sendMessage(_class489, 0x482B, 0);
@@ -881,8 +875,8 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene1402::handleMessage);
 
-	_background = addBackground(new Background(_vm, 0x231482F0, 0, 0));
-	_background->getSurface()->getDrawRect().y = -10;
+	setBackground(0x231482F0);
+	setBackgroundY(-10);
 	// TODO g_screen->field_26 = 0;
 	setPalette(0x231482F0);
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
@@ -928,10 +922,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (_class482) {
-		_class482->getSurface()->getClipRect().x1 = 0;
-		_class482->getSurface()->getClipRect().y1 = 0;
-		_class482->getSurface()->getClipRect().x2 = 640;
-		_class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+		_class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2());
 	}
 
 	if (getGlobalVar(0x4A105B3) == 1) {
@@ -948,39 +939,27 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
 		}
-		_class489->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x;
-		_class489->getSurface()->getClipRect().y1 = 0;
-		_class489->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x;
-		_class489->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+		_class489->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2());
 	}
 
-	_klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; 
-	_klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+	_klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2());
 	
 }
 
 void Scene1402::update() {
 	if (_flag) {
-		_background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10 - 1) - 10;
-		// TODO g_screen->field_26 = -10 - _background->getSurface()->getDrawRect().y;
+		setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10);
+		// TODO g_screen->field_26 = -10 - _background->getDrawRect().y;
 	} else {
-		_background->getSurface()->getDrawRect().y = -10;
+		setBackgroundY(-10);
 		// TODO g_screen->field_26 = 0;
 		SetUpdateHandler(&Scene::update);
 	}
 	Scene::update();
 	if (_class482) {
-		_class482->getSurface()->getClipRect().x1 = 0;
-		_class482->getSurface()->getClipRect().y1 = 0;
-		_class482->getSurface()->getClipRect().x2 = 640;
-		_class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+		_class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2());
 	}
-	_klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; 
-	_klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height;
+	_klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2());
 }
 
 uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1392,10 +1371,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->processDelta();
 			setMessageList(0x004B1F70);
 		}
-		_class489->getSurface()->getClipRect().x1 = 0;
-		_class489->getSurface()->getClipRect().y1 = 0;
-		_class489->getSurface()->getClipRect().x2 = 640;
-		_class489->getSurface()->getClipRect().y2 = _class401_2->getSurface()->getDrawRect().y + _class401_2->getSurface()->getDrawRect().height;
+		_class489->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2());
 		class489->setRepl(64, 0);
 	}
 
@@ -1515,16 +1491,10 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->processDelta();
 			setMessageList(0x004B8CB8);
 		}
-		_class489->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
-		_class489->getSurface()->getClipRect().y1 = 0;
-		_class489->getSurface()->getClipRect().x2 = 640;
-		_class489->getSurface()->getClipRect().y2 = 480;
+		_class489->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 	}
 
-	_klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 
 }
 
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index f551911..30e4631 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -210,47 +210,32 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 		InsertKlayman(KmScene1705, 231, 434);
 		setMessageList(0x004B69E8);
 		sendMessage(this, 0x2000, 0);
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 1) {
 		InsertKlayman(KmScene1705, 431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A08);
 		sendMessage(this, 0x2000, 1);
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 2) {
 		InsertKlayman(KmScene1705, 431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6AA0);
 		sendMessage(this, 0x2000, 1);
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 3) {
 		InsertKlayman(KmScene1705, 431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A18);
 		sendMessage(this, 0x2000, 1);
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = 0;
-		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else {
 		InsertKlayman(KmScene1705, 231, 74);
 		sendMessage(_klayman, 0x2000, 0);
 		setMessageList(0x004B69F0);
 		sendMessage(this, 0x2000, 0);
 		tempSprite = insertStaticSprite(0x30303822, 1100);
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y;
-		_klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width;
-		_klayman->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(0, tempSprite->getDrawRect().y, _sprite->getDrawRect().x2(), 480);
 	}
 
 }
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index b2e9a0e..3977598 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -133,10 +133,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setDoDeltaX(1);
 	}
 	
-	_klayman->getSurface()->getClipRect().x1 = _class401->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(_class401->getDrawRect().x, 0, 640, 480);
 	
 }
 
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index a0db788..124ace6 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -760,16 +760,16 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	tempSprite = insertStaticSprite(0x030326A0, 1100);
-	_rect1.x1 = tempSprite->getSurface()->getDrawRect().x;
+	_rect1.x1 = tempSprite->getDrawRect().x;
 	
 	insertStaticSprite(0x811DA061, 1100);
 
 	tempSprite = insertStaticSprite(0x11180022, 1100);
-	_rect2.x1 = tempSprite->getSurface()->getDrawRect().x;
+	_rect2.x1 = tempSprite->getDrawRect().x;
 
 	tempSprite = insertStaticSprite(0x0D411130, 1100);
-	_rect1.y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
-	_rect2.y1 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height;
+	_rect1.y2 = tempSprite->getDrawRect().y2();
+	_rect2.y1 = tempSprite->getDrawRect().y2();
 	
 	_doorLightSprite = insertStaticSprite(0xA4062212, 900);
 
@@ -1366,15 +1366,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100);
 	_ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100);
 	
-	_leftDoorClipRect.x1 = _ssSmallLeftDoor->getSurface()->getDrawRect().x;
-	_leftDoorClipRect.y1 = 0;
-	_leftDoorClipRect.x2 = 640;
-	_leftDoorClipRect.y2 = 480;
-	
-	_rightDoorClipRect.x1 = 0;
-	_rightDoorClipRect.y1 = 0;
-	_rightDoorClipRect.x2 = _ssSmallRightDoor->getSurface()->getDrawRect().x + _ssSmallRightDoor->getSurface()->getDrawRect().width;
-	_rightDoorClipRect.y2 = 480;
+	_leftDoorClipRect.set(_ssSmallLeftDoor->getDrawRect().x, 0, 640, 480);
+	_rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480);
 
 	sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor);
 	sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor);
@@ -1403,10 +1396,10 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(0x9A500914)) {
 		_ssSmallLeftDoor->setVisible(false);
-		_klayman->getSurface()->getClipRect() = _rightDoorClipRect;
+		_klayman->setClipRect(_rightDoorClipRect);
 	} else {
 		_ssSmallRightDoor->setVisible(false);
-		_klayman->getSurface()->getClipRect() = _leftDoorClipRect;
+		_klayman->setClipRect(_leftDoorClipRect);
 	}
 	
 	setRectList(0x004B8420);
@@ -1445,10 +1438,10 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x4808:
 		if (sender == _asLeftDoor) {
 			_ssSmallLeftDoor->setVisible(true);
-			_klayman->getSurface()->getClipRect() = _leftDoorClipRect;
+			_klayman->setClipRect(_leftDoorClipRect);
 		} else {
 			_ssSmallRightDoor->setVisible(true);
-			_klayman->getSurface()->getClipRect() = _rightDoorClipRect;
+			_klayman->setClipRect(_rightDoorClipRect);
 		}
 		break;
 	case 0x4826:
@@ -1548,10 +1541,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		_isKlaymanInLight = true;
 	}
 
-	_klayman->getSurface()->getClipRect().x1 = _ssDoorFrame->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480);
 
 	loadDataResource(0x00144822);
 	_klayman->setSoundFlag(true);
@@ -1563,14 +1553,14 @@ void Scene2205::update() {
 
 	if (!_isLightOn && getGlobalVar(0x4D080E54)) {
 		_palette->addPalette(0x0008028D, 0, 256, 0);
-		_background->load(0x0008028D);
+		changeBackground(0x0008028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030);
 		sendMessage(_ssDoorFrame, 0x2000, 0);
 		changeMouseCursor(0x80289008);
 		_isLightOn = true;
 	} else if (_isLightOn && !getGlobalVar(0x4D080E54)) {
 		_palette->addPalette(0xD00A028D, 0, 256, 0);
-		_background->load(0xD00A028D);
+		changeBackground(0xD00A028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84);
 		sendMessage(_ssDoorFrame, 0x2000, 0);
 		changeMouseCursor(0xA0289D08);
@@ -1769,10 +1759,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite2 = insertStaticSprite(0x3406A333, 300);
 		_sprite3 = insertStaticSprite(0x24A223A2, 100);
 		_sprite4 = addSprite(new Class603(_vm, 0x26133023));
-		_sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
-		_sprite4->getSurface()->getClipRect().y1 = 0;
-		_sprite4->getSurface()->getClipRect().x2 = 640;
-		_sprite4->getSurface()->getClipRect().y2 = 480;
+		_sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8AF8);
 		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0));
 		insertMouse433(0x83212411);
@@ -1784,10 +1771,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite2 = insertStaticSprite(0x020462E0, 300);
 		_sprite3 = insertStaticSprite(0x900626A2, 100);
 		_sprite4 = addSprite(new Class603(_vm, 0x544822A8));
-		_sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
-		_sprite4->getSurface()->getClipRect().y1 = 0;
-		_sprite4->getSurface()->getClipRect().x2 = 640;
-		_sprite4->getSurface()->getClipRect().y2 = 480;
+		_sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8B58);
 		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0));
 		insertMouse433(0x02A41E09);
@@ -1795,10 +1779,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class604 = addSprite(new Class604(_vm, 0x317831A0));
 	}
 
-	_class604->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
-	_class604->getSurface()->getClipRect().y1 = 0;
-	_class604->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
-	_class604->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
+	_class604->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
 
 	setBackground(fileHash);
 
@@ -1894,10 +1875,7 @@ void Scene2206::sub481950() {
 	setSurfacePriority(_sprite2->getSurface(), 300);
 	setSurfacePriority(_sprite3->getSurface(), 100);
 	setSurfacePriority(_sprite4->getSurface(), 200);
-	_klayman->getSurface()->getClipRect().x1 = 0;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = 640;
-	_klayman->getSurface()->getClipRect().y2 = 480;
+	_klayman->setClipRect(0, 0, 640, 480);
 }
 
 void Scene2206::sub4819D0() {
@@ -1909,10 +1887,7 @@ void Scene2206::sub4819D0() {
 	setSurfacePriority(_sprite2->getSurface(), 1300);
 	setSurfacePriority(_sprite3->getSurface(), 1100);
 	setSurfacePriority(_sprite4->getSurface(), 1200);
-	_klayman->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x;
-	_klayman->getSurface()->getClipRect().y1 = 0;
-	_klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width;
-	_klayman->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height;
+	_klayman->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
 }
 
 void Scene2206::sub481B00() {
@@ -2307,20 +2282,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 		_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0));
 	
-		_asLever->getSurface()->getClipRect().x1 = 0;
-		_asLever->getSurface()->getClipRect().y1 = 0;
-		_asLever->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width;
-		_asLever->getSurface()->getClipRect().y2 = 480;
-	
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
-		_klayman->getSurface()->getClipRect().x2 = 640;
-		_klayman->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height;
-	
-		_asElevator->getSurface()->getClipRect().x1 = 0;
-		_asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
-		_asElevator->getSurface()->getClipRect().x2 = 640;
-		_asElevator->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height;
+		_asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480);
+		_klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2());
+		_asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2());
 	
 	} else {
 
@@ -2342,15 +2306,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asWallCannonAnimation = NULL;
 		_ssButton = NULL;
 
-		_klayman->getSurface()->getClipRect().x1 = 0;
-		_klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
-		_klayman->getSurface()->getClipRect().x2 = 640;
-		_klayman->getSurface()->getClipRect().y2 = 480;
-		
-		_asElevator->getSurface()->getClipRect().x1 = 0;
-		_asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y;
-		_asElevator->getSurface()->getClipRect().x2 = 640;
-		_asElevator->getSurface()->getClipRect().y2 = 480;
+		_klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480);
+		_asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480);
 
 	}
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index bcae324..fd11509 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -40,6 +40,9 @@ namespace Neverhood {
 #define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman)
 #define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman)
 
+#define InsertSprite(SpriteClass) (SpriteClass*)addSprite(new SpriteClass(_vm)); 
+#define InsertSpriteInitArgs(SpriteClass, InitArgs) (SpriteClass*)addSprite((new SpriteClass(_vm))-> init InitArgs);
+
 class Scene : public Entity {
 public:
 	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
@@ -55,6 +58,8 @@ public:
 	Background *addBackground(Background *background);
 	void setBackground(uint32 fileHash, bool dirtyBackground = true);
 	void changeBackground(uint32 fileHash);
+	void setBackgroundY(int16 y) { _background->getSurface()->getDrawRect().y = y; }
+	int16 getBackgroundY() { return _background->getSurface()->getDrawRect().y; }
 	void setPalette(uint32 fileHash = 0);
 	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
 	void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL);
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 9dc1d8b..480e9e9 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -98,6 +98,22 @@ int16 Sprite::defFilterY(int16 y) {
 	return y;
 }
 
+void Sprite::setClipRect(int16 x1, int16 y1, int16 x2, int16 y2) {
+	NRect &clipRect = _surface->getClipRect();
+	clipRect.x1 = x1;
+	clipRect.y1 = y1;
+	clipRect.x2 = x2;
+	clipRect.y2 = y2;
+}
+
+void Sprite::setClipRect(NRect& clipRect) {
+	_surface->getClipRect() = clipRect;
+}
+
+void Sprite::setClipRect(NDrawRect& drawRect) {
+	setClipRect(drawRect.x, drawRect.y, drawRect.x2(), drawRect.y2());
+}
+
 // StaticSprite
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 1c4008e..59109d6 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -58,6 +58,12 @@ public:
 	void loadDataResource(uint32 fileHash);
 	int16 defFilterY(int16 y);
 	void setVisible(bool value) { _surface->setVisible(value); }
+	NDrawRect& getDrawRect() { return _surface->getDrawRect(); }
+	// Some shortcuts to set the clipRect
+	NRect& getClipRect() { return _surface->getClipRect(); }
+	void setClipRect(int16 x1, int16 y1, int16 x2, int16 y2);
+	void setClipRect(NRect& clipRect);
+	void setClipRect(NDrawRect& drawRect);
 protected:
 	void (Sprite::*_spriteUpdateCb)();
 	Common::String _spriteUpdateCbName; // For debugging purposes


Commit: 9aff6337bcfa95ba6ef6c17c9e018470f81407b4
    https://github.com/scummvm/scummvm/commit/9aff6337bcfa95ba6ef6c17c9e018470f81407b4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Try to cleanup sprite creation with a templated insertSprite function (only in Module1000 so far)

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/scene.h
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index ddd3e0a..e160a71 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -372,28 +372,28 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	
 	if (getGlobalVar(0xD217189D) == 0) {
-		_asDoor = addSprite(new AsScene1001Door(_vm));
+		_asDoor = insertSprite<AsScene1001Door>();
 		_asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	} else {
 		_asDoor = NULL;
 	}
 
-	_asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1));
+	_asLever = insertSprite<AsScene1001Lever>(this, 150, 433, 1);
 
 	insertStaticSprite(0x809861A6, 950);
 	insertStaticSprite(0x89C03848, 1100);
 
-	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0));
+	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
 
 	if (getGlobalVar(0x03C698DA) == 0) {
 		tempSprite = insertStaticSprite(0x8C066150, 200);
-		_asWindow = addSprite(new AsScene1001Window(_vm));
+		_asWindow = insertSprite<AsScene1001Window>();
 		_asWindow->setClipRect(tempSprite->getDrawRect());
 	} else {
 		_asWindow = NULL;
 	}
 
-	_asHammer = addSprite(new AsScene1001Hammer(_vm, _asDoor));
+	_asHammer = insertSprite<AsScene1001Hammer>(_asDoor);
 
 }
 
@@ -516,7 +516,7 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f
 		SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
 	}
 
-    setClipRect(0, clipY1, 640, 480);
+	setClipRect(0, clipY1, 640, 480);
 
 	_x = x;
 	_y = y;
@@ -1329,38 +1329,38 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x06149428, 1100);
 	insertStaticSprite(0x312C8774, 1100);
 
-	_ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this));
+	_ssLadderArch = insertSprite<SsScene1002LadderArch>(this);
 	_ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200);
 	_ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100);
 	_ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100);
 
-	_class599 = addSprite(new Class599(_vm, this));
+	_class599 = insertSprite<Class599>(this);
 
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
 			InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); 
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = insertSprite<Class478>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
 			InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch));
-			_class478 = addSprite(new Class478(_vm, _klayman));
+			_class478 = insertSprite<Class478>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 			_class478->setClipRect(_klayman->getClipRect());
 		}
 	} else if (which == 1) {
 		InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch));
-		_class478 = addSprite(new Class478(_vm, _klayman));
+		_class478 = insertSprite<Class478>(_klayman);
 		setMessageList(0x004B4478);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_class478->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
 		InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch));
-		_class478 = addSprite(new Class478(_vm, _klayman));
+		_class478 = insertSprite<Class478>(_klayman);
 		setMessageList(0x004B4298);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_class478->setClipRect(_klayman->getClipRect());
@@ -1368,11 +1368,11 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
 		InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch));
-		_class478 = addSprite(new Class478(_vm, _klayman));
+		_class478 = insertSprite<Class478>(_klayman);
 		setMessageList(0x004B4470);
 		_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
 		_class478->setClipRect(_klayman->getClipRect());
-		_class479 = addSprite(new Class479(_vm, this, _klayman));
+		_class479 = insertSprite<Class479>(this, _klayman);
 		_class479->setClipRect(_klayman->getClipRect());
 		_klayman->setRepl(64, 0);
 		_vm->_gameState.field2 = 0;
@@ -1384,26 +1384,22 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y,
 		_ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2());
 
-	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getDrawRect().y, false));
-	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getDrawRect().y, false));
-	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0));
-	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getDrawRect().y, false));
-	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getDrawRect().y, false));
-
-	_asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect));
-	
-	tempSprite = addSprite(new Class505(_vm));
-
-	_asDoorSpy = addSprite(new AsScene1002DoorSpy(_vm, tempClipRect, this, _asDoor, tempSprite));
-	
-	_class426 = addSprite(new Class426(_vm, this, 0x00412692, 0x140B60BE, 800, 0));
-	_asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, false));
-	
+	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 258, 191, _class599->getDrawRect().y, false);
+	_asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _class599->getDrawRect().y, false);
+	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0);
+	_asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _class599->getDrawRect().y, false);
+	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _class599->getDrawRect().y, false);
+
+	_asDoor = insertSprite<AsScene1002Door>(tempClipRect);
+	tempSprite = insertSprite<Class505>();
+	_asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
+	_class426 = insertSprite<Class426>(this, 0x00412692, 0x140B60BE, 800, 0);
+	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, false);
 	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 
-	_class506 = addSprite(new Class506(_vm));
+	_class506 = insertSprite<Class506>();
 								  
 	setRectList(0x004B43A0);
 
@@ -1660,7 +1656,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	updatePaletteArea();
 	
-	_class478 = addSprite(new Class478(_vm, _klayman));
+	_class478 = insertSprite<Class478>(_klayman);
 
 	insertStaticSprite(0x800034A0, 1100);
 	insertStaticSprite(0x64402020, 1100);
@@ -1670,7 +1666,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480);
 	_class478->setClipRect(_klayman->getClipRect());
 
-	_asTrashCan = addSprite(new AsScene1004TrashCan(_vm));
+	_asTrashCan = insertSprite<AsScene1004TrashCan>();
 
 }
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index fd11509..d0decd2 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -40,8 +40,8 @@ namespace Neverhood {
 #define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman)
 #define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman)
 
-#define InsertSprite(SpriteClass) (SpriteClass*)addSprite(new SpriteClass(_vm)); 
-#define InsertSpriteInitArgs(SpriteClass, InitArgs) (SpriteClass*)addSprite((new SpriteClass(_vm))-> init InitArgs);
+#define InsertSprite(SpriteObj, SpriteClass) SpriteObj = (SpriteClass*)addSprite(new SpriteClass(_vm)); 
+#define InsertSpriteInitArgs(SpriteObj, SpriteClass, InitArgs) SpriteObj = new SpriteClass(_vm); ((SpriteClass*)(SpriteObj))-> init InitArgs; addSprite(SpriteObj)
 
 class Scene : public Entity {
 public:
@@ -69,6 +69,35 @@ public:
 	void changeMouseCursor(uint32 fileHash);
 	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
+	// Some crazy templated functions to make the logic code smaller/simpler (imo!)
+	template<class T> 
+	T* insertSprite() {
+		return (T*)addSprite(new T(_vm));
+	}
+	template<class T, class Arg1> 
+	T* insertSprite(Arg1 arg1) {
+		return (T*)addSprite(new T(_vm, arg1));
+	}
+	template<class T, class Arg1, class Arg2> 
+	T* insertSprite(Arg1 arg1, Arg2 arg2) {
+		return (T*)addSprite(new T(_vm, arg1, arg2));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3> 
+	T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3) {
+		return (T*)addSprite(new T(_vm, arg1, arg2, arg3));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4> 
+	T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
+		return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5> 
+	T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
+		return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6> 
+	T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
+		return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6));
+	}
 protected:
 	Module *_parentModule;
 	Common::Array<Entity*> _entities;
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 59109d6..10ebc19 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -40,6 +40,7 @@ class Sprite : public Entity {
 public:
 	Sprite(NeverhoodEngine *vm, int objectPriority);
 	~Sprite();
+	void init() {}
 	BaseSurface *getSurface() { return _surface; }
 	void processDelta();
 	void setDoDeltaX(int type);


Commit: abf78e07eee50df3bd588c924d3c2ddf35a0e956
    https://github.com/scummvm/scummvm/commit/abf78e07eee50df3bd588c924d3c2ddf35a0e956
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Replace InsertKlayman macros with template functions (still weird but nicer)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 8cdd98e..3beb325 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -270,8 +270,8 @@ void GameModule::startup() {
 	createModule(1000, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 12;
-	createModule(3000, -1);
+	_vm->gameState().sceneNum = 1;
+	createModule(1000, -1);
 #endif
 }
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index b5d266e..4d4d9c4 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2115,19 +2115,14 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &para
 
 // KmScene1002
 
-KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL),
+KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _class599(class599), _ssLadderArch(ssLadderArch),
 	_status(0) {
 	
 	setKlaymanTable1();
 	
 }
 
-void KmScene1002::init(Sprite *class599, Sprite *ssLadderArch) {
-	_class599 = class599;
-	_ssLadderArch = ssLadderArch;  
-}
-
 void KmScene1002::xUpdate() {
 	if (_x >= 250 && _x <= 435 && _y >= 420) {
 		if (_status == 0) {
@@ -2694,18 +2689,14 @@ void KmScene1004::sub478170() {
 
 // KmScene1201
 
-KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) {
+KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) {
 	
 	// TODO setKlaymanTable(dword_4AEF10, 3);
 	_flagF6 = true;
 	
 }
 
-void KmScene1201::init(Entity *class464) {
-	_class464 = class464; 
-}
-
 uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
@@ -3878,7 +3869,7 @@ void KmScene2001::sub440270() {
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
-KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	// TODO: NRect *rect1, int16 unk in Klayman ctor
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -3886,10 +3877,6 @@ KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	_flagF6 = false;
 }
 
-void KmScene2201::init(NRect *clipRects, int clipRectsCount) {
-	// TODO
-}
-
 uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3f15b8f..a4d3557 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -44,7 +44,6 @@ struct KlaymanTableItem {
 class Klayman : public AnimatedSprite {
 public:
 	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);
-	void init() { }
 
 	void update();
 
@@ -262,8 +261,7 @@ protected:
 
 class KmScene1002 : public Klayman {
 public:
-	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-	void init(Sprite *class599, Sprite *ssLadderArch);
+	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch);
 protected:
 	Sprite *_class599;
 	Sprite *_ssLadderArch;
@@ -309,8 +307,7 @@ protected:
 
 class KmScene1201 : public Klayman {
 public:
-	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-	void init(Entity *class464);
+	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464);
 protected:
 	Entity *_class464;
 	int _countdown;
@@ -431,8 +428,7 @@ protected:
 
 class KmScene2201 : public Klayman {
 public:
-	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-	void init(NRect *clipRects, int clipRectsCount);
+	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index e160a71..14bc4a4 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -338,7 +338,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene1001::handleMessage);
 	
-	_vm->_collisionMan->setHitRects(0x004B4860);
+	setHitRects(0x004B4860);
 	_surfaceFlag = false;
 	setBackground(0x4086520E);
 	setPalette(0x4086520E);
@@ -346,24 +346,24 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (which < 0) {
 		setRectList(0x004B49F0);
-		InsertKlayman(KmScene1001, 200, 433);
+		insertKlayman<KmScene1001>(200, 433);
 		setMessageList(0x004B4888);
 	} else if (which == 1) {
 		setRectList(0x004B49F0);
-		InsertKlayman(KmScene1001, 640, 433);
+		insertKlayman<KmScene1001>(640, 433);
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
 		setRectList(0x004B49F0);
 		if (getGlobalVar(0xC0418A02)) {
-			InsertKlayman(KmScene1001, 390, 433);
+			insertKlayman<KmScene1001>(390, 433);
 			_klayman->setDoDeltaX(1);
 		} else {
-			InsertKlayman(KmScene1001, 300, 433);
+			insertKlayman<KmScene1001>(300, 433);
 		}
 		setMessageList(0x004B4970);
 	} else {
 		setRectList(0x004B4A00);
-		InsertKlayman(KmScene1001, 200, 433);
+		insertKlayman<KmScene1001>(200, 433);
 		setMessageList(0x004B4890);
 	}
 
@@ -1317,7 +1317,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1002::update);
 	SetMessageHandler(&Scene1002::handleMessage);
 
-	_vm->_collisionMan->setHitRects(0x004B4138);
+	setHitRects(0x004B4138);
 
 	_surfaceFlag = true;
 
@@ -1338,28 +1338,28 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
-			InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); 
+			insertKlayman<KmScene1002>(90, 226, _class599, _ssLadderArch);
 			_class478 = insertSprite<Class478>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
 			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
-			InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch));
+			insertKlayman<KmScene1002>(379, 435, _class599, _ssLadderArch);
 			_class478 = insertSprite<Class478>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 			_class478->setClipRect(_klayman->getClipRect());
 		}
 	} else if (which == 1) {
-		InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch));
+		insertKlayman<KmScene1002>(650, 435, _class599, _ssLadderArch);
 		_class478 = insertSprite<Class478>(_klayman);
 		setMessageList(0x004B4478);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_class478->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
-		InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch));
+		insertKlayman<KmScene1002>(68, 645, _class599, _ssLadderArch);
 		_class478 = insertSprite<Class478>(_klayman);
 		setMessageList(0x004B4298);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
@@ -1367,7 +1367,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_gameState.field2 = 1;
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
-		InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch));
+		insertKlayman<KmScene1002>(90, 226, _class599, _ssLadderArch);
 		_class478 = insertSprite<Class478>(_klayman);
 		setMessageList(0x004B4470);
 		_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
@@ -1642,15 +1642,15 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		setRectList(0x004B7C70);
-		InsertKlayman(KmScene1004, 330, 327);
+		insertKlayman<KmScene1004>(330, 327);
 		setMessageList(0x004B7C18);
 	} else if (which == 1) {
 		setRectList(0x004B7C70);
-		InsertKlayman(KmScene1004, 330, 327);
+		insertKlayman<KmScene1004>(330, 327);
 		setMessageList(0x004B7C08);
 	} else {
 		loadDataResource(0x01900A04);
-		InsertKlayman(KmScene1004, _dataResource.getPoint(0x80052A29).x, 27);
+		insertKlayman<KmScene1004>(_dataResource.getPoint(0x80052A29).x, 27);
 		setMessageList(0x004B7BF0);
 	}
 	
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 62462fc..9c84950 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -753,7 +753,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1201::update);
 	SetMessageHandler(&Scene1201::handleMessage);
 
-	_vm->_collisionMan->setHitRects(0x004AEBD0);
+	setHitRects(0x004AEBD0);
 	
 	_surfaceFlag = true;
 
@@ -797,29 +797,29 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	debug("Scene1201: which = %d", which);
 
 	if (which < 0) {
-		InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464));
+		insertKlayman<KmScene1201>(364, 333, class464);
 		setMessageList(0x004AEC08);
 	} else if (which == 3) {
-		InsertKlaymanInitArgs(KmScene1201, 400, 329, (class464));
+		insertKlayman<KmScene1201>(400, 329, class464);
 		setMessageList(0x004AEC08);
 	} else if (which == 2) {
 		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
-			InsertKlaymanInitArgs(KmScene1201, 374, 333, (class464));
+			insertKlayman<KmScene1201>(374, 333, class464);
 			setMessageList(0x004AEC08);
 		} else {
-			InsertKlaymanInitArgs(KmScene1201, 640, 329, (class464));
+			insertKlayman<KmScene1201>(640, 329, class464);
 			setMessageList(0x004AEC20);
 		}
 	} else if (which == 1) {
 		if (getGlobalVar(0xC0418A02)) {
-			InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464));
+			insertKlayman<KmScene1201>(364, 333, class464);
 			_klayman->setDoDeltaX(1);
 		} else {
-			InsertKlaymanInitArgs(KmScene1201, 246, 333, (class464));
+			insertKlayman<KmScene1201>(246, 333, class464);
 		}
 		setMessageList(0x004AEC30);
 	} else {
-		InsertKlaymanInitArgs(KmScene1201, 0, 336, (class464));
+		insertKlayman<KmScene1201>(0, 336, class464);
 		setMessageList(0x004AEC10);
 	}
 
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 48a8b54..4876135 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -417,7 +417,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _soundResource(vm) {
 
 	SetMessageHandler(&Scene1302::handleMessage);
-	_vm->_collisionMan->setHitRects(0x004B0858);
+	setHitRects(0x004B0858);
 	setRectList(0x004B0A38);
 
 	setBackground(0x420643C4);
@@ -441,10 +441,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2());
 
 	if (which < 0) {
-		InsertKlaymanInitArgs(KmScene1002, 380, 364, (_class595, NULL));
+		insertKlayman<KmScene1002>(380, 364, _class595, (Sprite*)NULL);
 		setMessageList(0x004B0868);
 	} else {
-		InsertKlaymanInitArgs(KmScene1002, 293, 330, (_class595, NULL));
+		insertKlayman<KmScene1002>(293, 330, _class595, (Sprite*)NULL);
 		setMessageList(0x004B0870);
 	}
 
@@ -649,7 +649,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_sprite1 = insertStaticSprite(0xA014216B, 1100);
 
-	InsertKlayman(KmScene1303, 207, 332);
+	insertKlayman<KmScene1303>(207, 332);
 	setMessageList(0x004AF9A0);
 
 	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
@@ -730,10 +730,10 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x090AF033, 1100);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1304, 217, 347);
+		insertKlayman<KmScene1304>(217, 347);
 		setMessageList(0x004B90E8);
 	} else {
-		InsertKlayman(KmScene1304, 100, 347);
+		insertKlayman<KmScene1304>(100, 347);
 		setMessageList(0x004B90F0);
 	}
 
@@ -778,10 +778,10 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x01B60280);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1305, 212, 441);
+		insertKlayman<KmScene1305>(212, 441);
 		setMessageList(0x004B6E40);
 	} else {
-		InsertKlayman(KmScene1305, 212, 441);
+		insertKlayman<KmScene1305>(212, 441);
 		setMessageList(0x004B6E48);
 	}
 	
@@ -913,45 +913,45 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x00042313, 1100);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1306, 380, 440);
+		insertKlayman<KmScene1306>(380, 440);
 		setMessageList(0x004AFAD0);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 1) {
-		InsertKlayman(KmScene1306, 136, 440);
+		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFAF0);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			InsertKlayman(KmScene1306, 515, 440);
+			insertKlayman<KmScene1306>(515, 440);
 			_klayman->setDoDeltaX(1);
 		} else {
-			InsertKlayman(KmScene1306, 355, 440);
+			insertKlayman<KmScene1306>(355, 440);
 		}
 		setMessageList(0x004AFBC8);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 3) {
-		InsertKlayman(KmScene1306, 534, 440);
+		insertKlayman<KmScene1306>(534, 440);
 		setMessageList(0x004AFC30);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 4) {
-		InsertKlayman(KmScene1306, 136, 440);
+		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFC38);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 5) {
-		InsertKlayman(KmScene1306, 136, 440);
+		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFB00);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else {
-		InsertKlayman(KmScene1306, 286, 408);
+		insertKlayman<KmScene1306>(286, 408);
 		setSurfacePriority(_asElevator->getSurface(), 1100);
 		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
 		setSurfacePriority(_sprite1->getSurface(), 1080);
@@ -1621,7 +1621,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite4 = NULL;
 
 	if (which < 0) {
-		InsertKlayman(KmScene1308, 380, 440);
+		insertKlayman<KmScene1308>(380, 440);
 		setMessageList(0x004B57C0);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
@@ -1631,7 +1631,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else if (which == 1) {
-		InsertKlayman(KmScene1308, 640, 440);
+		insertKlayman<KmScene1308>(640, 440);
 		setMessageList(0x004B57C8);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
@@ -1641,7 +1641,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else if (which == 2) {
-		InsertKlayman(KmScene1308, 475, 440);
+		insertKlayman<KmScene1308>(475, 440);
 		setMessageList(0x004B58B0);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite5 = addSprite(new Class592(_vm, this));
@@ -1652,7 +1652,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else {
-		InsertKlayman(KmScene1308, 41, 440);
+		insertKlayman<KmScene1308>(41, 440);
 		setMessageList(0x004B57D0);
 		sendMessage(_class549, 0x4808, 0);
 		_sprite1->setVisible(false);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 7bff294..b135458 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -683,19 +683,19 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite2->setVisible(false);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1401, 380, 447);
+		insertKlayman<KmScene1401>(380, 447);
 		setMessageList(0x004B65C8);
 		_sprite1->setVisible(false);
 	} else if (which == 1) {
-		InsertKlayman(KmScene1401, 0, 447);
+		insertKlayman<KmScene1401>(0, 447);
 		setMessageList(0x004B65D0);
 		_sprite1->setVisible(false);
 	} else if (which == 2) {
-		InsertKlayman(KmScene1401, 660, 447);
+		insertKlayman<KmScene1401>(660, 447);
 		setMessageList(0x004B65D8);
 		_sprite1->setVisible(false);
 	} else {
-		InsertKlayman(KmScene1401, 290, 413);
+		insertKlayman<KmScene1401>(290, 413);
 		setMessageList(0x004B65E8);
 		_sprite1->setVisible(false);
 	}
@@ -892,16 +892,16 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B0C98);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1402, 377, 391);
+		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B48);
 		if (!getGlobalVar(0x70A1189C)) {
 			_class482 = addSprite(new Class482(_vm, this, 0));
 		}
 	} else if (which == 1) {
-		InsertKlayman(KmScene1402, 42, 391);
+		insertKlayman<KmScene1402>(42, 391);
 		setMessageList(0x004B0B50);
 	} else if (which == 2) {
-		InsertKlayman(KmScene1402, 377, 391);
+		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B60);
 		_klayman->setDoDeltaX(1);
 		if (getGlobalVar(0x70A1189C)) {
@@ -913,7 +913,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 			_class482 = addSprite(new Class482(_vm, this, 0));
 		}
 	} else {
-		InsertKlayman(KmScene1402, 513, 391);
+		insertKlayman<KmScene1402>(513, 391);
 		setMessageList(0x004B0B58);
 		if (!getGlobalVar(0x70A1189C)) {
 			_class482 = addSprite(new Class482(_vm, this, 2));
@@ -1351,10 +1351,10 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape2->setRepl(64, 0);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1403, 380, 463);
+		insertKlayman<KmScene1402>(380, 463);
 		setMessageList(0x004B1F18);
 	} else {
-		InsertKlayman(KmScene1403, 640, 463);
+		insertKlayman<KmScene1402>(640, 463);
 		setMessageList(0x004B1F20);
 	}
 	_klayman->setRepl(64, 0);
@@ -1464,21 +1464,21 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape);
 
 	if (which < 0) {
-		InsertKlayman(KmScene1404, 376, 406);
+		insertKlayman<KmScene1404>(376, 406);
 		setMessageList(0x004B8C28);
 	} else if (which == 1) {
-		InsertKlayman(KmScene1404, 376, 406);
+		insertKlayman<KmScene1404>(376, 406);
 		setMessageList(0x004B8C30);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			InsertKlayman(KmScene1404, 347, 406);
+			insertKlayman<KmScene1404>(347, 406);
 			_klayman->setDoDeltaX(1);
 		} else {
-			InsertKlayman(KmScene1404, 187, 406);
+			insertKlayman<KmScene1404>(187, 406);
 		}
 		setMessageList(0x004B8D28);
 	} else {
-		InsertKlayman(KmScene1404, 30, 406);
+		insertKlayman<KmScene1404>(30, 406);
 		setMessageList(0x004B8C38);
 	}
 
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 30e4631..9547d34 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -182,7 +182,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1705::handleMessage);
 	SetUpdateHandler(&Scene1705::update);
 
-	_vm->_collisionMan->setHitRects(0x004B69D8);
+	setHitRects(0x004B69D8);
 
 	_surfaceFlag = true;
 
@@ -207,30 +207,30 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	which = 4;
 
 	if (which < 0) {
-		InsertKlayman(KmScene1705, 231, 434);
+		insertKlayman<KmScene1705>(231, 434);
 		setMessageList(0x004B69E8);
 		sendMessage(this, 0x2000, 0);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 1) {
-		InsertKlayman(KmScene1705, 431, 434);
+		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A08);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 2) {
-		InsertKlayman(KmScene1705, 431, 434);
+		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6AA0);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 3) {
-		InsertKlayman(KmScene1705, 431, 434);
+		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A18);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else {
-		InsertKlayman(KmScene1705, 231, 74);
+		insertKlayman<KmScene1705>(231, 74);
 		sendMessage(_klayman, 0x2000, 0);
 		setMessageList(0x004B69F0);
 		sendMessage(this, 0x2000, 0);
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 3977598..b870d82 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -108,26 +108,26 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class401 = insertStaticSprite(0x0D641724, 1100);
 
 	if (which < 0) {
-		InsertKlayman(KmScene2001, 300, 345);
+		insertKlayman<KmScene2001>(300, 345);
 		setMessageList(0x004B3538);
 		sendMessage(this, 0x2000, 0);
 	} else if (which == 1) {
-		InsertKlayman(KmScene2001, 116, 345);
+		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3540);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
-		InsertKlayman(KmScene2001, 116, 345);
+		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B35F0);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
-		InsertKlayman(KmScene2001, 116, 345);
+		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3550);
 		sendMessage(this, 0x2000, 1);
 	} else {
-		InsertKlayman(KmScene2001, 390, 345);
+		insertKlayman<KmScene2001>(390, 345);
 		setMessageList(0x004B3530);
 		sendMessage(this, 0x2000, 0);
 		_klayman->setDoDeltaX(1);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 124ace6..59dcbfc 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -774,25 +774,25 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_doorLightSprite = insertStaticSprite(0xA4062212, 900);
 
 	if (which < 0) {
-		InsertKlaymanInitArgs(KmScene2201, 300, 427, (&_rect1, 2));
+		insertKlayman<KmScene2201>(300, 427, &_rect1, 2);
 		setMessageList(0x004B8118);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
 	} else if (which == 1) {
-		InsertKlaymanInitArgs(KmScene2201, 412, 393, (&_rect1, 2));
+		insertKlayman<KmScene2201>(412, 393, &_rect1, 2);
 		setMessageList(0x004B8130);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			InsertKlaymanInitArgs(KmScene2201, 379, 427, (&_rect1, 2));
+			insertKlayman<KmScene2201>(379, 427, &_rect1, 2);
 			_klayman->setDoDeltaX(1);
 		} else {
-			InsertKlaymanInitArgs(KmScene2201, 261, 427, (&_rect1, 2));
+			insertKlayman<KmScene2201>(261, 427, &_rect1, 2);
 		}
 		setMessageList(0x004B8178);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
 	} else {
 		NPoint pt = _dataResource.getPoint(0x0304D8DC);
-		InsertKlaymanInitArgs(KmScene2201, pt.x, pt.y, (&_rect1, 2));
+		insertKlayman<KmScene2201>(pt.x, pt.y, &_rect1, 2);
 		setMessageList(0x004B8120);
 		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true));
 	}
@@ -1350,7 +1350,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x82C80334);
 	insertMouse433(0x80330824);
 
-	_vm->_collisionMan->setHitRects(0x004B8320);
+	setHitRects(0x004B8320);
 
 	if (getGlobalVar(0x13382860) == 1) {
 		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 282, 432));
@@ -1376,21 +1376,21 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asRightDoor);
 
 	if (which < 0) {
-		InsertKlayman(KmScene2203, 200, 427);
+		insertKlayman<KmScene2203>(200, 427);
 		setMessageList(0x004B8340);
 	} else if (which == 1) {
-		InsertKlayman(KmScene2203, 640, 427);
+		insertKlayman<KmScene2203>(640, 427);
 		setMessageList(0x004B8350);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			InsertKlayman(KmScene2203, 362, 427);
+			insertKlayman<KmScene2203>(362, 427);
 			_klayman->setDoDeltaX(1);
 		} else {
-			InsertKlayman(KmScene2203, 202, 427);
+			insertKlayman<KmScene2203>(202, 427);
 		}
 		setMessageList(0x004B8358);
 	} else {
-		InsertKlayman(KmScene2203, 0, 427);
+		insertKlayman<KmScene2203>(0, 427);
 		setMessageList(0x004B8348);
 	}
 
@@ -1496,7 +1496,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2205::handleMessage);
 	SetUpdateHandler(&Scene2205::update);
 	
-	_vm->_collisionMan->setHitRects(0x004B0620);
+	setHitRects(0x004B0620);
 	_surfaceFlag = true;
 
 	if (getGlobalVar(0x4D080E54)) {
@@ -1522,21 +1522,21 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm));
 
 	if (which < 0) {
-		InsertKlayman(KmScene2205, 320, 417);
+		insertKlayman<KmScene2205>(320, 417);
 		setMessageList(0x004B0658);
 		if (!getGlobalVar(0x4D080E54)) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
 		}
 		_isKlaymanInLight = false;
 	} else if (which == 1) {
-		InsertKlayman(KmScene2205, 640, 417);
+		insertKlayman<KmScene2205>(640, 417);
 		setMessageList(0x004B0648);
 		if (!getGlobalVar(0x4D080E54)) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
 		}
 		_isKlaymanInLight = false;
 	} else {
-		InsertKlayman(KmScene2205, 0, 417);
+		insertKlayman<KmScene2205>(0, 417);
 		setMessageList(0x004B0640);
 		_isKlaymanInLight = true;
 	}
@@ -1795,24 +1795,24 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_class607);
 	
 	if (which < 0) {
-		InsertKlayman(KmScene2206, 200, 430);
+		insertKlayman<KmScene2206>(200, 430);
 		setMessageList(0x004B88A8);
 	} else if (which == 1) {
-		InsertKlayman(KmScene2206, 640, 430);
+		insertKlayman<KmScene2206>(640, 430);
 		setMessageList(0x004B88B8);
 	} else if (which == 2) {
-		InsertKlayman(KmScene2206, 205, 396);
+		insertKlayman<KmScene2206>(205, 396);
 		setMessageList(0x004B88C8);
 		_palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
 		sub4819D0();
 		_soundResource.play(0x53B8284A);
 	} else if (which == 3) {
-		InsertKlayman(KmScene2206, kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
+		insertKlayman<KmScene2206>(kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B8A70);
 	} else {
-		InsertKlayman(KmScene2206, 0, 430);
+		insertKlayman<KmScene2206>(0, 430);
 		setMessageList(0x004B88B0);
 	}
 
@@ -2251,7 +2251,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2207::update);
 	_surfaceFlag = true;
 
-	InsertKlayman(KmScene2207, 0, 0);
+	insertKlayman<KmScene2207>(0, 0);
 	_klayman->setRepl(64, 0);
 	
 	setMessageList(0x004B38E8);
@@ -2673,18 +2673,18 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape); 
 
 	if (which < 0) {
-		InsertKlayman(KmScene2242, 200, 430);
+		insertKlayman<KmScene2242>(200, 430);
 		setMessageList(0x004B3C18);
 	} else if (which == 1) {
-		InsertKlayman(KmScene2242, 530, 430);
+		insertKlayman<KmScene2242>(530, 430);
 		setMessageList(0x004B3D60);
 	} else if (which == 2) {
-		InsertKlayman(KmScene2242, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430);
+		insertKlayman<KmScene2242>(kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430);
 		setMessageList(0x004B3D48);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 	} else {
-		InsertKlayman(KmScene2242, 0, 430);
+		insertKlayman<KmScene2242>(0, 430);
 		setMessageList(0x004B3C20);
 	}
 
@@ -2802,18 +2802,18 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 	}
 
 	if (which < 0) {
-		InsertKlayman(KmHallOfRecords, 200, 430);
+		insertKlayman<KmHallOfRecords>(200, 430);
 		setMessageList(0x004B2900);
 	} else if (which == 1) {
-		InsertKlayman(KmHallOfRecords, 640, 430);
+		insertKlayman<KmHallOfRecords>(640, 430);
 		setMessageList(0x004B2910);
 	} else if (which == 2) {
-		InsertKlayman(KmHallOfRecords, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
+		insertKlayman<KmHallOfRecords>(kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
 		setMessageList(0x004B2B70);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 	} else {
-		InsertKlayman(KmHallOfRecords, 0, 430);
+		insertKlayman<KmHallOfRecords>(0, 430);
 		setMessageList(0x004B2908);
 	}
 
@@ -2897,18 +2897,18 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (which < 0) {
-		InsertKlayman(KmScene2247, 200, 430);
+		insertKlayman<KmScene2247>(200, 430);
 		setMessageList(0x004B5428);
 	} else if (which == 1) {
-		InsertKlayman(KmScene2247, 640, 430);
+		insertKlayman<KmScene2247>(640, 430);
 		setMessageList(0x004B5438);
 	} else if (which == 2) {
-		InsertKlayman(KmScene2247, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
+		insertKlayman<KmScene2247>(kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
 		if (getGlobalVar(0xC0418A02))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B5530);
 	} else {
-		InsertKlayman(KmScene2247, 0, 430);
+		insertKlayman<KmScene2247>(0, 430);
 		setMessageList(0x004B5430);
 	}
 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index f1ee554..8d7fc78 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -191,6 +191,10 @@ void Scene::setPalette(uint32 fileHash) {
 	_palette->usePalette();
 }
 
+void Scene::setHitRects(uint32 id) {
+	_vm->_collisionMan->setHitRects(id);
+}
+
 Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
 	return addSprite(new StaticSprite(_vm, fileHash, surfacePriority));
 }
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index d0decd2..09d34b5 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -37,12 +37,6 @@
 
 namespace Neverhood {
 
-#define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman)
-#define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman)
-
-#define InsertSprite(SpriteObj, SpriteClass) SpriteObj = (SpriteClass*)addSprite(new SpriteClass(_vm)); 
-#define InsertSpriteInitArgs(SpriteObj, SpriteClass, InitArgs) SpriteObj = new SpriteClass(_vm); ((SpriteClass*)(SpriteObj))-> init InitArgs; addSprite(SpriteObj)
-
 class Scene : public Entity {
 public:
 	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
@@ -61,6 +55,7 @@ public:
 	void setBackgroundY(int16 y) { _background->getSurface()->getDrawRect().y = y; }
 	int16 getBackgroundY() { return _background->getSurface()->getDrawRect().y; }
 	void setPalette(uint32 fileHash = 0);
+	void setHitRects(uint32 id);
 	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
 	void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL);
 	void insertMouse435(uint32 fileHash, int16 x1, int16 x2);
@@ -70,6 +65,36 @@ public:
 	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
 	// Some crazy templated functions to make the logic code smaller/simpler (imo!)
+	// insertKlayman
+	template<class T> 
+	void insertKlayman() {
+		_klayman = (T*)addSprite(new T(_vm, this));
+	}
+	template<class T, class Arg1> 
+	void insertKlayman(Arg1 arg1) {
+		_klayman = (T*)addSprite(new T(_vm, this, arg1));
+	}
+	template<class T, class Arg1, class Arg2> 
+	void insertKlayman(Arg1 arg1, Arg2 arg2) {
+		_klayman = (T*)addSprite(new T(_vm, this, arg1, arg2));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3> 
+	void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3) {
+		_klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4> 
+	void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
+		_klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5> 
+	void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
+		_klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5));
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6> 
+	void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
+		_klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5, arg6));
+	}
+	// insertSprite
 	template<class T> 
 	T* insertSprite() {
 		return (T*)addSprite(new T(_vm));


Commit: 3872efe2a50a881cf4c2f778bee408982a52487e
    https://github.com/scummvm/scummvm/commit/3872efe2a50a881cf4c2f778bee408982a52487e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Start with Module1100 and add Scene1105

Changed paths:
  A engines/neverhood/module1100.cpp
  A engines/neverhood/module1100.h
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module.mk
    engines/neverhood/module2200.cpp
    engines/neverhood/smackerscene.cpp
    engines/neverhood/smackerscene.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 924a7a7..9256c13 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -131,6 +131,9 @@ public:
 	void incGlobalVar(uint32 nameHash, int incrValue) {
 		setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue);
 	}
+	void incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) {
+		setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue);
+	}
 protected:
 	void (Entity::*_updateHandlerCb)();
 	uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 3beb325..c6dc006 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -24,6 +24,7 @@
 
 #include "neverhood/graphics.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module1100.h"
 #include "neverhood/module1200.h"
 #include "neverhood/module1300.h"
 #include "neverhood/module1400.h"
@@ -269,10 +270,14 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(1000, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 1;
 	createModule(1000, -1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 4;
+	createModule(1100, -1);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
@@ -283,6 +288,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x03294419);
 		_childObject = new Module1000(_vm, this, which);
 		break;
+	case 1100:
+		setGlobalVar(0x91080831, 0x0002C818);
+		_childObject = new Module1100(_vm, this, which);
+		break;
 	case 1200:
 		setGlobalVar(0x91080831, 0x00478311);
 		_childObject = new Module1200(_vm, this, which);
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index c58c924..79197ed 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -84,6 +84,15 @@ void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1,
 	_childObject = smackerScene;
 }
 
+void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort) {
+	SmackerScene *smackerScene;
+	_sceneType = kSceneTypeSmacker;
+	smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort);
+	smackerScene->setFileHashList(fileHashList);
+	smackerScene->nextVideo();
+	_childObject = smackerScene;
+}
+
 bool Module::updateChild() {
 	if (_childObject) {
 		_childObject->handleUpdate();
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index c0fdaa7..2f6ce69 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -60,6 +60,7 @@ protected:
 	NavigationScene *navigationScene();
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
 	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
+	void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort);
 	bool updateChild();
 };
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 1b4d6e4..bbbbb02 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -12,6 +12,7 @@ MODULE_OBJS = \
 	klayman.o \
 	module.o \
 	module1000.o \
+	module1100.o \
 	module1200.o \
 	module1300.o \
 	module1400.o \
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
new file mode 100644
index 0000000..3ee3f4c
--- /dev/null
+++ b/engines/neverhood/module1100.cpp
@@ -0,0 +1,663 @@
+/* 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/module1100.h"
+#include "neverhood/gamemodule.h"
+
+namespace Neverhood {
+
+Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else if (which == 1) {
+		createScene(9, 1);
+	} else {
+		createScene(9, 3);
+	}
+
+	// TODO Sound1ChList_addSoundResources(0x2C818, dword_4B85B0, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B85B0, true, 50, 600, 20, 250);
+	// TODO Sound1ChList_setSoundValues(0x74E01054, false, 100, 200, 10, 20);
+	// TODO Sound1ChList_setVolume(0x74E01054, 60);
+	// TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F);
+
+}
+
+Module1100::~Module1100() {
+	// TODO Sound1ChList_sub_407A50(0x2C818);
+}
+
+void Module1100::createScene(int sceneNum, int which) {
+	static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0};
+	static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0};
+	debug("Module1100::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_countdown = 65;
+		createNavigationScene(0x004B8430, which);
+		break;
+	case 1:
+		_countdown = 50;
+		createNavigationScene(0x004B8460, which);
+		break;
+	case 2:
+		if (getGlobalVar(0x610210B7)) {
+			createNavigationScene(0x004B84F0, which);
+		} else {
+			createNavigationScene(0x004B8490, which);
+		}
+		break;
+	case 3:
+		if (getGlobalVar(0x610210B7)) {
+			createNavigationScene(0x004B8580, which);
+		} else {
+			createNavigationScene(0x004B8550, which);
+		}
+		break;
+	case 4:
+		_childObject = new Scene1105(_vm, this, which);
+		break;
+	case 5:
+		if (getGlobalVar(0x610210B7))
+			createSmackerScene(0x04180001, true, false, false);
+		else
+			createSmackerScene(0x04180007, true, false, false);
+		break;
+	case 6:
+		// TODO Sound1ChList_sub_407AF0(0x2C818);
+		createSmackerScene(kSmackerFileHashList06, true, true, false);
+		break;
+	case 7:
+		// TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0);
+		createSmackerScene(kSmackerFileHashList07, true, true, false);
+		break;
+	case 8:
+//TODO		_childObject = new Scene1109(_vm, this, which);
+		break;
+	case 1002:
+		_countdown = 40;
+		// TODO Sound1ChList_sub_4080B0(true);
+		createSmackerScene(0x00012211, true, true, false);
+		break;
+	}
+	SetUpdateHandler(&Module1100::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module1100::updateScene() {
+	if (!updateChild()) {
+		debug("_vm->gameState().sceneNum = %d", _vm->gameState().sceneNum);
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			_countdown = 0;
+			// TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64);
+			// TODO Sound1ChList_setVolume(0x48498E46, 65);
+			// TODO Sound1ChList_setVolume(0x50399F64, 65);
+			if (_moduleResult == 0) {
+				createScene(1, 0);
+			} else if (_moduleResult == 1) {
+				createScene(8, 0);
+			}
+			break;
+		case 1:
+			// TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F);
+			if (getGlobalVar(0x0C0288F4)) {
+				if (_moduleResult == 0) {
+					createScene(6, -1);
+				} else if (_moduleResult == 1) {
+					createScene(0, 1);
+				}
+			} else {
+				if (_moduleResult == 0) {
+					createScene(2, 0);
+				} else if (_moduleResult == 1) {
+					createScene(0, 1);
+				}
+			}
+			break;
+		case 2:
+			// TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0);
+			if (_navigationAreaType == 3) {
+				createScene(7, -1);
+			} else if (_moduleResult == 1) {
+				createScene(3, 0);
+			} else if (_moduleResult == 2) {
+				createScene(1002, -1);
+			}
+			break;
+		case 3:
+			if (_moduleResult == 0) {
+				createScene(4, 0);
+			} else if (_moduleResult == 1) {
+				createScene(2, 3);
+			}
+			break;
+		case 4:
+			if (_moduleResult == 0) {
+				createScene(3, 0);
+			} else if (_moduleResult == 1) {
+				createScene(5, -1);
+			}
+			break;
+		case 5:
+			if (getGlobalVar(0x610210B7)) {
+				createScene(3, 0);
+			} else {
+				createScene(4, 0);
+			}
+			break;
+		case 6:
+			sendMessage(_parentModule, 0x1009, 1);
+			break;
+		case 7:
+			createScene(2, 2);
+			break;
+		case 8:
+			if (_moduleResult == 0) {
+				createScene(0, 0);
+			} else if (_moduleResult == 1) {
+				sendMessage(_parentModule, 0x1009, 0);
+			}
+			break;
+		case 1002:
+			_countdown = 0;
+			// TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64, 0);
+			createScene(1, 1);
+			break;
+		}
+	} else {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+#if 0 // TODO		
+			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
+				Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64);
+				Sound1ChList_setVolume(0x48498E46, 65);
+				Sound1ChList_setVolume(0x50399F64, 65);
+			}
+#endif			
+			break;
+		case 1:
+#if 0 // TODO		
+			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
+				Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F);
+			}
+#endif			
+			break;
+		case 2:
+			// TODO Sound1ChList_setSoundValues(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0);
+			break;
+		case 5:
+		case 6:
+		case 7:
+		case 1002:
+			if (_countdown != 0 && (--_countdown == 0)) {
+				// TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64);
+				// TODO Sound1ChList_setVolume(0x48498E46, 65);
+				// TODO Sound1ChList_setVolume(0x50399F64, 65);
+			}
+			break;
+		}
+	}
+}
+
+static const uint32 kScene1105FileHashes[] = {
+	0x00028006,
+	0x0100A425,
+	0x63090415,
+	0x082100C4,
+	0x0068C607,
+	0x00018344,
+	0x442090E4,
+	0x0400E004,
+	0x5020A054,
+	0xB14A891E
+};
+
+static const uint32 kScene1105BackgroundFileHashes[] = {
+	0x20018662,
+	0x20014202,
+	0x20012202,
+	0x20010002 // CHECKME: This used ??
+};
+
+static const uint32 kSsScene1105SymbolDieFileHashes[] = {
+	0,
+	0x90898414,
+	0x91098414,
+	0x92098414,
+	0x94098414,
+	0x98098414,
+	0x80098414,
+	0xB0098414,
+	0xD0098414,
+	0x10098414
+};
+
+SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect)
+	: StaticSprite(vm, fileHash, 200), _soundResource(vm), _parentScene(parentScene),
+	_countdown(0) {
+	
+	_rect = rect;
+	SetMessageHandler(&SsScene1105Button::handleMessage);
+	SetUpdateHandler(&SsScene1105Button::update);
+	setVisible(false);
+}
+
+void SsScene1105Button::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		sendMessage(_parentScene, 0x4807, 0);
+		setVisible(false);
+	}
+}
+
+uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0) {
+			sendMessage(_parentScene, 0x4826, 0);
+			messageResult = 1;
+		}
+		break;
+	case 0x480B:
+		_countdown = 8;
+		setVisible(true);
+		_soundResource.play(0x44141000);
+		break;
+	}
+	return messageResult;
+}
+
+SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y)
+	: StaticSprite(vm, fileHash, 200) {
+
+	_x = x;
+	_y = y;
+	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	StaticSprite::update();
+}
+
+void SsScene1105Symbol::hide() {
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
+SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y)
+	: StaticSprite(vm, 1100), _index(index) {
+
+	SetMessageHandler(&SsScene1105SymbolDie::handleMessage);
+	_x = x;
+	_y = y;
+	createSurface(200, 50, 50);
+	loadSymbolSprite();
+}
+
+uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		loadSymbolSprite();
+		break;
+	}
+	return messageResult;
+}
+
+void SsScene1105SymbolDie::loadSymbolSprite() {
+	load(kSsScene1105SymbolDieFileHashes[getSubVar(0x61084036, _index)], true, false);
+	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
+	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	StaticSprite::update();
+}
+
+void SsScene1105SymbolDie::hide() {
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
+AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm),
+	_parentScene(parentScene) {
+	
+	// TODO createSurface3(100, dword_4AF4C0);
+	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
+	_x = 320;
+	_y = 240;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1105TeddyBear::handleMessage);
+	setFileHash(0x65084002, 0, -1);
+	_newHashListIndex = 0;
+	setVisible(false);
+	_needRefresh = true;
+	updatePosition();
+	_soundResource1.load(0xCE840261);
+	_soundResource2.load(0xCCA41A62);
+}
+
+uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		if (getGlobalVar(0x610210B7)) {
+			setFileHash(0x6B0C0432, 0, -1);
+			_soundResource1.play();
+		} else {
+			setFileHash(0x65084002, 0, -1);
+			_soundResource2.play();
+		}
+		break;
+	case 0x3002:
+		sendMessage(_parentScene, 0x2003, 0);
+		setFileHash1();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1105TeddyBear::show() {
+	setVisible(true);
+	_needRefresh = true;
+	updatePosition();
+}
+
+void AsScene1105TeddyBear::hide() {
+	setVisible(false);
+	_needRefresh = true;
+	updatePosition();
+}
+
+SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene)
+	: StaticSprite(vm, 900), _soundResource(vm), _parentScene(parentScene),
+	_countdown(0), _flag1(false) {
+	
+	_spriteResource.load2(0x8228A46C);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_deltaRect = _drawRect;
+	_needRefresh = true;
+	processDelta();
+	setVisible(false);
+	_soundResource.load(0x44045140);
+	SetUpdateHandler(&SsScene1105OpenButton::update);
+	SetMessageHandler(&SsScene1105OpenButton::handleMessage);
+}
+
+void SsScene1105OpenButton::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		setVisible(false);
+		sendMessage(_parentScene, 0x2001, 0);
+	}
+}
+
+uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0 && !_flag1) {
+			_soundResource.play();
+			setVisible(true);
+			_flag1 = true;
+			_countdown = 4;
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
+	_soundResource3(vm), _countdown(0), _flag1(false), _flag2(false), _flag3(false),
+	_flag4(false), _flag5(false), _backgroundIndex(0) {
+	
+	Sprite *ssOpenButton;
+	
+	_vm->gameModule()->initScene1405Vars();
+	
+	_surfaceFlag = true;
+	SetUpdateHandler(&Scene1105::update);
+	SetMessageHandler(&Scene1105::handleMessage);
+	
+	setBackground(0x20010002);
+	setPalette(0x20010002);
+	
+	_asTeddyBear = insertSprite<AsScene1105TeddyBear>(this);
+	ssOpenButton = insertSprite<SsScene1105OpenButton>(this);
+	_vm->_collisionMan->addSprite(ssOpenButton);
+	insertMouse435(0x10006208, 20, 620);
+	
+	_soundResource1.load(0x48442057);
+	_soundResource2.load(0xC025014F);
+	_soundResource3.load(0x68E25540);
+	
+}
+
+uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = 0;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO Debug stuff
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			if (!_flag2 && _backgroundIndex == 0) {
+				if (_flag1) {
+					_flag1 = false;
+					_backgroundIndex = 15;
+					SetUpdateHandler(&Scene1105::upClosePanel);
+				} else
+					_flag1 = true;
+				_flag5 = false;
+			}
+		}
+		break;
+	// TODO Debug stuff
+	case 0x2001:
+		showMouse(false);
+		_backgroundIndex = 24;
+		SetUpdateHandler(&Scene1105::upOpenPanel);
+		break;
+	case 0x2003:
+		_backgroundIndex = 24;
+		_flag5 = true;
+		SetUpdateHandler(&Scene1105::upClosePanel);
+		break;
+	case 0x4807:
+		if (sender == _ssActionButton) {
+			if (getSubVar(0x7500993A, 0) == getSubVar(0x61084036, 0) &&
+				getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) &&
+				getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) {
+				setGlobalVar(0x610210B7, 1);
+				_soundResource3.play();
+				_flag3 = true;
+			} else {
+				sendMessage(_asTeddyBear, 0x2002, 0);
+			}
+			showMouse(false);
+			_flag2 = true;
+		}
+		break;
+	case 0x4826:
+		if (_flag1) {
+			if (sender == _ssActionButton) {
+				sendMessage(_ssActionButton, 0x480B, 0);
+				_flag1 = false;
+			} else if (!getGlobalVar(0x610210B7)) {
+				if (sender == _ssSymbol1UpButton) {
+					if (getSubVar(0x61084036, 0) < 9) {
+						incSubVar(0x61084036, 0, +1);
+						sendMessage(_ssSymbol1UpButton, 0x480B, 0);
+						sendMessage(_ssSymbolDice[0], 0x2000, 0);
+					}
+				} else if (sender == _ssSymbol1DownButton) {
+					if (getSubVar(0x61084036, 0) > 1) {
+						incSubVar(0x61084036, 0, -1);
+						sendMessage(_ssSymbol1DownButton, 0x480B, 0);
+						sendMessage(_ssSymbolDice[0], 0x2000, 0);
+					}
+				} else if (sender == _ssSymbol2UpButton) {
+					if (getSubVar(0x61084036, 1) < 9) {
+						incSubVar(0x61084036, 1, +1);
+						sendMessage(_ssSymbol2UpButton, 0x480B, 0);
+						sendMessage(_ssSymbolDice[1], 0x2000, 0);
+					}
+				} else if (sender == _ssSymbol2DownButton) {
+					if (getSubVar(0x61084036, 1) > 1) {
+						incSubVar(0x61084036, 1, -1);
+						sendMessage(_ssSymbol2DownButton, 0x480B, 0);
+						sendMessage(_ssSymbolDice[1], 0x2000, 0);
+					}
+				} else if (sender == _ssSymbol3UpButton) {
+					if (getSubVar(0x61084036, 2) < 9) {
+						incSubVar(0x61084036, 2, +1);
+						sendMessage(_ssSymbol3UpButton, 0x480B, 0);
+						sendMessage(_ssSymbolDice[2], 0x2000, 0);
+					}
+				} else if (sender == _ssSymbol3DownButton) {
+					if (getSubVar(0x61084036, 2) > 1) {
+						incSubVar(0x61084036, 2, -1);
+						sendMessage(_ssSymbol3DownButton, 0x480B, 0);
+						sendMessage(_ssSymbolDice[2], 0x2000, 0);
+					}
+				}
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Scene1105::createObjects() {
+	_ssSymbols[0] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(0x13100631, 0)], 161, 304);
+	_ssSymbols[1] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(0x13100631, 1)], 294, 304);
+	_ssSymbols[2] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(0x13100631, 2)], 440, 304);
+
+	_ssSymbolDice[0] = insertSprite<SsScene1105SymbolDie>(0, 206, 304);
+	_ssSymbolDice[1] = insertSprite<SsScene1105SymbolDie>(1, 339, 304);
+	_ssSymbolDice[2] = insertSprite<SsScene1105SymbolDie>(2, 485, 304);
+
+	_ssSymbol1UpButton = insertSprite<SsScene1105Button>(this, 0x08002860, NRect(146, 362, 192, 403));
+	_vm->_collisionMan->addSprite(_ssSymbol1UpButton);
+	_ssSymbol1DownButton = insertSprite<SsScene1105Button>(this, 0x42012460, NRect(147, 404, 191, 442));
+	_vm->_collisionMan->addSprite(_ssSymbol1DownButton);
+	_ssSymbol2UpButton = insertSprite<SsScene1105Button>(this, 0x100030A0, NRect(308, 361, 355, 402));
+	_vm->_collisionMan->addSprite(_ssSymbol2UpButton);
+	_ssSymbol2DownButton = insertSprite<SsScene1105Button>(this, 0x840228A0, NRect(306, 406, 352, 445));
+	_vm->_collisionMan->addSprite(_ssSymbol2DownButton);
+	_ssSymbol3UpButton = insertSprite<SsScene1105Button>(this, 0x20000120, NRect(476, 358, 509, 394));
+	_vm->_collisionMan->addSprite(_ssSymbol3UpButton);
+	_ssSymbol3DownButton = insertSprite<SsScene1105Button>(this, 0x08043121, NRect(463, 401, 508, 438));
+	_vm->_collisionMan->addSprite(_ssSymbol3DownButton);
+	_ssActionButton = insertSprite<SsScene1105Button>(this, 0x8248AD35, NRect(280, 170, 354, 245));
+	_vm->_collisionMan->addSprite(_ssActionButton);
+	
+	_flag1 = true;
+	
+	_asTeddyBear->show();
+
+	// TODO: Find a nicer way
+	deleteSprite((Sprite**)&_mouseCursor);
+	insertMouse435(0x18666208, 20, 620);
+	
+}
+
+void Scene1105::upOpenPanel() {
+	Scene::update();
+	if (_backgroundIndex != 0) {
+		_backgroundIndex--;
+		if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) {
+			uint32 backgroundFileHash = kScene1105BackgroundFileHashes[_backgroundIndex / 2];
+			changeBackground(backgroundFileHash);
+			_palette->addPalette(backgroundFileHash, 0, 256, 0);
+		}
+		if (_backgroundIndex == 10) {
+			_soundResource1.play();
+		}
+		if (_backgroundIndex == 0) {
+			SetUpdateHandler(&Scene1105::update);
+			_countdown = 2;
+		}
+	}
+}
+
+void Scene1105::upClosePanel() {
+	Scene::update();
+	if (_backgroundIndex != 0) {
+		_backgroundIndex--;
+		if (_backgroundIndex == 14) {
+			showMouse(false);
+			_ssSymbols[0]->hide();
+			_ssSymbols[1]->hide();
+			_ssSymbols[2]->hide();
+			_ssSymbolDice[0]->hide();
+			_ssSymbolDice[1]->hide();
+			_ssSymbolDice[2]->hide();
+		}
+		if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) {
+			uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME
+			if (_backgroundIndex == 4) {
+				_soundResource2.play();
+				_asTeddyBear->hide();
+			}
+			changeBackground(backgroundFileHash);
+			_palette->addPalette(backgroundFileHash, 0, 256, 0);
+		}
+		if (_backgroundIndex == 0) {
+			SetUpdateHandler(&Scene1105::update);
+			_flag4 = true;
+		}
+	}
+}
+
+void Scene1105::update() {
+
+	// DEBUG: Show the correct code
+	debug("(%d, %d) (%d, %d) (%d, %d)", 
+		getSubVar(0x7500993A, 0), getSubVar(0x61084036, 0),
+		getSubVar(0x7500993A, 1), getSubVar(0x61084036, 1),
+		getSubVar(0x7500993A, 2), getSubVar(0x61084036, 2));
+
+	Scene::update();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		createObjects();
+	}
+	if (_flag4 && !_soundResource2.isPlaying()) {
+		sendMessage(_parentModule, 0x1009, _flag5);
+	}
+	if (_flag3 && !_soundResource3.isPlaying()) {
+		sendMessage(_asTeddyBear, 0x2002, 0);
+		_flag3 = false;
+	}
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h
new file mode 100644
index 0000000..8d49f8f
--- /dev/null
+++ b/engines/neverhood/module1100.h
@@ -0,0 +1,128 @@
+/* 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_MODULE1100_H
+#define NEVERHOOD_MODULE1100_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module1100
+
+class Module1100 : public Module {
+public:
+	Module1100(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1100();
+protected:
+	int _countdown;
+	void createScene(int sceneNum, int which);
+	void updateScene();
+};
+
+class SsScene1105Button : public StaticSprite {
+public:
+	SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class SsScene1105Symbol : public StaticSprite {
+public:
+	SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y);
+	void hide();
+};
+
+class SsScene1105SymbolDie : public StaticSprite {
+public:
+	SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y);
+	void hide();
+protected:
+	uint _index;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void loadSymbolSprite();
+};
+
+class AsScene1105TeddyBear : public AnimatedSprite {
+public:
+	AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene);
+	void show();
+	void hide();
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class SsScene1105OpenButton : public StaticSprite {
+public:
+	SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	int _countdown;
+	bool _flag1;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1105 : public Scene {
+public:
+	Scene1105(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	int _countdown;
+	int _backgroundIndex;
+	bool _flag1;
+	bool _flag2;
+	bool _flag3;
+	bool _flag4;
+	bool _flag5;
+	AsScene1105TeddyBear *_asTeddyBear;
+	SsScene1105Symbol *_ssSymbols[3];
+	SsScene1105SymbolDie *_ssSymbolDice[3];
+	Sprite *_ssSymbol1UpButton;
+	Sprite *_ssSymbol1DownButton;
+	Sprite *_ssSymbol2UpButton;
+	Sprite *_ssSymbol2DownButton;
+	Sprite *_ssSymbol3UpButton;
+	Sprite *_ssSymbol3DownButton;
+	Sprite *_ssActionButton;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createObjects();
+	void upOpenPanel();
+	void upClosePanel();
+	void update();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1100_H */
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 59dcbfc..c37cdac 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -217,6 +217,9 @@ void Module2200::createScene(int sceneNum, int which) {
 	_childObject->handleUpdate();
 }
 
+#define HallOfRecordsSceneLink(nextSceneNum, prevSceneNum) \
+	if (_moduleResult == 1) createScene(nextSceneNum, 0); else if (_moduleResult == 2) createScene(7, 0); else createScene(prevSceneNum, 1)
+
 void Module2200::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
@@ -274,346 +277,118 @@ void Module2200::updateScene() {
 			createScene(5, 3);
 			break;
 		case 9:
-			if (_moduleResult == 1) {
-				createScene(10, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(46, 1);
-			}
+			HallOfRecordsSceneLink(10, 46);
 			break;
 		case 10:
-			if (_moduleResult == 1) {
-				createScene(11, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(9, 1);
-			}
+			HallOfRecordsSceneLink(11, 9);
 			break;
 		case 11:
-			if (_moduleResult == 1) {
-				createScene(12, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(10, 1);
-			}
+			HallOfRecordsSceneLink(12, 10);
 			break;
 		case 12:
-			if (_moduleResult == 1) {
-				createScene(13, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(11, 1);
-			}
+			HallOfRecordsSceneLink(13, 11);
 			break;
 		case 13:
-			if (_moduleResult == 1) {
-				createScene(14, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(12, 1);
-			}
+			HallOfRecordsSceneLink(14, 12);
 			break;
 		case 14:
-			if (_moduleResult == 1) {
-				createScene(15, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(13, 1);
-			}
+			HallOfRecordsSceneLink(15, 13);
 			break;
 		case 15:
-			if (_moduleResult == 1) {
-				createScene(16, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(14, 1);
-			}
+			HallOfRecordsSceneLink(16, 14);
 			break;
 		case 16:
-			if (_moduleResult == 1) {
-				createScene(17, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(15, 1);
-			}
+			HallOfRecordsSceneLink(17, 15);
 			break;
 		case 17:
-			if (_moduleResult == 1) {
-				createScene(18, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(16, 1);
-			}
+			HallOfRecordsSceneLink(18, 16);
 			break;
 		case 18:
-			if (_moduleResult == 1) {
-				createScene(19, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(17, 1);
-			}
+			HallOfRecordsSceneLink(19, 17);
 			break;
 		case 19:
-			if (_moduleResult == 1) {
-				createScene(20, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(18, 1);
-			}
+			HallOfRecordsSceneLink(20, 18);
 			break;
 		case 20:
-			if (_moduleResult == 1) {
-				createScene(21, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(19, 1);
-			}
+			HallOfRecordsSceneLink(21, 19);
 			break;
 		case 21:
-			if (_moduleResult == 1) {
-				createScene(22, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(20, 1);
-			}
+			HallOfRecordsSceneLink(22, 20);
 			break;
 		case 22:
-			if (_moduleResult == 1) {
-				createScene(23, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(21, 1);
-			}
+			HallOfRecordsSceneLink(23, 21);
 			break;
 		case 23:
-			if (_moduleResult == 1) {
-				createScene(24, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(22, 1);
-			}
+			HallOfRecordsSceneLink(24, 22);
 			break;
 		case 24:
-			if (_moduleResult == 1) {
-				createScene(25, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(23, 1);
-			}
+			HallOfRecordsSceneLink(25, 23);
 			break;
 		case 25:
-			if (_moduleResult == 1) {
-				createScene(26, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(24, 1);
-			}
+			HallOfRecordsSceneLink(26, 24);
 			break;
 		case 26:
-			if (_moduleResult == 1) {
-				createScene(27, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(25, 1);
-			}
+			HallOfRecordsSceneLink(27, 25);
 			break;
 		case 27:
-			if (_moduleResult == 1) {
-				createScene(28, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(26, 1);
-			}
+			HallOfRecordsSceneLink(28, 26);
 			break;
 		case 28:
-			if (_moduleResult == 1) {
-				createScene(29, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(27, 1);
-			}
+			HallOfRecordsSceneLink(29, 27);
 			break;
 		case 29:
-			if (_moduleResult == 1) {
-				createScene(30, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(28, 1);
-			}
+			HallOfRecordsSceneLink(30, 28);
 			break;
 		case 30:
-			if (_moduleResult == 1) {
-				createScene(31, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(29, 1);
-			}
+			HallOfRecordsSceneLink(31, 29);
 			break;
 		case 31:
-			if (_moduleResult == 1) {
-				createScene(32, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(30, 1);
-			}
+			HallOfRecordsSceneLink(32, 30);
 			break;
 		case 32:
-			if (_moduleResult == 1) {
-				createScene(33, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(31, 1);
-			}
+			HallOfRecordsSceneLink(33, 31);
 			break;
 		case 33:
-			if (_moduleResult == 1) {
-				createScene(34, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(32, 1);
-			}
+			HallOfRecordsSceneLink(34, 32);
 			break;
 		case 34:
-			if (_moduleResult == 1) {
-				createScene(42, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(33, 1);
-			}
+			HallOfRecordsSceneLink(42, 33);
 			break;
 		case 35:
-			if (_moduleResult == 1) {
-				createScene(36, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(45, 1);
-			}
+			HallOfRecordsSceneLink(36, 45);
 			break;
 		case 36:
-			if (_moduleResult == 1) {
-				createScene(37, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(35, 1);
-			}
+			HallOfRecordsSceneLink(37, 35);
 			break;
 		case 37:
-			if (_moduleResult == 1) {
-				createScene(38, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(36, 1);
-			}
+			HallOfRecordsSceneLink(38, 36);
 			break;
 		case 38:
-			if (_moduleResult == 1) {
-				createScene(39, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(37, 1);
-			}
+			HallOfRecordsSceneLink(39, 37);
 			break;
 		case 39:
-			if (_moduleResult == 1) {
-				createScene(40, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(38, 1);
-			}
+			HallOfRecordsSceneLink(40, 38);
 			break;
 		case 40:
-			if (_moduleResult == 1) {
-				createScene(41, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(39, 1);
-			}
+			HallOfRecordsSceneLink(41, 39);
 			break;
 		case 41:
-			if (_moduleResult == 1) {
-				createScene(47, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(40, 1);
-			}
+			HallOfRecordsSceneLink(47, 40);
 			break;
 		case 42:
-			if (_moduleResult == 1) {
-				createScene(43, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(34, 1);
-			}
+			HallOfRecordsSceneLink(43, 34);
 			break;
 		case 43:
-			if (_moduleResult == 1) {
-				createScene(44, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(42, 1);
-			}
+			HallOfRecordsSceneLink(44, 42);
 			break;
 		case 44:
-			if (_moduleResult == 1) {
-				createScene(45, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(43, 1);
-			}
+			HallOfRecordsSceneLink(45, 43);
 			break;
 		case 45:
-			if (_moduleResult == 1) {
-				createScene(35, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(44, 1);
-			}
+			HallOfRecordsSceneLink(35, 44);
 			break;
 		case 46:
-			if (_moduleResult == 1) {
-				createScene(9, 0);
-			} else if (_moduleResult == 2) {
-				createScene(7, 0);
-			} else {
-				createScene(5, 1);
-			}
+			HallOfRecordsSceneLink(9, 5);
 			break;
 		case 47:
 			createScene(41, 1);
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index c24bf6a..fe78e50 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -59,7 +59,7 @@ void SmackerScene::setFileHash(uint32 fileHash) {
 	_fileHashList = _fileHash;
 }
 
-void SmackerScene::setFileHashList(uint32 *fileHashList) {
+void SmackerScene::setFileHashList(const uint32 *fileHashList) {
 	debug("SmackerScene::setFileHashList(...)");
 	_fileHashList = fileHashList;
 }
diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h
index b3c354c..0523766 100644
--- a/engines/neverhood/smackerscene.h
+++ b/engines/neverhood/smackerscene.h
@@ -34,7 +34,7 @@ public:
 	SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort);
 	virtual ~SmackerScene();
 	void setFileHash(uint32 fileHash);
-	void setFileHashList(uint32 *fileHashList);
+	void setFileHashList(const uint32 *fileHashList);
 	void nextVideo();
 protected:
 	bool _doubleSurface;
@@ -43,7 +43,7 @@ protected:
 	bool _fieldDF;
 	bool _playNextVideoFlag;
 	int _fileHashListIndex;
-	uint32 *_fileHashList;
+	const uint32 *_fileHashList;
 	uint32 _fileHash[2];
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);


Commit: 95cfa04e3bdddf15db55ea0859d77cf41e102620
    https://github.com/scummvm/scummvm/commit/95cfa04e3bdddf15db55ea0859d77cf41e102620
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1105

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index ef32a22..de90983 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -340,6 +340,13 @@ static const uint32 messageListOffsets[] = {
 };
 
 static const uint32 navigationListOffsets[] = {
+	// Module1100
+	2, 0x004B8430,
+	2, 0x004B8460,
+	4, 0x004B84F0,
+	4, 0x004B8490,
+	2, 0x004B8580,
+	2, 0x004B8550,
 	// Module1300
 	6, 0x004B2718,
 	2, 0x004B27A8,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index f902613..9d22f38 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 8a08287e7b92d9db70a2eee9a8b76302e282809b
    https://github.com/scummvm/scummvm/commit/8a08287e7b92d9db70a2eee9a8b76302e282809b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1109

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index de90983..16c00a7 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -48,6 +48,9 @@ static const uint32 rectListOffsets[] = {
 	3, 0x004B43A0,
 	// Scene1004
 	1, 0x004B7C70,
+	// Scene1109
+	1, 0x004B63A8,
+	1, 0x004B6398,
 	// Scene1201
 	1, 0x004AEE58,
 	1, 0x004AEDC8,
@@ -134,6 +137,12 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B7C08,
 	1, 0x004B7C18,
 	2, 0x004B7C20,
+	// Scene1109
+	1, 0x004B6260,
+	2, 0x004B6268,
+	4, 0x004B6318,
+	2, 0x004B6278,
+	1, 0x004B6258,
 	// Scene1201
 	1, 0x004AEC08,
 	2, 0x004AEC10,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 9d22f38..47123e8 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 47f1fe141b2205d6ce8999fa1a327310de4a1790
    https://github.com/scummvm/scummvm/commit/47f1fe141b2205d6ce8999fa1a327310de4a1790
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:40-07:00

Commit Message:
NEVERHOOD: Add Scene1109

- Also fix some bugs regarding a missing parameter to setMessageList in various scenes

Changed paths:
    engines/neverhood/background.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1100.cpp
    engines/neverhood/module1100.h
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
index 0c522db..e235eaa 100644
--- a/engines/neverhood/background.cpp
+++ b/engines/neverhood/background.cpp
@@ -62,7 +62,7 @@ void Background::load(uint32 fileHash) {
 DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority)
 	: Background(vm, objectPriority) {
 	
-	// TODO _spriteResource.load(calcHash(fileName));
+	_spriteResource.load(calcHash(fileName));
 	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_surface->drawSpriteResource(_spriteResource);
 }
@@ -85,5 +85,4 @@ void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 heig
 
 }
 
-
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c6dc006..4d1c27d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -275,7 +275,7 @@ void GameModule::startup() {
 	createModule(1000, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 4;
+	_vm->gameState().sceneNum = 8;
 	createModule(1100, -1);
 #endif
 }
@@ -353,6 +353,14 @@ void GameModule::updateModule() {
 				createModule(2300, 2);
 			}
 			break;
+		case 1100:
+			if (_moduleResult == 0) {
+				createModule(2900, 2);
+			} else {
+				setGlobalVar(0xD0A14D10, 1);
+				createModule(1300, 0);
+			}
+			break;
 		case 1300:
 			if (_moduleResult == 1) {
 				// TODO _gameState.clear();
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 4d4d9c4..4916056 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2687,6 +2687,102 @@ void KmScene1004::sub478170() {
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 }
 
+KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+	
+	// Empty
+}
+
+uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x2000:
+		_flag1 = param.asInteger() != 0;
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub421350));
+		else
+			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_x4 = param.asInteger();
+			setCallback2(AnimationCallback(&Klayman::sub41F9E0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;
+	case 0x481D:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+		break;
+	case 0x481E:
+		if (_flag)
+			setCallback2(AnimationCallback(&Klayman::sub421510));
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x4835:
+		sendMessage(_parentScene, 0x2000, 1);
+		_flag1 = true;
+		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		break;																		
+	case 0x4836:
+		sendMessage(_parentScene, 0x2000, 0);
+		_flag1 = false;
+		setCallback2(AnimationCallback(&Klayman::sub421310));
+		break;
+	case 0x483D:
+		sub461F30();
+		break;
+	case 0x483E:
+		sub461F70();
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			_soundResource1.play(0x85B10BB8);
+		} else if (param.asInteger() == 0x4E6A0CA0) {
+			_soundResource1.play(0xC5B709B0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene1109::sub461F30() {
+	_status2 = 0;
+	_flagE5 = false;
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1109::handleMessage461EA0);
+	setFileHash(0x2C2A4A1C, 0, -1);
+}
+
+void KmScene1109::sub461F70() {
+	_status2 = 0;
+	_flagE5 = false;
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene1109::handleMessage461EA0);
+	setFileHash(0x3C2E4245, 0, -1);
+}
+
 // KmScene1201
 
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a4d3557..7b3530c 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -305,6 +305,17 @@ protected:
 	void sub478170();
 };
 
+class KmScene1109 : public Klayman {
+public:
+	KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag1;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage461EA0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub461F30();
+	void sub461F70();
+};
+
 class KmScene1201 : public Klayman {
 public:
 	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464);
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 3ee3f4c..4bafbd9 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -94,7 +94,7 @@ void Module1100::createScene(int sceneNum, int which) {
 		createSmackerScene(kSmackerFileHashList07, true, true, false);
 		break;
 	case 8:
-//TODO		_childObject = new Scene1109(_vm, this, which);
+		_childObject = new Scene1109(_vm, this, which);
 		break;
 	case 1002:
 		_countdown = 40;
@@ -108,7 +108,6 @@ void Module1100::createScene(int sceneNum, int which) {
 
 void Module1100::updateScene() {
 	if (!updateChild()) {
-		debug("_vm->gameState().sceneNum = %d", _vm->gameState().sceneNum);
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			_countdown = 0;
@@ -660,4 +659,61 @@ void Scene1105::update() {
 	}
 }
 
+Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, which) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1109::handleMessage);
+	
+	setBackground(0x8449E02F);
+	setPalette(0x8449E02F);
+	insertMouse433(0x9E02B84C);
+	
+	_sprite1 = insertStaticSprite(0x600CEF01, 1100);
+
+	if (which < 0) {
+		insertKlayman<KmScene1109>(140, 436);
+		setMessageList(0x004B6260);
+		sendMessage(this, 0x2000, 0);
+	} else if (which == 1) {
+		insertKlayman<KmScene1109>(450, 436);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004B6268, false);
+		sendMessage(this, 0x2000, 1);
+	} else if (which == 2) {
+		insertKlayman<KmScene1109>(450, 436);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004B6318, false);
+		sendMessage(this, 0x2000, 1);
+	} else if (which == 3) {
+		insertKlayman<KmScene1109>(450, 436);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004B6278, false);
+		sendMessage(this, 0x2000, 1);
+	} else {
+		insertKlayman<KmScene1109>(0, 436);
+		setMessageList(0x004B6258);
+		sendMessage(this, 0x2000, 0);
+	}
+
+	_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480);
+
+}
+
+uint32 Scene1109::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (param.asInteger()) {
+			setRectList(0x004B63A8);
+			_klayman->setKlaymanTable3();
+		} else {
+			setRectList(0x004B6398);
+			_klayman->setKlaymanTable1();
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h
index 8d49f8f..c46c1df 100644
--- a/engines/neverhood/module1100.h
+++ b/engines/neverhood/module1100.h
@@ -123,6 +123,14 @@ protected:
 	void update();
 };
 
+class Scene1109 : public Scene {
+public:
+	Scene1109(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite1;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1100_H */
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 9c84950..8853dd0 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -971,7 +971,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2002:		
 		if (getGlobalVar(0x20A0C516)) {
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
-			setMessageList2(0x004AECF0);
+			setMessageList2(0x004AECF0, false);
 		} else if (getGlobalVar(0x0112090A) == 3) {
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			if (_klayman->getX() > _asTntMan->getX()) {
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 4876135..1f3716b 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1719,7 +1719,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else {
 			setRectList(0x004B5980);
 		}
-		setMessageList(0x004B57E8);
+		setMessageList(0x004B57E8, false);
 		_sprite1->setVisible(true);
 		_klayman->setVisible(true);
 		break;
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 9547d34..8140608 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -214,19 +214,19 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 1) {
 		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004B6A08);
+		setMessageList(0x004B6A08, false);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 2) {
 		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004B6AA0);
+		setMessageList(0x004B6AA0, false);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 3) {
 		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004B6A18);
+		setMessageList(0x004B6A18, false);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else {
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index b870d82..22ee648 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -114,17 +114,17 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 1) {
 		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004B3540);
+		setMessageList(0x004B3540, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
 		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004B35F0);
+		setMessageList(0x004B35F0, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
 		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004B3550);
+		setMessageList(0x004B3550, false);
 		sendMessage(this, 0x2000, 1);
 	} else {
 		insertKlayman<KmScene2001>(390, 345);
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 8d7fc78..441ee1e 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -249,14 +249,14 @@ void Scene::update() {
 		if (_mouseClicked) {
 			if (_klayman) {
 				// TODO: Merge later
-				if (_klayman->hasMessageHandler() && 
+				if (_messageListFlag &&
+					_klayman->hasMessageHandler() && 
 					sendMessage(_klayman, 0x1008, 0) != 0 &&
-					_messageListFlag &&
 					queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
 					_mouseClicked = false;
-				} else if (_klayman->hasMessageHandler() && 
-					sendMessage(_klayman, 0x1008, 0) != 0 &&
-					_messageListFlag) {
+				} else if (_messageListFlag &&
+					_klayman->hasMessageHandler() && 
+					sendMessage(_klayman, 0x1008, 0) != 0) {
 					_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
 				}
 			} else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {


Commit: 2445e6aba8e9724737a069eb4e018f8e60015aac
    https://github.com/scummvm/scummvm/commit/2445e6aba8e9724737a069eb4e018f8e60015aac
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add tables for Module1600 and Scene1608

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 16c00a7..01ddd15 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -81,6 +81,9 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B2008,
 	// Scene1404
 	1, 0x004B8D80,
+	// Scene1608
+	1, 0x004B47D0,
+	1, 0x004B4810,
 	// Scene1705
 	1, 0x004B6B40,
 	1, 0x004B6B30,
@@ -242,6 +245,14 @@ static const uint32 messageListOffsets[] = {
 	3, 0x004B8CA0,
 	2, 0x004B8CD0,
 	2, 0x004B8D18,
+	// Scene1608
+	1, 0x004B46A8,
+	1, 0x004B46B0,
+	1, 0x004B47A8,
+	3, 0x004B4748,
+	2, 0x004B4770,
+	2, 0x004B46C8,
+	2, 0x004B4760,
 	// Scene1705
 	1, 0x004B69E8,
 	2, 0x004B6A08,
@@ -362,6 +373,14 @@ static const uint32 navigationListOffsets[] = {
 	2, 0x004B27D8,
 	2, 0x004B2808,
 	2, 0x004B2838,
+	// Module1600
+	4, 0x004B39D0,
+	2, 0x004B3A30,
+	2, 0x004B3A60,
+	6, 0x004B3A90,
+	2, 0x004B3B20,
+	2, 0x004B3B50,
+	2, 0x004B3B80,
 	// Module1700
 	2, 0x004AE8B8,
 	3, 0x004AE8E8,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 47123e8..5561301 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 236ca705e8082184aae61aae5e2d561d09b7043c
    https://github.com/scummvm/scummvm/commit/236ca705e8082184aae61aae5e2d561d09b7043c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add Module1600 and Scene1608 (stuff will be renamed later)

Changed paths:
  A engines/neverhood/module1600.cpp
  A engines/neverhood/module1600.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module.mk
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 4d1c27d..854a5cc 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -29,6 +29,7 @@
 #include "neverhood/module1300.h"
 #include "neverhood/module1400.h"
 #include "neverhood/module1500.h"
+#include "neverhood/module1600.h"
 #include "neverhood/module1700.h"
 #include "neverhood/module1800.h"
 #include "neverhood/module2000.h"
@@ -275,8 +276,9 @@ void GameModule::startup() {
 	createModule(1000, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 8;
-	createModule(1100, -1);
+	_vm->gameState().sceneNum = 7;
+	_vm->gameState().which = 1;
+	createModule(1600, -1);
 #endif
 }
 
@@ -309,6 +311,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x00F10114);
 		_childObject = new Module1500(_vm, this, which, true);
 		break;
+	case 1600:
+		setGlobalVar(0x91080831, 0x01A008D8);
+		_childObject = new Module1600(_vm, this, which);
+		break;
 	case 1700:
 		setGlobalVar(0x91080831, 0x04212331);
 		_childObject = new Module1700(_vm, this, which);
@@ -379,6 +385,15 @@ void GameModule::updateModule() {
 		case 1500:
 			createModule(1000, 0);
 			break;
+		case 1600:
+			if (_moduleResult == 1) {
+				createModule(1400, 0);
+			} else if (_moduleResult == 2) {
+				createModule(1700, 0);
+			} else {
+				createModule(2100, 0);
+			}
+			break;
 		case 1700:
 			if (_moduleResult == 1) {
 				createModule(2900, 3);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 4916056..27ef84a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -282,7 +282,7 @@ void Klayman::sub421350() {
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_counter3 = 0;
 	_counterMax = 8;
-	_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+	_counter3Max = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
 void Klayman::update41D1C0() {
@@ -3719,6 +3719,93 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+}
+
+uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x2032:
+		_flag1 = param.asInteger() != 0;
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub421350));
+		else
+			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+		break;
+	case 0x481E:
+		if (_flag)
+			setCallback2(AnimationCallback(&Klayman::sub421510));
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+		} else if (param.asInteger() == 0) {
+			setCallback2(AnimationCallback(&Klayman::sub420870));
+		} else if (param.asInteger() == 4) {
+			setCallback2(AnimationCallback(&Klayman::sub420930));
+		} else if (param.asInteger() == 3) {
+			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub420830));
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x4835:
+		sendMessage(_parentScene, 0x2032, 1);
+		_flag1 = true;
+		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		break;																		
+	case 0x4836:
+		sendMessage(_parentScene, 0x2032, 0);
+		_flag1 = false;
+		setCallback2(AnimationCallback(&Klayman::sub421310));
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 // KmScene1705
 
 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 7b3530c..84cb05a 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -413,6 +413,14 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene1608 : public Klayman {
+public:
+	KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag1;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene1705 : public Klayman {
 public:
 	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 79197ed..5be9a63 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -110,4 +110,8 @@ bool Module::updateChild() {
 	return true;
 }
 
+void Module::leaveModule(uint32 result) {
+	sendMessage(_parentModule, 0x1009, result);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 2f6ce69..57a42c6 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -62,6 +62,7 @@ protected:
 	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
 	void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort);
 	bool updateChild();
+	void leaveModule(uint32 result);
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index bbbbb02..5a597fb 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -17,6 +17,7 @@ MODULE_OBJS = \
 	module1300.o \
 	module1400.o \
 	module1500.o \
+	module1600.o \
 	module1700.o \
 	module1800.o \
 	module2000.o \
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
new file mode 100644
index 0000000..a23e710
--- /dev/null
+++ b/engines/neverhood/module1600.cpp
@@ -0,0 +1,1387 @@
+/* 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/module1600.h"
+#include "neverhood/gamemodule.h"
+#include "neverhood/module1200.h"
+#include "neverhood/module2200.h"
+
+namespace Neverhood {
+
+Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else if (which == 1) {
+		createScene(4, 1);
+	} else if (which == 2) {
+		createScene(5, 0);
+	} else if (which == 3) {
+		createScene(6, 1);
+	} else if (which == 4) {
+		createScene(1, 0);
+	} else {
+		createScene(0, 0);
+	}
+
+	// TODO Sound1ChList_addSoundResources(0x1A008D8, dword_4B3BB0, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B3BB0, true, 50, 600, 5, 150);
+	// TODO Sound1ChList_sub_407C70(0x1A008D8, 0x41861371, 0x43A2507F, 0);
+
+}
+
+Module1600::~Module1600() {
+	// TODO Sound1ChList_sub_407A50(0x1A008D8);
+}
+
+void Module1600::createScene(int sceneNum, int which) {
+	debug("Module1600::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		createNavigationScene(0x004B39D0, which);
+		break;
+	case 1:
+		createNavigationScene(0x004B3A30, which);
+		break;
+	case 2:
+		createNavigationScene(0x004B3A60, which);
+		break;
+	case 3:
+		createNavigationScene(0x004B3A90, which);
+		break;
+	case 4:
+		createNavigationScene(0x004B3B20, which);
+		break;
+	case 5:
+		createNavigationScene(0x004B3B50, which);
+		break;
+	case 6:
+		createNavigationScene(0x004B3B80, which);
+		break;
+	case 7:
+		_childObject = new Scene1608(_vm, this, which);
+		break;
+	case 8:
+//TODO		_childObject = new Scene1609(_vm, this, which);
+		break;
+	case 1001:
+		if (getGlobalVar(0xA0808898) == 1) {
+			createSmackerScene(0x80050200, true, true, false);
+		} else if (getGlobalVar(0xA0808898) == 2) {
+			createSmackerScene(0x80090200, true, true, false);
+		} else {
+			createSmackerScene(0x80000200, true, true, false);
+		}
+		if (getGlobalVar(0xA0808898) >= 2)
+			setGlobalVar(0xA0808898, 0);
+		else
+			incGlobalVar(0xA0808898, +1);			
+		break;
+	}
+	SetUpdateHandler(&Module1600::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module1600::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 0)
+				createScene(2, 0);
+			else if (_moduleResult == 1)
+				createScene(1, 0);
+			else if (_moduleResult == 2)
+				leaveModule(4);
+			break;
+		case 1:
+			if (_moduleResult == 0)
+				createScene(1001, -1);
+			else if (_moduleResult == 1)
+				createScene(0, 3);
+			break;
+		case 2:
+			if (_moduleResult == 0)
+				createScene(3, 0);
+			else if (_moduleResult == 1)
+				createScene(0, 2);
+			break;
+		case 3:
+			if (_moduleResult == 0)
+				createScene(5, 0);
+			else if (_moduleResult == 2)
+				createScene(6, 0);
+			else if (_moduleResult == 3)
+				createScene(2, 1);
+			else if (_moduleResult == 4)
+				createScene(4, 0);
+			break;
+		case 4:
+			if (_moduleResult == 0)
+				leaveModule(1);
+			else if (_moduleResult == 1)
+				createScene(3, 1);
+			break;
+		case 5:
+			if (_moduleResult == 0)
+				leaveModule(2);
+			else if (_moduleResult == 1)
+				createScene(3, 3);
+			break;
+		case 6:
+			if (_moduleResult == 0)
+				createScene(8, -1);
+			else if (_moduleResult == 1)
+				createScene(3, 5);
+			break;
+		case 7:
+			createScene(6, 1);
+			break;
+		case 8:
+			if (_moduleResult == 0)
+				createScene(6, 0);
+			else
+				createScene(7, 0);
+			break;
+		case 1001:
+			createScene(1, 0);
+			break;
+		}
+	}
+}
+
+Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
+	: AnimatedSprite(vm, 1000), _parentScene(parentScene) {
+	
+	SetUpdateHandler(&Class521::update);
+	SetMessageHandler(&Class521::handleMessage);
+	SetSpriteCallback(NULL);
+
+	// TODO createSurface2(200, dword_4AF4C0);
+	createSurface(200, 640, 480); //TODO: Remove once the line above is done
+	_x = x;
+	_y = y;
+	
+	_field100 = 0;
+	_exitDirection = 0;
+	_currPointIndex = 0;
+	_againDestPtFlag = 0;
+	_stepError = 0;
+	_againDestPointFlag = 0;
+	_steps = 0;
+	_flag10E = 0;
+	_moreY = 0;
+	_flag10F = 0;
+	_flag113 = 0;
+	_flag114 = 1;
+	_flag11A = 0;
+	_newDeltaXType = -1;
+	_field11E = 0;
+	_pathPoints = NULL;
+	_rectList = NULL;
+	
+	setFileHash(0xD4220027, 0, -1);
+	setDoDeltaX(getGlobalVar(0x21E60190));
+
+}
+
+Class521::~Class521() {
+	if (_callback1Cb == AnimationCallback(&Class521::sub45D620)) {
+		setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190));
+	}
+}
+
+void Class521::setPathPoints(NPointArray *pathPoints) {
+	_pathPoints = pathPoints;
+}
+
+void Class521::update() {
+	if (_newDeltaXType >= 0) {
+		setDoDeltaX(_newDeltaXType);
+		_newDeltaXType = -1;
+	}
+	AnimatedSprite::update();
+	if (_againDestPtFlag && _moreY == 0 && !_flag10F) {
+		_againDestPtFlag = 0;
+		_againDestPointFlag = 0;
+		sendPointMessage(this, 0x2004, _againDestPt);
+	} else if (_againDestPointFlag && _moreY == 0 && !_flag10F) {
+		_againDestPointFlag = 0;
+		sendMessage(this, 0x2003, _againDestPointIndex);
+	}
+	sub45CE10();
+	sub45E0A0();
+}
+
+void Class521::update45C790() {
+	Class521::update();
+	if (++_idleCounter >= _idleCounterMax)
+		sub45D050();
+	sub45E0A0();
+}
+
+uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1019:
+		SetSpriteCallback(NULL);
+		break;
+	/* NOTE: Implemented in setPathPoints
+	case 0x2000:
+	case 0x2001:
+	*/
+	case 0x2002:
+		// Set the current position without moving
+		_currPointIndex = param.asInteger();
+		_stepError = 0;
+		_x = pathPoint(_currPointIndex).x;
+		_y = pathPoint(_currPointIndex).y;
+		break;
+	case 0x2003:
+		// Move to a point by its index
+		{
+			int newPointIndex = param.asInteger();
+			if (_moreY <= 0 && !_flag10F) {
+				_someX = pathPoint(newPointIndex).x;
+				_someY = pathPoint(newPointIndex).y;
+				if (_currPointIndex < newPointIndex) {
+					moveToNextPoint();
+				} else if (_currPointIndex == newPointIndex && _stepError == 0) {
+					if (_currPointIndex == 0) {
+						_moreY = 0;
+						sendMessage(_parentScene, 0x2005, 0);
+					} else if (_currPointIndex == (int)_pathPoints->size()) {
+						_moreY = 0;
+						sendMessage(_parentScene, 0x2006, 0);
+					}
+				} else {
+					moveToPrevPoint();
+				}
+			} else {
+				_againDestPointFlag = 1;
+				_againDestPointIndex = newPointIndex;
+			}
+		}
+		break;
+	case 0x2004:
+		// Move to the point closest to the parameter point
+		{
+			int minMatchIndex = -1;
+			int minMatchDistance, distance;
+			NPoint pt = param.asPoint();
+			if (_moreY <= 0 && !_flag10F) {
+				// Check if we're already exiting (or something)
+				if ((pt.x <= 20 && _exitDirection == 1) ||
+					(pt.x >= 620 && _exitDirection == 3) ||
+					(pt.y <= 20 && _exitDirection == 2) ||
+					(pt.y >= 460 && _exitDirection == 4))
+					break;
+				_someX = pt.x;
+				_someY = pt.y;
+				minMatchDistance = calcDistance(_someX, _someY, _x, _y) + 1;
+				for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) {
+					distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y);
+					if (distance >= minMatchDistance)
+						break;
+					minMatchDistance = distance;
+					minMatchIndex = i;
+				}
+				for (int i = _currPointIndex; i >= 0; i--) {
+					distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y);
+					if (distance >= minMatchDistance)
+						break;
+					minMatchDistance = distance;
+					minMatchIndex = i;
+				}
+				if (minMatchIndex == -1) {
+					if (_currPointIndex == 0) {
+						moveToPrevPoint();
+					} else {
+						SetSpriteCallback(NULL);
+					}
+				} else {
+					if (minMatchIndex > _currPointIndex) {
+						moveToNextPoint();
+					} else {
+						moveToPrevPoint();
+					}
+				}
+			} else {
+				_againDestPtFlag = 1;
+				_againDestPt = pt;
+			}
+		}
+		break;
+	case 0x2007:
+		_moreY = param.asInteger();
+		_steps = 0;
+		_flag10E = 0;
+		SetSpriteCallback(&Class521::suMoveToPrevPoint);
+		_lastDistance = 640;
+		break;
+	case 0x2008:
+		_moreY = param.asInteger();
+		_steps = 0;
+		_flag10E = 0;
+		SetSpriteCallback(&Class521::suMoveToNextPoint);
+		_lastDistance = 640;
+		break;
+	case 0x2009:
+		sub45CF80();
+		break;
+	case 0x200A:
+		sub45CFB0();
+		break;
+	/* NOTE: Implemented in setRectList
+	case 0x200B:
+	case 0x200C:
+	*/
+	case 0x200E:
+		sub45D180();
+		break;
+	case 0x200F:
+		sub45CD00();
+		_newDeltaXType = param.asInteger();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Class521::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_flag10F && param.asInteger() == 0x025424A2) {
+			removeCallbacks();
+		}
+		break;
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Class521::handleMessage45CCA0(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x2009:
+		sub45CF80();
+		break;
+	case 0x3002:
+		sendMessage(_parentScene, 0x200A, 0);
+		SetMessageHandler(&Class521::handleMessage);
+		break;
+	}
+	return 0;
+}
+
+void Class521::sub45CD00() {
+	bool doDeltaX = _doDeltaX;
+	SetSpriteCallback(NULL);
+	_againDestPtFlag = 0;
+	_againDestPointFlag = 0;
+	_flag10E = 0;
+	_flag10F = 0;
+	_flag113 = 0;
+	_flag114 = 0;
+	_flag11A = 0;
+	_rectList = NULL;
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetAnimationCallback3(&Class521::sub45CFE0);
+	setFileHash(0x35698F78, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update45C790);
+	setCallback1(AnimationCallback(&Class521::sub45D040));
+	setDoDeltaX(doDeltaX ? 1 : 0);
+	_currMoveDirection = 0;
+	_newMoveDirection = 0;
+	_steps = 0;
+	_idleCounter = 0;
+	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+}
+
+void Class521::sub45CDC0() {
+	if (_value112 == 1) {
+		_lastDistance = 640;
+		_flag113 = 0;
+		_flag10E = 0;
+		SetSpriteCallback(&Class521::suMoveToNextPoint);
+	} else if (_value112 == 2) {
+		_lastDistance = 640;
+		_flag113 = 0;
+		_flag10E = 0;
+		SetSpriteCallback(&Class521::suMoveToPrevPoint);
+	}
+}
+
+void Class521::sub45CE10() {
+	if (_flag10E && !_flag113 && !_flag10F) {
+		removeCallbacks();
+		_flag114 = 0;
+		_flag113 = 1;
+		setFileHash(0x192ADD30, 0, -1);
+		SetMessageHandler(&Class521::handleMessage45CC30);
+		SetUpdateHandler(&Class521::update);
+		SetAnimationCallback3(&Class521::sub45CFE0);
+	} else if (!_flag10E && _steps && _flag113) {
+		removeCallbacks();
+		_flag113 = 0;
+		setFileHash(0x9966B138, 0, -1);
+		SetMessageHandler(&Class521::handleMessage45CC30);
+		SetUpdateHandler(&Class521::update);
+		SetAnimationCallback3(&Class521::sub45D100);
+	} else {
+		bool flag = false;
+		uint index = 0;
+		if (_rectList && _rectList->size() > 0) {
+			while (index < _rectList->size()) {
+				NRect r = (*_rectList)[index];
+				if (_x >= r.x1 && _x <= r.x2 && _y >= r.y1 && _y <= r.y2)
+					break;
+			}
+			if (index < _rectList->size() && !_flag11A)
+				flag = true;
+			_flag11A = index < _rectList->size();
+		}
+		if (flag) {
+			removeCallbacks();
+			sub45D0A0();
+		} else if (_newMoveDirection != _currMoveDirection && _flag114 && !_flag10F) {
+			removeCallbacks();
+			_currMoveDirection = _newMoveDirection;
+			sub45D100();
+		}
+	}
+}
+
+void Class521::sub45CF80() {
+	setFileHash(0xA86A9538, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	SetAnimationCallback3(&Class521::sub45CFE0);
+}
+
+void Class521::sub45CFB0() {
+	setFileHash(0xA86A9538, -1, -1);
+	_playBackwards = true;
+	SetMessageHandler(&Class521::handleMessage45CCA0);
+	SetUpdateHandler(&Class521::update);
+}
+
+void Class521::sub45CFE0() {
+	setFileHash(0x35698F78, 0, -1);
+	SetMessageHandler(&Class521::handleMessage);
+	SetUpdateHandler(&Class521::update45C790);
+	setCallback1(AnimationCallback(&Class521::sub45D040));
+	_idleCounter = 0;
+	_currMoveDirection = 0;
+	_newMoveDirection = 0;
+	_steps = 0;
+	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+}
+
+void Class521::sub45D040() {
+	SetUpdateHandler(&Class521::update);
+}
+
+void Class521::sub45D050() {
+	setFileHash(0xB579A77C, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	SetAnimationCallback3(&Class521::sub45CFE0);
+	_idleCounter = 0;
+	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+}
+
+void Class521::sub45D0A0() {
+	_flag10F = 1;
+	removeCallbacks();
+	setFileHash(0x9C220DA4, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	setCallback1(AnimationCallback(&Class521::sub45D0E0));
+}
+
+void Class521::sub45D0E0() {
+	_flag10F = 0;
+	_newMoveDirection = 0;
+	sub45D100();
+}
+
+void Class521::sub45D100() {
+	_flag114 = 1;
+	if (_currMoveDirection == 1) {
+		setFileHash(0xD4AA03A4, 0, -1);
+	} else if (_currMoveDirection == 3) {
+		setFileHash(0xD00A1364, 0, -1);
+	} else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) {
+		sub45D180();
+	} else {
+		setFileHash(0xD4220027, 0, -1);
+	}
+	setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0);
+}
+
+void Class521::sub45D180() {
+	_flag10F = 1;
+	removeCallbacks();
+	setFileHash(0xF46A0324, 0, -1);
+	_value112 = 0;
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	setCallback1(AnimationCallback(&Class521::sub45D620));
+	sub45CDC0();
+}
+
+void Class521::moveToNextPoint() {
+	if (_currPointIndex >= (int)_pathPoints->size() - 1) {
+		_moreY = 0;
+		sendMessage(this, 0x1019, 0);
+		sendMessage(_parentScene, 0x2006, 0);
+	} else {
+		NPoint nextPt = pathPoint(_currPointIndex + 1);
+		NPoint currPt = pathPoint(_currPointIndex);
+		if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && nextPt.x >= currPt.x &&
+			(_currMoveDirection == 4 || _currMoveDirection == 2)) {
+			if (_currMoveDirection == 4) 
+				_currMoveDirection = 2;
+			else if (_currMoveDirection == 2)
+				_currMoveDirection = 4;
+			if (_flag113)
+				sub45D390();
+			else
+				sub45D350();
+		} else {
+			if (_steps == 0) {
+				removeCallbacks();
+				_flag113 = 0;
+				setFileHash(0x9966B138, 0, -1);
+				SetMessageHandler(&Class521::handleMessage45CC30);
+				SetUpdateHandler(&Class521::update);
+				SetAnimationCallback3(&Class521::sub45D100);
+			}
+			_flag10E = 0;
+			SetSpriteCallback(&Class521::suMoveToNextPoint);
+			_lastDistance = 640;
+		}
+	}
+}
+
+void Class521::sub45D350() {
+	removeCallbacks();
+	_flag10F = 1;
+	_flag10E = 1;
+	setFileHash(0x192ADD30, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	SetAnimationCallback3(&Class521::sub45D390);
+}
+
+void Class521::sub45D390() {
+	removeCallbacks();
+	_flag10F = 1;
+	setFileHash(0xF46A0324, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	setCallback1(AnimationCallback(&Class521::sub45D620));
+	_value112 = 1;
+	sub45CDC0();
+}
+
+void Class521::moveToPrevPoint() {
+	if (_currPointIndex == 0 && _stepError == 0) {
+		_moreY = 0;
+		sendMessage(this, 0x1019, 0);
+		sendMessage(_parentScene, 0x2005, 0);
+	} else {
+		NPoint prevPt;
+		NPoint currPt;
+		if (_stepError == 0) {
+			prevPt = pathPoint(_currPointIndex - 1);
+			currPt = pathPoint(_currPointIndex);
+		} else {
+			prevPt = pathPoint(_currPointIndex);
+			currPt = pathPoint(_currPointIndex + 1);
+		}
+		if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && currPt.x >= prevPt.x &&
+			(_currMoveDirection == 2 || _currMoveDirection == 4)) {
+			if (_currMoveDirection == 2) 
+				_currMoveDirection = 4;
+			else if (_currMoveDirection == 4)
+				_currMoveDirection = 2;
+			if (_flag113)
+				sub45D5D0();
+			else
+				sub45D580();
+		} else {
+			if (_steps == 0) {
+				removeCallbacks();
+				_flag113 = 0;
+				setFileHash(0x9966B138, 0, -1);
+				SetMessageHandler(&Class521::handleMessage45CC30);
+				SetUpdateHandler(&Class521::update);
+				SetAnimationCallback3(&Class521::sub45D100);
+			}
+			_flag10E = 0;
+			SetSpriteCallback(&Class521::suMoveToPrevPoint);
+			_lastDistance = 640;
+		}
+	}
+}
+
+void Class521::sub45D580() {
+	_flag10F = 1;
+	_flag10E = 1;
+	setCallback1(NULL);
+	setFileHash(0x192ADD30, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	SetAnimationCallback3(&Class521::sub45D5D0);
+}
+
+void Class521::sub45D5D0() {
+	_flag10F = 1;
+	setCallback1(NULL);
+	setFileHash(0xF46A0324, 0, -1);
+	SetMessageHandler(&Class521::handleMessage45CC30);
+	SetUpdateHandler(&Class521::update);
+	setCallback1(AnimationCallback(&Class521::sub45D620));
+	_value112 = 2;
+	sub45CDC0();
+}
+
+void Class521::sub45D620() {
+	_flag10F = 0;
+	_newMoveDirection = 0;
+	setDoDeltaX(2);
+	sub45D100();
+}
+
+void Class521::suMoveToNextPoint() {
+	int16 newX = _x, newY = _y;
+
+	if (_currPointIndex >= (int)_pathPoints->size()) {
+		_moreY = 0;
+		sendMessage(this, 0x1019, 0);
+		sendMessage(_parentScene, 0x2006, 0);
+		return;
+	}
+
+	if (_flag10E) {
+		if (_steps <= 0) {
+			sendMessage(this, 0x1019, 0);
+			return;
+		} else {
+			_steps--;
+		}
+	} else if (_steps < 11) {
+		_steps++;
+	}
+
+	bool firstTime = true;
+	_anotherY = _steps;
+	int stepsCtr = _steps;
+	
+	while (stepsCtr > 0) {
+		NPoint pt1;
+		NPoint pt2 = pathPoint(_currPointIndex);
+		if (_currPointIndex + 1 >= (int)_pathPoints->size())
+			pt1 = pathPoint(0);
+		else
+			pt1 = pathPoint(_currPointIndex + 1);
+		int16 deltaX = ABS(pt1.x - pt2.x);
+		int16 deltaY = ABS(pt1.y - pt2.y);
+		if (deltaX >= deltaY) {
+			_newMoveDirection = 2;
+			if (pt1.x < pt2.x)
+				_newMoveDirection = 4;
+			if (stepsCtr + _stepError >= deltaX) {
+				stepsCtr -= deltaX;
+				stepsCtr += _stepError;
+				_stepError = 0;
+				_currPointIndex++;
+				if (_currPointIndex == (int)_pathPoints->size() - 1)
+					stepsCtr = 0;
+				newX = pathPoint(_currPointIndex).x;
+				newY = pathPoint(_currPointIndex).y;
+			} else {
+				_stepError += stepsCtr;
+				if (pt1.x >= pt2.x)
+					newX += stepsCtr;
+				else
+					newX -= stepsCtr;
+				if (pt1.y >= pt2.y)
+					newY = pt2.y + (deltaY * _stepError) / deltaX;
+				else
+					newY = pt2.y - (deltaY * _stepError) / deltaX;
+				stepsCtr = 0;
+			}
+		} else {
+			_newMoveDirection = 3;
+			if (pt1.y < pt2.y)
+				_newMoveDirection = 1;
+			if (firstTime) {
+				if (pt1.y >= pt2.y) {
+					stepsCtr += 7;
+				} else {
+					stepsCtr -= 4;
+					if (stepsCtr < 0)
+						stepsCtr = 0;
+				}
+				_anotherY = stepsCtr;
+			}
+			if (stepsCtr + _stepError >= deltaY) {
+				stepsCtr -= deltaY;
+				stepsCtr += _stepError;
+				_stepError = 0;
+				_currPointIndex++;
+				if (_currPointIndex == (int)_pathPoints->size() - 1)
+					stepsCtr = 0;
+				newX = pathPoint(_currPointIndex).x;
+				newY = pathPoint(_currPointIndex).y;
+			} else {
+				_stepError += stepsCtr;
+				if (pt1.x >= pt2.x)
+					newX = pt2.x + (deltaX * _stepError) / deltaY;
+				else
+					newX = pt2.x - (deltaX * _stepError) / deltaY;
+				if (pt1.y >= pt2.y)
+					newY += stepsCtr;
+				else
+					newY -= stepsCtr;
+				stepsCtr = 0;
+			}
+		}
+		firstTime = false;		
+	}
+
+	if (_moreY != 0) {
+		_x = newX;
+		_y = newY;
+		_moreY -= _anotherY;
+		if (_moreY <= 0) {
+			_flag10E = 1;
+			_moreY = 0;
+		}
+	} else {
+		int distance = calcDistance(_someX, _someY, _x, _y);
+		_x = newX;
+		_y = newY;
+		if (newX > 20 && newX < 620 && newY > 20 && newY < 460) {
+			_exitDirection = 0;
+			_field100 = 1;
+		} else if (_field100) {
+			_someX = pathPoint(_pathPoints->size() - 1).x;
+			_someY = pathPoint(_pathPoints->size() - 1).y;
+			_field100 = 0;
+			if (_x <= 20)
+				_exitDirection = 1;
+			else if (_x >= 620)
+				_exitDirection = 3;
+			else if (_y <= 20)
+				_exitDirection = 2;
+			else if (_y >= 460)
+				_exitDirection = 4;
+			if (_exitDirection != 0 && _flag10E) {
+				_flag10E = 0;
+				_steps = 11;
+			}
+		}
+		if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) ||
+			(_exitDirection == 0 && _lastDistance + 20 < distance))
+			_flag10E = 1;
+		if (distance < _lastDistance)
+			_lastDistance = distance;
+		if (_currPointIndex == (int)_pathPoints->size() - 1) {
+			_flag10E = 1;
+			_moreY = 0;
+			sendMessage(this, 0x1019, 0);
+			sendMessage(_parentScene, 0x2006, 0);
+		}
+	}
+
+}
+
+void Class521::suMoveToPrevPoint() {
+	int16 newX = _x, newY = _y;
+
+	if (_currPointIndex == 0 && _stepError == 0) {
+		_moreY = 0;
+		sendMessage(this, 0x1019, 0);
+		sendMessage(_parentScene, 0x2005, 0);
+		return;
+	}
+
+	if (_flag10E) {
+		if (_steps <= 0) {
+			sendMessage(this, 0x1019, 0);
+			return;
+		} else {
+			_steps--;
+		}
+	} else if (_steps < 11) {
+		_steps++;
+	}
+
+	bool firstTime = true;
+	_anotherY = _steps;
+	int stepsCtr = _steps;
+	
+	while (stepsCtr > 0) {
+		if (_stepError == 0)
+			_currPointIndex--;
+		NPoint pt1;
+		NPoint pt2 = pathPoint(_currPointIndex);
+		if (_currPointIndex + 1 >= (int)_pathPoints->size())
+			pt1 = pathPoint(0);
+		else
+			pt1 = pathPoint(_currPointIndex + 1);
+		int16 deltaX = ABS(pt1.x - pt2.x);
+		int16 deltaY = ABS(pt1.y - pt2.y);
+		if (deltaX >= deltaY) {
+			_newMoveDirection = 4;
+			if (pt1.x < pt2.x)
+				_newMoveDirection = 2;
+			if (_stepError == 0)
+				_stepError = deltaX;
+			if (stepsCtr > _stepError) {
+				stepsCtr -= _stepError;
+				_stepError = 0;
+				if (_currPointIndex == 0)
+					stepsCtr = 0;
+				newX = pathPoint(_currPointIndex).x;
+				newY = pathPoint(_currPointIndex).y;
+			} else {
+				_stepError -= stepsCtr;
+				if (pt1.x >= pt2.x)
+					newX -= stepsCtr;
+				else
+					newX += stepsCtr;
+				if (pt1.y >= pt2.y)
+					newY = pt2.y + (deltaY * _stepError) / deltaX;
+				else
+					newY = pt2.y - (deltaY * _stepError) / deltaX;
+				stepsCtr = 0;
+			}
+		} else {
+			_newMoveDirection = 1;
+			if (pt1.y < pt2.y)
+				_newMoveDirection = 3;
+			if (firstTime) {
+				if (pt1.y >= pt2.y) {
+					stepsCtr -= 4;
+					if (stepsCtr < 0)
+						stepsCtr = 0;
+				} else {
+					stepsCtr += 7;
+				}
+				_anotherY = stepsCtr;
+			}
+			if (_stepError == 0)
+				_stepError = deltaY;
+			if (stepsCtr > _stepError) {
+				stepsCtr -= _stepError;
+				_stepError = 0;
+				if (_currPointIndex == 0)
+					stepsCtr = 0;
+				newX = pathPoint(_currPointIndex).x;
+				newY = pathPoint(_currPointIndex).y;
+			} else {
+				_stepError -= stepsCtr;
+				if (pt1.x >= pt2.x)
+					newX = pt2.x + (deltaX * _stepError) / deltaY;
+				else
+					newX = pt2.x - (deltaX * _stepError) / deltaY;
+				if (pt1.y >= pt2.y)
+					newY -= stepsCtr;
+				else
+					newY += stepsCtr;
+				stepsCtr = 0;
+			}
+		}
+		firstTime = false;		
+	}
+
+	if (_moreY != 0) {
+		_x = newX;
+		_y = newY;
+		_moreY -= _anotherY;
+		if (_moreY <= 0) {
+			_flag10E = 1;
+			_moreY = 0;
+		}
+	} else {
+		int distance = calcDistance(_someX, _someY, _x, _y);
+		_x = newX;
+		_y = newY;
+		if (newX > 20 && newX < 620 && newY > 20 && newY < 460) {
+			_exitDirection = 0;
+			_field100 = 1;
+		} else if (_field100) {
+			_someX = pathPoint(0).x;
+			_someY = pathPoint(0).y;
+			_field100 = 0;
+			if (_x <= 20)
+				_exitDirection = 1;
+			else if (_x >= 620)
+				_exitDirection = 3;
+			else if (_y <= 20)
+				_exitDirection = 2;
+			else if (_y >= 460)
+				_exitDirection = 4;
+			if (_exitDirection != 0 && _flag10E) {
+				_flag10E = 0;
+				_steps = 11;
+			}
+		}
+		if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) ||
+			(_exitDirection == 0 && _lastDistance + 20 < distance))
+			_flag10E = 1;
+		if (distance < _lastDistance)
+			_lastDistance = distance;
+		if (_currPointIndex == 0 && _stepError == 0) {
+			_flag10E = 1;
+			_moreY = 0;
+			sendMessage(this, 0x1019, 0);
+			sendMessage(_parentScene, 0x2005, 0);
+		}
+	}
+
+}
+
+void Class521::sub45E0A0() {
+	// TODO
+}
+
+int Class521::calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) {
+	int16 deltaX = ABS(x1 - x2);
+	int16 deltaY = ABS(y1 - y2);
+	return sqrt(deltaX * deltaX + deltaY * deltaY);
+}
+
+Class546::Class546(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _soundResource(vm),
+	_parentScene(parentScene) {
+
+	setVisible(false);
+	SetMessageHandler(&Class546::handleMessage);
+	setFileHash1();
+}
+
+uint32 Class546::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		sub44D710();
+		break; 
+	case 0x4809:
+		sub44D790();
+		break; 
+	}
+	return messageResult;
+}
+
+void Class546::sub44D710() {
+	setFileHash(0x08C80144, 0, -1);
+	setVisible(true);
+	SetAnimationCallback3(&Class546::sub44D760);
+	_soundResource.play(calcHash("fxDoorOpen23"));
+}
+
+void Class546::sub44D760() {
+	sendMessage(_parentScene, 0x2033, 0);
+	setFileHash1();
+	setVisible(false);
+}
+
+void Class546::sub44D790() {
+	setFileHash(0x08C80144, -1, -1);
+	setVisible(true);
+	SetAnimationCallback3(&Class546::sub44D7F0);
+	_soundResource.play(calcHash("fxDoorClose23"));
+}
+
+void Class546::sub44D7F0() {
+	sendMessage(_parentScene, 0x2034, 0);
+	setFileHash1();
+}
+
+Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y)
+	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
+
+	setDoDeltaX(1);
+	setFileHash(0x1209E09F, 1, -1);
+	_newHashListIndex = 1;
+}
+
+Class548::Class548(NeverhoodEngine *vm, int16 x, int16 y)
+	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
+
+	setDoDeltaX(1);
+	_newHashListIndex = 0;
+}
+
+Class518::Class518(NeverhoodEngine *vm, Class521 *class521)
+	: AnimatedSprite(vm, 1100), _class521(class521) {
+	
+	SetUpdateHandler(&Class518::update);
+	createSurface1(0x60281C10, 150);
+	setFileHash(0x60281C10, -1, -1);
+	_newHashListIndex = -2;
+}
+
+void Class518::update() {
+	_x = _class521->getX();
+	_y = _class521->getY();
+	AnimatedSprite::update();
+}
+
+Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _class521(NULL), _countdown1(0) {
+	
+	setGlobalVar(0x21E60190, 1);
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1608::handleMessage44D2A0);
+	
+	_class545 = insertSprite<Class545>(this, 1, 1100, 198, 220);
+	_vm->_collisionMan->addSprite(_class545);
+
+	if (which < 0) {
+		if (_vm->gameState().which == 1)
+			which = 1;
+		else {
+			setRectList(0x004B47D0);
+			insertKlayman<KmScene1608>(380, 438);
+			_klayman2 = _klayman;
+			_flag4 = false;
+			_class546 = insertSprite<Class546>(this);
+			_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
+			setMessageList(0x004B46A8);
+			setBackground(0x10080E01);
+			setPalette(0x10080E01);
+			_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
+			_vm->_collisionMan->addSprite(_asTape);
+			_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
+			SetUpdateHandler(&Scene1608::update44CE90);
+			insertMouse433(0x80E05108);
+			insertStaticSprite(0x4B18F868, 1200);
+		}
+	} else if (which == 0) {
+		_vm->gameState().which = 0;
+		setRectList(0x004B47D0);
+		insertKlayman<KmScene1608>(0, 438);
+		_klayman2 = _klayman;
+		_flag4 = false;
+		setMessageList(0x004B46B0);
+		setBackground(0x10080E01);
+		setPalette(0x10080E01);
+		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
+		_vm->_collisionMan->addSprite(_asTape);
+		insertMouse433(0x80E05108);
+		_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
+		_class546 = insertSprite<Class546>(this);
+		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
+		SetUpdateHandler(&Scene1608::update44CE90);
+		sendMessage(_class546, 0x4808, 0);
+		insertStaticSprite(0x4B18F868, 1200);
+	} else if (which == 2) {
+		_vm->gameState().which = 1;
+		_dataResource.load(0x003C0492);
+		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
+		setBackground(0x98001604);
+		setPalette(0x98001604);
+		_palette->addPalette("paPodRed", 65, 31, 65);
+		insertMouse433(0x01600988);
+		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
+		_class521 = createSprite<Class521>(this, 375, 227); // Create but don't add to the sprite list yet
+		_class547 = insertSprite<Class547>(375, 227);
+		_class548 = insertSprite<Class548>(375, 227);
+		_class521->setVisible(false);
+		if (getGlobalVar(0xC0418A02)) {
+			insertKlayman<KmScene1608>(373, 220);
+			_klayman->setDoDeltaX(1);
+		} else {
+			insertKlayman<KmScene1608>(283, 220);
+		}
+		_klayman2 = _klayman;
+		setMessageList(0x004B47A8);
+		SetMessageHandler(&Scene1608::handleMessage44D3C0);
+		SetUpdateHandler(&Scene1608::update44CED0);
+		// NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original
+		_class521->setPathPoints(_roomPathPoints);
+		sendMessage(_class521, 0x2002, _roomPathPoints->size() - 1);
+		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
+		_rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_rect2 = _rect1;
+		_rect2.y2 = 215;
+		_klayman->setClipRect(_rect1);
+		_class521->setClipRect(_rect1);
+		_class547->setClipRect(_rect1);
+		_class548->setClipRect(_rect1);
+		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
+		_vm->_collisionMan->addSprite(_asTape);
+		insertSprite<Class518>(_class521)->setClipRect(_rect1);
+		_flag4 = false;
+		_flag2 = false;
+		_flag1 = 0;
+		setRectList(0x004B4810);
+	} 
+
+	// NOTE: Not in the else because 'which' is set to 1 in the true branch	
+	if (which == 1) {
+		_vm->gameState().which = 1;
+		_dataResource.load(0x003C0492);
+		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
+		setBackground(0x98001604);
+		setPalette(0x98001604);
+		_palette->addPalette("paPodRed", 65, 31, 65);
+		insertMouse433(0x01600988);
+		_class521 = insertSprite<Class521>(this, 375, 227);
+		_class547 = insertSprite<Class547>(375, 227);
+		_class548 = insertSprite<Class548>(375, 227);
+		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
+		_klayman2 = createSprite<KmScene1608>(this, 439, 220); // Special Klayman handling...
+		sendMessage(_klayman2, 0x2032, 1);
+		_klayman2->setDoDeltaX(1);
+		SetMessageHandler(&Scene1608::handleMessage44D470);
+		SetUpdateHandler(&Scene1608::update44D1E0);
+		_class547->setVisible(false);
+		_class548->setVisible(false);
+		// NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original
+		_class521->setPathPoints(_roomPathPoints);
+		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_class521, 0x2008, 90);
+		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
+		_rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_rect2 = _rect1;
+		_rect2.y2 = 215;
+		_klayman2->setClipRect(_rect1);
+		_class521->setClipRect(_rect1);
+		_class547->setClipRect(_rect1);
+		_class548->setClipRect(_rect1);
+		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
+		// ... _vm->_collisionMan->addSprite(_asTape);
+		insertSprite<Class518>(_class521)->setClipRect(_rect1);
+		_flag4 = true;
+		_flag2 = true;
+		_flag1 = 0;
+	}
+	
+	_palette->addPalette("paKlayRed", 0, 64, 0);
+
+}
+
+Scene1608::~Scene1608() {
+	setGlobalVar(0xC0418A02, _klayman2->isDoDeltaX() ? 1 : 0);
+	// Weird
+	if (_flag4) {
+		delete _klayman2;
+	} else {
+		delete _class521;
+	}
+}
+
+void Scene1608::update44CE90() {
+	Scene::update();
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+		leaveScene(0);
+	}
+}
+
+void Scene1608::update44CED0() {
+	Scene::update();
+	if (_flag1 == 1) {
+		removeSurface(_klayman->getSurface());
+		removeEntity(_klayman);
+		addSprite(_class521);
+		_flag4 = true;
+		clearRectList();
+		SetUpdateHandler(&Scene1608::update44CFE0);
+		SetMessageHandler(&Scene1608::handleMessage44D510);
+		_class547->setVisible(false);
+		_class548->setVisible(false);
+		_class521->setVisible(true);
+		sendMessage(_class521, 0x2009, 0);
+		_class521->handleUpdate();
+		_klayman = NULL;
+		_flag1 = 0;
+	}
+	if (_klayman2->getX() <= 375) {
+		_klayman2->setClipRect(_rect1);
+	} else {
+		_klayman2->setClipRect(_rect2);
+	}
+}
+
+void Scene1608::update44CFE0() {
+	Scene::update();
+	if (_mouseClicked) {
+		if (_mouseClickPos.x <= 329 && _class521->getX() == 375 && _class521->getY() == 227) {
+			sendMessage(_class521, 0x200A, 0);
+			SetUpdateHandler(&Scene1608::update44D0C0);
+		} else {
+			sendPointMessage(_class521, 0x2004, _mouseClickPos);
+			SetMessageHandler(&Scene1608::handleMessage44D470);
+			SetUpdateHandler(&Scene1608::update44D1E0);
+		}
+		_mouseClicked = false;
+	}
+	if (_klayman2->getX() <= 375) {
+		_klayman2->setClipRect(_rect1);
+	} else {
+		_klayman2->setClipRect(_rect2);
+	}
+}
+
+void Scene1608::update44D0C0() {
+	Scene::update();
+	if (_flag1 == 2) {
+		_klayman = _klayman2;
+		removeSurface(_class521->getSurface());
+		removeEntity(_class521);
+		addSprite(_klayman);
+		_flag4 = false;
+		SetMessageHandler(&Scene1608::handleMessage44D3C0);
+		SetUpdateHandler(&Scene1608::update44CED0);
+		setRectList(0x004B4810);
+		_class547->setVisible(true);
+		_class548->setVisible(true);
+		_class521->setVisible(false);
+		setMessageList(0x004B4748);
+		runMessageList();
+		_klayman->handleUpdate();
+		_flag1 = 0;
+	}
+	if (_klayman2->getX() <= 375) {
+		_klayman2->setClipRect(_rect1);
+	} else {
+		_klayman2->setClipRect(_rect2);
+	}
+}
+
+void Scene1608::update44D1E0() {
+	Scene::update();
+	if (_mouseClicked) {
+		sendPointMessage(_class521, 0x2004, _mouseClickPos);
+		_mouseClicked = false;
+	}
+	if (_class521->getX() < 300) {
+		if (_flag2) {
+			_flag2 = false;
+			_class521->setClipRect(_rect1);
+			if (!_class521->isDoDeltaX())
+				sendMessage(_class521, 0x200E, 0);
+		}
+	} else if (!_flag2) {
+		_flag2 = true;
+		_class521->setClipRect(_rect3);
+	}
+}
+
+uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x20250B1A) {
+			clearRectList();
+			_klayman->setVisible(false);
+			showMouse(false);
+			_sprite1->setVisible(false);
+			sendMessage(_class546, 0x4809, 0);
+			_countdown1 = 28;
+		}
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			sendEntityMessage(_klayman2, 0x1014, _asTape);
+			setMessageList(0x004B4770);
+		} else if (sender == _class545) {
+			setMessageList(0x004B46C8);
+		}
+		break;
+	}
+	return 0;
+}
+
+uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x60842040) {
+			_flag1 = true;
+		}
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	case 0x4826:
+		if (sender == _class545) {
+			sendEntityMessage(_klayman2, 0x1014, _class545);
+			setMessageList(0x004B4760);
+		}
+		break;
+	}
+	return 0;
+}
+
+uint32 Scene1608::handleMessage44D470(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2005:
+		leaveScene(1);
+		break;
+	case 0x2006:
+		SetMessageHandler(&Scene1608::handleMessage44D510);
+		SetUpdateHandler(&Scene1608::update44CFE0);
+		sendMessage(_class521, 0x200F, 1);
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+
+uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x200A:
+		_flag1 = 2;
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+	
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
new file mode 100644
index 0000000..9af1a19
--- /dev/null
+++ b/engines/neverhood/module1600.h
@@ -0,0 +1,176 @@
+/* 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_MODULE1600_H
+#define NEVERHOOD_MODULE1600_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module1600
+
+class Module1600 : public Module {
+public:
+	Module1600(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1600();
+protected:
+	void createScene(int sceneNum, int which);
+	void updateScene();
+};
+
+class Class521 : public AnimatedSprite {
+public:
+	Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
+	~Class521();
+	void setPathPoints(NPointArray *pathPoints);
+protected:
+	Scene *_parentScene;
+	NPointArray *_pathPoints;
+	NRectArray *_rectList;
+	int _newMoveDirection;
+	int _currMoveDirection;
+	int _exitDirection;
+	int _currPointIndex;
+	NPoint _againDestPt;
+	int _againDestPtFlag;
+	int _steps;
+	int _stepError;
+	int _idleCounter;
+	int _idleCounterMax;
+	int _lastDistance;
+	int _field100;
+	int _againDestPointFlag;
+	int _flag10E;
+	int _moreY;
+	int _flag10F;
+	int _flag113;
+	int _flag114;
+	int _flag11A;
+	int _newDeltaXType;
+	int _field11E;
+	int _againDestPointIndex;
+	int _value112;
+	int _anotherY;
+	int16 _someX, _someY;
+	NPoint pathPoint(uint index) { return (*_pathPoints)[index]; }
+	void update();
+	void update45C790();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage45CC30(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage45CCA0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub45CD00();
+	void sub45CDC0();
+	void sub45CE10();
+	void sub45CF80();
+	void sub45CFB0();
+	void sub45CFE0();
+	void sub45D040();
+	void sub45D050();
+	void sub45D0A0();
+	void sub45D0E0();
+	void sub45D100();
+	void sub45D180();
+	void moveToNextPoint();
+	void sub45D350();
+	void sub45D390();
+	void moveToPrevPoint();
+	void sub45D580();
+	void sub45D5D0();
+	void sub45D620();
+	void suMoveToNextPoint();
+	void suMoveToPrevPoint();
+	void sub45E0A0();
+	int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2);
+};
+
+class Class546 : public AnimatedSprite {
+public:
+	Class546(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub44D710();
+	void sub44D760();
+	void sub44D790();
+	void sub44D7F0();
+};
+
+class Class547 : public AnimatedSprite {
+public:
+	Class547(NeverhoodEngine *vm, int16 x, int16 y);
+};
+
+class Class548 : public AnimatedSprite {
+public:
+	Class548(NeverhoodEngine *vm, int16 x, int16 y);
+};
+
+class Class518 : public AnimatedSprite {
+public:
+	Class518(NeverhoodEngine *vm, Class521 *class521);
+protected:
+	Class521 *_class521;
+	void update();
+};
+
+class Scene1608 : public Scene {
+public:
+	Scene1608(NeverhoodEngine *vm, Module *parentModule, int which);
+	~Scene1608();
+protected:
+	Class521 *_class521;
+	Sprite *_class545;
+	Sprite *_class546;
+	Sprite *_class547;
+	Sprite *_class548;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_asTape;
+	Klayman *_klayman2;
+	NRect _rect1;
+	NRect _rect2;
+	NRect _rect3;
+	int _flag1;
+	bool _flag2;
+	bool _flag3;
+	bool _flag4;
+	int _countdown1;
+	NPointArray *_roomPathPoints;
+	void update44CE90();
+	void update44CED0();
+	void update44CFE0();
+	void update44D0C0();
+	void update44D1E0();
+	uint32 handleMessage44D2A0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage44D3C0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage44D470(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage44D510(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1600_H */
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 441ee1e..9a588f2 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -274,6 +274,10 @@ void Scene::update() {
 
 }
 
+void Scene::leaveScene(uint32 result) {
+	sendMessage(_parentModule, 0x1009, result);
+}
+
 uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0: // mouse moved
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 09d34b5..e962266 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -64,6 +64,7 @@ public:
 	void changeMouseCursor(uint32 fileHash);
 	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
+	void leaveScene(uint32 result);
 	// Some crazy templated functions to make the logic code smaller/simpler (imo!)
 	// insertKlayman
 	template<class T> 
@@ -123,6 +124,35 @@ public:
 	T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
 		return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6));
 	}
+	// createSprite
+	template<class T> 
+	T* createSprite() {
+		return new T(_vm);
+	}
+	template<class T, class Arg1> 
+	T* createSprite(Arg1 arg1) {
+		return new T(_vm, arg1);
+	}
+	template<class T, class Arg1, class Arg2> 
+	T* createSprite(Arg1 arg1, Arg2 arg2) {
+		return new T(_vm, arg1, arg2);
+	}
+	template<class T, class Arg1, class Arg2, class Arg3> 
+	T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3) {
+		return new T(_vm, arg1, arg2, arg3);
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4> 
+	T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
+		return new T(_vm, arg1, arg2, arg3, arg4);
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5> 
+	T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
+		return new T(_vm, arg1, arg2, arg3, arg4, arg5);
+	}
+	template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6> 
+	T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
+		return new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6);
+	}
 protected:
 	Module *_parentModule;
 	Common::Array<Entity*> _entities;


Commit: af2820fd23d152c7fddf77872198a07df680b46d
    https://github.com/scummvm/scummvm/commit/af2820fd23d152c7fddf77872198a07df680b46d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add leaveModule and leaveScene

(instead of using sendMessage directly)

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module3000.cpp



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 14bc4a4..26b68e1 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -89,7 +89,7 @@ void Module1000::updateScene() {
 			break;
 		case 1:
 			if (_moduleResult == 1)
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			else if (_moduleResult == 2)
 				createScene(3, 0);
 			else
@@ -408,12 +408,12 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	case 0x000D:
 		if (param.asInteger() == 0x188B2105) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 			messageResult = 1;
 		}
 		break;
@@ -1439,7 +1439,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
 			setGlobalVar(0x8306F218, 1);
 			setGlobalVar(0x1B144052, 3);
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveScene(1);
 		}
 		break;
 	case 0x000D:
@@ -1447,7 +1447,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asInteger() == 0x48848178) {
 			setGlobalVar(0x8306F218, 1);
 			setGlobalVar(0x1B144052, 3);
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveScene(1);
 		}
 		messageResult = 1;
 		break;
@@ -1577,7 +1577,7 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	}
@@ -1745,7 +1745,7 @@ uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			sendMessage(_parentModule, 0x1009, 0);			
+			leaveScene(0);			
 		}
 		break;
 	}
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 4bafbd9..740e487 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -168,7 +168,7 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 6:
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveModule(1);
 			break;
 		case 7:
 			createScene(2, 2);
@@ -177,7 +177,7 @@ void Module1100::updateScene() {
 			if (_moduleResult == 0) {
 				createScene(0, 0);
 			} else if (_moduleResult == 1) {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			}
 			break;
 		case 1002:
@@ -651,7 +651,7 @@ void Scene1105::update() {
 		createObjects();
 	}
 	if (_flag4 && !_soundResource2.isPlaying()) {
-		sendMessage(_parentModule, 0x1009, _flag5);
+		leaveScene(_flag5);
 	}
 	if (_flag3 && !_soundResource3.isPlaying()) {
 		sendMessage(_asTeddyBear, 0x2002, 0);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 8853dd0..83a9b5c 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -77,10 +77,10 @@ void Module1200::updateScene() {
 				if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
 					createScene(2, -1);
 				} else {
-					sendMessage(_parentModule, 0x1009, 1);
+					leaveModule(1);
 				}
 			} else {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			}
 			break;
 		case 1:
@@ -1157,9 +1157,8 @@ Scene1202::~Scene1202() {
 void Scene1202::update() {
 	Scene::update();
 	if (_soundFlag) {
-		if (!_soundResource4.isPlaying()) {
-			sendMessage(_parentModule, 0x1009, 0);
-		}
+		if (!_soundResource4.isPlaying())
+			leaveScene(0);
 	} else if (_counter == 0 && isSolved()) {
 		SetMessageHandler(&Scene1202::handleMessage453D90);
 		setGlobalVar(0x000CF819, 1);
@@ -1191,7 +1190,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam &param,
 	case 0x0001:
 		// TODO: Debug/Cheat stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	case 0x000D:
@@ -1215,7 +1214,7 @@ uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	}
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 1f3716b..75a185b 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -214,7 +214,7 @@ void Module1300::updateScene() {
 			} else if (_moduleResult == 3) {
 				createScene(2, 0);
 			} else if (_moduleResult == 0) {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			} else if (_moduleResult == 1) {
 				createScene(10, -1);
 			}
@@ -522,7 +522,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2002:
 		if (_klayman->getX() > 545) {
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveScene(1);
 		}
 		break;
 	case 0x2032:
@@ -1036,7 +1036,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 		SetMessageHandler(&Scene1306::handleMessage);
 		break;
 	case 0x4809:
-		sendMessage(_parentModule, 0x1009, 1);
+		leaveScene(1);
 		break;
 	case 0x482A:
 		setSurfacePriority(_asElevator->getSurface(), 1100);
@@ -1328,7 +1328,7 @@ void Scene1307::update() {
 		_palette->startFadeToWhite(40);
 	}
 	if (_doLeaveScene && !_soundResource.isPlaying()) {
-		sendMessage(_parentModule, 0x1009, 1);
+		leaveScene(1);
 		setGlobalVar(0x80455A41, 1);
 	} 
 }
@@ -1368,7 +1368,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 					}
 				}
 			} else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveScene(0);
 			}
 		}
 		break;
@@ -1724,7 +1724,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		_klayman->setVisible(true);
 		break;
 	case 0x2001:
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 		break;
 	case 0x2003:
 		_class601_1->setVisible(false);
@@ -1868,7 +1868,7 @@ uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam &param, Ent
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 		break;
 	}
 	return messageResult;
@@ -1878,7 +1878,7 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index b135458..0045064 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -94,7 +94,7 @@ void Module1400::updateScene() {
 			} else if (_moduleResult == 2) {
 				createScene(3, 0);
 			} else {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			}
 			break;
 		case 1:
@@ -755,9 +755,9 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x1019:
 		if (param.asInteger() != 0) {
-			sendMessage(_parentModule, 0x1009, 2);
+			leaveScene(2);
 		} else {
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveScene(1);
 		}			
 		break;
 	case 0x480B:
@@ -968,7 +968,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x00F43389) {
 			if (getGlobalVar(0x70A1189C)) {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveScene(0);
 			} else {
 				clearRectList();
 				_klayman->setVisible(false);
@@ -980,9 +980,9 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x1019:
 		if (param.asInteger()) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		} else {
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveScene(1);
 		}
 		break;
 	case 0x2000:
@@ -992,7 +992,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2001:
 		sub428230();
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 		break;
 	case 0x2003:
 		sub428230();
@@ -1277,7 +1277,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene1407::update() {
 	Scene::update();
 	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) {
-		sendMessage(_parentModule, 0x1009, 1);
+		leaveScene(1);
 	} else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) {
 		_ssResetButton->setVisible(false);
 	}
@@ -1291,7 +1291,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 			// TODO: Debug/Cheat stuff
 			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 				// Exit scene
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveScene(0);
 			} else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 &&
 				param.asPoint().y >= 62 && param.asPoint().y <= 90) {
 				// The reset button was clicked
@@ -1391,7 +1391,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x1019:
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 		break;
 	case 0x1022:
 		if (sender == _class489) {
@@ -1515,7 +1515,7 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x1019:
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 		break;
 	case 0x4826:
 		if (sender == _class489) {
@@ -1708,7 +1708,7 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x0001:
 		// TODO: Debug/Cheat stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	case 0x000D:
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 54a4685..76afb95 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -67,14 +67,14 @@ void Module1500::updateScene() {
 			if (_flag) {
 				createScene(2, -1);
 			} else {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			}
 			break;
 		case 3:
 			createScene(0, -1);
 			break;
 		default:
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveModule(0);
 			break;
 		}
 	}
@@ -119,7 +119,7 @@ void Scene1501::update() {
 		_countdown1--;
 		if (_countdown1 == 0) {
 			_vm->_screen->clear();
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) {
 		_countdown1 = 12;
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 8140608..4426a7e 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -107,7 +107,7 @@ void Module1700::updateScene() {
 			createScene(4, 0);
 			break;
 		case 4:
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveModule(1);
 			break;
 		}
 	}
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index d5aa789..cce72b0 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -134,7 +134,7 @@ void Module1800::updateScene() {
 			break;
 		case 5:
 			if (_moduleResult == 0) {
-				sendMessage(_parentModule, 0x1009, 2);
+				leaveModule(2);
 			} else if (_moduleResult == 1) {
 				createScene(4, 3);
 			}
@@ -143,14 +143,14 @@ void Module1800::updateScene() {
 			createScene(8, -1);
 			break;
 		case 7:
-			sendMessage(_parentModule, 0x1009, 3);
+			leaveModule(3);
 			break;
 		case 8:
-			sendMessage(_parentModule, 0x1009, 1);
+			leaveModule(1);
 			// TODO GameState stuff
 			break;
 		case 9:
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveModule(0);
 			break;
 		}
 	} else {
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 22ee648..9c0843c 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -68,7 +68,7 @@ void Module2000::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			if (_moduleResult == 1) {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			} else {
 				createScene(1, 0);
 			}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index c37cdac..3751a6f 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -229,7 +229,7 @@ void Module2200::updateScene() {
 			} else if (_moduleResult == 2) {
 				createScene(1, 0);
 			} else {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			}
 			break;
 		case 1:
@@ -929,7 +929,7 @@ void Scene2202::update() {
 	Scene::update();
 
 	if (_leaveScene && !_soundResource2.isPlaying()) {
-		sendMessage(_parentModule, 0x1009, 0);
+		leaveScene(0);
 	}
 
 	if (_isSolved && !_soundResource1.isPlaying()) {
@@ -966,7 +966,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x0001:
 		// TODO Debug stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	case 0x000D:
@@ -2356,7 +2356,7 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 40 || param.asPoint().x >= 600) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	}
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index dd4144f..1513f7b 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -107,7 +107,7 @@ void Module2300::updateScene() {
 			if (_moduleResult == 1) {
 				createScene(1, 4);
 			} else {
-				sendMessage(_parentModule, 0x1009, 0);
+				leaveModule(0);
 			}
 			break;
 		case 1:
@@ -120,21 +120,21 @@ void Module2300::updateScene() {
 			} else if (_moduleResult == 4) {
 				createScene(3, 1);
 			} else if (_moduleResult == 5) {
-				sendMessage(_parentModule, 0x1009, 3);
+				leaveModule(3);
 			} else {
-				sendMessage(_parentModule, 0x1009, 4);
+				leaveModule(4);
 			}
 			break;
 		case 2:
 			if (_moduleResult == 1) {
-				sendMessage(_parentModule, 0x1009, 3);
+				leaveModule(3);
 			} else {
 				createScene(1, 5);
 			}
 			break;
 		case 3:
 			if (_moduleResult == 1) {
-				sendMessage(_parentModule, 0x1009, 2);
+				leaveModule(2);
 			} else {
 				createScene(1, 1);
 			}
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index e7714c0..f645fb4 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -169,7 +169,7 @@ void Module3000::updateScene() {
 				if (_moduleResult == 0)
 					createScene(9, -1);
 				else if (_moduleResult == 1)
-					sendMessage(_parentModule, 0x1009, 0);
+					leaveModule(0);
 			} else {
 				if (_moduleResult == 0)
 					if (_navigationAreaType == 2)
@@ -177,7 +177,7 @@ void Module3000::updateScene() {
 					else
 						createScene(1001, -1);
 				else if (_moduleResult == 1)
-					sendMessage(_parentModule, 0x1009, 0);
+					leaveModule(0);
 			}
 			break;
 		case 2:
@@ -205,7 +205,7 @@ void Module3000::updateScene() {
 			break;
 		case 4:
 			if (_moduleResult == 0)
-				sendMessage(_parentModule, 0x1009, 1);
+				leaveModule(1);
 			else if (_moduleResult == 1)
 				createScene(7, -1);
 			else if (_moduleResult == 2)
@@ -248,7 +248,7 @@ void Module3000::updateScene() {
 			createScene(3, 3);
 			break;
 		case 11:
-			sendMessage(_parentModule, 0x1009, 3);
+			leaveModule(3);
 			break;
 		case 12:
 			createScene(1, 0);
@@ -931,7 +931,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 		// TODO: Debug stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) {
 			setGlobalVar(0x20580A86, 0);
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	case 0x000D:
@@ -1014,7 +1014,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 void Scene3009::playExtVideo() {
 	setGlobalVar(0x20580A86, _cannonLocation);
 	setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]);
-	sendMessage(_parentModule, 0x1009, 1);
+	leaveScene(1);
 }
 
 bool Scene3009::isSymbolsPart1Solved() {
@@ -1332,7 +1332,7 @@ void Scene3010::update() {
 		_checkUnlocked = false;
 	}
 	if (_countdown != 0 && (--_countdown == 0)) {
-		sendMessage(_parentModule, 0x1009, _doorUnlocked ? 1 : 0);
+		leaveScene(_doorUnlocked ? 1 : 0);
 	}
 }
 
@@ -1608,7 +1608,7 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			sendMessage(_parentModule, 0x1009, 0);
+			leaveScene(0);
 		}
 		break;
 	case 0x2000:


Commit: 2275141d56a66b8a6262fb2c160cce34c46af119
    https://github.com/scummvm/scummvm/commit/2275141d56a66b8a6262fb2c160cce34c46af119
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add Scene1609

- Use Scene::insertSprite<> in all scenes

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module1700.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 854a5cc..960e732 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -276,7 +276,7 @@ void GameModule::startup() {
 	createModule(1000, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 7;
+	_vm->gameState().sceneNum = 8;
 	_vm->gameState().which = 1;
 	createModule(1600, -1);
 #endif
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 83a9b5c..ffb4f20 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -766,7 +766,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse433(0x9A2C0409);
 	
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 3, 1100, 243, 340, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 	
 	tempSprite = insertStaticSprite(0x03C82530, 100);
@@ -781,7 +781,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x04063110, 500);
 	topY4 = tempSprite->getY() + 1; 
 
-	_class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1));
+	_class466 = insertSprite<Class466>(getGlobalVar(0x000CF819) && which != 1);
 	_class466->setClipRect(0, topY4, 640, 480);
 	
 	insertStaticSprite(0x400B04B0, 1200);
@@ -792,7 +792,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0xA29223FA, 1200);
 	x2 = tempSprite->getX() + tempSprite->getDrawRect().width;
 
-	class464 = addSprite(new Class464(_vm));
+	class464 = insertSprite<Class464>();
 
 	debug("Scene1201: which = %d", which);
 
@@ -833,20 +833,18 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else {
 		setBackground(0x40206EC5);
 		setPalette(0x40206EC5);
-		_asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2));
+		_asRightDoor = insertSprite<AsScene1201RightDoor>(_klayman, which == 2);
 	}
 
 	if (getGlobalVar(0x000CF819)) {
 		insertStaticSprite(0x10002ED8, 500);
 		if (!getGlobalVar(0x0A18CA33)) {
-			AsScene1201TntMan *asTntMan;
-			asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1);
-			asTntMan->setClipRect(x1, 0, x2, 480);
-			_vm->_collisionMan->addSprite(asTntMan);
-			_asTntMan = addSprite(asTntMan);
-			tempSprite = addSprite(new Class465(_vm, _asTntMan));
+			_asTntMan = insertSprite<AsScene1201TntMan>(this, _class466, which == 1);
+			_asTntMan->setClipRect(x1, 0, x2, 480);
+			_asTntMan->setRepl(64, 0);
+			_vm->_collisionMan->addSprite(_asTntMan);
+			tempSprite = insertSprite<Class465>(_asTntMan);
 			tempSprite->setClipRect(x1, 0, x2, 480);
-			asTntMan->setRepl(64, 0);
 		}
 		
 		uint32 tntIndex = 1; 
@@ -859,7 +857,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 				clipY2 = topY2;
 			else
 				clipY2 = topY3;
-			addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2));
+			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2);
 			elemIndex = getSubVar(0x10055D14, tntIndex + 1);
 			if (kScene1201PointArray[elemIndex].y < 175)
 				clipY2 = topY1;
@@ -867,7 +865,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 				clipY2 = topY2;
 			else
 				clipY2 = topY3;
-			addSprite(new SsScene1201Tnt(_vm, tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2));
+			insertSprite<SsScene1201Tnt>(tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2);
 			tntIndex += 3;
 		}
 
@@ -895,7 +893,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 				else
 					clipY2 = topY3;
 			}
-			addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2));
+			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2);
 			tntIndex++;
 		}
 
@@ -909,7 +907,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	tempSprite = insertStaticSprite(0x63D400BC, 900);
 
-	_asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman));
+	_asLeftDoor = insertSprite<AsScene1201LeftDoor>(_klayman);
 	_asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480);
 
 	if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) {
@@ -919,12 +917,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asMatch = NULL;
 
 	if (getGlobalVar(0x0112090A) < 3) {
-		_asMatch = addSprite(new AsScene1201Match(_vm, this));
+		_asMatch = insertSprite<AsScene1201Match>(this);
 		_vm->_collisionMan->addSprite(_asMatch);
 	}
 
 	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
-		_asCreature = addSprite(new AsScene1201Creature(_vm, this, _klayman));
+		_asCreature = insertSprite<AsScene1201Creature>(this, _klayman);
 		_asCreature->setClipRect(x1, 0, x2, 480);
 	}
 
@@ -1131,7 +1129,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse435(0x10ED160A, 20, 620);
 
 	for (int i = 0; i < 18; i++) {
-		_asTntItems[i] = addSprite(new AsScene1202TntItem(_vm, this, i));
+		_asTntItems[i] = insertSprite<AsScene1202TntItem>(this, i);
 		_vm->_collisionMan->addSprite(_asTntItems[i]);
 	}
 
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index a34bd95..dc8e903 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -179,7 +179,7 @@ protected:
 	// TODO ResourceTable _resourceTable1;
 	// TODO ResourceTable _resourceTable2;
 	Sprite *_asMatch;
-	Sprite *_asTntMan;
+	AsScene1201TntMan *_asTntMan;
 	Sprite *_asCreature;
 	Sprite *_class466;
 	Sprite *_asLeftDoor;
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 75a185b..26b61f0 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -424,20 +424,20 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x420643C4);
 	insertMouse433(0x643C0428);
 
-	_class595 = addSprite(new Class595(_vm, this));
+	_class595 = insertSprite<Class595>(this);
 	_sprite1 = insertStaticSprite(0x942FC224, 300);
 	_sprite2 = insertStaticSprite(0x70430830, 1200);
 	_sprite2->setVisible(false);
 	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
 
-	_asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getDrawRect().y, false));
-	_asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309)));
-	_asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false));
-	_asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E)));
-	_asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false));
+	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 218, 122, _class595->getDrawRect().y, false);
+	_asRing2 = insertSprite<AsScene1002Ring>(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309));
+	_asRing3 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false);
+	_asRing4 = insertSprite<AsScene1002Ring>(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E));
+	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false);
 
-	_asBridge = addSprite(new AsScene1302Bridge(_vm, this));
-	_ssFence = addSprite(new SsScene1302Fence(_vm));
+	_asBridge = insertSprite<AsScene1302Bridge>(this);
+	_ssFence = insertSprite<SsScene1302Fence>();
 	_ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2());
 
 	if (which < 0) {
@@ -450,7 +450,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480);
 
-	_asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true));
+	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, true);
 	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
@@ -643,7 +643,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x81A9801D);
 
 	if (!getGlobalVar(0xAC00C0D0)) {
-		_asBalloon = addSprite(new AsScene1303Balloon(_vm, this));
+		_asBalloon = insertSprite<AsScene1303Balloon>(this);
 		_vm->_collisionMan->addSprite(_asBalloon);
 	}
 	
@@ -711,15 +711,15 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0xC021006A);
 	
 	if (getGlobalVar(0xAC00C0D0)) {
-		_class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347));
+		_class545 = insertSprite<Class545>(this, 0, 1100, 278, 347);
 		_vm->_collisionMan->addSprite(_class545);
 	} else {
-		_class545 = addSprite(new AnimatedSprite(_vm, 0x80106018, 100, 279, 48));
+		_class545 = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
 		// TODO _class545->setUpdateDeltaXY();
 	}
 
 	if (!getGlobalVar(0x31C63C51)) {
-		_class544 = addSprite(new Class544(_vm, this, 1100, 278, 347));
+		_class544 = insertSprite<Class544>(this, 1100, 278, 347);
 		_vm->_collisionMan->addSprite(_class544);
 	} else {
 		_class544 = NULL;
@@ -893,20 +893,19 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x0311005B);
 
 	if (!getGlobalVar(0x13382860)) {
-		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 435, 445));
+		_class545 = insertSprite<Class545>(this, 2, 1100, 435, 445);
 		_vm->_collisionMan->addSprite(_class545);
 	}
 
-	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x404A36A0, 100, 0x440C1000));
+	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x404A36A0, 100, 0x440C1000);
 	
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 19, 1100, 359, 445, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 19, 1100, 359, 445, 0x9148A011);
 
-	_asElevatorDoor = new AnimatedSprite(_vm, 0x043B0270, 90, 320, 240);
+	_asElevatorDoor = insertSprite<AnimatedSprite>(0x043B0270, 90, 320, 240);
 	_asElevatorDoor->setFileHash(0x043B0270, 6, -1);
 	_asElevatorDoor->setNewHashListIndex(6);
-	addSprite(_asElevatorDoor);
 
-	_asElevator = addSprite(new AsScene1306Elevator(_vm, this, _asElevatorDoor));
+	_asElevator = insertSprite<AsScene1306Elevator>(this, _asElevatorDoor);
 	
 	_sprite1 = insertStaticSprite(0x036A1EE0, 80);
 	
@@ -1309,7 +1308,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 		if (getSubVar(0x08D0AB11, keyIndex)) {
-			_asKeys[keyIndex] = addSprite(new AsScene1307Key(_vm, this, keyIndex, _clipRects));
+			_asKeys[keyIndex] = insertSprite<AsScene1307Key>(this, keyIndex, _clipRects);
 			_vm->_collisionMan->addSprite(_asKeys[keyIndex]);
 		} else {
 			_asKeys[keyIndex] = NULL;
@@ -1600,21 +1599,21 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x41024202);
 	insertMouse433(0x24206418);
 
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 17, 1100, 502, 445, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 
 	if (getGlobalVar(0x01023818)) {
-		addSprite(new Class513(_vm));
-		addSprite(new AnimatedSprite(_vm, 0x461A1490, 200, 235, 429));
+		insertSprite<Class513>();
+		insertSprite<AnimatedSprite>(0x461A1490, 200, 235, 429);
 	}
 	
 	_sprite1 = insertStaticSprite(0x0A042060, 1100);
-	_class549 = addSprite(new Class549(_vm, this));
-	_class593 = addSprite(new Class593(_vm, this));
+	_class549 = insertSprite<Class549>(this);
+	_class593 = insertSprite<Class593>(this);
 
-	_class601_1 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0));
-	_class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1));
-	_class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2));
+	_class601_1 = insertSprite<Class601>(kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0);
+	_class601_2 = insertSprite<Class601>(kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1);
+	_class601_2 = insertSprite<Class601>(kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2);
 
 	_sprite2 = insertStaticSprite(0x40043120, 995);
 	_sprite3 = insertStaticSprite(0x43003100, 995);
@@ -1644,7 +1643,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1308>(475, 440);
 		setMessageList(0x004B58B0);
 		if (getGlobalVar(0x80455A41)) {
-			_sprite5 = addSprite(new Class592(_vm, this));
+			_sprite5 = insertSprite<Class592>(this);
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			_sprite4->setVisible(false);
 		} else {
@@ -1672,8 +1671,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x04A105B3) == 4) {
-		_class489 = new Class489(_vm, this, _klayman, 0);
-		addSprite(_class489);
+		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_class489);
 		_class489->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
 		_class489->setRepl(64, 0);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 0045064..37fb354 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -667,17 +667,17 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x08221FA5);
 	insertMouse433(0x21FA108A);
 	
-	// TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0));
-	_class525 = addSprite(new Class525(_vm));
+	// TODO _class427 = insertSprite<Class427>(this, 0x980F3124, 0x12192892, 100, 0);
+	_class525 = insertSprite<Class525>();
 
 	if (!getGlobalVar(0x01023818)) {
-		_class526 = addSprite(new Class526(_vm, _class525));
-		_class527 = addSprite(new Class527(_vm, _class525));
+		_class526 = insertSprite<Class526>(_class525);
+		_class527 = insertSprite<Class527>(_class525);
 	}
 
 	_sprite3 = insertStaticSprite(0xA82BA811, 1100);
 	insertStaticSprite(0x0A116C60, 1100);
-	_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0));
+	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0xB84B1100, 100, 0);
 	_sprite1 = insertStaticSprite(0x38EA100C, 1005);
 	_sprite2 = insertStaticSprite(0x98D0223C, 1200);
 	_sprite2->setVisible(false);
@@ -701,7 +701,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x04A105B3) == 2) {
-		_class489 = addSprite(new Class489(_vm, this, _klayman, _class525));
+		_class489 = insertSprite<Class489>(this, _klayman, _class525);
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x04A10F33) == 6) {
 			sendEntityMessage(_klayman, 0x1014, _class489);
@@ -719,11 +719,11 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480);
 
-	if (which == 0 && _class489 && _class489->hasMessageHandler()) {
+	if (which == 0 && _class489) {
 		sendMessage(_class489, 0x482B, 0);
 	}
 
-	_class528 = addSprite(new Class528(_vm, _klayman, which == 1));
+	_class528 = insertSprite<Class528>(_klayman, which == 1);
 
 }
 
@@ -746,7 +746,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x402064D8) {
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x01C66840) {
-			if (_class528->hasMessageHandler() && sendMessage(_class528, 0x2001, 0) != 0) {
+			if (sendMessage(_class528, 0x2001, 0) != 0) {
 				setMessageList(0x004B6690);
 			} else {
 				setMessageList(0x004B66B0);
@@ -882,9 +882,9 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
 	insertMouse433(0x482F4239);
 
-	_class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100));
-	_class454_2 = addSprite(new Class454(_vm, 0x10A02120, 1100));
-	_class454_3 = addSprite(new Class454(_vm, 0x60882BE0, 1100));
+	_class454_1 = insertSprite<Class454>(0x15402D64, 1100);
+	_class454_2 = insertSprite<Class454>(0x10A02120, 1100);
+	_class454_3 = insertSprite<Class454>(0x60882BE0, 1100);
 
 	if (getGlobalVar(0x70A1189C))
 		setRectList(0x004B0C48);
@@ -895,7 +895,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B48);
 		if (!getGlobalVar(0x70A1189C)) {
-			_class482 = addSprite(new Class482(_vm, this, 0));
+			_class482 = insertSprite<Class482>(this, 0);
 		}
 	} else if (which == 1) {
 		insertKlayman<KmScene1402>(42, 391);
@@ -905,18 +905,18 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B0B60);
 		_klayman->setDoDeltaX(1);
 		if (getGlobalVar(0x70A1189C)) {
-			_class482 = addSprite(new Class482(_vm, this, 1));
+			_class482 = insertSprite<Class482>(this, 1);
 			clearRectList();
 			showMouse(false);
 			sub428220();
 		} else {
-			_class482 = addSprite(new Class482(_vm, this, 0));
+			_class482 = insertSprite<Class482>(this, 0);
 		}
 	} else {
 		insertKlayman<KmScene1402>(513, 391);
 		setMessageList(0x004B0B58);
 		if (!getGlobalVar(0x70A1189C)) {
-			_class482 = addSprite(new Class482(_vm, this, 2));
+			_class482 = insertSprite<Class482>(this, 2);
 			sub428220();
 		}
 	}
@@ -926,7 +926,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x4A105B3) == 1) {
-		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
+		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x4A10F33) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _class489);
@@ -1268,7 +1268,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x00442225);
 	insertMouse435(0x4222100C, 20, 620);
 
-	_asMouse = addSprite(new AsScene1407Mouse(_vm, this));
+	_asMouse = insertSprite<AsScene1407Mouse>(this);
 	_ssResetButton = insertStaticSprite(0x12006600, 100);
 	_ssResetButton->setVisible(false); 
 
@@ -1340,13 +1340,11 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_class401_3 = insertStaticSprite(0x08742271, 995);
 
-	_asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011);
-	addSprite(_asTape1);
+	_asTape1 = insertSprite<AsScene1201Tape>(this, 12, 1100, 201, 468, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape1);
 	_asTape1->setRepl(64, 0);
 
-	_asTape2 = new AsScene1201Tape(_vm, this, 16, 1100, 498, 468, 0x9048A093);
-	addSprite(_asTape2);
+	_asTape2 = insertSprite<AsScene1201Tape>(this, 16, 1100, 498, 468, 0x9048A093);
 	_vm->_collisionMan->addSprite(_asTape2);
 	_asTape2->setRepl(64, 0);
 
@@ -1360,10 +1358,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setRepl(64, 0);
 
 	if (getGlobalVar(0x04A105B3) == 4) {
-		Class489 *class489;
-		class489 = new Class489(_vm, this, _klayman, 0);
-		_class489 = class489;
-		addSprite(_class489);
+		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x04A10F33) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _class489);
@@ -1372,7 +1367,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004B1F70);
 		}
 		_class489->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2());
-		class489->setRepl(64, 0);
+		_class489->setRepl(64, 0);
 	}
 
 }
@@ -1454,13 +1449,13 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0xB006BAC8);
 
 	if (getGlobalVar(0x13382860) == 5) {
-		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411));
+		_class545 = insertSprite<Class545>(this, 2, 1100, 267, 411);
 		_vm->_collisionMan->addSprite(_class545);
 	}
 
 	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
 
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 14, 1100, 281, 411, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 14, 1100, 281, 411, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 
 	if (which < 0) {
@@ -1483,7 +1478,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x04A105B3) == 3) {
-		_class489 = addSprite(new Class489(_vm, this, _klayman, 0));
+		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_class489);
 		if (getGlobalVar(0x04A10F33) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _class489);
@@ -1673,8 +1668,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	for (uint32 index = 0; index < 48; index++) {
-		_tiles[index] = new AsScene1405Tile(_vm, this, index);
-		addSprite(_tiles[index]);
+		_tiles[index] = insertSprite<AsScene1405Tile>(this, index);
 		_vm->_collisionMan->addSprite(_tiles[index]);
 		if (getSubVar(0xCCE0280F, index))
 			_tilesLeft--;
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 7b4d957..d256b82 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -143,7 +143,7 @@ public:
 protected:
 	bool _flag;
 	Sprite *_class427;
-	Sprite *_class489;
+	Class489 *_class489;
 	Sprite *_class525;
 	Sprite *_class526;
 	Sprite *_class527;
@@ -184,7 +184,7 @@ protected:
 	Sprite *_class454_2;
 	Sprite *_class454_3;
 	Sprite *_class482;
-	Sprite *_class489;
+	Class489 *_class489;
 	bool _flag;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -237,7 +237,7 @@ protected:
 	Sprite *_class401_3;
 	AsScene1201Tape *_asTape1;
 	AsScene1201Tape *_asTape2;
-	Sprite *_class489;
+	Class489 *_class489;
 	bool _flag;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -251,7 +251,7 @@ public:
 protected:
 	Sprite *_sprite1;
 	Sprite *_asTape;
-	Sprite *_class489;
+	Class489 *_class489;
 	Sprite *_class545;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index a23e710..94b836a 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -83,7 +83,7 @@ void Module1600::createScene(int sceneNum, int which) {
 		_childObject = new Scene1608(_vm, this, which);
 		break;
 	case 8:
-//TODO		_childObject = new Scene1609(_vm, this, which);
+		_childObject = new Scene1609(_vm, this, which);
 		break;
 	case 1001:
 		if (getGlobalVar(0xA0808898) == 1) {
@@ -1384,4 +1384,109 @@ uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam &param,
 	return 0;
 }
 	
+Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _soundResource(vm), _countdown1(1),
+	_index1(0), _index3(0), _flag5(true), _flag6(false) {
+
+	// TODO _vm->gameModule()->initScene3011Vars();
+	_index2 = getGlobalVar(0x2414C2F2);
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene1609::handleMessage);
+	SetUpdateHandler(&Scene1609::update);
+	
+	setBackground(0x92124A14);
+	setPalette(0x92124A14);
+	
+	for (int i = 0; i < 12; i++)
+		_asSymbols[i] = insertSprite<AsScene3011Symbol>(i, false);
+	
+	_ssButton = insertSprite<SsScene3011Button>(this, true);
+	_vm->_collisionMan->addSprite(_ssButton);
+
+	insertMouse435(0x24A10929, 20, 620);
+
+	_soundResource.load(0x68E25540);
+
+}
+
+void Scene1609::update() {
+	if (!_flag6 && _countdown1 != 0 && (--_countdown1 == 0)) {
+		if (_flag5) {
+			_index1++;
+			if (_index1 >= 12)
+				_index1 = 0;
+			_asSymbols[_index3]->change(_index1 + 12, _index1 == (int)getSubVar(0x04909A50, _index2));
+			_flag5 = false;
+			_countdown1 = 36;
+		} else {
+			_asSymbols[_index3]->hide();
+			_flag5 = true;
+			_countdown1 = 12;
+		}
+	}
+	if (_flag6 && !_soundResource.isPlaying()) {
+		leaveScene(1);
+	}
+	Scene::update();
+}
+
+uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO: Debug stuff
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
+			leaveScene(0);
+		break;
+	// TODO: Debug stuff
+	case 0x2000:
+		if (!_flag6) {
+			if (_flag5)
+				_asSymbols[_index3]->change(_index1 + 12, false);
+			_asSymbols[_index3]->stopSound();
+			_index3++;
+			if (_index3 >= 12) {
+				if (testVars()) {
+					_soundResource.play();
+					setGlobalVar(0x2C531AF8, 1);
+					_flag6 = true;
+				} else {
+					_index3 = 0;
+					for (int i = 0; i < 12; i++)
+						_asSymbols[i]->hide();
+				}
+			}
+			_flag5 = true;
+			_countdown1 = 1;
+		}
+		break;
+	}
+	return 0;
+}
+
+bool Scene1609::testVars() {
+	int index1 = 0;
+	do {
+		int cmpIndex = _asSymbols[0]->getIndex();
+		if (!_asSymbols[0]->getFlag1())
+			cmpIndex -= 12;
+		if ((int)getSubVar(0x04909A50, index1) == cmpIndex)
+			break;
+		index1++;
+	} while(1);
+	for (int index2 = 0; index2 < 12; index2++) {
+		int cmpIndex = _asSymbols[index2]->getIndex();
+		if (!_asSymbols[index2]->getFlag1())
+			cmpIndex -= 12;
+		if ((int)getSubVar(0x04909A50, index1) != cmpIndex)
+			return false;
+		_index1++;
+		if (_index1 >= 12)
+			_index1 = 0;
+		_index2++;
+	}
+	return true;
+}
+	
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 9af1a19..1096377 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -26,6 +26,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/module3000.h"
 
 namespace Neverhood {
 
@@ -171,6 +172,24 @@ protected:
 	uint32 handleMessage44D510(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene1609 : public Scene {
+public:
+	Scene1609(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	SoundResource _soundResource;
+	Sprite *_ssButton;
+	AsScene3011Symbol *_asSymbols[12];
+	int _index1;
+	int _index2;
+	int _index3;
+	int _countdown1;
+	bool _flag5;
+	bool _flag6;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	bool testVars();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE1600_H */
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 4426a7e..ae7a7fd 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -195,13 +195,13 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse433(0x18222039);
 
-	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0));
-	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1));
-	addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2));
+	insertSprite<Class602>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0);
+	insertSprite<Class602>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1);
+	insertSprite<Class602>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2);
 
 	_sprite = insertStaticSprite(0x31313A22, 1100);
 
-	_class606 = addSprite(new Class606(_vm, this, 15, 1100, 238, 439, 0x02363852));
+	_class606 = insertSprite<Class606>(this, 15, 1100, 238, 439, 0x02363852);
 	_vm->_collisionMan->addSprite(_class606);
 
 	which = 4;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 3751a6f..97729cb 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -514,14 +514,14 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x40008208);
 	insertMouse433(0x0820C408);
 
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 7, 1100, 459, 432, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape); 
 
-	_ssDoorButton = addSprite(new Class426(_vm, this, 0xE4A43E29, 0xE4A43E29, 100, 0));
+	_ssDoorButton = insertSprite<Class426>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
 	for (uint32 i = 0; i < 9; i++) {
 		if ((int16)getSubVar(0x484498D0, i) >= 0) {
-			addSprite(new Class444(_vm, i, (int16)getSubVar(0x484498D0, i)));
+			insertSprite<Class444>(i, (int16)getSubVar(0x484498D0, i));
 		}
 	}
 
@@ -551,11 +551,11 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		insertKlayman<KmScene2201>(300, 427, &_rect1, 2);
 		setMessageList(0x004B8118);
-		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
 	} else if (which == 1) {
 		insertKlayman<KmScene2201>(412, 393, &_rect1, 2);
 		setMessageList(0x004B8130);
-		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
 			insertKlayman<KmScene2201>(379, 427, &_rect1, 2);
@@ -564,15 +564,15 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 			insertKlayman<KmScene2201>(261, 427, &_rect1, 2);
 		}
 		setMessageList(0x004B8178);
-		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false));
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
 	} else {
 		NPoint pt = _dataResource.getPoint(0x0304D8DC);
 		insertKlayman<KmScene2201>(pt.x, pt.y, &_rect1, 2);
 		setMessageList(0x004B8120);
-		_asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true));
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, true);
 	}
 	
-	addSprite(new AsScene2201CeilingFan(_vm));
+	insertSprite<AsScene2201CeilingFan>();
 
 	// TODO Sound1ChList_addSoundResource(0x04106220, 0x81212040, true);
 
@@ -598,7 +598,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asInteger() == 0x402064D8) {
 			sendEntityMessage(_klayman, 0x1014, _ssDoorButton);
 		} else if (param.asInteger() == 0x35803198) {
-			if (_asDoor->hasMessageHandler() && sendMessage(_asDoor, 0x2000, 0)) {
+			if (sendMessage(_asDoor, 0x2000, 0)) {
 				setMessageList(0x004B81A0);
 			} else {
 				setMessageList(0x004B81B8);
@@ -904,7 +904,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (uint32 index = 0; index < 9; index++) {
 		int16 value = (int16)getSubVar(0x484498D0, index);
 		if (value >= 0) {
-			Sprite *puzzleTileSprite = addSprite(new SsScene2202PuzzleTile(_vm, this, index, value));
+			Sprite *puzzleTileSprite = insertSprite<SsScene2202PuzzleTile>(this, index, value);
 			_vm->_collisionMan->addSprite(puzzleTileSprite);
 		}
 	}
@@ -1128,15 +1128,15 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	setHitRects(0x004B8320);
 
 	if (getGlobalVar(0x13382860) == 1) {
-		_class545 = addSprite(new Class545(_vm, this, 2, 1100, 282, 432));
+		_class545 = insertSprite<Class545>(this, 2, 1100, 282, 432);
 		_vm->_collisionMan->addSprite(_class545);
 	}
 
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 1, 1100, 435, 432, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 1, 1100, 435, 432, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 
-	_asLeftDoor = addSprite(new AsScene2203Door(_vm, this, 0));
-	_asRightDoor = addSprite(new AsScene2203Door(_vm, this, 1));
+	_asLeftDoor = insertSprite<AsScene2203Door>(this, 0);
+	_asRightDoor = insertSprite<AsScene2203Door>(this, 1);
 	
 	_ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100);
 	_ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100);
@@ -1280,21 +1280,19 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		setPalette(0x0008028D);
 		addEntity(_palette);
 		insertMouse433(0x80289008);
-		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0);
-		addSprite(_ssLightSwitch);
+		_ssLightSwitch = insertSprite<Class426>(this, 0x2D339030, 0x2D309030, 100, 0);
 	} else {
 		_isLightOn = false;
 		setBackground(0xD00A028D);
 		setPalette(0xD00A028D);
 		addEntity(_palette);
 		insertMouse433(0xA0289D08);
-		_ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0);
-		addSprite(_ssLightSwitch);
+		_ssLightSwitch = insertSprite<Class426>(this, 0x2D339030, 0xDAC86E84, 100, 0);
 	}
 
 	_palette->addBasePalette(0xD00A028D, 0, 256, 0);
 	
-	_ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm));
+	_ssDoorFrame = insertSprite<SsScene2205DoorFrame>();
 
 	if (which < 0) {
 		insertKlayman<KmScene2205>(320, 417);
@@ -1533,25 +1531,25 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite1 = insertStaticSprite(0x2201266A, 100);
 		_sprite2 = insertStaticSprite(0x3406A333, 300);
 		_sprite3 = insertStaticSprite(0x24A223A2, 100);
-		_sprite4 = addSprite(new Class603(_vm, 0x26133023));
+		_sprite4 = insertSprite<Class603>(0x26133023);
 		_sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8AF8);
-		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0));
+		_sprite5 = insertSprite<SsCommonButtonSprite>(this, 0x0E038022, 100, 0);
 		insertMouse433(0x83212411);
-		_class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x5E00E262));
-		_class604 = addSprite(new Class604(_vm, 0x085E25E0));
+		_class607 = insertSprite<Class607>(this, 1100, /*464, 433, */0x5E00E262);
+		_class604 = insertSprite<Class604>(0x085E25E0);
 	} else {
 		fileHash = 0xE0102A45;
 		_sprite1 = insertStaticSprite(0x1C1106B8, 100);
 		_sprite2 = insertStaticSprite(0x020462E0, 300);
 		_sprite3 = insertStaticSprite(0x900626A2, 100);
-		_sprite4 = addSprite(new Class603(_vm, 0x544822A8));
+		_sprite4 = insertSprite<Class603>(0x544822A8);
 		_sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8B58);
-		_sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0));
+		_sprite5 = insertSprite<SsCommonButtonSprite>(this, 0x16882608, 100, 0);
 		insertMouse433(0x02A41E09);
-		_class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x52032563));
-		_class604 = addSprite(new Class604(_vm, 0x317831A0));
+		_class607 = insertSprite<Class607>(this, 1100, /*464, 433, */0x52032563);
+		_class604 = insertSprite<Class604>(0x317831A0);
 	}
 
 	_class604->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
@@ -2031,7 +2029,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setMessageList(0x004B38E8);
 	
-	_asElevator = addSprite(new AsScene2207Elevator(_vm, this));
+	_asElevator = insertSprite<AsScene2207Elevator>(this);
 	
 	if (getGlobalVar(0x4D080E54)) {
 
@@ -2043,19 +2041,19 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 		_ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100);
 		_ssMaskPart3 = insertStaticSprite(0x0043B038, 1100);
 	
-		_asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011));
+		_asTape = insertSprite<AsScene1201Tape>(this, 4, 1100, 277, 428, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape); 
 	
-		_asLever = addSprite(new AsScene2207Lever(_vm, this, 527, 333, 0));
+		_asLever = insertSprite<AsScene2207Lever>(this, 527, 333, 0);
 		_vm->_collisionMan->addSprite(_asLever);
 		
-		_asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this));
-		_asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm));
+		_asWallRobotAnimation = insertSprite<AsScene2207WallRobotAnimation>(this);
+		_asWallCannonAnimation = insertSprite<AsScene2207WallCannonAnimation>();
 		
 		_asWallRobotAnimation->setVisible(false);
 		_asWallCannonAnimation->setVisible(false);
 
-		_ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0));
+		_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x2C4061C4, 100, 0);
 	
 		_asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480);
 		_klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2());
@@ -2071,9 +2069,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
 
-		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0));
-		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1));
-		addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2));
+		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0);
+		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1);
+		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2);
 
 		_asTape = NULL;
 		_asLever = NULL;
@@ -2444,7 +2442,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B3E18);
 	}
 
-	_asTape = addSprite(new AsScene1201Tape(_vm, this, 10, 1100, 464, 435, 0x9148A011));
+	_asTape = insertSprite<AsScene1201Tape>(this, 10, 1100, 464, 435, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape); 
 
 	if (which < 0) {
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index f645fb4..d979bbb 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -735,15 +735,10 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene
 	updatePosition();
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009Symbol::handleMessage);
-
-	_ssArrowPrev = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 0);
-	_parentScene->addSprite(_ssArrowPrev);
+	_ssArrowPrev = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _index * 2 + 0);
 	_vm->_collisionMan->addSprite(_ssArrowPrev);
-
-	_ssArrowNext = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 1);
-	_parentScene->addSprite(_ssArrowNext);
+	_ssArrowNext = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _index * 2 + 1);
 	_vm->_collisionMan->addSprite(_ssArrowNext);
-
 }
 
 uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -798,15 +793,13 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0xD000420C);
 	insertMouse435(0x04208D08, 20, 620);
 
-	_ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this));
+	_ssFireCannonButton = insertSprite<SsScene3009FireCannonButton>(this);
 	_vm->_collisionMan->addSprite(_ssFireCannonButton);
 
-	_asVerticalIndicator = new AsScene3009VerticalIndicator(_vm, this, _cannonLocation);
-	addSprite(_asVerticalIndicator);
+	_asVerticalIndicator = insertSprite<AsScene3009VerticalIndicator>(this, _cannonLocation);
 	_vm->_collisionMan->addSprite(_asVerticalIndicator);
 
-	_asHorizontalIndicator = new AsScene3009HorizontalIndicator(_vm, this, _cannonLocation);
-	addSprite(_asHorizontalIndicator);
+	_asHorizontalIndicator = insertSprite<AsScene3009HorizontalIndicator>(this, _cannonLocation);
 	_vm->_collisionMan->addSprite(_asHorizontalIndicator);
 
 	if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) {
@@ -826,16 +819,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x8540252C, 400);
 
 	for (int i = 0; i < 2; i++) {
-		_ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i);
-		addSprite(_ssSymbolEdges[i]);
-		_ssTargetLines[i] = new SsScene3009TargetLine(_vm, i);
-		addSprite(_ssTargetLines[i]);
+		_ssSymbolEdges[i] = insertSprite<SsScene3009SymbolEdges>(i);
+		_ssTargetLines[i] = insertSprite<SsScene3009TargetLine>(i);
 	}
 
-
 	for (int i = 0; i < 6; i++) {
-		_asSymbols[i] = new AsScene3009Symbol(_vm, this, i);
-		addSprite(_asSymbols[i]);
+		_asSymbols[i] = insertSprite<AsScene3009Symbol>(this, i);
 		if (i < 3)
 			_correctSymbols[i] = getSubVar(0x00504B86, i);
 		else
@@ -1294,10 +1283,8 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x80802626);
 
 	for (int i = 0; i < 3; i++) {
-		_asDeadBolts[i] = new AsScene3010DeadBolt(_vm, this, i, which == 1);//CHECKME
-		addSprite(_asDeadBolts[i]);
-		_ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME
-		addSprite(_ssDeadBoltButtons[i]);
+		_asDeadBolts[i] = insertSprite<AsScene3010DeadBolt>(this, i, which == 1);//CHECKME
+		_ssDeadBoltButtons[i] = insertSprite<SsScene3010DeadBoltButton>(this, i, initCountdown, which == 1);//CHECKME
 		_vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]);
 		if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i]))
 			initCountdown++;
@@ -1533,28 +1520,25 @@ void AsScene3011Symbol::change(int index, bool flag) {
 Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) {
 
-	_surfaceFlag = true;
-
 	// TODO _vm->gameModule()->initScene3011Vars();
 	_index1 = getGlobalVar(0x2414C2F2);
 
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene3011::handleMessage);
+	SetUpdateHandler(&Scene3011::update);
+	
 	setBackground(0x92124A04);
 	setPalette(0xA4070114);
 	addEntity(_palette);
 
 	insertMouse435(0x24A00929, 20, 620);
 
-	for (int i = 0; i < 12; i++) {
-		_asSymbols[i] = new AsScene3011Symbol(_vm, i, true);
-		addSprite(_asSymbols[i]);
-	}
+	for (int i = 0; i < 12; i++)
+		_asSymbols[i] = insertSprite<AsScene3011Symbol>(i, true);
 
-	_ssButton = addSprite(new SsScene3011Button(_vm, this, true));
+	_ssButton = insertSprite<SsScene3011Button>(this, true);
 	_vm->_collisionMan->addSprite(_ssButton);
 	
-	SetUpdateHandler(&Scene3011::update);
-	SetMessageHandler(&Scene3011::handleMessage);
-	
 }
 
 void Scene3011::update() {
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 2764c83..2e25a0d 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -236,6 +236,8 @@ public:
 	void hide();
 	void stopSound();
 	void change(int index, bool flag);
+	bool getFlag1() { return _flag1; }
+	int getIndex() { return _index; }
 protected:
 	SoundResource _soundResource1;
 	SoundResource _soundResource2;


Commit: 7a0a0c4b65f29981ca4f19af166d8bdca02c173c
    https://github.com/scummvm/scummvm/commit/7a0a0c4b65f29981ca4f19af166d8bdca02c173c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add Module1900 and Scene1901, Scene1907

(Scene1908 is actually only used in another module...)

Changed paths:
  A engines/neverhood/module1900.cpp
  A engines/neverhood/module1900.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 960e732..7f74590 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -32,6 +32,7 @@
 #include "neverhood/module1600.h"
 #include "neverhood/module1700.h"
 #include "neverhood/module1800.h"
+#include "neverhood/module1900.h"
 #include "neverhood/module2000.h"
 #include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
@@ -275,11 +276,15 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 1;
 	createModule(1000, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 8;
 	_vm->gameState().which = 1;
 	createModule(1600, -1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 6;
+	createModule(1900, -1);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
@@ -323,6 +328,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x04A14718);
 		_childObject = new Module1800(_vm, this, which);
 		break;
+	case 1900:
+		setGlobalVar(0x91080831, 0x04E1C09C);
+		_childObject = new Module1900(_vm, this, which);
+		break;
 	case 2000:
 		setGlobalVar(0x91080831, 0x08250000);
 		_childObject = new Module2000(_vm, this, which);
@@ -413,6 +422,9 @@ void GameModule::updateModule() {
 				createModule(2800, 0);
 			}
 			break;
+		case 1900:
+			createModule(3000, 1);
+			break;
 		case 2000:
 			createModule(2900, 4);
 			break;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 27ef84a..873ba68 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3953,6 +3953,45 @@ void KmScene1705::sub468B10() {
 	SetMessageHandler(&KmScene1705::handleMessage4689A0);
 }
 
+KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+
+	// Empty	
+}
+
+uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481D:
+		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		break;
+	case 0x481E:
+		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		sub41C7B0();
+		break;
+	case 0x483F:
+		sub41CD00(param.asInteger());
+		break;		
+	case 0x4840:
+		sub41CD70(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) {
 
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 84cb05a..5c0429e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -434,6 +434,13 @@ protected:
 	void sub468B10();
 };
 
+class KmScene1901 : public Klayman {
+public:
+	KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene2001 : public Klayman {
 public:
 	KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 5a597fb..6530a7f 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -20,6 +20,7 @@ MODULE_OBJS = \
 	module1600.o \
 	module1700.o \
 	module1800.o \
+	module1900.o \
 	module2000.o \
 	module2200.o \
 	module2300.o \
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
new file mode 100644
index 0000000..7a34a2b
--- /dev/null
+++ b/engines/neverhood/module1900.cpp
@@ -0,0 +1,691 @@
+/* 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/module1900.h"
+#include "neverhood/gamemodule.h"
+
+namespace Neverhood {
+
+Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+
+	// NOTE: The original has a Scene1908 here as well but it's not used here but in another module... 
+	
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else {
+		createScene(0, 0);
+	}
+
+	// TODO Sound1ChList_addSoundResources(0x04E1C09C, dword_4B8800, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B8800, true, 50, 600, 5, 150);
+
+}
+
+Module1900::~Module1900() {
+	// TODO Sound1ChList_sub_407A50(0x04E1C09C);
+}
+
+void Module1900::createScene(int sceneNum, int which) {
+	debug("Module1900::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_childObject = new Scene1901(_vm, this, which);
+		break;
+	case 6:
+		_childObject = new Scene1907(_vm, this, which);
+		break;
+	}
+	SetUpdateHandler(&Module1900::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module1900::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(6, 0);
+			} else {
+				leaveModule(0);
+			}
+			break;
+		case 6:
+			createScene(0, 1);
+			break;
+		}
+	}
+}
+
+// Scene1901
+
+Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	Sprite *tempSprite;
+
+	_surfaceFlag = true;
+	
+	setRectList(0x004B34C8);
+
+	setBackground(0x01303227);
+	setPalette(0x01303227);
+	insertMouse433(0x0322301B);
+	
+	insertStaticSprite(0x42213133, 1100);
+	
+	if (!getGlobalVar(0xA9035F60)) {
+		insertStaticSprite(0x40A40168, 100);
+	} else if (getGlobalVar(0x09221A62)) {
+		insertStaticSprite(0x124404C4, 100);
+		setGlobalVar(0x2050861A, 1);
+	} else {
+		insertStaticSprite(0x02840064, 100);
+	}
+
+	if (which < 0) {
+		insertKlayman<KmScene1901>(120, 380);
+		setMessageList(0x004B3408);
+	} else if (which == 1) {
+		insertKlayman<KmScene1901>(372, 380);
+		setMessageList(0x004B3410);
+	} else {
+		insertKlayman<KmScene1901>(0, 380);
+		setMessageList(0x004B3400);
+	}
+
+	tempSprite = insertStaticSprite(0x4830A402, 1100);
+	_klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480);
+
+}
+
+static const NPoint kAsScene1907SymbolGroundPositions[] = {
+	{160, 310},
+	{ 90, 340},
+	{210, 335},
+	{210, 380},
+	{310, 340},
+	{290, 400},
+	{400, 375},
+	{370, 435},
+	{475, 415}
+};
+
+static const NPoint kAsScene1907SymbolPluggedInPositions[] = { 
+	{275, 125},
+	{244, 125},
+	{238, 131},
+	{221, 135},
+	{199, 136},
+	{168, 149},
+	{145, 152},
+	{123, 154},
+	{103, 157}
+};
+
+static const NPoint kAsScene1907SymbolGroundHitPositions[] = {
+	{275, 299}, 
+	{244, 299}, 
+	{238, 305}, 
+	{221, 309},
+	{199, 310},
+	{168, 323}, 
+	{145, 326}, 
+	{123, 328}, 
+	{103, 331} 
+};
+
+static const NPoint kAsScene1907SymbolPluggedInDownPositions[] = {
+	{275, 136},
+	{244, 156},
+	{238, 183},
+	{221, 207},
+	{199, 228},
+	{168, 262},
+	{145, 285},
+	{123, 307},
+	{103, 331}
+};
+
+static const uint32 kAsScene1907SymbolFileHashes[] = {
+	0x006A1034,
+	0x006A1010,
+	0x006A1814,
+	0x006A1016,
+	0x006A0014,
+	0x002A1014,
+	0x00EA1014,
+	0x206A1014,
+	0x046A1414
+};
+
+int AsScene1907Symbol::_symbolFlag1 = 0;
+int AsScene1907Symbol::_symbolFlag2 = 0;
+
+AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex)
+	: AnimatedSprite(vm, 1000 - positionIndex), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
+	_parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) {
+
+	_symbolFlag1 = 0;
+	_symbolFlag2 = 0;
+	
+	if (getGlobalVar(0xA9035F60)) {
+		_isPluggedIn = true;
+		_currPositionIndex = elementIndex;
+		if (!getGlobalVar(0x09221A62)) {
+			_x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x;
+			_y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y;
+		} else {
+			_x = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].x;
+			_y = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].y;
+		}
+		createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex);
+		setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);
+		_newHashListIndex = -2;
+	} else {
+		_isPluggedIn = false;
+		_currPositionIndex = positionIndex;
+		_soundResource1.load(0x74231924);
+		_soundResource2.load(0x36691914);
+		_soundResource3.load(0x5421D806);
+		_parentScene->setPositionFree(_currPositionIndex, false);
+		_x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x;
+		_y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y;
+		createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex);
+		setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
+		_newHashListIndex = 0;
+	}
+	_deltaRect.set(0, 0, 80, 80);
+	Sprite::processDelta();
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1907Symbol::handleMessage);
+
+}
+
+void AsScene1907Symbol::update() {
+	AnimatedSprite::updateAnim();
+	handleSpriteUpdate();
+	AnimatedSprite::updatePosition();
+	if (_symbolFlag1 && !_symbolFlag2)
+		_symbolFlag1 = 0;
+}
+
+uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (!_isPluggedIn && !_symbolFlag1) {
+			tryToPlugIn();
+			messageResult = 1;
+		} else {
+			messageResult = 0;
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1907Symbol::suTryToPlugIn() {
+	_currStep++;
+	_x -= _deltaX;
+	_y -= _deltaY;
+	if (_currStep == 16) {
+		_x -= _smallDeltaX;
+		_y -= _smallDeltaY;
+		SetSpriteCallback(NULL);
+	}
+}
+
+void AsScene1907Symbol::suFallOff() {
+	if (_fallOffDelay != 0) {
+		_fallOffDelay--;
+	} else {
+		_y += _yAccel;
+		_yAccel += 8;
+		if (_y >= kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) {
+			_y = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y;
+			stFallOffHitGround();
+		}
+	}
+}
+
+void AsScene1907Symbol::suFallOffHitGround() {
+
+	if (_x == _someX - _xBreak)
+		_x -= _smallDeltaX;
+	else
+		_x -= _deltaX;
+
+	if (_y == kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) {
+		_y -= _someY;
+	}
+
+	if (_currStep < 8) {
+		_y -= _yAccel;
+		_yAccel -= 4;
+		if (_yAccel < 0)
+			_yAccel = 0;
+	} else if (_currStep < 15) {
+		_y += _yAccel;
+		_yAccel += 4;
+	} else {
+		_y = kAsScene1907SymbolGroundPositions[_newPositionIndex].y;
+		cbFallOffHitGroundEvent();
+	}
+
+	_currStep++;
+}
+
+void AsScene1907Symbol::suMoveDown() {
+	_y += _yIncr;
+	if (_yIncr < 11)
+		_yIncr++;
+	if (_y >= kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y) {
+		_y = kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y;
+		_isMoving = false;
+		SetSpriteCallback(NULL);
+	}	
+}
+
+void AsScene1907Symbol::suMoveUp() {
+	_y -= _yIncr;
+	if (getGlobalVar(0x10938830)) {
+		if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) {
+			_yIncr--;
+		} else {
+			_yIncr++;
+		}
+	} else {
+		_yIncr = 2;
+	}
+	if (_yIncr > 9)
+		_yIncr = 9;
+	else if (_yIncr < 1)
+		_yIncr = 1;
+	if (_y < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) {
+		_y = kAsScene1907SymbolPluggedInPositions[_elementIndex].y;
+		_isMoving = false;
+		SetSpriteCallback(NULL);
+	}
+}
+
+void AsScene1907Symbol::tryToPlugIn() {
+	_isPluggedIn = true;
+	_symbolFlag2++;
+	_newPositionIndex = _parentScene->getNextPosition();
+	_parentScene->setPositionFree(_currPositionIndex, true);
+	sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex);
+	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
+	SetUpdateHandler(&AsScene1907Symbol::update);
+	SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn);
+	SetSpriteCallback(&AsScene1907Symbol::suTryToPlugIn);
+	_currStep = 0;
+	_deltaX = (_x - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x) / 16;
+	_smallDeltaX = _x - _deltaX * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x;
+	_deltaY = (_y - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y) / 16;
+	_smallDeltaY = _y - _deltaY * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y;
+	if (_elementIndex == _newPositionIndex) {
+		SetAnimationCallback3(&AsScene1907Symbol::stPlugIn);
+	} else {
+		_symbolFlag1 = 1;
+		SetAnimationCallback3(&AsScene1907Symbol::stPlugInFail);
+	}
+}
+
+void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
+	_isPluggedIn = false;
+	_newPositionIndex = newPositionIndex;
+	_fallOffDelay = fallOffDelay;
+	_parentScene->setPositionFree(_newPositionIndex, false);
+	_x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x;
+	_y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y;
+	_someX = _x;
+	_someY = _y;
+	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0);
+	_playBackwards = true;
+	_newHashListIndex = -2;
+	_currStep = 0;
+	_yAccel = 1;
+	SetUpdateHandler(&AsScene1907Symbol::update);
+	SetMessageHandler(&AsScene1907Symbol::handleMessage);
+	SetSpriteCallback(&AsScene1907Symbol::suFallOff);
+}
+
+void AsScene1907Symbol::stFallOffHitGround() {
+	_soundResource2.play();
+	sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex);
+	// TODO: Meh...
+	Entity::_priority = 1000 - _newPositionIndex;
+	_vm->_collisionMan->removeSprite(this);
+	_vm->_collisionMan->addSprite(this);
+	SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround);
+	SetAnimationCallback3(&AsScene1907Symbol::cbFallOffHitGroundEvent);
+	_newHashListIndex = 0;
+	_currStep = 0;
+	_yAccel = 30;
+	_deltaX = (_x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x) / 15;
+	_xBreak = _deltaX * 15;
+	_smallDeltaX = _x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x - _xBreak;
+	_someY = 0;
+	if (kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y > kAsScene1907SymbolGroundPositions[_newPositionIndex].y)
+		_someY = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y - kAsScene1907SymbolGroundPositions[_newPositionIndex].y;
+}
+
+void AsScene1907Symbol::cbFallOffHitGroundEvent() {
+	_currPositionIndex = _newPositionIndex;
+	if (_symbolFlag2)
+		_symbolFlag2--;
+	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
+	_newHashListIndex = 0;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1907Symbol::handleMessage);
+	SetSpriteCallback(NULL);
+	processDelta();
+	_soundResource3.play();
+}
+
+void AsScene1907Symbol::stPlugIn() {
+	_soundResource1.play();
+	_currPositionIndex = _newPositionIndex;
+	setFileHash1();
+	SetMessageHandler(&AsScene1907Symbol::handleMessage);
+	SetSpriteCallback(NULL);
+	if (_elementIndex == 8)
+		sendMessage(_parentScene, 0x2001, 0);
+}
+
+void AsScene1907Symbol::stPlugInFail() {
+	_currPositionIndex = _newPositionIndex;
+	setFileHash1();
+	_parentScene->plugInFailed();
+}
+
+void AsScene1907Symbol::moveUp() {
+	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
+	setFileHash1();
+	SetMessageHandler(&AsScene1907Symbol::handleMessage);
+	SetSpriteCallback(&AsScene1907Symbol::suMoveUp);
+	_yIncr = 1;
+	_isMoving = true;
+}
+
+void AsScene1907Symbol::moveDown() {
+	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
+	setFileHash1();
+	SetMessageHandler(&AsScene1907Symbol::handleMessage);
+	SetSpriteCallback(&AsScene1907Symbol::suMoveDown);
+	_yIncr = 4;
+	_isMoving = true;
+}
+
+SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol)
+	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _AsScene1907Symbol(AsScene1907Symbol),
+	_countdown1(0) {
+	
+	_spriteResource.load2(0x64516424);
+	createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	setVisible(false);
+	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_deltaRect = _drawRect;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	processDelta();
+	_needRefresh = true;
+	_soundResource.load(0x44061000);
+	SetUpdateHandler(&SsScene1907UpDownButton::update);
+	SetMessageHandler(&SsScene1907UpDownButton::handleMessage);
+	if (getGlobalVar(0xA9035F60)) {
+		if (getGlobalVar(0x09221A62))
+			setToDownPosition();
+		else
+			setToUpPosition();
+	}
+}
+
+void SsScene1907UpDownButton::update() {
+	StaticSprite::update();
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+		setVisible(false);
+		sendMessage(_parentScene, 0x2000, 0);
+	}
+}
+
+uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown1 == 0 && !_AsScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) {
+			setVisible(true);
+			_countdown1 = 4;
+			StaticSprite::update();
+			_soundResource.play();
+		}
+		messageResult = 1;
+	}
+	return messageResult;
+}
+
+void SsScene1907UpDownButton::setToUpPosition() {
+	_y = _spriteResource.getPosition().y;
+	Sprite::processDelta();
+	StaticSprite::update();
+}
+
+void SsScene1907UpDownButton::setToDownPosition() {
+	_y = _spriteResource.getPosition().y + 174;
+	Sprite::processDelta();
+	StaticSprite::update();
+}
+
+AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1400) {
+	
+	createSurface1(0x110A1061, 1500);
+	_x = 320;
+	_y = 240;
+	setFileHash(0x110A1061, 0, -1);
+	_newHashListIndex = 0;
+	setVisible(false);
+	_needRefresh = true;
+	AnimatedSprite::updatePosition();
+	SetUpdateHandler(&AsScene1907WaterHint::update);
+	SetMessageHandler(&Sprite::handleMessage);
+}
+
+void AsScene1907WaterHint::update() {
+	AnimatedSprite::updateAnim();
+	AnimatedSprite::updatePosition();
+}
+
+uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene1907WaterHint::show() {
+	setVisible(true);
+	setFileHash(0x110A1061, 0, -1);
+	SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20);
+	SetAnimationCallback3(&AsScene1907WaterHint::hide);
+}
+
+void AsScene1907WaterHint::hide() {
+	setFileHash1();
+	setVisible(false);
+	SetMessageHandler(&Sprite::handleMessage);
+}
+
+Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)	
+	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
+	_soundResource3(vm), _soundResource4(vm), _currMovingSymbolIndex(0), _pluggedInCount(0), 
+	_moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) {
+	
+	_surfaceFlag = true;
+
+	//setGlobalVar(0x10938830, 1);
+	
+	setBackground(0x20628E05);
+	setPalette(0x20628E05);
+
+	for (int i = 0; i < 9; i++)
+		_positionFree[i] = true;
+
+	for (int i = 0; i < 9; i++) {
+		_asSymbols[i] = insertSprite<AsScene1907Symbol>(this, i, getRandomPositionIndex());
+		_vm->_collisionMan->addSprite(_asSymbols[i]);
+	}
+	
+	_ssUpDownButton = insertSprite<SsScene1907UpDownButton>(this, _asSymbols[8]);
+	_vm->_collisionMan->addSprite(_ssUpDownButton);
+
+	_asWaterHint = insertSprite<AsScene1907WaterHint>();
+	
+	insertMouse435(0x28E0120E, 20, 620);
+
+	SetMessageHandler(&Scene1907::handleMessage);
+	SetUpdateHandler(&Scene1907::update);
+
+	if (getGlobalVar(0xA9035F60))
+		_pluggedInCount = 9;
+		
+	_soundResource1.load(0x72004A10);
+	_soundResource2.load(0x22082A12);
+	_soundResource3.load(0x21100A10);
+	_soundResource4.load(0x68E25540);
+
+}
+
+void Scene1907::update() {
+	Scene::update();
+	
+	if (_hasPlugInFailed) {
+		int fallOffDelay = 0;
+		_hasPlugInFailed = false;
+		for (int i = 0; i < 9; i++) {
+			AsScene1907Symbol *asSymbol = _asSymbols[8 - i];
+			if (asSymbol->isPluggedIn()) {
+				asSymbol->fallOff(getRandomPositionIndex(), fallOffDelay);
+				fallOffDelay += _vm->_rnd->getRandomNumber(10 - 1) + 4;
+			}
+		}
+	}
+
+	if (_moveDownCountdown != 0 && (--_moveDownCountdown == 0)) {
+		_asSymbols[_currMovingSymbolIndex]->moveDown();
+		if (_currMovingSymbolIndex > 0) {
+			_moveDownCountdown = 2;
+			_currMovingSymbolIndex--;
+		}
+	}
+
+	if (_moveUpCountdown != 0 && (--_moveUpCountdown == 0)) {
+		_moveDownCountdown = 0;
+		for (int i = 0; i < 9; i++)
+			_asSymbols[i]->moveUp();
+	}
+
+	if (_countdown3 != 0 && (--_countdown3 == 0)) {
+		_asWaterHint->show();
+		_moveUpCountdown = 4;
+	}
+
+}
+
+uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO DEBUG stuff
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) &&
+			!_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) {
+			leaveScene(0);
+		}
+		break;
+	// TODO Debug stuff
+	case 0x2000:
+		if (getGlobalVar(0x09221A62)) {
+			_soundResource1.play();
+			for (int i = 0; i < 9; i++)
+				_asSymbols[i]->moveUp();
+			_ssUpDownButton->setToUpPosition();
+			setGlobalVar(0x09221A62, 0);
+		} else {
+			if (!getGlobalVar(0x10938830)) {
+				_soundResource3.play();
+				_countdown3 = 5;
+			} else {
+				_soundResource2.play();
+				_ssUpDownButton->setToDownPosition();
+				setGlobalVar(0x09221A62, 1);
+			}
+			_moveDownCountdown = 1;
+			_currMovingSymbolIndex = 8;
+		}
+		break;
+	case 0x2001:
+		_soundResource4.play();
+		setGlobalVar(0xA9035F60, 1);
+		break;
+	}	
+	return 0;
+}
+
+void Scene1907::plugInFailed() {
+	_pluggedInCount = 0;
+	_hasPlugInFailed = true;
+}
+
+int Scene1907::getRandomPositionIndex() {
+	bool flag = false;
+	int index = 0;
+	for (int i = 0; i < 9; i++) {
+		if (_positionFree[i])
+			flag = true;
+	}
+	if (flag) {
+		flag = false;
+		while (!flag) {
+			index = _vm->_rnd->getRandomNumber(9 - 1);
+			if (_positionFree[index])
+				flag = true;
+		}
+	}
+	return index;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h
new file mode 100644
index 0000000..7b41c57
--- /dev/null
+++ b/engines/neverhood/module1900.h
@@ -0,0 +1,150 @@
+/* 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_MODULE1900_H
+#define NEVERHOOD_MODULE1900_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/module1200.h"
+
+namespace Neverhood {
+
+class Module1900 : public Module {
+public:
+	Module1900(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module1900();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createScene(int sceneNum, int which);
+	void updateScene();
+};
+
+// Scene1901
+
+class Scene1901 : public Scene {
+public:
+	Scene1901(NeverhoodEngine *vm, Module *parentModule, int which);
+};
+
+// Scene1907
+
+class Scene1907;
+
+class AsScene1907Symbol : public AnimatedSprite {
+public:
+	AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex);
+	void moveUp();
+	void moveDown();
+	void fallOff(int newPositionIndex, int fallOffDelay);
+	bool isPluggedIn() { return _isPluggedIn; }
+	bool isMoving() { return _isMoving; }
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	Scene1907 *_parentScene;
+	int _elementIndex;
+	int _currPositionIndex;
+	int _newPositionIndex;
+	bool _isPluggedIn;
+	bool _isMoving;
+	int _someX, _someY;
+	int _xBreak;
+	int _currStep;
+	int _yAccel;
+	int _yIncr;
+	int _fallOffDelay;
+	int _deltaX, _smallDeltaX;
+	int _deltaY, _smallDeltaY;
+	// Dumb, change if possible
+	static int _symbolFlag1;
+	static int _symbolFlag2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmTryToPlugIn(int messageNum, const MessageParam &param, Entity *sender);
+	void suTryToPlugIn();
+	void suFallOff();
+	void suFallOffHitGround();
+	void suMoveDown();
+	void suMoveUp();
+	void tryToPlugIn();
+	void stFallOffHitGround();
+	void cbFallOffHitGroundEvent();
+	void stPlugIn();
+	void stPlugInFail();
+};
+
+class AsScene1907WaterHint : public AnimatedSprite {
+public:
+	AsScene1907WaterHint(NeverhoodEngine *vm);
+	void show();
+protected:
+	void update();
+	uint32 handleMessage46BA20(int messageNum, const MessageParam &param, Entity *sender);
+	void hide();
+};
+
+class SsScene1907UpDownButton : public StaticSprite {
+public:
+	SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol);
+	void setToUpPosition();
+	void setToDownPosition();
+protected:
+	SoundResource _soundResource;
+	Scene1907 *_parentScene;
+	AsScene1907Symbol *_AsScene1907Symbol;
+	int _countdown1;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene1907 : public Scene {
+public:
+	Scene1907(NeverhoodEngine *vm, Module *parentModule, int which);
+	void plugInFailed();
+	void setPositionFree(int index, bool value) { _positionFree[index] = value; }
+	int getNextPosition() { return _pluggedInCount++; }
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	AsScene1907Symbol *_asSymbols[9];
+	SsScene1907UpDownButton *_ssUpDownButton;
+	AsScene1907WaterHint *_asWaterHint;
+	int _currMovingSymbolIndex;
+	int _pluggedInCount;
+	int _moveDownCountdown;
+	int _moveUpCountdown;
+	int _countdown3;
+	bool _hasPlugInFailed;
+	bool _positionFree[9];
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	int getRandomPositionIndex();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE1900_H */


Commit: 729e3ae26ef9c3c039861ef5212ca3588a679ca5
    https://github.com/scummvm/scummvm/commit/729e3ae26ef9c3c039861ef5212ca3588a679ca5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add tables for Scene1901

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 01ddd15..9328bfd 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -87,6 +87,8 @@ static const uint32 rectListOffsets[] = {
 	// Scene1705
 	1, 0x004B6B40,
 	1, 0x004B6B30,
+	// Scene1901
+	1, 0x004B34C8,
 	// Scene2001
 	1, 0x004B3680,
 	1, 0x004B3670,
@@ -260,6 +262,10 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B6A18,
 	1, 0x004B69F0,
 	2, 0x004B6AC0,
+	// Scene1901
+	1, 0x004B3408,
+	1, 0x004B3410,
+	1, 0x004B3400,
 	// Scene2001
 	1, 0x004B3538,
 	2, 0x004B3540,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 5561301..6663e64 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: ced4efc66f68c284a290a88cbeac337021526b5e
    https://github.com/scummvm/scummvm/commit/ced4efc66f68c284a290a88cbeac337021526b5e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2101

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 9328bfd..f0308bd 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -92,6 +92,9 @@ static const uint32 rectListOffsets[] = {
 	// Scene2001
 	1, 0x004B3680,
 	1, 0x004B3670,
+	// Scene2101
+	1, 0x004B9008,
+	1, 0x004B8FF8,
 	// Scene2203
 	1, 0x004B8420,
 	// Scene2206
@@ -272,6 +275,18 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B35F0,
 	2, 0x004B3550,
 	1, 0x004B3530,
+	// Scene2101
+	1, 0x004B8E48,
+	3, 0x004B8E50,
+	4, 0x004B8F58,
+	2, 0x004B8EB0,
+	2, 0x004B8EA0,
+	1, 0x004B8F50,
+	1, 0x004B8F48,
+	4, 0x004B8E80,
+	1, 0x004B8EC8,
+	2, 0x004B8F78,
+	3, 0x004B8F00,
 	// Scene2201
 	1, 0x004B8118,
 	1, 0x004B8130,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 6663e64..72e8133 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 21ebcf2af20bf96c32f5668952dba4ed7797a89c
    https://github.com/scummvm/scummvm/commit/21ebcf2af20bf96c32f5668952dba4ed7797a89c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add Module2100 and Scene2101 (not complete yet)

Changed paths:
  A engines/neverhood/module2100.cpp
  A engines/neverhood/module2100.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7f74590..7d463fb 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -34,6 +34,7 @@
 #include "neverhood/module1800.h"
 #include "neverhood/module1900.h"
 #include "neverhood/module2000.h"
+#include "neverhood/module2100.h"
 #include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
 #include "neverhood/module3000.h"
@@ -281,10 +282,14 @@ void GameModule::startup() {
 	_vm->gameState().which = 1;
 	createModule(1600, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 6;
 	createModule(1900, -1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 0;
+	createModule(2100, 3);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
@@ -336,6 +341,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x08250000);
 		_childObject = new Module2000(_vm, this, which);
 		break;
+	case 2100:
+		setGlobalVar(0x91080831, 0x10A10C14);
+		_childObject = new Module2100(_vm, this, which);
+		break;
 	case 2200:
 		setGlobalVar(0x91080831, 0x11391412);
 		_childObject = new Module2200(_vm, this, which);
@@ -428,6 +437,13 @@ void GameModule::updateModule() {
 		case 2000:
 			createModule(2900, 4);
 			break;
+		case 2100:
+			if (_moduleResult == 1) {
+				createModule(2900, 1);
+			} else {
+				createModule(1600, 0);
+			}
+			break;
 		case 2200:
 			createModule(2300, 1);
 			break;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 873ba68..865c91a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -4091,6 +4091,157 @@ void KmScene2001::sub440270() {
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
+KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+	
+	// Empty
+}
+
+uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x2000:
+		_flag1 = param.asInteger() != 0;
+		messageResult = 1;
+		break;
+	case 0x4001:
+	case 0x4800:
+		sub41C930(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub421350));
+		else
+			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		break;
+	case 0x4811:
+		setCallback2(AnimationCallback(&KmScene2101::sub4862C0));
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420060));
+		} else if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+		} else {
+			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		}
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			setCallback2(AnimationCallback(&Klayman::sub420120));
+		} else if (param.asInteger() == 2) {
+			setCallback2(AnimationCallback(&Klayman::sub420170));
+		}else {
+			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		sub41C7B0();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481D:
+		if (_flag1)
+			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+		break;
+	case 0x481E:
+		if (_flag)
+			setCallback2(AnimationCallback(&Klayman::sub421510));
+		break;
+	case 0x4834:
+		setCallback2(AnimationCallback(&Klayman::sub421160));
+		break;
+	case 0x4835:
+		sendMessage(_parentScene, 0x2000, 1);
+		_flag1 = true;
+		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		break;																		
+	case 0x4836:
+		sendMessage(_parentScene, 0x2000, 0);
+		_flag1 = false;
+		setCallback2(AnimationCallback(&Klayman::sub421310));
+		break;
+	case 0x483D:
+		sub486320();
+		break;
+	case 0x483E:
+		sub486360();
+		break;
+	}
+	return messageResult;	
+}
+
+uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	int16 speedUpFrameIndex;
+	switch (messageNum) {
+	case 0x1008:
+		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
+		if (_frameIndex < speedUpFrameIndex) {
+			setFileHash(0x35AA8059, speedUpFrameIndex, -1);
+			_y = 438;
+		}
+		messageResult = 0;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x1A1A0785) {
+			_soundResource1.play(0x40F0A342);
+		} else if (param.asInteger() == 0x60428026) {
+			_soundResource1.play(0x40608A59);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			_soundResource1.play(0x85B10BB8);
+		} else if (param.asInteger() == 0x4E6A0CA0) {
+			_soundResource1.play(0xC5B709B0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2101::sub4862C0() {
+	_status2 = 1;
+	_flagE5 = false;
+	setFileHash(0x35AA8059, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&KmScene2101::handleMessage486160);
+	_soundResource1.play(0x402E82D4);
+}
+
+void KmScene2101::sub486320() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0xFF290E30, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene2101::handleMessage486230);
+}
+
+void KmScene2101::sub486360() {
+	_status2 = 0;
+	_flagE5 = false;
+	setFileHash(0x9A28CA1C, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteCallback(NULL);
+	SetMessageHandler(&KmScene2101::handleMessage486230);
+}
+
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	// TODO: NRect *rect1, int16 unk in Klayman ctor
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 5c0429e..eb6ab40 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -452,6 +452,19 @@ protected:
 	void sub440270();
 };
 
+class KmScene2101 : public Klayman {
+public:
+	KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _flag1;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage486160(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage486230(int messageNum, const MessageParam &param, Entity *sender);
+	void sub4862C0();
+	void sub486320();
+	void sub486360();
+};
+
 class KmScene2201 : public Klayman {
 public:
 	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 6530a7f..9484e2e 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -22,6 +22,7 @@ MODULE_OBJS = \
 	module1800.o \
 	module1900.o \
 	module2000.o \
+	module2100.o \
 	module2200.o \
 	module2300.o \
 	module3000.o \
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
new file mode 100644
index 0000000..e07e990
--- /dev/null
+++ b/engines/neverhood/module2100.cpp
@@ -0,0 +1,298 @@
+/* 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/module2100.h"
+#include "neverhood/gamemodule.h"
+#include "neverhood/module1200.h"
+
+namespace Neverhood {
+
+Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+
+	// TODO Music18hList_add(0x10A10C14, 0x11482B95);
+	
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else if (which == 1) {
+		createScene(0, 0);
+	} else if (which == 2) {
+		createScene(0, 3);
+	} else {
+		createScene(0, 1);
+	}
+
+}
+
+Module2100::~Module2100() {
+	// TODO Music18hList_deleteGroup(0x10A10C14);
+}
+
+void Module2100::createScene(int sceneNum, int which) {
+	debug("Module2100::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		// TODO Music18hList_play(0x11482B95, 0, 1, 1);
+		_childObject = new Scene2101(_vm, this, which);
+		break;
+	}
+	SetUpdateHandler(&Module2100::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2100::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				setGlobalVar(0x2090590C, 1);
+				leaveModule(0);
+			} else {
+				leaveModule(1);
+			}
+			break;
+		}
+	}
+}
+
+// Scene2101
+
+Class538::Class538(NeverhoodEngine *vm, bool flag)
+	: AnimatedSprite(vm, 1100), _soundResource(vm) {
+
+	// TODO createSurface3(100, dword_4B9018);
+	createSurface(100, 640, 480); //TODO: Remove once the line above is done
+	_x = 320;
+	_y = 240;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class538::handleMessage);
+	if (flag) {
+		setFileHash(0x0C202B9C, -1, -1);
+		_newHashListIndex = -2;
+	} else {
+		setVisible(false);
+	}
+}
+
+uint32 Class538::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		removeCallbacks();
+		break;
+	case 0x4808:
+		openDoor();
+		break;
+	case 0x4809:
+		closeDoor();
+		break;
+	}
+	return messageResult;
+}
+
+void Class538::openDoor() {
+	setFileHash(0x0C202B9C, 0, -1);
+	_newHashListIndex = -2;
+	setVisible(true);
+	_soundResource.play(calcHash("fxDoorOpen32"));
+}
+
+void Class538::closeDoor() {
+	setFileHash(0xC222A8D4, 0, -1);
+	_newHashListIndex = -2;
+	setVisible(true);
+	SetAnimationCallback3(&Class538::hide);
+	_soundResource.play(calcHash("fxDoorClose32"));
+}
+
+void Class538::hide() {
+	setFileHash1();
+	setVisible(false);
+}
+
+Class539::Class539(NeverhoodEngine *vm, Sprite *klayman)
+	: AnimatedSprite(vm, 1400), _klayman(klayman) {
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class539::handleMessage);
+	createSurface(1200, 88, 165);
+	setVisible(false);
+}
+
+uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		_x = _klayman->getX();
+		_y = _klayman->getY() - 132;
+		setFileHash(0x0422255A, 0, -1);
+		setVisible(true);
+		break;
+	case 0x3002:
+		setFileHash1();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2101::handleMessage);
+	SetUpdateHandler(&Scene2101::update);
+	
+	setBackground(0x44242305);
+	setPalette(0x44242305);
+	insertMouse433(0x4230144A);
+
+	insertStaticSprite(0x00502330, 1100);
+	_sprite1 = insertStaticSprite(0x78492010, 1100);
+	// TODO _class427 = insertSprite<Class427>(this, 0x72427010, 0x32423010, 200, 0);
+	_asTape1 = insertSprite<AsScene1201Tape>(this, 18, 1100, 412, 443, 0x9148A011);
+	_vm->_collisionMan->addSprite(_asTape1);
+	_asTape2 = insertSprite<AsScene1201Tape>(this, 11, 1100, 441, 443, 0x9148A011);
+	_vm->_collisionMan->addSprite(_asTape2);
+	
+	if (which < 0) {
+		insertKlayman<KmScene2101>(380, 438);
+		setMessageList(0x004B8E48);
+		sendMessage(this, 0x2000, 0);
+		_class538 = insertSprite<Class538>(false);
+		_value1 = 1;
+		_countdown1 = 0;
+	} else if (which == 1) {
+		insertKlayman<KmScene2101>(640, 438);
+		setMessageList(0x004B8E50);
+		sendMessage(this, 0x2000, 0);
+		_class538 = insertSprite<Class538>(true);
+		_value1 = 2;
+		_countdown1 = 48;
+	} else if (which == 2) {
+		insertKlayman<KmScene2101>(115, 438);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004B8F58);
+		sendMessage(this, 0x2000, 1);
+		_class538 = insertSprite<Class538>(false);
+		_value1 = 1;
+		_countdown1 = 0;
+	} else if (which == 3) {
+		insertKlayman<KmScene2101>(115, 438);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004B8EB0);
+		sendMessage(this, 0x2000, 1);
+		_class538 = insertSprite<Class538>(false);
+		_value1 = 1;
+		_countdown1 = 0;
+	} else {
+		insertKlayman<KmScene2101>(115, 438);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004B8EA0);
+		sendMessage(this, 0x2000, 1);
+		_class538 = insertSprite<Class538>(false);
+		_value1 = 1;
+		_countdown1 = 0;
+	}
+	
+	_class539 = insertSprite<Class539>(_klayman);
+	_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480);
+	
+}
+
+void Scene2101::update() {
+	if (_countdown1 != 0) {
+		if (_value1 == 2) {
+			if (--_countdown1 == 0) {
+				sendMessage(_class538, 0x4809, 0);
+				_value1 = 1;
+			}
+		} else {
+			if (_klayman->getX() > 575)
+				_messageListFlag  = false;
+			if (--_countdown1 == 0) {
+				if (_klayman->getX() < 480) {
+					sendMessage(_class538, 0x4809, 0);
+					_value1 = 1;
+				} else if (_klayman->getX() >= 480 && _klayman->getX() <= 575) {
+					_klayman->setDoDeltaX(0);
+					setMessageList2(0x004B8F48);
+					sendMessage(_class538, 0x4809, 0);
+					sendMessage(_class539, 0x2001, 0);
+					_value1 = 1;
+				}
+			}
+		}
+	} else if (_value1 == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) {
+		setMessageList2(0x004B8F50);
+	}
+	Scene::update();
+}
+
+uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02144CB1) {
+			sendEntityMessage(_klayman, 0x1014, _class427);
+		} else if (param.asInteger() == 0x21E64A00) {
+			if (_value1 == 0) {
+				setMessageList(0x004B8E80);
+			} else {
+				setMessageList(0x004B8EC8);
+			}
+		} else if (param.asInteger() == 0x41442820) {
+			messageList402220();
+		}
+		break;
+	case 0x2000:
+		if (param.asInteger() != 0) {
+			setRectList(0x004B9008);
+			_klayman->setKlaymanTable3();
+		} else {
+			setRectList(0x004B8FF8);
+			_klayman->setKlaymanTable1();
+		}
+		break;
+	case 0x480B:
+		if (sender == _class427 && _value1 == 1) {
+			sendMessage(_class538, 0x4808, 0);
+			_value1 = 0;
+			_countdown1 = 90;
+		}
+		break;
+	case 0x4826:
+		if (sender == _asTape1 || sender == _asTape2) {
+			if (_klayman->getX() >= 228 && _klayman->getX() <= 500) {
+				sendEntityMessage(_klayman, 0x1014, sender);
+				setMessageList(0x004B8F78);
+			} else if (_klayman->getX() < 228) {
+				setMessageList2(0x004B8F00);
+			}
+		}
+		break;
+	}
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h
new file mode 100644
index 0000000..3e7f579
--- /dev/null
+++ b/engines/neverhood/module2100.h
@@ -0,0 +1,81 @@
+/* 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_MODULE2100_H
+#define NEVERHOOD_MODULE2100_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class Module2100 : public Module {
+public:
+	Module2100(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2100();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createScene(int sceneNum, int which);
+	void updateScene();
+};
+
+// Scene1901
+
+class Class538 : public AnimatedSprite {
+public:
+	Class538(NeverhoodEngine *vm, bool flag);
+protected:
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void openDoor();
+	void closeDoor();
+	void hide();
+};
+
+class Class539 : public AnimatedSprite {
+public:
+	Class539(NeverhoodEngine *vm, Sprite *klayman);
+protected:
+	Sprite *_klayman;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2101 : public Scene {
+public:
+	Scene2101(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite1;
+	Sprite *_class427;
+	Sprite *_asTape1;
+	Sprite *_asTape2;
+	Sprite *_class538;
+	Sprite *_class539;
+	int _countdown1;
+	int _value1;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2100_H */


Commit: a7dcbd0f335023615acdcdef514e614bd6a40f76
    https://github.com/scummvm/scummvm/commit/a7dcbd0f335023615acdcdef514e614bd6a40f76
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add floor button ("Class429") to Scene2101

Changed paths:
    engines/neverhood/module2100.cpp
    engines/neverhood/module2100.h



diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index e07e990..fa0d111 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -156,6 +156,49 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
+Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash)
+	: StaticSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _countdown(0),
+	_fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) {
+
+	SetUpdateHandler(&Class427::update);
+	SetMessageHandler(&Class427::handleMessage);
+	if (_soundFileHash == 0)
+		_soundFileHash = 0x44141000;
+	createSurface(1010, 61, 30);
+	if (_fileHash1) {
+		load(_fileHash1, true, true);
+		StaticSprite::update();
+	} else
+		setVisible(false);
+}
+
+void Class427::update() {
+	if (_countdown != 0 && (--_countdown == 0)) {
+		sendMessage(_parentScene, 0x1022, 1010);
+		if (_fileHash1) {
+			load(_fileHash1, true, true);
+			StaticSprite::update();
+		} else
+			setVisible(false);
+	}
+}	
+	
+uint32 Class427::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x480B:
+		sendMessage(_parentScene, 0x480B, 0);
+		setVisible(true);
+		sendMessage(_parentScene, 0x1022, 990);
+		load(_fileHash2, true, true);
+		StaticSprite::update();
+		_countdown = 16;
+		_soundResource.play(_soundFileHash);
+		break;
+	}
+	return messageResult;
+}
+
 Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
@@ -169,7 +212,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertStaticSprite(0x00502330, 1100);
 	_sprite1 = insertStaticSprite(0x78492010, 1100);
-	// TODO _class427 = insertSprite<Class427>(this, 0x72427010, 0x32423010, 200, 0);
+	_class427 = insertSprite<Class427>(this, 0x72427010, 0x32423010, 200, 0);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 18, 1100, 412, 443, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape1);
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 11, 1100, 441, 443, 0x9148A011);
diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h
index 3e7f579..65846d7 100644
--- a/engines/neverhood/module2100.h
+++ b/engines/neverhood/module2100.h
@@ -60,6 +60,20 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Class427 : public StaticSprite {
+public:
+	Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 _soundFileHash;
+	uint32 _fileHash1, _fileHash2;
+	int16 _countdown;
+	void update();	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+
 class Scene2101 : public Scene {
 public:
 	Scene2101(NeverhoodEngine *vm, Module *parentModule, int which);


Commit: 8840c7481924b515032ed310bb999c3003c7dbf7
    https://github.com/scummvm/scummvm/commit/8840c7481924b515032ed310bb999c3003c7dbf7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:41-07:00

Commit Message:
NEVERHOOD: Add floor button to Scene1401

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1400.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7d463fb..2891bdd 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -286,10 +286,14 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 6;
 	createModule(1900, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 0;
 	createModule(2100, 3);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 0;
+	createModule(1400, -1);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 37fb354..8d42c7f 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/module1400.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module2100.h"
 #include "neverhood/module2200.h"
 #include "neverhood/diskplayerscene.h"
 #include "neverhood/gamemodule.h"
@@ -667,7 +668,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x08221FA5);
 	insertMouse433(0x21FA108A);
 	
-	// TODO _class427 = insertSprite<Class427>(this, 0x980F3124, 0x12192892, 100, 0);
+	_class427 = insertSprite<Class427>(this, 0x980F3124, 0x12192892, 100, 0);
 	_class525 = insertSprite<Class525>();
 
 	if (!getGlobalVar(0x01023818)) {


Commit: 9f599a7dfcc2175a8940eacce621f5a15d762314
    https://github.com/scummvm/scummvm/commit/9f599a7dfcc2175a8940eacce621f5a15d762314
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Start with Module2600 (missing Scene2609)

Changed paths:
  A engines/neverhood/module2600.cpp
  A engines/neverhood/module2600.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.mk



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 2891bdd..a1a1fc3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -37,6 +37,7 @@
 #include "neverhood/module2100.h"
 #include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
+#include "neverhood/module2600.h"
 #include "neverhood/module3000.h"
 
 namespace Neverhood {
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 9484e2e..2eefff9 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -25,6 +25,7 @@ MODULE_OBJS = \
 	module2100.o \
 	module2200.o \
 	module2300.o \
+	module2600.o \
 	module3000.o \
 	mouse.o \
 	navigationscene.o \
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
new file mode 100644
index 0000000..0217fe4
--- /dev/null
+++ b/engines/neverhood/module2600.cpp
@@ -0,0 +1,199 @@
+/* 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/module2600.h"
+
+namespace Neverhood {
+
+Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, -1);
+	} else if (which == 1) {
+		createScene(4, 1);
+	} else {
+		createScene(0, 1);
+	}
+
+	// TODO Sound1ChList_addSoundResources(0x40271018, dword_4B87E8, true);
+	// TODO Sound1ChList_setSoundValuesMulti(dword_4B87E8, true, 50, 600, 5, 150);
+	// TODO Sound1ChList_sub_407C70(0x40271018, 0x41861371, 0x43A2507F);
+
+}
+
+Module2600::~Module2600() {
+	// TODO Sound1ChList_sub_407A50(0x40271018);
+}
+
+void Module2600::createScene(int sceneNum, int which) {
+	debug("Module2600::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		createNavigationScene(0x004B8608, which);
+		break;
+	case 1:
+		createNavigationScene(0x004B8638, which);
+		break;
+	case 2:
+		createNavigationScene(0x004B86C8, which);
+		break;
+	case 3:
+		if (getGlobalVar(0x0A310817)) {
+			createNavigationScene(0x004B8758, which);
+		} else {
+			createNavigationScene(0x004B86F8, which);
+		}
+		break;
+	case 4:
+		createNavigationScene(0x004B87B8, which);
+		break;
+	case 6:
+		createNavigationScene(0x004B8698, which);
+		break;
+	case 7:
+		// TODO Sound1ChList_sub_407A50(0x40271018);
+		createSmackerScene(0x30090001, true, true, false);
+		break;
+	case 8:
+//TODO		_childObject = new Scene2609(_vm, this, which);
+		break;
+	case 1002:
+		if (getGlobalVar(0x40040831) == 1) {
+			createSmackerScene(0x018C0404, true, true, false);
+		} else if (getGlobalVar(0x40040831) == 2) {
+			createSmackerScene(0x018C0407, true, true, false);
+		} else {
+			createSmackerScene(0x818C0405, true, true, false);
+		}
+		if (getGlobalVar(0x40040831) >= 2) {
+			setGlobalVar(0x40040831, 0);
+		} else {
+			incGlobalVar(0x40040831, +1);
+		}
+		break;
+	case 1003:
+		createSmackerScene(0x001C0007, true, true, false);
+		break;
+	case 1006:
+		if (getGlobalVar(0x4E0BE910)) {
+			createSmackerScene(0x049A1181, true, true, false);
+		} else {
+			createSmackerScene(0x04981181, true, true, false);
+		}
+		break;
+	case 1008:
+		if (getGlobalVar(0x4E0BE910)) {
+			createSmackerScene(0x42B80941, true, true, false);
+		} else {
+			createSmackerScene(0x42980941, true, true, false);
+		}
+		break;
+	}
+	SetUpdateHandler(&Module2600::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2600::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(1, 3);
+			} else {
+				leaveModule(0);
+			}
+			break;
+		case 1:
+			if (_moduleResult == 0) {
+				createScene(6, 0);
+			} else if (_moduleResult == 1) {
+				createScene(0, 0);
+			} else if (_moduleResult == 2) {
+				createScene(2, 1);
+			} else if (_moduleResult == 3) {
+				createScene(3, 0);
+			}
+			break;
+		case 2:
+			if (_moduleResult == 0) {
+				createScene(1, 0);
+			} else if (_moduleResult == 1) {
+				createScene(1002, -1);
+			}
+			break;
+		case 3:
+			if (_moduleResult == 0) {
+				if (getGlobalVar(0x0A310817)) {
+					createScene(4, 0);
+				} else {
+					createScene(1003, -1);
+				}
+			} else if (_moduleResult == 2) {
+				createScene(1, 1);
+			} else if (_moduleResult == 3) {
+				if (getGlobalVar(0x0A310817)) {
+					createScene(4, 0);
+				} else {
+					setGlobalVar(0x0A310817, 1);
+					createScene(7, -1);
+				}
+			}
+			break;
+		case 4:
+			if (_moduleResult == 0) {
+				leaveModule(1);
+			} else {
+				createScene(3, 1);
+			}
+			break;
+		case 6:
+			if (_moduleResult == 0) {
+				createScene(1006, -1);
+			} else if (_moduleResult == 1) {
+				createScene(1, 2);
+			}
+			break;
+		case 7:
+			leaveModule(0);
+			break;
+		case 8:
+			createScene(1008, -1);
+			break;
+		case 1002:
+			createScene(2, 1);
+			break;
+		case 1003:
+			createScene(3, 0);
+			break;
+		case 1006:
+			createScene(8, -1);
+			break;
+		case 1008:
+			createScene(6, 0);
+			break;
+		}
+	}
+}
+			
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h
new file mode 100644
index 0000000..66ee360
--- /dev/null
+++ b/engines/neverhood/module2600.h
@@ -0,0 +1,45 @@
+/* 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_MODULE2600_H
+#define NEVERHOOD_MODULE2600_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module2600
+
+class Module2600 : public Module {
+public:
+	Module2600(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2600();
+protected:
+	void createScene(int sceneNum, int which);
+	void updateScene();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2600_H */


Commit: 28be9f6f4bb8db60b69bb22e72187dfa80357d9f
    https://github.com/scummvm/scummvm/commit/28be9f6f4bb8db60b69bb22e72187dfa80357d9f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Add Scene2609 and hook Module2600 to the GameModule

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2600.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index a1a1fc3..fa0af07 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -292,8 +292,8 @@ void GameModule::startup() {
 	createModule(2100, 3);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 0;
-	createModule(1400, -1);
+	_vm->gameState().sceneNum = 8;
+	createModule(2600, -1);
 #endif
 }
 
@@ -358,6 +358,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x1A214010);
 		_childObject = new Module2300(_vm, this, which);
 		break;
+	case 2600:
+		setGlobalVar(0x91080831, 0x40271018);
+		_childObject = new Module2600(_vm, this, which);
+		break;
 	case 3000:
 		setGlobalVar(0x91080831, 0x81293110);
 		_childObject = new Module3000(_vm, this, which);
@@ -465,6 +469,13 @@ void GameModule::updateModule() {
 				createModule(1000, 1);
 			}
 			break;
+		case 2600:
+			if (_moduleResult == 1) {
+				createModule(2500, 0);
+			} else {
+				createModule(1200, 1);
+			}
+			break;
 		case 3000:
 			if (_moduleResult == 1) {
 				createModule(1900, 0);
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 0217fe4..0163e97 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -76,7 +76,7 @@ void Module2600::createScene(int sceneNum, int which) {
 		createSmackerScene(0x30090001, true, true, false);
 		break;
 	case 8:
-//TODO		_childObject = new Scene2609(_vm, this, which);
+		_childObject = new Scene2609(_vm, this, which);
 		break;
 	case 1002:
 		if (getGlobalVar(0x40040831) == 1) {
@@ -196,4 +196,138 @@ void Module2600::updateScene() {
 	}
 }
 			
+SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
+	: StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm),
+	_soundResource3(vm), _soundResource4(vm), _parentScene(parentScene),
+	_countdown(0) {
+	
+	_spriteResource.load2(0x825A6923);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	if (!getGlobalVar(0x4E0BE910))
+		setVisible(false);
+
+	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_deltaRect = _drawRect;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	processDelta();
+	_needRefresh = true;
+
+	_soundResource1.load(0x10267160);
+	_soundResource2.load(0x7027FD64);
+	_soundResource3.load(0x44043000);
+	_soundResource4.load(0x44045000);
+
+	SetUpdateHandler(&SsScene2609Button::update);
+	SetMessageHandler(&SsScene2609Button::handleMessage);
+
+}
+
+void SsScene2609Button::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown == 0)) {
+		if (getGlobalVar(0x4E0BE910)) {
+			setGlobalVar(0x4E0BE910, 0);
+			sendMessage(_parentScene, 0x2001, 0);
+		} else {
+			setGlobalVar(0x4E0BE910, 1);
+			sendMessage(_parentScene, 0x2002, 0);
+		}
+	}
+}
+
+uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0) {
+			sendMessage(_parentScene, 0x2000, 0);
+			if (getGlobalVar(0x4E0BE910)) {
+				setVisible(false);
+				_soundResource4.play();
+				_soundResource2.play();
+				_countdown = 12;
+			} else {
+				setVisible(true);
+				_soundResource3.play();
+				_soundResource1.play();
+				_countdown = 96;
+			}
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1000) {
+	
+	_x = 240;
+	_y = 420;
+	setDoDeltaX(1);
+	createSurface1(0x9C210C90, 1200);
+	setClipRect(260, 260, 400, 368);
+	// TODO Sound1ChList_addSoundResource(0xDC2769B0, true);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2609Water::handleMessage);
+	if (getGlobalVar(0x4E0BE910))
+		sendMessage(this, 0x2002, 0);
+}
+
+uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2001:
+		setFileHash1();
+		setVisible(false);
+		// TODO Sound1ChList_stop(0xDC2769B0);
+		break;
+	case 0x2002:
+		setFileHash(0x9C210C90, 0, -1);
+		setVisible(true);
+		// TODO Sound1ChList_playLooping(0xDC2769B0);
+		break;
+	}
+	return messageResult;
+}
+
+Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _isBusy(false) {
+	
+	_surfaceFlag = true;
+	setBackground(0x51409A16);
+	setPalette(0x51409A16);
+	_asWater = insertSprite<AsScene2609Water>();
+	_ssButton = insertSprite<SsScene2609Button>(this);
+	_vm->_collisionMan->addSprite(_ssButton);
+	insertMouse435(0x09A1251C, 20, 620);
+	insertStaticSprite(0x02138002, 1200);
+	insertStaticSprite(0x825E2827, 1200);
+	SetMessageHandler(&Scene2609::handleMessage);
+	SetUpdateHandler(&Scene::update);
+}
+
+uint32 Scene2609::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isBusy)
+			leaveScene(0);
+		break;
+	case 0x2000:
+		_isBusy = true;
+		break;
+	case 0x2001:
+		_isBusy = false;
+		sendMessage(_asWater, 0x2001, 0);
+		break;
+	case 0x2002:
+		_isBusy = false;
+		sendMessage(_asWater, 0x2002, 0);
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h
index 66ee360..d6580a6 100644
--- a/engines/neverhood/module2600.h
+++ b/engines/neverhood/module2600.h
@@ -40,6 +40,37 @@ protected:
 	void updateScene();
 };
 
+class SsScene2609Button : public StaticSprite {
+public:
+	SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2609Water : public AnimatedSprite {
+public:
+	AsScene2609Water(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2609 : public Scene {
+public:
+	Scene2609(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	bool _isBusy;
+	Sprite *_asWater;
+	Sprite *_ssButton;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2600_H */


Commit: 770689b2f1c998d637f122c524412639debfed07
    https://github.com/scummvm/scummvm/commit/770689b2f1c998d637f122c524412639debfed07
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Start with Module2700 (doesn't do anything yet)

Changed paths:
  A engines/neverhood/module2700.cpp
  A engines/neverhood/module2700.h
    engines/neverhood/module.mk



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 2eefff9..adf58b1 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -26,6 +26,7 @@ MODULE_OBJS = \
 	module2200.o \
 	module2300.o \
 	module2600.o \
+	module2700.o \
 	module3000.o \
 	mouse.o \
 	navigationscene.o \
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
new file mode 100644
index 0000000..83b1d90
--- /dev/null
+++ b/engines/neverhood/module2700.cpp
@@ -0,0 +1,333 @@
+/* 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/module2700.h"
+#include "neverhood/gamemodule.h"
+#include "neverhood/module1000.h"
+
+namespace Neverhood {
+
+static const NRect kScene2710ClipRect = NRect(0, 0, 626, 480);
+
+static const uint32 kScene2710StaticSprites[] = {
+	0x0D2016C0,
+	0
+};
+
+static const NRect kScene2711ClipRect = NRect(0, 0, 521, 480);
+
+static const uint32 kScene2711FileHashes1[] = {
+	0,
+	0x100801A1,
+	0x201081A0,
+	0x006800A4,
+	0x40390120,
+	0x000001B1,
+	0x001000A1,
+	0
+};
+
+static const uint32 kScene2711FileHashes2[] = {
+	0,
+	0x40403308,
+	0x71403168,
+	0x80423928,
+	0x224131A8,
+	0x50401328,
+	0x70423328,
+	0
+};
+
+static const uint32 kScene2711FileHashes3[] = {
+	0,
+	0x1088A021,
+	0x108120E5,
+	0x18A02321,
+	0x148221A9,
+	0x10082061,
+	0x188820E1,
+	0
+};
+
+static const NRect kScene2724ClipRect = NRect(0, 141, 640, 480);
+
+static const uint32 kScene2724StaticSprites[] = {
+	0xC20D00A5,
+	0
+};
+
+static const NRect kScene2725ClipRect = NRect(0, 0, 640, 413);
+
+static const uint32 kScene2725StaticSprites[] = {
+	0xC20E00A5,
+	0
+};
+
+Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
+	_soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) {
+	
+	// TODO Music18hList_add(0x42212411, 0x04020210);
+	// TODO Music18hList_play(0x04020210, 24, 2, 1);
+	SetMessageHandler(&Module2700::handleMessage);
+
+
+	if (which < 0) {
+		which = _vm->gameState().which;
+		if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31)
+			which = -1;
+		createScene(_vm->gameState().sceneNum, which);
+	} else {
+		createScene(0, 0);
+	}
+
+	_soundResource1.load(0x00880CCC);
+	_soundResource2.load(0x00880CC0);
+	_soundResource3.load(0x00880CCC);
+	_soundResource4.load(0x00880CC0);
+
+}
+
+Module2700::~Module2700() {
+	// TODO Sound1ChList_sub_407A50(0x42212411);
+}
+
+void Module2700::createScene(int sceneNum, int which) {
+	debug("Module2700::createScene(%d, %d)", sceneNum, which);
+	if (sceneNum != 30 && sceneNum != 31)
+		_vm->gameState().which = which;
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+//TODO		_childObject = new Scene2701(_vm, this, which);
+		break;
+	case 1:
+//TODO		_childObject = new Scene2702(_vm, this, which);
+		break;
+	case 2:
+		if (which == 6 || which == 7)
+			createScene2703(which, 0x004B1710);
+		else if (which == 4 || which == 5)
+			createScene2703(which, 0x004B1738);
+		else if (which == 2 || which == 3)
+			createScene2703(which, 0x004B1760);
+		else
+			createScene2703(which, 0x004B1788);
+		break;
+	case 3:
+		createScene2704(which, 0x004B17B0, 150);
+		break;
+	case 4:
+		createScene2704(which, 0x004B17D8, 150);
+		break;
+	case 5:
+		if (which >= 4) {
+//TODO		_childObject = new Scene2706(_vm, this, which);
+		} else if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1828, 150);
+		} else {
+			createScene2704(which, 0x004B1800, 150);
+		}
+		break;
+	case 6:
+		createScene2704(which, 0x004B1850, 150);
+		break;
+	case 7:
+		if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1878, 150);
+		} else {
+			createScene2704(which, 0x004B18A0, 150);
+		}
+		break;
+	case 8:
+		if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B18C8, 150);
+		} else {
+			createScene2704(which, 0x004B18F0, 150);
+		}
+		break;
+	case 9:
+		createScene2704(which, 0x004B18F0, 150, kScene2710StaticSprites, &kScene2710ClipRect);
+		break;
+	case 10:
+		// TODO _vm->gameModule()->initScene2808Vars2();
+		_scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(0x40005834, 2)];
+		_scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(0x40005834, 1)];
+		_scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(0x40005834, 0)];
+		_scene2711StaticSprites[3] = 0x0261282E;
+		_scene2711StaticSprites[4] = 0x9608E5A0;
+		_scene2711StaticSprites[5] = 0;
+		createScene2704(which, 0x004B1950, 150, _scene2711StaticSprites, &kScene2711ClipRect);
+		break;
+	case 11:
+		createScene2704(which, 0x004B19E0, 150);
+		break;
+	case 12:
+		createScene2704(which, 0x004B1A08, 150);
+		break;
+	case 13:
+		createScene2704(which, 0x004B1A30, 150);
+		break;
+	case 14:
+		if (which == 4 || which == 5) {
+			createScene2704(which, 0x004B1A58, 150);
+		} else if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1A80, 150);
+		} else {
+			createScene2704(which, 0x004B1AA8, 150);
+		}
+		break;
+	case 15:
+		if (which == 4 || which == 5) {
+			createScene2704(which, 0x004B1AD0, 150);
+		} else if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1AF8, 150);
+		} else {
+			createScene2704(which, 0x004B1B20, 150);
+		}
+		break;
+	case 16:
+		if (which == 4 || which == 5) {
+			createScene2704(which, 0x004B1B48, 150);
+		} else if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1B70, 150);
+		} else {
+			createScene2704(which, 0x004B1B98, 150);
+		}
+		break;
+	case 17:
+		if (which == 4 || which == 5) {
+			createScene2704(which, 0x004B1BC0, 150);
+		} else if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1BE8, 150);
+		} else {
+			createScene2704(which, 0x004B1C10, 150);
+		}
+		break;
+	case 18:
+		if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1C38, 150);
+		} else {
+			createScene2704(which, 0x004B1C60, 150);
+		}
+		break;
+	case 19:
+		if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1CB0, 150);
+		} else {
+			createScene2704(which, 0x004B1C88, 150);
+		}
+		break;
+	case 20:
+		if (which == 2 || which == 3) {
+			createScene2704(which, 0x004B1CD8, 150);
+		} else {
+			createScene2704(which, 0x004B1D00, 150);
+		}
+		break;
+	case 21:
+		createScene2704(which, 0x004B1D28, 150);
+		break;
+	case 22:
+		createScene2704(which, 0x004B1D50, 150);
+		break;
+	case 23:
+		createScene2704(which, 0x004B1D78, 150, kScene2724StaticSprites, &kScene2724ClipRect);
+		break;
+	case 24:
+		createScene2704(which, 0x004B1DB0, 150, kScene2725StaticSprites, &kScene2725ClipRect);
+		break;
+	case 25:
+		createScene2704(which, 0x004B1DE8, 150);
+		break;
+	case 26:
+		createScene2704(which, 0x004B1E10, 150);
+		break;
+	case 27:
+		createScene2704(which, 0x004B1E38, 150);
+		break;
+	case 28:
+		createScene2704(which, 0x004B1E60, 150);
+		break;
+	case 30:
+		_childObject = new Class152(_vm, this, 0x09507248, 0x0724C09D);
+		break;
+	case 31:
+//TODO		_childObject = new Scene2732(_vm, this, which);
+		break;
+	}
+	SetUpdateHandler(&Module2700::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2700::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1) {
+				createScene(1, 3);
+			} else {
+				leaveModule(0);
+			}
+			break;
+		}
+	}
+}
+
+void Module2700::update() {
+}
+
+uint32 Module2700::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x200D:
+		switch (_soundIndex) {
+		case 0:
+			_soundResource1.play();
+			break;
+		case 1:
+			_soundResource2.play();
+			break;
+		case 2:
+			_soundResource3.play();
+			break;
+		case 3:
+			_soundResource4.play();
+			break;
+		}
+		_soundIndex++;
+		if (_soundIndex >= 4)
+			_soundIndex = 0;
+		break;
+	}
+	return messageResult;
+}
+			
+void Module2700::createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites, const NRect *clipRect) {
+	// TODO
+}
+
+void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
+	// TODO
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
new file mode 100644
index 0000000..a0f424e
--- /dev/null
+++ b/engines/neverhood/module2700.h
@@ -0,0 +1,56 @@
+/* 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_MODULE2700_H
+#define NEVERHOOD_MODULE2700_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module2700
+
+class Module2700 : public Module {
+public:
+	Module2700(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2700();
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	int _soundIndex;
+	bool _flag1;
+	uint32 _scene2711StaticSprites[6];
+	void createScene(int sceneNum, int which);
+	void updateScene();
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
+	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2700_H */


Commit: ee1bf85456c380c4fd01fb749e6f009a5c0c2147
    https://github.com/scummvm/scummvm/commit/ee1bf85456c380c4fd01fb749e6f009a5c0c2147
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Add new SceneInfo2700 structure and some tables using it for Module2700

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 2d11931..33b5a3e 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -277,6 +277,54 @@ struct SceneInfo140Item {
 
 };
 
+struct SceneInfo2700Item {
+	uint32 id;
+	uint32 bgFilename;
+	uint32 class437Filename;
+	uint32 dataResourceFilename;
+	uint32 pointListName;
+	uint32 rectListName;
+	uint32 exPaletteFilename2;
+	uint32 exPaletteFilename1;
+	uint32 mouseCursorFilename;
+	int16 which1;
+	int16 which2;
+	uint32 field24;
+
+	void load(uint32 offset) {
+		byte *item = getData(offset);
+		id = offset;
+		// Only save the hashes instead of the full names
+		bgFilename = calcHash(getStringP(READ_LE_UINT32(item + 0)));
+		class437Filename = calcHash(getStringP(READ_LE_UINT32(item + 4)));
+		dataResourceFilename = calcHash(getStringP(READ_LE_UINT32(item + 8)));
+		pointListName = calcHash(getStringP(READ_LE_UINT32(item + 12)));
+		rectListName = calcHash(getStringP(READ_LE_UINT32(item + 16)));
+		exPaletteFilename2 = calcHash(getStringP(READ_LE_UINT32(item + 20)));
+		exPaletteFilename1 = calcHash(getStringP(READ_LE_UINT32(item + 24)));
+		mouseCursorFilename = calcHash(getStringP(READ_LE_UINT32(item + 28)));
+		which1 = READ_LE_UINT16(item + 32);
+		which2 = READ_LE_UINT16(item + 34);
+		field24 = READ_LE_UINT16(item + 36);
+	}
+
+	void save(FILE *fd) {
+		writeUint32LE(fd, id);
+		writeUint32LE(fd, bgFilename);
+		writeUint32LE(fd, class437Filename);
+		writeUint32LE(fd, dataResourceFilename);
+		writeUint32LE(fd, pointListName);
+		writeUint32LE(fd, rectListName);
+		writeUint32LE(fd, exPaletteFilename2);
+		writeUint32LE(fd, exPaletteFilename1);
+		writeUint32LE(fd, mouseCursorFilename);
+		writeUint16LE(fd, which1);
+		writeUint16LE(fd, which2);
+		writeUint32LE(fd, field24);
+	}
+
+};
+
 template<class ITEMCLASS>
 class StaticDataList {
 public:
@@ -456,6 +504,7 @@ StaticDataListVector<RectList> rectLists;
 StaticDataListVector<MessageList> messageLists;
 StaticDataListVector<NavigationList> navigationLists;
 StaticDataVector<SceneInfo140Item> sceneInfo140Items; 
+StaticDataVector<SceneInfo2700Item> sceneInfo2700Items; 
 
 void addMessageList(uint32 messageListCount, uint32 messageListOffset) {
 	MessageList *messageList = new MessageList();
@@ -474,6 +523,7 @@ int main(int argc, char *argv[]) {
 	messageLists.loadListVector(messageListOffsets);
 	navigationLists.loadListVector(navigationListOffsets);
 	sceneInfo140Items.loadVector(sceneInfo140Offsets);
+	sceneInfo2700Items.loadVector(sceneInfo2700Offsets);
 	    
 	datFile = fopen("neverhood.dat", "wb");
 
@@ -485,6 +535,7 @@ int main(int argc, char *argv[]) {
 	hitRectLists.saveListVector(datFile);
 	navigationLists.saveListVector(datFile);
 	sceneInfo140Items.saveVector(datFile);
+	sceneInfo2700Items.saveVector(datFile);
 
 	fclose(datFile);
 
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index f0308bd..51954f8 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -420,6 +420,14 @@ static const uint32 navigationListOffsets[] = {
 	// Module2000
 	3, 0x004B7B48,
 	3, 0x004B7B00,
+	// Module2600
+	2, 0x004B8608,
+	4, 0x004B8638,
+	2, 0x004B8698,
+	2, 0x004B86C8,
+	4, 0x004B8758,
+	4, 0x004B86F8,
+	2, 0x004B87B8,
 	// Module3000
 	2, 0x004B7C80,
 	2, 0x004B7CE0,
@@ -478,3 +486,56 @@ static const uint32 sceneInfo140Offsets[] = {
 	0
 };
 
+static const uint32 sceneInfo2700Offsets[] = {
+	//
+	0x004B1710,
+	0x004B1738,
+	0x004B1760,
+	0x004B1788,
+	0x004B17B0,
+	0x004B17D8,
+	0x004B1800,
+	0x004B1828,
+	0x004B1850,
+	0x004B1878,
+	0x004B18A0,
+	0x004B18C8,
+	0x004B18F0,
+	0x004B1918,
+	//
+	0x004B19E0,
+	0x004B1A08,
+	0x004B1A30,
+	0x004B1A58,
+	0x004B1A80,
+	0x004B1AA8,
+	0x004B1AD0,
+	0x004B1AF8,
+	0x004B1B20,
+	0x004B1B48,
+	0x004B1B70,
+	0x004B1B98,
+	0x004B1BC0,
+	0x004B1BE8,
+	0x004B1C10,
+	0x004B1C38,
+	0x004B1C60,
+	0x004B1C88,
+	0x004B1CB0,
+	0x004B1CD8,
+	0x004B1D00,
+	0x004B1D28,
+	0x004B1D50,
+	0x004B1D78,
+	//
+	0x004B1DB0,
+	//
+	0x004B1DE8,
+	0x004B1E10,
+	0x004B1E38,
+	0x004B1E60,
+	//
+	0x004B1950,
+	//
+	0
+};
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 72e8133..7063311 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: e7673ffdc63f4d0a9b7b6f39161c3150537f3cd6
    https://github.com/scummvm/scummvm/commit/e7673ffdc63f4d0a9b7b6f39161c3150537f3cd6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Updated dat

Changed paths:
    dists/engine-data/neverhood.dat



diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 7063311..b97c5a4 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: aa789ee02bf55828fb8f0bfa9aa1efe0ecb44310
    https://github.com/scummvm/scummvm/commit/aa789ee02bf55828fb8f0bfa9aa1efe0ecb44310
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: More work in Module2700

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index fa0af07..9bdaa86 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -38,6 +38,7 @@
 #include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
 #include "neverhood/module2600.h"
+#include "neverhood/module2700.h"
 #include "neverhood/module3000.h"
 
 namespace Neverhood {
@@ -291,10 +292,15 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(2100, 3);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 8;
 	createModule(2600, -1);
 #endif
+#if 1
+	_vm->gameState().which = 0;
+	_vm->gameState().sceneNum = 5;
+	createModule(2700, -1);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
@@ -362,6 +368,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x40271018);
 		_childObject = new Module2600(_vm, this, which);
 		break;
+	case 2700:
+		setGlobalVar(0x91080831, 0x42212411);
+		_childObject = new Module2700(_vm, this, which);
+		break;
 	case 3000:
 		setGlobalVar(0x91080831, 0x81293110);
 		_childObject = new Module3000(_vm, this, which);
@@ -476,6 +486,9 @@ void GameModule::updateModule() {
 				createModule(1200, 1);
 			}
 			break;
+		case 2700:
+			createModule(1800, 2);
+			break;
 		case 3000:
 			if (_moduleResult == 1) {
 				createModule(1900, 0);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 97729cb..ff0afa6 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -396,6 +396,8 @@ void Module2200::updateScene() {
 		}
 	}
 }
+
+#undef HallOfRecordsSceneLink
 			
 // Scene2201
 
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 83b1d90..f5dc078 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -166,7 +166,7 @@ void Module2700::createScene(int sceneNum, int which) {
 		}
 		break;
 	case 9:
-		createScene2704(which, 0x004B18F0, 150, kScene2710StaticSprites, &kScene2710ClipRect);
+		createScene2704(which, 0x004B1918, 150, kScene2710StaticSprites, &kScene2710ClipRect);
 		break;
 	case 10:
 		// TODO _vm->gameModule()->initScene2808Vars2();
@@ -279,14 +279,196 @@ void Module2700::createScene(int sceneNum, int which) {
 	_childObject->handleUpdate();
 }
 
+#define SceneLinkIf(moduleResult, sceneNum, which) \
+	if (_moduleResult == moduleResult) { createScene(sceneNum, which); break; }
+
 void Module2700::updateScene() {
 	if (!updateChild()) {
+	
+		debug("sceneNum = %d; _moduleResult = %d", _vm->gameState().sceneNum, _moduleResult);
+	
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
-				createScene(1, 3);
-			} else {
-				leaveModule(0);
+			SceneLinkIf(1, 1, 0);
+			leaveModule(0);
+			break;
+		case 1:
+			SceneLinkIf(1, 14, 1);
+			SceneLinkIf(2,  2, 2);
+			SceneLinkIf(3, 14, 3);
+			SceneLinkIf(4,  2, 6);
+			SceneLinkIf(5,  2, 4);
+			createScene(0, 1);
+			break;
+		case 2:
+			SceneLinkIf(1,  5, 0);
+			SceneLinkIf(2,  1, 2);
+			SceneLinkIf(3,  5, 2);
+			SceneLinkIf(4,  1, 5);
+			SceneLinkIf(5,  5, 4);
+			SceneLinkIf(6,  1, 4);
+			SceneLinkIf(7, 11, 0);
+			createScene(3, 0);
+			break;
+		case 3:
+			createScene(2, 0);
+			break;
+		case 4:
+			SceneLinkIf(1, 7, 2);
+			createScene(5, 5);
+			break;
+		case 5:
+			SceneLinkIf(1, 6, 0);
+			SceneLinkIf(2, 2, 3);
+			SceneLinkIf(3, 8, 2);
+			SceneLinkIf(4, 2, 5);
+			SceneLinkIf(5, 4, 0);
+			SceneLinkIf(6, 7, 0);
+			createScene(2, 1);
+			break;
+		case 6:
+			SceneLinkIf(1, 8, 0);
+			createScene(5, 1);
+			break;
+		case 7:
+			SceneLinkIf(1, 8, 3);
+			SceneLinkIf(2, 4, 1);
+			SceneLinkIf(3, 9, 0);
+			createScene(5, 6);
+			break;
+		case 8:
+			SceneLinkIf(1, 10, 0);
+			SceneLinkIf(2,  5, 3);
+			SceneLinkIf(3,  7, 1);
+			createScene(6, 1);
+			break;
+		case 9:
+			SceneLinkIf(1, 10, 1);
+			createScene(7, 3);
+			break;
+		case 10:
+			SceneLinkIf(1, 9, 1);
+			createScene(8, 1);
+			break;
+		case 11:
+			SceneLinkIf(1, 12, 0);
+			createScene(2, 7);
+			break;
+		case 12:
+			SceneLinkIf(1, 13, 0);
+			createScene(11, 1);
+			break;
+		case 13:
+			SceneLinkIf(1, 30, 0);
+			createScene(12, 1);
+			break;
+		case 14:
+			SceneLinkIf(1, 1, 1);
+			SceneLinkIf(2, 15, 3);
+			SceneLinkIf(3, 1, 3);
+			SceneLinkIf(4, 15, 5);
+			SceneLinkIf(5, 22, 0);
+			createScene(15, 1);
+			break;
+		case 15:
+			SceneLinkIf(1, 14, 0);
+			SceneLinkIf(2, 16, 3);
+			SceneLinkIf(3, 14, 2);
+			SceneLinkIf(4, 16, 5);
+			SceneLinkIf(5, 14, 4);
+			createScene(16, 1);
+			break;
+		case 16:
+			SceneLinkIf(1, 15, 0);
+			SceneLinkIf(2, 17, 3);
+			SceneLinkIf(3, 15, 2);
+			SceneLinkIf(4, 17, 5);
+			SceneLinkIf(5, 15, 4);
+			createScene(17, 1);
+			break;
+		case 17:
+			SceneLinkIf(1, 16, 0);
+			SceneLinkIf(2, 18, 3);
+			SceneLinkIf(3, 16, 2);
+			SceneLinkIf(4, 20, 1);
+			SceneLinkIf(5, 16, 4);
+			createScene(18, 1);
+			break;
+		case 18:
+			SceneLinkIf(1, 17, 0);
+			SceneLinkIf(2, 19, 2);
+			SceneLinkIf(3, 17, 2);
+			createScene(19, 0);
+			break;
+		case 19:
+			SceneLinkIf(1, 20, 2);
+			SceneLinkIf(2, 18, 2);
+			SceneLinkIf(3, 20, 0);
+			createScene(18, 0);
+			break;
+		case 20:
+			SceneLinkIf(1, 17, 4);
+			SceneLinkIf(2, 19, 1);
+			SceneLinkIf(3, 21, 0);
+			createScene(19, 3);
+			break;
+		case 21:
+			// TODO? GameState_sub_469C50(&field_52, 0);
+			// TODO MusicMan_stopAll (if field_52 above = 1)
+			// TODO Music18hList_delete(_musicFileHash);
+			// TODO Music18hList_play(0x04020210, 0, 2, 1);
+			// TODO Sound1ChList_sub_407AF0(0x42212411);
+			createScene(20, 3);
+			break;
+		case 22:
+			SceneLinkIf(1, 23, 0);
+			createScene(14, 5);
+			break;
+		case 23:
+			SceneLinkIf(1, 24, 0);
+			createScene(22, 1);
+			break;
+		case 24:
+			SceneLinkIf(1, 25, 0);
+			createScene(23, 1);
+			break;
+		case 25:
+			SceneLinkIf(1, 26, 0);
+			createScene(24, 1);
+			break;
+		case 26:
+			SceneLinkIf(1, 27, 0);
+			createScene(25, 1);
+			break;
+		case 27:
+			SceneLinkIf(1, 28, 0);
+			createScene(26, 1);
+			break;
+		case 28:
+			SceneLinkIf(1, 31, 0);
+			createScene(27, 1);
+			break;
+		case 29:
+			createScene(13, 1);
+			break;
+		case 30:
+			createScene(28, 1);
+			break;
+		}
+	} else {
+		switch (_vm->gameState().sceneNum) {
+		case 21:
+			if (!_flag1) {
+				// TODO Music18hList_stop(0x04020210, 0, 1);
+				// TODO _vm->gameModule()->initScene2801Vars();
+				_musicFileHash = getGlobalVar(0x89A82A15);
+				// TODO? GameState_sub_469C50(&field_52, 0);
+				// TODO MusicMan_create();
+				// TODO Music18hList_add2(0x42212411, _musicFileHash);
+				// TODO Music18hList_play2(_musicFileHash, 0, /*TODO */???, 1);
+				// TODO Sound1ChList_addSoundResource(0x42212411, 0x44014282, true);
+				// TODO Sound1ChList_setSoundValues(0x44014282, true, 120, 360, 72, 0);
+				_flag1 = true;
 			}
 			break;
 		}
@@ -294,6 +476,7 @@ void Module2700::updateScene() {
 }
 
 void Module2700::update() {
+
 }
 
 uint32 Module2700::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -327,7 +510,113 @@ void Module2700::createScene2703(int which, uint32 sceneInfoId, const uint32 *st
 }
 
 void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
-	// TODO
+	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
+}
+
+Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
+	const uint32 *staticSprites, const NRect *clipRect)
+	: Scene(vm, parentModule, true) {
+
+	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2704::handleMessage);
+	SetUpdateHandler(&Scene2704::update);
+	
+	setBackground(sceneInfo->bgFilename);
+	setPalette(sceneInfo->bgFilename);
+	
+	if (sceneInfo->exPaletteFilename1)
+		_palette->addPalette(sceneInfo->exPaletteFilename1, 0, 65, 0);
+	
+	if (sceneInfo->exPaletteFilename2)
+		_palette->addPalette(sceneInfo->exPaletteFilename2, 65, 31, 65);
+	
+	while (staticSprites && *staticSprites)
+		insertStaticSprite(*staticSprites++, 1100);
+
+	insertMouse433(sceneInfo->mouseCursorFilename);
+	
+	if (sceneInfo->class437Filename) {
+//TODO		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
+		_class521 = insertSprite<Class521>(this, 320, 240);
+//TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+//TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+//TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	} else {
+//TODO		_class437 = NULL;
+//TODO		_class517 = NULL;
+		_class521 = insertSprite<Class521>(this, 320, 240);
+	}
+
+//TODO	_class518 = insertSprite<Class518>(_class521);
+	
+	_which1 = sceneInfo->which1;
+	_which2 = sceneInfo->which2;
+
+	_dataResource.load(sceneInfo->dataResourceFilename);
+	_pointList = _dataResource.getPointArray(sceneInfo->pointListName);
+	_class521->setPathPoints(_pointList);
+	
+	if (sceneInfo->rectListName) {
+		_rectList = _dataResource.getRectArray(sceneInfo->rectListName);
+		// TODO _class521->setPathRects(_rectList);
+	}
+
+	if (which == _which2) {
+		NPoint testPoint = (*_pointList)[_pointList->size() - 1];
+		sendMessage(_class521, 0x2002, _pointList->size() - 1);
+		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
+			sendMessage(_class521, 0x2009, 0);
+		else
+			sendMessage(_class521, 0x2007, 0);
+	} else {
+		NPoint testPoint = (*_pointList)[0];
+		sendMessage(_class521, 0x2002, 0);
+		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
+			sendMessage(_class521, 0x2009, 0);
+		else
+			sendMessage(_class521, 0x2008, 0);
+	}
+	
+	if (clipRect) {
+		_class521->getClipRect() = *clipRect;
+		if (_class517)
+			_class517->getClipRect() = *clipRect; 
+		if (_class520)
+			_class520->getClipRect() = *clipRect; 
+		if (_class519)
+			_class519->getClipRect() = *clipRect; 
+		if (_class518)
+			_class518->getClipRect() = *clipRect; 
+	}
+
+}
+		
+void Scene2704::update() {
+	Scene::update();
+	if (_mouseClicked) {
+		sendPointMessage(_class521, 0x2004, _mouseClickPos);
+		_mouseClicked = false;
+	}
+}
+
+uint32 Scene2704::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2005:
+		if (_which1 >= 0)
+			leaveScene(_which1);
+		break;
+	case 0x2006:
+		if (_which2 >= 0)
+			leaveScene(_which2);
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index a0f424e..4df284c 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -26,6 +26,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/module1600.h"
 
 namespace Neverhood {
 
@@ -43,6 +44,7 @@ protected:
 	int _soundIndex;
 	bool _flag1;
 	uint32 _scene2711StaticSprites[6];
+	uint32 _musicFileHash;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	void update();
@@ -51,6 +53,19 @@ protected:
 	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
+class Scene2704 : public Scene {
+public:
+	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
+		const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
+protected:
+	Class521 *_class521;
+	int _which1, _which2;
+	NPointArray *_pointList;
+	NRectArray *_rectList;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2700_H */
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index ef8e532..9678031 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -601,6 +601,13 @@ NPointArray *DataResource::getPointArray(uint32 nameHash) {
 	return NULL;
 }
 
+NRectArray *DataResource::getRectArray(uint32 nameHash) {
+	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 3);
+	if (drDirectoryItem)
+		return _rectArrays[drDirectoryItem->offset];
+	return NULL;
+}
+
 HitRectList *DataResource::getHitRectList() {
 	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(calcHash("HitArray"), 3);
 	if (drDirectoryItem)
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index f8d282c..6436509 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -154,6 +154,7 @@ public:
 	void unload();
 	NPoint getPoint(uint32 nameHash);
 	NPointArray *getPointArray(uint32 nameHash);
+	NRectArray *getRectArray(uint32 nameHash);
 	HitRectList *getHitRectList();
 	MessageList *getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY);
 protected:
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index d897d7a..4e7d24c 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -140,6 +140,26 @@ void StaticData::load(const char *filename) {
 		_sceneInfo140Items[id] = sceneInfo140;
 	}
 
+	// Load SceneInfo2700 items
+	uint32 sceneInfo2700ItemsCount = fd.readUint32LE();
+	debug("sceneInfo2700ItemsCount: %d", sceneInfo2700ItemsCount);
+	for (uint32 i = 0; i < sceneInfo2700ItemsCount; i++) {
+		SceneInfo2700 *sceneInfo2700 = new SceneInfo2700();
+		uint32 id = fd.readUint32LE();
+		sceneInfo2700->bgFilename = fd.readUint32LE();
+		sceneInfo2700->class437Filename = fd.readUint32LE();
+		sceneInfo2700->dataResourceFilename = fd.readUint32LE();
+		sceneInfo2700->pointListName = fd.readUint32LE();
+		sceneInfo2700->rectListName = fd.readUint32LE();
+		sceneInfo2700->exPaletteFilename2 = fd.readUint32LE();
+		sceneInfo2700->exPaletteFilename1 = fd.readUint32LE();
+		sceneInfo2700->mouseCursorFilename = fd.readUint32LE();
+		sceneInfo2700->which1 = fd.readUint16LE();
+		sceneInfo2700->which2 = fd.readUint16LE();
+		sceneInfo2700->field24 = fd.readUint32LE();
+		_sceneInfo2700Items[id] = sceneInfo2700;
+	}
+
 }
 
 HitRectList *StaticData::getHitRectList(uint32 id) {
@@ -172,4 +192,10 @@ SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) {
 	return _sceneInfo140Items[id];
 }
 
+SceneInfo2700 *StaticData::getSceneInfo2700(uint32 id) {
+	if (!_sceneInfo2700Items[id])
+		error("StaticData::getSceneInfo2700() SceneInfo2700 with id %08X not found", id);
+	return _sceneInfo2700Items[id];
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index 2a0cc90..c223735 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -77,6 +77,21 @@ struct SceneInfo140 {
 	byte count;
 };
 
+struct SceneInfo2700 {
+	uint32 id;
+	uint32 bgFilename;
+	uint32 class437Filename;
+	uint32 dataResourceFilename;
+	uint32 pointListName;
+	uint32 rectListName;
+	uint32 exPaletteFilename2;
+	uint32 exPaletteFilename1;
+	uint32 mouseCursorFilename;
+	int16 which1;
+	int16 which2;
+	uint32 field24;
+};
+
 class StaticData {
 public:
 	StaticData();
@@ -87,12 +102,14 @@ public:
 	MessageList *getMessageList(uint32 id);
 	NavigationList *getNavigationList(uint32 id);
 	SceneInfo140 *getSceneInfo140Item(uint32 id);
+	SceneInfo2700 *getSceneInfo2700(uint32 id);
 protected:
 	Common::HashMap<uint32, HitRectList*> _hitRectLists;
 	Common::HashMap<uint32, RectList*> _rectLists;
 	Common::HashMap<uint32, MessageList*> _messageLists;
 	Common::HashMap<uint32, NavigationList*> _navigationLists;
 	Common::HashMap<uint32, SceneInfo140*> _sceneInfo140Items;
+	Common::HashMap<uint32, SceneInfo2700*> _sceneInfo2700Items;
 };
 
 } // End of namespace Neverhood


Commit: 463039c40666c5417cf298365d31690299685e5f
    https://github.com/scummvm/scummvm/commit/463039c40666c5417cf298365d31690299685e5f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Add Scene2706

- Move calcDistance from Class521 to graphics.cpp

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 9bdaa86..9ed447a 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -297,7 +297,7 @@ void GameModule::startup() {
 	createModule(2600, -1);
 #endif
 #if 1
-	_vm->gameState().which = 0;
+	_vm->gameState().which = 4;
 	_vm->gameState().sceneNum = 5;
 	createModule(2700, -1);
 #endif
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 900ad57..5bb9424 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -312,4 +312,10 @@ void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int des
 
 }
 
+int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) {
+	int16 deltaX = ABS(x1 - x2);
+	int16 deltaY = ABS(y1 - y2);
+	return sqrt((double)(deltaX * deltaX + deltaY * deltaY));
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 08fa1f5..c2adb11 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -127,6 +127,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY);
 void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
+int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2);
 
 } // End of namespace Neverhood
 
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 94b836a..15e2474 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -973,12 +973,6 @@ void Class521::sub45E0A0() {
 	// TODO
 }
 
-int Class521::calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) {
-	int16 deltaX = ABS(x1 - x2);
-	int16 deltaY = ABS(y1 - y2);
-	return sqrt(deltaX * deltaX + deltaY * deltaY);
-}
-
 Class546::Class546(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _soundResource(vm),
 	_parentScene(parentScene) {
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 1096377..efb2b94 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -103,7 +103,6 @@ protected:
 	void suMoveToNextPoint();
 	void suMoveToPrevPoint();
 	void sub45E0A0();
-	int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2);
 };
 
 class Class546 : public AnimatedSprite {
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index f5dc078..7d09b66 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -141,7 +141,7 @@ void Module2700::createScene(int sceneNum, int which) {
 		break;
 	case 5:
 		if (which >= 4) {
-//TODO		_childObject = new Scene2706(_vm, this, which);
+			_childObject = new Scene2706(_vm, this, which);
 		} else if (which == 2 || which == 3) {
 			createScene2704(which, 0x004B1828, 150);
 		} else {
@@ -555,8 +555,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	_which2 = sceneInfo->which2;
 
 	_dataResource.load(sceneInfo->dataResourceFilename);
-	_pointList = _dataResource.getPointArray(sceneInfo->pointListName);
-	_class521->setPathPoints(_pointList);
+	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
+	_class521->setPathPoints(_trackPoints);
 	
 	if (sceneInfo->rectListName) {
 		_rectList = _dataResource.getRectArray(sceneInfo->rectListName);
@@ -564,14 +564,14 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	}
 
 	if (which == _which2) {
-		NPoint testPoint = (*_pointList)[_pointList->size() - 1];
-		sendMessage(_class521, 0x2002, _pointList->size() - 1);
+		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
 		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
 			sendMessage(_class521, 0x2009, 0);
 		else
 			sendMessage(_class521, 0x2007, 0);
 	} else {
-		NPoint testPoint = (*_pointList)[0];
+		NPoint testPoint = (*_trackPoints)[0];
 		sendMessage(_class521, 0x2002, 0);
 		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
 			sendMessage(_class521, 0x2009, 0);
@@ -581,6 +581,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	
 	if (clipRect) {
 		_class521->getClipRect() = *clipRect;
+#if 0		
 		if (_class517)
 			_class517->getClipRect() = *clipRect; 
 		if (_class520)
@@ -588,7 +589,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 		if (_class519)
 			_class519->getClipRect() = *clipRect; 
 		if (_class518)
-			_class518->getClipRect() = *clipRect; 
+			_class518->getClipRect() = *clipRect;
+#endif			 
 	}
 
 }
@@ -619,4 +621,126 @@ uint32 Scene2704::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+static const struct { const char *pointListName; int which1, which2; } kSceneInfo2706[] = {
+	{"me06slotSlotPath2", 4, -1},
+	{"me06slotSlotPath3", -1, 6},
+	{"me06slotSlotPath4", -1, 5}
+};
+
+Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _newTrackIndex(-1), _count(3) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2706::handleMessage);
+	
+	setBackground(0x18808B88);
+	setPalette(0x18808B88);
+	
+	_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
+	_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
+	
+	insertMouse433(0x08B8C180);
+
+//TODO	_class437 = insertSprite<Class437>(0x18808B88);
+	_class521 = insertSprite<Class521>(this, 320, 240);
+//TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+//TODO		_class518 = insertSprite<Class518>(_class521);
+//TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+//TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+
+	_dataResource.load(0x06000162);
+	
+	if (which == 5)
+		_currTrackIndex = 2;
+	else if (which == 6)		
+		_currTrackIndex = 1;
+	else
+		_currTrackIndex = 0;
+
+	_trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName));
+	_class521->setPathPoints(_trackPoints);
+
+	if (which == kSceneInfo2706[_currTrackIndex].which2) {
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		if (which == 5)
+			sendMessage(_class521, 0x2007, 50);
+		else			
+			sendMessage(_class521, 0x2007, 150);
+	} else {
+		sendMessage(_class521, 0x2002, 0);
+		if (which == 5)
+			sendMessage(_class521, 0x2008, 50);
+		else			
+			sendMessage(_class521, 0x2008, 150);
+	}
+	
+}
+
+uint32 Scene2706::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		findClosestTrack(param.asPoint());
+		break;
+	case 0x2005:
+		if (_newTrackIndex >= 0) {
+			if (kSceneInfo2706[_currTrackIndex].which1 < 0)
+				changeTrack();
+		} else if (kSceneInfo2706[_currTrackIndex].which1 >= 0)
+			leaveScene(kSceneInfo2706[_currTrackIndex].which1);
+		break;
+	case 0x2006:
+		if (_newTrackIndex >= 0) {
+			if (kSceneInfo2706[_currTrackIndex].which2 < 0)
+				changeTrack();
+		} else if (kSceneInfo2706[_currTrackIndex].which2 >= 0)
+			leaveScene(kSceneInfo2706[_currTrackIndex].which2);
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+
+void Scene2706::findClosestTrack(NPoint pt) {
+	int minMatchTrackIndex = -1;
+	int minMatchDistance = 640;
+	// Find the track which contains a point closest to pt
+	for (int infoIndex = 0; infoIndex < _count; infoIndex++) {
+		NPointArray *pointList = _dataResource.getPointArray(calcHash(kSceneInfo2706[infoIndex].pointListName));
+		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
+			NPoint testPt = (*pointList)[pointIndex];
+			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
+			if (distance < minMatchDistance) {
+				minMatchTrackIndex = infoIndex;
+				minMatchDistance = distance;
+			}
+		}
+	}
+	if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
+		_newTrackIndex = minMatchTrackIndex;
+		_newTrackDestX = pt.x;
+		if (_currTrackIndex == 0)
+			sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+		else
+			sendMessage(_class521, 0x2003, 0);
+	} else {
+		_newTrackIndex = -1;
+		sendMessage(_class521, 0x2004, pt.x);
+	}
+}
+
+void Scene2706::changeTrack() {
+	_currTrackIndex = _newTrackIndex;
+	_trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName));
+	_class521->setPathPoints(_trackPoints);
+	if (_currTrackIndex == 0)
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+	else
+		sendMessage(_class521, 0x2002, 0);
+	sendMessage(_class521, 0x2004, _newTrackDestX);
+	_newTrackIndex = -1;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index 4df284c..b596ccd 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -60,12 +60,31 @@ public:
 protected:
 	Class521 *_class521;
 	int _which1, _which2;
-	NPointArray *_pointList;
+	NPointArray *_trackPoints;
 	NRectArray *_rectList;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2706 : public Scene {
+public:
+	Scene2706(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Class521 *_class521;
+	Sprite *_class437;
+	Sprite *_class517;
+	Sprite *_class518;
+	Sprite *_class520;
+	Sprite *_class519;
+	int16 _newTrackDestX;
+	int _currTrackIndex, _newTrackIndex;
+	int _count;
+	NPointArray *_trackPoints;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void findClosestTrack(NPoint pt);
+	void changeTrack();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2700_H */


Commit: 31b3dec8c94975333a868cc527107a32b091a5ae
    https://github.com/scummvm/scummvm/commit/31b3dec8c94975333a868cc527107a32b091a5ae
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: More tables for Module2700

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index 33b5a3e..dc77d71 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -289,7 +289,6 @@ struct SceneInfo2700Item {
 	uint32 mouseCursorFilename;
 	int16 which1;
 	int16 which2;
-	uint32 field24;
 
 	void load(uint32 offset) {
 		byte *item = getData(offset);
@@ -305,7 +304,6 @@ struct SceneInfo2700Item {
 		mouseCursorFilename = calcHash(getStringP(READ_LE_UINT32(item + 28)));
 		which1 = READ_LE_UINT16(item + 32);
 		which2 = READ_LE_UINT16(item + 34);
-		field24 = READ_LE_UINT16(item + 36);
 	}
 
 	void save(FILE *fd) {
@@ -320,7 +318,6 @@ struct SceneInfo2700Item {
 		writeUint32LE(fd, mouseCursorFilename);
 		writeUint16LE(fd, which1);
 		writeUint16LE(fd, which2);
-		writeUint32LE(fd, field24);
 	}
 
 };
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 51954f8..3a5d405 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -537,5 +537,7 @@ static const uint32 sceneInfo2700Offsets[] = {
 	//
 	0x004B1950,
 	//
+	0x004B2240,
+	//
 	0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index b97c5a4..f88d516 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: d276e7ceaa307844a8db82f231bba86a6b88e121
    https://github.com/scummvm/scummvm/commit/d276e7ceaa307844a8db82f231bba86a6b88e121
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Add Scene2701

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 9ed447a..64117ad 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -298,7 +298,7 @@ void GameModule::startup() {
 #endif
 #if 1
 	_vm->gameState().which = 4;
-	_vm->gameState().sceneNum = 5;
+	_vm->gameState().sceneNum = 0;
 	createModule(2700, -1);
 #endif
 }
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 7d09b66..e8d3105 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -118,7 +118,7 @@ void Module2700::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-//TODO		_childObject = new Scene2701(_vm, this, which);
+		_childObject = new Scene2701(_vm, this, which);
 		break;
 	case 1:
 //TODO		_childObject = new Scene2702(_vm, this, which);
@@ -513,6 +513,110 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
 }
 
+Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	NRect clipRect;
+	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240);
+	setGlobalVar(0x21E60190, 1);
+	
+	_surfaceFlag = true;
+	
+	setBackground(sceneInfo->bgFilename);
+	setPalette(sceneInfo->bgFilename);
+
+	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
+	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
+	
+	insertMouse433(0x08B08180);
+	
+	_sprite1 = insertStaticSprite(0x1E086325, 1200);
+	
+	clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2());
+
+	if (sceneInfo->class437Filename) {
+//TODO		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
+		_class521 = insertSprite<Class521>(this, 320, 240);
+//TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+//TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+//TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	} else {
+		_class437 = NULL;
+		_class521 = insertSprite<Class521>(this, 320, 240);
+	}
+
+//TODO	_class518 = insertSprite<Class518>(_class521);
+	
+	_which1 = sceneInfo->which1;
+	_which2 = sceneInfo->which2;
+
+	_dataResource.load(sceneInfo->dataResourceFilename);
+	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
+	_class521->setPathPoints(_trackPoints);
+
+	if (which == _which2) {
+		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
+			sendMessage(_class521, 0x2007, 150);
+	} else {
+		NPoint testPoint = (*_trackPoints)[0];
+		sendMessage(_class521, 0x2002, 0);
+		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
+			sendMessage(_class521, 0x2008, 150);
+	}
+	
+	_class521->setClipRect(clipRect);
+	// TODO _class518->setClipRect(clipRect);
+
+	if (which == 1) {
+		SetMessageHandler(&Scene2701::handleMessage42F500);
+	} else {
+		sendMessage(_class521, 0x2009, 0);
+		SetMessageHandler(&Scene2701::handleMessage42F600);
+	}
+
+}
+
+uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		sendPointMessage(_class521, 0x2004, param.asPoint());
+		break;
+	case 0x2005:
+		if (_which1 >= 0)
+			SetMessageHandler(&Scene2701::handleMessage42F600);
+		break;
+	case 0x2006:
+		if (_which2 >= 0)
+			leaveScene(_which2);
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+
+uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x >= 385) {
+			leaveScene(0);
+		} else {
+			sendPointMessage(_class521, 0x2004, param.asPoint());
+			SetMessageHandler(&Scene2701::handleMessage42F500);
+		}
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+
 Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
 	const uint32 *staticSprites, const NRect *clipRect)
 	: Scene(vm, parentModule, true) {
@@ -621,6 +725,7 @@ uint32 Scene2704::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+static const int kSceneInfo2706Count = 3;
 static const struct { const char *pointListName; int which1, which2; } kSceneInfo2706[] = {
 	{"me06slotSlotPath2", 4, -1},
 	{"me06slotSlotPath3", -1, 6},
@@ -628,7 +733,7 @@ static const struct { const char *pointListName; int which1, which2; } kSceneInf
 };
 
 Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _newTrackIndex(-1), _count(3) {
+	: Scene(vm, parentModule, true), _newTrackIndex(-1) {
 	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2706::handleMessage);
@@ -707,7 +812,7 @@ void Scene2706::findClosestTrack(NPoint pt) {
 	int minMatchTrackIndex = -1;
 	int minMatchDistance = 640;
 	// Find the track which contains a point closest to pt
-	for (int infoIndex = 0; infoIndex < _count; infoIndex++) {
+	for (int infoIndex = 0; infoIndex < kSceneInfo2706Count; infoIndex++) {
 		NPointArray *pointList = _dataResource.getPointArray(calcHash(kSceneInfo2706[infoIndex].pointListName));
 		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
 			NPoint testPt = (*pointList)[pointIndex];
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index b596ccd..85c5b88 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -53,6 +53,24 @@ protected:
 	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
+class Scene2701 : public Scene {
+public:
+	Scene2701(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Class521 *_class521;
+	Sprite *_class437;
+	Sprite *_class517;
+	Sprite *_class520;
+	Sprite *_class519;
+	Sprite *_class518;
+	Sprite *_sprite1;
+	//NRect _rect;
+	int _which1, _which2;
+	NPointArray *_trackPoints;
+	uint32 handleMessage42F500(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage42F600(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene2704 : public Scene {
 public:
 	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
@@ -78,7 +96,6 @@ protected:
 	Sprite *_class519;
 	int16 _newTrackDestX;
 	int _currTrackIndex, _newTrackIndex;
-	int _count;
 	NPointArray *_trackPoints;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void findClosestTrack(NPoint pt);
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 4e7d24c..147a319 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -156,7 +156,6 @@ void StaticData::load(const char *filename) {
 		sceneInfo2700->mouseCursorFilename = fd.readUint32LE();
 		sceneInfo2700->which1 = fd.readUint16LE();
 		sceneInfo2700->which2 = fd.readUint16LE();
-		sceneInfo2700->field24 = fd.readUint32LE();
 		_sceneInfo2700Items[id] = sceneInfo2700;
 	}
 
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index c223735..2a2db55 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -89,7 +89,6 @@ struct SceneInfo2700 {
 	uint32 mouseCursorFilename;
 	int16 which1;
 	int16 which2;
-	uint32 field24;
 };
 
 class StaticData {


Commit: 6315ccb5528a9a4d810779055df9184f4b2960c1
    https://github.com/scummvm/scummvm/commit/6315ccb5528a9a4d810779055df9184f4b2960c1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:42-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2702

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 3a5d405..2534bce 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -539,5 +539,11 @@ static const uint32 sceneInfo2700Offsets[] = {
 	//
 	0x004B2240,
 	//
+	0x004B5F68,
+	0x004B5F8C,
+	0x004B5FB0,
+	0x004B5FD8,
+	0x004B5FFC,
+	0x004B6020,
 	0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index f88d516..946b19a 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: c56c93f085a7861e19a6a0befdbdd69b9837b41f
    https://github.com/scummvm/scummvm/commit/c56c93f085a7861e19a6a0befdbdd69b9837b41f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:43-07:00

Commit Message:
NEVERHOOD: Add Scene2702 (needs cleanup)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 64117ad..95fe521 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -297,8 +297,8 @@ void GameModule::startup() {
 	createModule(2600, -1);
 #endif
 #if 1
-	_vm->gameState().which = 4;
-	_vm->gameState().sceneNum = 0;
+	_vm->gameState().which = 0;
+	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
 #endif
 }
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index e8d3105..8c81ddf 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -121,7 +121,7 @@ void Module2700::createScene(int sceneNum, int which) {
 		_childObject = new Scene2701(_vm, this, which);
 		break;
 	case 1:
-//TODO		_childObject = new Scene2702(_vm, this, which);
+		_childObject = new Scene2702(_vm, this, which);
 		break;
 	case 2:
 		if (which == 6 || which == 7)
@@ -617,6 +617,181 @@ uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam &param,
 	return 0;
 }
 
+static const uint32 kScene2702Infos[2][3] = {
+	{0x004B5F68, 0x004B5F8C, 0x004B5FB0},
+	{0x004B5FD8, 0x004B5FFC, 0x004B6020}
+};
+
+
+Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _flag1(true), _newTrackIndex(-1), _count(3) {
+	
+	for (int i = 0; i < 2; i++)
+		for (int j = 0; j < 3; j++)
+			_sceneInfos[i][j] = _vm->_staticData->getSceneInfo2700(kScene2702Infos[i][j]);
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2702::handleMessage);
+	SetUpdateHandler(&Scene2702::update);
+	
+	setBackground(0x18808B00);
+	setPalette(0x18808B00);
+	
+	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
+	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
+	addEntity(_palette);
+	
+	insertMouse433(0x08B04180);
+
+	//TODO	_class437 = insertSprite<Class437>(0x12002035);
+	_class521 = insertSprite<Class521>(this, 320, 240);
+	//TODO	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+	//TODO	insertSprite<Class518>(_class521);
+	//TODO	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+	//TODO	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+
+	_dataResource.load(0x04310014);
+	
+	if (which == 1) {
+		_currSceneInfos = _sceneInfos[1];
+		_currTrackIndex = 1;
+	} else if (which == 2) {
+		_currSceneInfos = _sceneInfos[1];
+		_currTrackIndex = 2;
+		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
+		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
+		_flag1 = false;
+	} else if (which == 3) {
+		_currSceneInfos = _sceneInfos[0];
+		_currTrackIndex = 0;
+	} else if (which == 4) {
+		_currSceneInfos = _sceneInfos[0];
+		_currTrackIndex = 2;
+		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
+		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
+		_flag1 = false;
+	} else if (which == 5) {
+		_currSceneInfos = _sceneInfos[0];
+		_currTrackIndex = 1;
+		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
+		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
+		_flag1 = false;
+	} else {
+		_currSceneInfos = _sceneInfos[1];
+		_currTrackIndex = 0;
+	}
+
+	_trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName);
+	_class521->setPathPoints(_trackPoints);
+
+	if (which == _currSceneInfos[_currTrackIndex]->which2) {
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_class521, 0x2007, 150);
+	} else {
+		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_class521, 0x2008, 150);
+	}
+
+	_palette->copyBasePalette(0, 256, 0);
+
+}
+
+void Scene2702::update() {
+	Scene::update();
+	if (_flag1 && _class521->getX() > 422) {
+		debug("fade #1");
+		_palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65);
+		_palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0);
+		_palette->startFadeToPalette(12);
+		_flag1 = false;
+	} else if (!_flag1 && _class521->getX() <= 422) {
+		debug("fade #2");
+		_palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65);
+		_palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0);
+		_palette->startFadeToPalette(12);
+		_flag1 = true;
+	}
+}
+
+uint32 Scene2702::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		findClosestTrack(param.asPoint());
+		break;
+	case 0x2005:
+		if (_newTrackIndex >= 0) {
+			if (_currSceneInfos[_currTrackIndex]->which1 < 0)
+				changeTrack();
+		} else if (_currSceneInfos[_currTrackIndex]->which1 >= 0)
+			leaveScene(_currSceneInfos[_currTrackIndex]->which1);
+		break;
+	case 0x2006:
+		if (_newTrackIndex >= 0) {
+			if (_currSceneInfos[_currTrackIndex]->which2 < 0)
+				changeTrack();
+		} else if (_currSceneInfos[_currTrackIndex]->which2 >= 0)
+			leaveScene(_currSceneInfos[_currTrackIndex]->which2);
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+
+void Scene2702::findClosestTrack(NPoint pt) {
+	int minMatchTrackIndex = -1;
+	int minMatchDistance = 640;
+	// Find the track which contains a point closest to pt
+	for (int infoIndex = 0; infoIndex < _count; infoIndex++) {
+		NPointArray *pointList = _dataResource.getPointArray(_currSceneInfos[infoIndex]->pointListName);
+		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
+			NPoint testPt = (*pointList)[pointIndex];
+			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
+			if (distance < minMatchDistance) {
+				minMatchTrackIndex = infoIndex;
+				minMatchDistance = distance;
+			}
+		}
+	}
+	if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
+		_newTrackIndex = minMatchTrackIndex;
+		_newTrackDestX = pt.x;
+		if (_currSceneInfos == _sceneInfos[0]) {
+			if (_currTrackIndex == 0)
+				sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+			else
+				sendMessage(_class521, 0x2003, 0);
+		} else if (_currTrackIndex == 2) {
+			sendMessage(_class521, 0x2003, 0);
+		} else {
+			sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+		}
+	} else {
+		_newTrackIndex = -1;
+		sendMessage(_class521, 0x2004, pt.x);
+	}
+}
+
+void Scene2702::changeTrack() {
+	_currTrackIndex = _newTrackIndex;
+	_trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName);
+	_class521->setPathPoints(_trackPoints);
+	if (_currSceneInfos == _sceneInfos[0]) {
+		if (_currTrackIndex == 0)
+			sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		else
+			sendMessage(_class521, 0x2002, 0);
+	} else if (_currTrackIndex == 2) {
+		sendMessage(_class521, 0x2002, 0);
+	} else {
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+	}
+	sendMessage(_class521, 0x2004, _newTrackDestX);
+	_newTrackIndex = -1;
+}
+
 Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
 	const uint32 *staticSprites, const NRect *clipRect)
 	: Scene(vm, parentModule, true) {
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index 85c5b88..a39b52c 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -64,13 +64,34 @@ protected:
 	Sprite *_class519;
 	Sprite *_class518;
 	Sprite *_sprite1;
-	//NRect _rect;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
 	uint32 handleMessage42F500(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage42F600(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2702 : public Scene {
+public:
+	Scene2702(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Class521 *_class521;
+	Sprite *_class437;
+	Sprite *_class517;
+	Sprite *_class520;
+	Sprite *_class519;
+	int16 _newTrackDestX;
+	int _currTrackIndex, _newTrackIndex;
+	int _count;
+	bool _flag1;
+	SceneInfo2700 *_sceneInfos[2][3];
+	SceneInfo2700 **_currSceneInfos;
+	NPointArray *_trackPoints;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void findClosestTrack(NPoint pt);
+	void changeTrack();
+};
+
 class Scene2704 : public Scene {
 public:
 	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,


Commit: 023c36f2b6f1906c28d246a1b861e2287d85d851
    https://github.com/scummvm/scummvm/commit/023c36f2b6f1906c28d246a1b861e2287d85d851
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:43-07:00

Commit Message:
NEVERHOOD: Add Class437 (still needs renaming, of course :)

Changed paths:
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 8c81ddf..096e335 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -513,6 +513,18 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
 }
 
+Class437::Class437(NeverhoodEngine *vm, uint32 fileHash)
+	: StaticSprite(vm, 0) {
+	
+	_spriteResource.load2(fileHash);
+	createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
 Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
@@ -535,7 +547,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2());
 
 	if (sceneInfo->class437Filename) {
-//TODO		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
+		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
 		_class521 = insertSprite<Class521>(this, 320, 240);
 //TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
 //TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
@@ -643,7 +655,7 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B04180);
 
-	//TODO	_class437 = insertSprite<Class437>(0x12002035);
+	_class437 = insertSprite<Class437>(0x12002035);
 	_class521 = insertSprite<Class521>(this, 320, 240);
 	//TODO	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
 	//TODO	insertSprite<Class518>(_class521);
@@ -817,13 +829,13 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	insertMouse433(sceneInfo->mouseCursorFilename);
 	
 	if (sceneInfo->class437Filename) {
-//TODO		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
+		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
 		_class521 = insertSprite<Class521>(this, 320, 240);
 //TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
 //TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
 //TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
 	} else {
-//TODO		_class437 = NULL;
+		_class437 = NULL;
 //TODO		_class517 = NULL;
 		_class521 = insertSprite<Class521>(this, 320, 240);
 	}
@@ -921,7 +933,7 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B8C180);
 
-//TODO	_class437 = insertSprite<Class437>(0x18808B88);
+	_class437 = insertSprite<Class437>(0x18808B88);
 	_class521 = insertSprite<Class521>(this, 320, 240);
 //TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
 //TODO		_class518 = insertSprite<Class518>(_class521);
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index a39b52c..f1ef3f5 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -53,6 +53,11 @@ protected:
 	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
+class Class437 : public StaticSprite {
+public:
+	Class437(NeverhoodEngine *vm, uint32 fileHash);
+};
+
 class Scene2701 : public Scene {
 public:
 	Scene2701(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -98,6 +103,7 @@ public:
 		const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 protected:
 	Class521 *_class521;
+	Sprite *_class437;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
 	NRectArray *_rectList;


Commit: 9cf2c83e5e5a35816ab153bf8443dac691829ea8
    https://github.com/scummvm/scummvm/commit/9cf2c83e5e5a35816ab153bf8443dac691829ea8
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:39:43-07:00

Commit Message:
NEVERHOOD: Major renaming:

- Give better names to animation callback functions/vars
- Give better names to animation functions (previously known as subXXXX - not completed yet)
- Add dumpAllResources (which is a lie, since it only dumps animations for now)
- More renaming to come

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resourceman.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index ace2b5b..4fdc736 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -179,7 +179,7 @@ uint32 Class494::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Class494::sub43BE00() {
-	setFileHash1();
+	stopAnimation();
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Sprite::handleMessage);
 	_surface->setVisible(false);
@@ -189,7 +189,7 @@ void Class494::sub43BE20() {
 	setFileHash(0x100B90B4, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class494::handleMessage);
-	SetAnimationCallback3(&Class494::sub43BE00);
+	NextState(&Class494::sub43BE00);
 	_surface->setVisible(true);
 }
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 865c91a..567788b 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -28,17 +28,17 @@
 namespace Neverhood {
 
 static const KlaymanTableItem klaymanTable1[] = {
-	{1, &Klayman::sub41FD30},
+	{1, &Klayman::stDoIdlePickEar},
 	{1, &Klayman::sub41FDA0},
 	{1, &Klayman::sub41FDF0},
-	{1, &Klayman::sub41FE60},
+	{1, &Klayman::stDoIdleChest},
 	{1, &Klayman::sub41FEB0}
 }; 
 
 static const KlaymanTableItem klaymanTable2[] = {
-	{1, &Klayman::sub41FD30},
+	{1, &Klayman::stDoIdlePickEar},
 	{1, &Klayman::sub41FDA0},
-	{1, &Klayman::sub41FE60},
+	{1, &Klayman::stDoIdleChest},
 	{1, &Klayman::sub41FEB0}
 }; 
 
@@ -51,7 +51,7 @@ static const KlaymanTableItem klaymanTable3[] = {
 
 static const KlaymanTableItem klaymanTable4[] = {
 	{1, &Klayman::sub41FDA0},
-	{1, &Klayman::sub41FE60},
+	{1, &Klayman::stDoIdleChest},
 	{1, &Klayman::sub41FEB0},
 };
 
@@ -72,7 +72,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_y4 = y;
 	_flags = 2;
 	setKlaymanTable1();
-	sub41FC80();
+	stTryStandIdle();
 	SetUpdateHandler(&Klayman::update);
 }
 
@@ -87,7 +87,7 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4818:
 		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
@@ -122,22 +122,22 @@ void Klayman::setKlaymanTable3() {
 	// TODO setKlaymanTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
 }
 
-void Klayman::sub41FD30() {
-	sub41D320(0x5B20C814, AnimationCallback(&Klayman::sub41FD40));
+void Klayman::stDoIdlePickEar() {
+	sub41D320(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar));
 }
 
-void Klayman::sub41FD40() {
+void Klayman::stIdlePickEar() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x5B20C814, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB10);
+	SetMessageHandler(&Klayman::hmIdlePickEar);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub41FCF0);
-	setCallback1(AnimationCallback(&Klayman::sub41FD90));
+	NextState(&Klayman::stStandAround);
+	FinalizeState(&Klayman::evIdlePickEarDone);
 }
 
-uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -149,7 +149,7 @@ uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FD90() {
+void Klayman::evIdlePickEarDone() {
 	_soundResource1.stop();
 }
 
@@ -164,7 +164,7 @@ void Klayman::sub41FDB0() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41E980);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub41FCF0);
+	NextState(&Klayman::stStandAround);
 }
 
 uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam &param, Entity *sender) {
@@ -190,8 +190,8 @@ void Klayman::sub41FE00() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41E9E0);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub41FCF0);
-	setCallback1(AnimationCallback(&Klayman::sub41FE50));
+	NextState(&Klayman::stStandAround);
+	FinalizeState(&Klayman::sub41FE50);
 }
 
 void Klayman::sub41FE50() {
@@ -214,21 +214,21 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FE60() {
-	sub41D320(0x40A0C034, AnimationCallback(&Klayman::sub41FE70));
+void Klayman::stDoIdleChest() {
+	sub41D320(0x40A0C034, AnimationCallback(&Klayman::stIdleChest));
 }
 
-void Klayman::sub41FE70() {
+void Klayman::stIdleChest() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x40A0C034, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EF80);
+	SetMessageHandler(&Klayman::hmIdleChest);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub41FCF0);
+	NextState(&Klayman::stStandAround);
 }
 
-uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmIdleChest(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -251,7 +251,7 @@ void Klayman::sub41FEC0() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EFE0);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub41FCF0);
+	NextState(&Klayman::stStandAround);
 }
 
 uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender) {
@@ -306,22 +306,22 @@ void Klayman::update41D1C0() {
 		if (_counter3 >= _counter3Max) {
 			_counter3 = 0;
 			_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
-			sub4213F0();
+			stIdleSitBlink();
 		}
 	}
 }
 
-void Klayman::sub4213F0() {
+void Klayman::stIdleSitBlink() {
 	_status2 = 0;
 	_flagE5 = true;
 	setFileHash(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub4213B0);
+	NextState(&Klayman::stIdleSitBlinkSecond);
 }
 
-void Klayman::sub4213B0() {
+void Klayman::stIdleSitBlinkSecond() {
 	_status2 = 0;
 	_flagE5 = true;
 	setFileHash(0x5C24C018, 0, -1);
@@ -330,21 +330,21 @@ void Klayman::sub4213B0() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub420060() {
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420060))) {
+void Klayman::stPickUpNeedle() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klayman::stPickUpNeedle))) {
 		_status2 = 1;
 		_flagE5 = false;
 		setFileHash(0x1449C169, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41D4C0);
+		SetMessageHandler(&Klayman::hmPickUpGeneric);
 		SetSpriteCallback(NULL);
 	}
 }
 
 void Klayman::sub41FFF0() {
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub41FFF0))) {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klayman::sub41FFF0))) {
 		_status2 = 1;
 		_flagE5 = false;
 		setFileHash(0x0018C032, 0, -1);
@@ -395,8 +395,8 @@ void Klayman::sub421510() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub421160() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub421160))) {
+void Klayman::stStepOver() {
+	if (!stStartAction(AnimationCallback(&Klayman::stStepOver))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0x004AA310, 0, -1);
@@ -406,8 +406,8 @@ void Klayman::sub421160() {
 	}
 }
 
-void Klayman::sub4212C0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub4212C0))) {
+void Klayman::stSitInTeleporter() {
+	if (!stStartAction(AnimationCallback(&Klayman::stSitInTeleporter))) {
 		_status2 = 0;
 		_flagE5 = false;
 		setFileHash(0x392A0330, 0, -1);
@@ -443,7 +443,7 @@ void Klayman::sub421310() {
 void Klayman::sub41CE70() {
 	_x4 = _x;
 	if (!_flagE1 && !_flagE2 && !_flagE3) {
-		setCallback2(NULL);
+		gotoState(NULL);
 		sub41C7B0();
 	}
 }
@@ -452,7 +452,7 @@ void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) {
 	_resourceHandle = _vm->_res->useResource(fileHash);
 	if (_resourceHandle != -1) {
 		// TODO _vm->_res->moveToFront(_resourceHandle);
-		SetAnimationCallback3(callback);
+		NextState(callback);
 		SetUpdateHandler(&Klayman::update41D2B0);
 	}
 }
@@ -470,7 +470,7 @@ void Klayman::update41D2B0() {
 	update();
 }
 
-bool Klayman::sub41CF10(AnimationCb callback) {
+bool Klayman::stStartActionFromIdle(AnimationCb callback) {
 	if (_status2 == 2) {
 		_status2 = 1;
 		_flagE5 = false; 
@@ -478,21 +478,21 @@ bool Klayman::sub41CF10(AnimationCb callback) {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41F140);
 		SetSpriteCallback(NULL);
-		SetAnimationCallback3(callback);
+		NextState(callback);
 		return true;
 	}
 	return false;
 }
 
 void Klayman::sub41C7B0() {
-	if (_callback1Cb) {
-		AnimationCb cb = _callback1Cb;
-		_callback1Cb = NULL;
+	if (_finalizeStateCb) {
+		AnimationCb cb = _finalizeStateCb;
+		_finalizeStateCb = NULL;
 		(this->*cb)();
 	}
-	if (_callback3Cb) {
-		AnimationCb cb = _callback3Cb;
-		_callback3Cb = NULL;
+	if (_nextStateCb) {
+		AnimationCb cb = _nextStateCb;
+		_nextStateCb = NULL;
 		(this->*cb)();
 #if 0 // TODO		
 	} else if (_callbackList) {
@@ -513,8 +513,8 @@ void Klayman::sub41C790() {
 		_status3 = 0;
 }
 
-void Klayman::sub41FC80() {
-	if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) {
+void Klayman::stTryStandIdle() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTryStandIdle))) {
 		_status2 = 1;
 		_flagE5 = true;
 		setFileHash(0x5420E254, 0, -1);
@@ -547,7 +547,7 @@ void Klayman::update41D0F0() {
 		if (_counter3 >= _counter3Max) {
 			_counter3 = 0;
 			_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
-			sub41FF00();
+			stStand();
 		}
 	}
 }
@@ -560,7 +560,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		messageResult = _flagE5;
 		break;
 	case 0x1014:
-		_attachedSprite = param.asEntity();
+		_attachedSprite = (Sprite*)(param.asEntity());
 		break;
 	case 0x1019:
 		sub41C7B0();
@@ -589,14 +589,14 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FF00() {
+void Klayman::stStand() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x5900C41E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Klayman::sub41FCF0);
+	NextState(&Klayman::stStandAround);
 }
 
 uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
@@ -609,7 +609,7 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FCF0() {
+void Klayman::stStandAround() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x5420E254, 0, -1);
@@ -638,33 +638,33 @@ void Klayman::sub41C930(int16 x, bool flag) {
 	if (x == _x) {
 		_x4 = x;
 		if (!_flagE1 && !_flagE2 && !_flagE3) {
-			setCallback2(NULL);
+			gotoState(NULL);
 			sub41C7B0();
 		}
 	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
 		_x4 = x;
-		setCallback2(NULL);
+		gotoState(NULL);
 		sub41C7B0();
 	} else if (xdiff <= 42 && _status3 != 3) {
 		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
 			_x4 = x;
 		} else {
 			_x4 = x;
-			setCallback2(AnimationCallback(&Klayman::sub41FB40));
+			GotoState(&Klayman::stSneak);
 		}
 	} else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
 		_x4 = x;
 	} else if (flag) {
 		_x4 = x;
-		error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));");
-		// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));
+		error("// TODO AnimatedSprite_GotoState(&Klayman::sub421550));");
+		// TODO AnimatedSprite_GotoState(&Klayman::sub421550);
 	} else {
 		_x4 = x;
-		setCallback2(AnimationCallback(&Klayman::sub41F950));
+		GotoState(&Klayman::stStartWalking);
 	}
 }
 
-void Klayman::sub4211F0() {
+void Klayman::stWakeUp() {
 	_status2 = 1;
 	_flagE5 = false;
 	setFileHash(0x527AC970, 0, -1);
@@ -673,16 +673,16 @@ void Klayman::sub4211F0() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub4211B0() {
+void Klayman::stSleeping() {
 	_status2 = 0;
 	_flagE5 = true;
 	setFileHash(0x5A38C110, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E920);
+	SetMessageHandler(&Klayman::hmSleeping);
 	SetSpriteCallback(NULL);
 }
 
-uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmSleeping(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -694,7 +694,7 @@ uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-bool Klayman::sub41CEB0(AnimationCb callback3) {
+bool Klayman::stStartAction(AnimationCb callback3) {
 	if (_status2 == 1) {
 		_status2 = 2;
 		_flagE5 = false;
@@ -702,7 +702,7 @@ bool Klayman::sub41CEB0(AnimationCb callback3) {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41F140);
 		SetSpriteCallback(&Klayman::spriteUpdate41F250);
-		SetAnimationCallback3(callback3);
+		NextState(callback3);
 		return true;
 	} else {
 		_x = _x4;
@@ -789,7 +789,7 @@ void Klayman::spriteUpdate41F5F0() {
 	
 }
 
-void Klayman::sub41FB40() {
+void Klayman::stSneak() {
 	_status2 = 1;
 	_flagE2 = true;
 	_flagE5 = true;
@@ -798,10 +798,10 @@ void Klayman::sub41FB40() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41DD80);
 	SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
-	setCallback1(AnimationCallback(&Klayman::sub41FBB0));	
+	FinalizeState(&Klayman::stSneakDone);	
 }
 
-void Klayman::sub41FBB0() {
+void Klayman::stSneakDone() {
 	_flagE2 = false;
 }
 
@@ -844,15 +844,15 @@ void Klayman::sub41CD70(int16 x) {
 		}
 	} else if (x == _x) {
 		_x4 = x;
-		setCallback2(NULL);
+		gotoState(NULL);
 		sub41C7B0();
 	} else {
 		sub41C930(x, false);
 	}
 }
 
-void Klayman::sub41F950() {
-	if (!sub41CF10(AnimationCallback(&Klayman::sub41F950))) {
+void Klayman::stStartWalking() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) {
 		_status2 = 0;
 		_flagE1 = true;
 		_flagE5 = true;
@@ -861,12 +861,12 @@ void Klayman::sub41F950() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41EC70);
 		SetSpriteCallback(&Klayman::spriteUpdate41F320);
-		setCallback1(AnimationCallback(&Klayman::sub41FB30));	
-		SetAnimationCallback3(&Klayman::sub41F9E0);
+		FinalizeState(&Klayman::stStartWalkingDone);	
+		NextState(&Klayman::stWalking);
 	}
 }
 
-void Klayman::sub41FB30() {
+void Klayman::stStartWalkingDone() {
 	_flagE1 = false;
 }
 
@@ -892,7 +892,7 @@ uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41F9E0() {
+void Klayman::stWalking() {
 	_status2 = 0;
 	_flagE1 = true;
 	_flagE5 = true;
@@ -900,8 +900,8 @@ void Klayman::sub41F9E0() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	setCallback1(AnimationCallback(&Klayman::sub41FB30));	
-	SetAnimationCallback3(&Klayman::sub41FA40);
+	FinalizeState(&Klayman::stStartWalkingDone);	
+	NextState(&Klayman::sub41FA40);
 }
 
 void Klayman::spriteUpdate41F300() {
@@ -959,7 +959,7 @@ void Klayman::sub41FA40() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DD80);
 		SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
-		setCallback1(AnimationCallback(&Klayman::sub41FBB0));	
+		FinalizeState(&Klayman::stSneakDone);	
 	}
 }
 
@@ -1035,19 +1035,19 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FF80() {
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub41FF80))) {
+void Klayman::stPickUpGeneric() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klayman::stPickUpGeneric))) {
 		_status2 = 1;
 		_flagE5 = false;
 		setFileHash(0x1C28C178, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41D4C0);
+		SetMessageHandler(&Klayman::hmPickUpGeneric);
 		SetSpriteCallback(NULL);
 	}
 }
 
-uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1073,18 +1073,18 @@ uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam &param, E
 
 }
 
-void Klayman::sub420120() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420120))) {
+void Klayman::stTurnPressButton() {
+	if (!stStartAction(AnimationCallback(&Klayman::stTurnPressButton))) {
 		_status2 = 2;
 		_flagE5 = true;
 		setFileHash(0x1C02B03D, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41DAD0);
+		SetMessageHandler(&Klayman::hmPressButton);
 		SetSpriteCallback(NULL);
 	}
 }
 
-uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPressButton(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1102,24 +1102,24 @@ uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420170() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420170))) {
+void Klayman::stStampFloorButton() {
+	if (!stStartAction(AnimationCallback(&Klayman::stStampFloorButton))) {
 		_status2 = 2;
 		_flagE5 = true;
 		setFileHash(0x1C16B033, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41DAD0);
+		SetMessageHandler(&Klayman::hmPressButton);
 		SetSpriteCallback(NULL);
 	}
 }
 
-void Klayman::sub4200D0() {
-	if (!sub41CF10(AnimationCallback(&Klayman::sub4200D0))) {
+void Klayman::stPressButtonSide() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stPressButtonSide))) {
 		_status2 = 1;
 		_flagE5 = true;
 		setFileHash(0x1CD89029, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41DAD0);
+		SetMessageHandler(&Klayman::hmPressButton);
 		SetSpriteCallback(&Klayman::spriteUpdate41F250);
 	}
 }
@@ -1135,7 +1135,7 @@ void Klayman::sub41CD00(int16 x) {
 		sub41C930(x, false);
 	} else {
 		_x4 = x;
-		setCallback2(NULL);
+		gotoState(NULL);
 		sub41C7B0();
 	}
 }
@@ -1144,7 +1144,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 	if (_x > x1) {
 		if (_x == x1 + x2) {
 			_x4 = x1 + x2;
-			setCallback2(NULL);
+			gotoState(NULL);
 			sub41C7B0();
 		} else if (_x < x1 + x2) {
 			sub41CAC0(x1 + x2);
@@ -1154,7 +1154,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 	} else {
 		if (_x == x1 - x2) {
 			_x4 = x1 - x2;
-			setCallback2(NULL);
+			gotoState(NULL);
 			sub41C7B0();
 		} else if (_x > x1 - x2) {
 			sub41CAC0(x1 - x2);
@@ -1169,45 +1169,45 @@ void Klayman::sub41CAC0(int16 x) {
 	if (x == _x) {
 		_x4 = x;
 		if (!_flagE1 && !_flagE2 && !_flagE3) {
-			setCallback2(NULL);
+			gotoState(NULL);
 			sub41C7B0();
 		}
 	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
 		_x4 = x;
-		setCallback2(NULL);
+		gotoState(NULL);
 		sub41C7B0();
 	} else if (xdiff <= 42 && _status3 != 3) {
 		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
 			_x4 = x;
 		} else {
 			_x4 = x;
-			setCallback2(AnimationCallback(&Klayman::sub41FB40));
+			GotoState(&Klayman::stSneak);
 		}
 	} else if (_flagE3 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
 		_x4 = x;
 	} else {
 		_x4 = x;
-		setCallback2(AnimationCallback(&Klayman::sub41FBC0));
+		GotoState(&Klayman::stLargeStep);
 	}
 }
 
-void Klayman::sub41FBC0() {
+void Klayman::stLargeStep() {
 	_status2 = 2;
 	_flagE3 = true;
 	_flagE5 = true;
 	setDoDeltaX(_x4 >= _x ? 1 : 0);
 	setFileHash(0x08B28116, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41DF10);
-	SetSpriteCallback(&Klayman::spriteUpdate41F780);
-	setCallback1(AnimationCallback(&Klayman::sub41FC30));	
+	SetMessageHandler(&Klayman::hmLargeStep);
+	SetSpriteCallback(&Klayman::suLargeStep);
+	FinalizeState(&Klayman::stLargeStepDone);	
 }
 
-void Klayman::sub41FC30() {
+void Klayman::stLargeStepDone() {
 	_flagE3 = false;
 }
 
-void Klayman::spriteUpdate41F780() {
+void Klayman::suLargeStep() {
 	int16 xdiff = _x4 - _x;
 	
 	if (_doDeltaX) {
@@ -1253,7 +1253,7 @@ void Klayman::spriteUpdate41F780() {
 	}
 }
 
-uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmLargeStep(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1271,7 +1271,7 @@ uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420870() {
+void Klayman::stWonderAboutHalf() {
 	_status2 = 0;
 	_flagE5 = true;
 	setFileHash(0xD820A114, 0, 10);
@@ -1280,7 +1280,7 @@ void Klayman::sub420870() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub4208B0() {
+void Klayman::stWonderAboutAfter() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0xD820A114, 30, -1);
@@ -1289,7 +1289,7 @@ void Klayman::sub4208B0() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub4208F0() {
+void Klayman::stTurnToUseHalf() {
 	_status2 = 0;
 	_flagE5 = true;
 	setFileHash(0x9B250AD2, 0, 7);
@@ -1312,7 +1312,7 @@ uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420930() {
+void Klayman::stTurnAwayFromUse() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x98F88391, 4, -1);
@@ -1321,7 +1321,7 @@ void Klayman::sub420930() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub420830() {
+void Klayman::stWonderAbout() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0xD820A114, 0, -1);
@@ -1330,23 +1330,22 @@ void Klayman::sub420830() {
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub41FC40() {
+void Klayman::stPeekWall() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0xAC20C012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E3C0);
+	SetMessageHandler(&Klayman::hmPeekWall);
 	SetSpriteCallback(NULL);
 }
 
-uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *sender) {
 	int16 speedUpFrameIndex;
 	switch (messageNum) {
 	case 0x1008:
 		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_frameIndex < speedUpFrameIndex) {
+		if (_frameIndex < speedUpFrameIndex)
 			setFileHash(0xAC20C012, speedUpFrameIndex, -1);
-		}
 		return 0;
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -1360,7 +1359,7 @@ uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub420210() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420210))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420210))) {
 		_status2 = 0;
 		setFileHash(0xD82890BA, 0, -1);
 		sub4201C0();
@@ -1372,7 +1371,7 @@ void Klayman::sub4201C0() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D790);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
-	SetAnimationCallback3(&Klayman::sub420340);
+	NextState(&Klayman::sub420340);
 	sendMessage(_attachedSprite, 0x482B, 0);
 }
 
@@ -1412,7 +1411,7 @@ void Klayman::sub420340() {
 }
 
 void Klayman::sub420250() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420250))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420250))) {
 		_status2 = 0;
 		setFileHash(0x900980B2, 0, -1);
 		sub4201C0();
@@ -1420,14 +1419,14 @@ void Klayman::sub420250() {
 }
 
 void Klayman::sub420290() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420290))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420290))) {
 		_status2 = 0;
 		_flagE5 = false;
 		setFileHash(0xBA1910B2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::handleMessage41D880);
-		SetAnimationCallback3(&Klayman::sub420380);
+		NextState(&Klayman::sub420380);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
@@ -1483,7 +1482,7 @@ void Klayman::sub4203C0() {
 }
 
 void Klayman::sub420300() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420300))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420300))) {
 		_status2 = 0;
 		setFileHash(0xB8699832, 0, -1);
 		sub4201C0();
@@ -1491,7 +1490,7 @@ void Klayman::sub420300() {
 }
 
 void Klayman::sub41CCE0(int16 x) {
-	sub41CC40(((Sprite*)_attachedSprite)->getX(), x);
+	sub41CC40(_attachedSprite->getX(), x);
 }
 
 void Klayman::sub420970() {
@@ -1507,7 +1506,7 @@ void Klayman::sub420970() {
 }
 
 void Klayman::sub4209D0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub4209D0))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub4209D0))) {
 		_status2 = 0;
 		if (_y4 < _y) {
 			if (_statusE0 == 1) {
@@ -1609,7 +1608,7 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub420AD0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420AD0))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420AD0))) {
 		_status2 = 0;
 		if (_y4 >= _y - 30) {
 			sub41C7B0();
@@ -1671,7 +1670,7 @@ uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub420FE0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420FE0))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420FE0))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0xF229C003, 0, -1);
@@ -1682,7 +1681,7 @@ void Klayman::sub420FE0() {
 }
 
 void Klayman::sub4210C0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub4210C0))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub4210C0))) {
 		_status2 = 0;
 		_flagE5 = false;
 		setFileHash2(0xCA221107, 0x8520108C, 0);
@@ -1693,7 +1692,7 @@ void Klayman::sub4210C0() {
 }
 
 void Klayman::sub421070() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub421070))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub421070))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0xCA221107, 0, -1);
@@ -1703,7 +1702,7 @@ void Klayman::sub421070() {
 	}
 }
 
-void Klayman::sub420420() {
+void Klayman::stLandOnFeet() {
 	_status2 = 1;
 	_flagE5 = true;
 	setFileHash(0x18118554, 0, -1);
@@ -1725,7 +1724,7 @@ uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub420ED0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420ED0))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420ED0))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0x91540140, 0, -1);
@@ -1752,7 +1751,7 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub420750() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420750))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420750))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0x5CCCB330, 0, -1);
@@ -1762,8 +1761,8 @@ void Klayman::sub420750() {
 	}
 }
 
-void Klayman::sub4207A0() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub4207A0))) {
+void Klayman::stTurnToUse() {
+	if (!stStartAction(AnimationCallback(&Klayman::stTurnToUse))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0x9B250AD2, 0, -1);
@@ -1799,8 +1798,8 @@ void Klayman::spriteUpdate41F5A0() {
 	AnimatedSprite::updateDeltaXY();
 }
 
-void Klayman::sub420600() {
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+void Klayman::stMoveObjectSkipTurnFaceObject() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	_flagE4 = false;
 	_flagE5 = true;
 	setFileHash2(0x0C1CA072, 0x01084280, 0);
@@ -1820,10 +1819,10 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, E
 			if (_attachedSprite)
 				sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
 		} else if (param.asInteger() == 0x02421405) {
-			if (_flagE4 && _attachedSprite->hasMessageHandler() && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
-				sub4205C0();
+			if (_flagE4 && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
+				stMoveObjectSkipTurn();
 			} else {
-				setCallback1(AnimationCallback(&Klayman::sub420660));
+				FinalizeState(&Klayman::sub420660);
 				SetMessageHandler(&Klayman::handleMessage41D480);
 			}
 		} else if (param.asInteger() == 0x32180101) {
@@ -1839,7 +1838,7 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, E
 	return handleMessage41D480(messageNum, param, sender);
 }
 
-void Klayman::sub4205C0() {
+void Klayman::stMoveObjectSkipTurn() {
 	_flagE4 = false;
 	_flagE5 = true;
 	setFileHash2(0x0C1CA072, 0x01084280, 0);
@@ -1848,9 +1847,9 @@ void Klayman::sub4205C0() {
 	SetMessageHandler(&Klayman::handleMessage41D970);
 }
 
-void Klayman::sub420550() {
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420550))) {
+void Klayman::stMoveObjectFaceObject() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) {
 		_status2 = 2;
 		_flagE4 = false;
 		_flagE5 = true;
@@ -1862,29 +1861,30 @@ void Klayman::sub420550() {
 }
 
 void Klayman::sub420C50() {
-	if (!sub41CEB0(AnimationCallback(&Klayman::sub420C50))) {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420C50))) {
 		_status2 = 0;
 		if (_flagF7) {
-			sub420D50();
+			stReleaseLeverUp();
 		} else {
 			sendMessage(_attachedSprite, 0x482B, 0);
 			setFileHash(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
 			SetMessageHandler(&Klayman::handleMessage41E210);
-			SetAnimationCallback3(&Klayman::sub420CD0);
+			NextState(&Klayman::stPullLeverDown);
 			_flagE5 = false;
 		}
 	}
 }
 
-void Klayman::sub420CD0() {
+// Exactly the same code as sub420DA0 which was removed
+void Klayman::stPullLeverDown() {
 	setFileHash(0x0D318140, 0, -1);
 	sendMessage(_attachedSprite, 0x480F, 0);
-	SetAnimationCallback3(&Klayman::sub420D10);
+	NextState(&Klayman::stHoldLeverDown);
 }
 
-void Klayman::sub420D10() {
+void Klayman::stHoldLeverDown() {
 	setFileHash(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
@@ -1893,31 +1893,16 @@ void Klayman::sub420D10() {
 	_flagE5 = true;
 }
 
-void Klayman::sub420D50() {
+void Klayman::stReleaseLeverUp() {
 	setFileHash(0x09018068, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41E210);
 	sendMessage(_attachedSprite, 0x4807, 0);
-	SetAnimationCallback3(&Klayman::sub420DA0);
+	NextState(&Klayman::stPullLeverDown);
 	_flagE5 = false;
 }
 
-void Klayman::sub420DA0() {
-	setFileHash(0x0D318140, 0, -1);
-	sendMessage(_attachedSprite, 0x480F, 0);
-	SetAnimationCallback3(&Klayman::sub420DE0);
-}
-
-void Klayman::sub420DE0() {
-	setFileHash(0x4464A440, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
-	SetMessageHandler(&Klayman::handleMessage41D360);
-	_flagF7 = true;
-	_flagE5 = true;
-}
-
 void Klayman::sub420E20() {
 	if (_flagF7) {
 		_status2 = 2;
@@ -1926,7 +1911,7 @@ void Klayman::sub420E20() {
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::handleMessage41E210);
 		sendMessage(_attachedSprite, 0x4807, 0);
-		SetAnimationCallback3(&Klayman::sub420E90);
+		NextState(&Klayman::sub420E90);
 		_flagE5 = false;
 		_flagF7 = false;
 	} else {
@@ -1936,7 +1921,7 @@ void Klayman::sub420E20() {
 
 void Klayman::sub420E90() {
 	setFileHash(0x0928C048, 0, -1);
-	setCallback1(AnimationCallback(&Klayman::sub420EB0));
+	FinalizeState(&Klayman::sub420EB0);
 }
 
 void Klayman::sub420EB0() {
@@ -1944,7 +1929,7 @@ void Klayman::sub420EB0() {
 }
 
 void Klayman::sub420680() {
-	if (!sub41CF10(AnimationCallback(&Klayman::sub420680))) {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub420680))) {
 		_status2 = 2;
 		_counter2 = 0;
 		for (uint32 i = 0; i < 20; i++) {
@@ -1955,7 +1940,7 @@ void Klayman::sub420680() {
 			}
 		}
 		if (_counter2 == 0) {
-			setCallback2(NULL);
+			gotoState(NULL);
 			sub41C7B0();
 		} else {
 			setFileHash(0xD8C8D100, 0, -1);
@@ -2023,26 +2008,25 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;		
 	case 0x4804:
-		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub4211B0));
-		}
+		if (param.asInteger() == 2)
+			GotoState(&Klayman::stSleeping);
 		break;
 	case 0x480D:
-		setCallback2(AnimationCallback(&KmScene1001::sub44FA50));
+		GotoState(&KmScene1001::sub44FA50);
 		break;
 	case 0x4812:
-		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
-		}else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -2059,15 +2043,15 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -2077,7 +2061,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4836:
 		if (param.asInteger() == 1) {
 			sendMessage(_parentScene, 0x2002, 0);
-			setCallback2(AnimationCallback(&Klayman::sub4211F0));
+			GotoState(&Klayman::stWakeUp);
 		}
 		break;		
 	case 0x483F:
@@ -2091,7 +2075,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene1001::sub44FA50() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) {
+	if (!stStartAction(AnimationCallback(&KmScene1001::sub44FA50))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0x00648953, 0, -1);
@@ -2138,7 +2122,7 @@ void KmScene1002::xUpdate() {
 uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2001:
-		setCallback2(AnimationCallback(&KmScene1002::sub449E90));
+		GotoState(&KmScene1002::sub449E90);
 		break;
 	case 0x2007:
 		_otherSprite = (Sprite*)param.asEntity();
@@ -2148,43 +2132,43 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004: 
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4803:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&KmScene1002::sub44A250));
+			GotoState(&KmScene1002::stJumpAndFall);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&KmScene1002::sub44A2C0));
+			GotoState(&KmScene1002::stDropFromRing);
 		}
 		break;
 	case 0x4804:
-		setCallback2(AnimationCallback(&Klayman::sub41FC40));
+		GotoState(&Klayman::stPeekWall);
 		break;
 	case 0x4805:
 		switch (param.asInteger()) {
 		case 1:
-			setCallback2(AnimationCallback(&Klayman::sub420210));
+			GotoState(&Klayman::sub420210);
 			break;
 		case 2:
-			setCallback2(AnimationCallback(&Klayman::sub420250));
+			GotoState(&Klayman::sub420250);
 			break;
 		case 3:
-			setCallback2(AnimationCallback(&Klayman::sub420290));
+			GotoState(&Klayman::sub420290);
 			break;
 		case 4:
-			setCallback2(AnimationCallback(&Klayman::sub420300));
+			GotoState(&Klayman::sub420300);
 			break;
 		}
 		break;
 	case 0x480A:	  
-		setCallback2(AnimationCallback(&KmScene1002::sub44A3E0));
+		GotoState(&KmScene1002::stMoveVenusFlyTrap);
 		break;
 	case 0x480D:			   
-		setCallback2(AnimationCallback(&KmScene1002::sub449E20));
+		GotoState(&KmScene1002::sub449E20);
 		break;
 	case 0x4816:  
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&KmScene1002::sub44A330));
+			GotoState(&KmScene1002::stPressDoorButton);
 		}
 		break;
 	case 0x4817:				  
@@ -2196,34 +2180,34 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4820:  
 		sendMessage(_parentScene, 0x2005, 0);
-		setCallback2(AnimationCallback(&Klayman::sub420970));	 
+		GotoState(&Klayman::sub420970);	 
 		break;
 	case 0x4821:	
 		sendMessage(_parentScene, 0x2005, 0);
 		_y4 = param.asInteger();
-		setCallback2(AnimationCallback(&Klayman::sub4209D0));	 
+		GotoState(&Klayman::sub4209D0);	 
 		break;
 	case 0x4822:  
 		sendMessage(_parentScene, 0x2005, 0);
 		_y4 = param.asInteger();
-		setCallback2(AnimationCallback(&Klayman::sub420AD0));	 
+		GotoState(&Klayman::sub420AD0);	 
 		break;
 	case 0x4823:
 		sendMessage(_parentScene, 0x2006, 0);
-		setCallback2(AnimationCallback(&Klayman::sub420BC0));	 
+		GotoState(&Klayman::sub420BC0);	 
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub421030));
+			GotoState(&Klayman::sub421030);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+			GotoState(&Klayman::sub420FE0);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+			GotoState(&Klayman::sub4210C0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub421070));
+			GotoState(&Klayman::sub421070);
 		}
 		break;
 	case 0x483F:
@@ -2286,14 +2270,14 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &para
 		} else if (param.asInteger() == 1) {
 			sub44A0D0();
 		} else if (param.asInteger() == 2) {
-			sub44A050();
+			stSpitOutFall();
 		}
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2301,7 +2285,7 @@ uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &para
 			_flagE5 = false;
 			sendMessage(_attachedSprite, 0x2003, 0);
 		} else if (param.asInteger() == 0xDA600012) {
-			sub44A370();
+			stHitByBoxingGlove();
 		} else if (param.asInteger() == 0x0D01B294) {
 			_flagE5 = false;
 			sendMessage(_attachedSprite, 0x480B, 0);
@@ -2311,7 +2295,7 @@ uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
@@ -2322,7 +2306,7 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam &para
 			if (_flagE4) {
 				if (_attachedSprite) {
 					if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) {
-						sub44A460();
+						stContinueMovingVenusFlyTrap();
 					}
 				}
 			} else {
@@ -2398,7 +2382,7 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene1002::spriteUpdate449DC0() {
+void KmScene1002::suFallDown() {
 	AnimatedSprite::updateDeltaXY();
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
@@ -2410,14 +2394,14 @@ void KmScene1002::spriteUpdate449DC0() {
 }
 
 void KmScene1002::sub449E20() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) {
+	if (!stStartAction(AnimationCallback(&KmScene1002::sub449E20))) {
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1002::handleMessage449800);
-		SetAnimationCallback3(&Klayman::sub420420);
+		NextState(&Klayman::stLandOnFeet);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
@@ -2439,13 +2423,11 @@ void KmScene1002::sub449EF0() {
 	_flagE5 = false;
 	setFileHash(0x000BAB02, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
-
 	// Weird stuff happening
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	//SetMessageHandler(&Klayman::handleMessage41D480);
-	
-	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
-	SetAnimationCallback3(&KmScene1002::sub449F70);
+	SetSpriteCallback(&KmScene1002::suFallDown);
+	NextState(&KmScene1002::sub449F70);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
 }
@@ -2460,7 +2442,7 @@ void KmScene1002::sub449F70() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
-	SetAnimationCallback3(&KmScene1002::sub44A230);
+	NextState(&KmScene1002::sub44A230);
 	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
@@ -2468,15 +2450,15 @@ void KmScene1002::sub449F70() {
 	sendMessage(_ssLadderArch, 0x482B, 0);
 }
 
-void KmScene1002::sub44A050() {
+void KmScene1002::stSpitOutFall() {
 	_counter1 = 1;
 	_status2 = 0;
 	_flagE5 = false;
 	setFileHash(0x9308C132, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
-	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
+	SetSpriteCallback(&KmScene1002::suFallDown);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetAnimationCallback3(&KmScene1002::sub449F70);
+	NextState(&KmScene1002::sub449F70);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
 }
@@ -2488,8 +2470,8 @@ void KmScene1002::sub44A0D0() {
 	setFileHash(0x0013A206, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
-	SetAnimationCallback3(&KmScene1002::sub44A150);
+	SetSpriteCallback(&KmScene1002::suFallDown);
+	NextState(&KmScene1002::sub44A150);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
 }
@@ -2504,7 +2486,7 @@ void KmScene1002::sub44A150() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&KmScene1002::sub44A230);
+	NextState(&KmScene1002::sub44A230);
 	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
@@ -2514,25 +2496,25 @@ void KmScene1002::sub44A150() {
 
 void KmScene1002::sub44A230() {
 	setDoDeltaX(2);
-	sub41FC80();
+	stTryStandIdle();
 }
 
-void KmScene1002::sub44A250() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) {
+void KmScene1002::stJumpAndFall() {
+	if (!stStartAction(AnimationCallback(&KmScene1002::stJumpAndFall))) {
 		sendMessage(_parentScene, 0x1024, 3);
 		_status2 = 2;
 		_flagE5 = false;
 		setFileHash(0xB93AB151, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1002::handleMessage449D60);
-		SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
-		SetAnimationCallback3(&Klayman::sub420420);
+		SetSpriteCallback(&KmScene1002::suFallDown);
+		NextState(&Klayman::stLandOnFeet);
 	}
 }
 
-void KmScene1002::sub44A2C0() {
+void KmScene1002::stDropFromRing() {
 	if (_attachedSprite) {
-		_x = ((Sprite*)_attachedSprite)->getX();
+		_x = _attachedSprite->getX();
 		sendMessage(_attachedSprite, 0x4807, 0);
 		_attachedSprite = NULL;
 	}
@@ -2541,59 +2523,59 @@ void KmScene1002::sub44A2C0() {
 	setFileHash(0x586984B1, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D360);
-	SetSpriteCallback(&KmScene1002::spriteUpdate449DC0);
-	SetAnimationCallback3(&Klayman::sub420420);
+	SetSpriteCallback(&KmScene1002::suFallDown);
+	NextState(&Klayman::stLandOnFeet);
 }
 
-void KmScene1002::sub44A330() {
+void KmScene1002::stPressDoorButton() {
 	_status2 = 2;
 	_flagE5 = true;
 	setDoDeltaX(0);
 	setFileHash(0x1CD89029, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::handleMessage449990);
+	SetMessageHandler(&KmScene1002::hmPressDoorButton);
 	SetSpriteCallback(&Klayman::spriteUpdate41F250);
 }
 
-void KmScene1002::sub44A370() {
+void KmScene1002::stHitByBoxingGlove() {
 	_status2 = 1;
 	_flagE5 = false;
 	setFileHash(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage449C90);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	setCallback1(AnimationCallback(&KmScene1002::sub44A3C0));
+	FinalizeState(&KmScene1002::stHitByBoxingGloveDone);
 }
 
-void KmScene1002::sub44A3C0() {
+void KmScene1002::stHitByBoxingGloveDone() {
 	sendMessage(_parentScene, 0x1024, 1);
 }
 
-void KmScene1002::sub44A3E0() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) {
+void KmScene1002::stMoveVenusFlyTrap() {
+	if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) {
 		_status2 = 2;
 		_flagE4 = false;
 		_flagE5 = true;
-		setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		setFileHash(0x5C01A870, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1002::handleMessage449A30);
+		SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-		setCallback1(AnimationCallback(&KmScene1002::sub44A4B0));
+		FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone);
 	}
 }
 
-void KmScene1002::sub44A460() {
+void KmScene1002::stContinueMovingVenusFlyTrap() {
 	_flagE4 = false;
 	_flagE5 = true;
 	setFileHash2(0x5C01A870, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::handleMessage449A30);
+	SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	setCallback1(AnimationCallback(&KmScene1002::sub44A4B0));
+	FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone);
 }
 
-void KmScene1002::sub44A4B0() {
+void KmScene1002::stMoveVenusFlyTrapDone() {
 	sendMessage(_attachedSprite, 0x482A, 0);
 }
 
@@ -2612,7 +2594,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -2622,38 +2604,38 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&KmScene1004::sub478170));
+		GotoState(&KmScene1004::stReadNote);
 		break;
 	case 0x4820:
 		sendMessage(_parentScene, 0x2000, 0);
-		setCallback2(AnimationCallback(&Klayman::sub420970));
+		GotoState(&Klayman::sub420970);
 		break;
 	case 0x4821:
 		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = param.asInteger();
-		setCallback2(AnimationCallback(&Klayman::sub4209D0));
+		GotoState(&Klayman::sub4209D0);
 		break;
 	case 0x4822:
 		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = param.asInteger();
-		setCallback2(AnimationCallback(&Klayman::sub420AD0));
+		GotoState(&Klayman::sub420AD0);
 		break;
 	case 0x4823:
 		sendMessage(_parentScene, 0x2001, 0);
-		setCallback2(AnimationCallback(&Klayman::sub420BC0));
+		GotoState(&Klayman::sub420BC0);
 		break;
 	case 0x4824:
 		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = _dataResource.getPoint(param.asInteger()).y;
-		setCallback2(AnimationCallback(&Klayman::sub4209D0));
+		GotoState(&Klayman::sub4209D0);
 		break;
 	case 0x4825:
 		sendMessage(_parentScene, 0x2000, 0);
 		_y4 = _dataResource.getPoint(param.asInteger()).y;
-		setCallback2(AnimationCallback(&Klayman::sub420AD0));
+		GotoState(&Klayman::sub420AD0);
 		break;
 	case 0x4828:
-		setCallback2(AnimationCallback(&Klayman::sub420ED0));
+		GotoState(&Klayman::sub420ED0);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -2665,7 +2647,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2678,12 +2660,12 @@ uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene1004::sub478170() {
+void KmScene1004::stReadNote() {
 	_status2 = 2;
 	_flagE5 = false;
 	setFileHash(0x123E9C9F, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1004::handleMessage478110);
+	SetMessageHandler(&KmScene1004::hmReadNote);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 }
 
@@ -2704,16 +2686,16 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub421350));
+			GotoState(&Klayman::sub421350);
 		else
-			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+			GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&Klayman::sub41F9E0));
+			GotoState(&Klayman::stWalking);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4817:
@@ -2722,24 +2704,24 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481D:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+			GotoState(&Klayman::sub4214D0);
 		break;
 	case 0x481E:
 		if (_flag)
-			setCallback2(AnimationCallback(&Klayman::sub421510));
+			GotoState(&Klayman::sub421510);
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
 		_flag1 = true;
-		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
 		_flag1 = false;
-		setCallback2(AnimationCallback(&Klayman::sub421310));
+		GotoState(&Klayman::sub421310);
 		break;
 	case 0x483D:
 		sub461F30();
@@ -2800,26 +2782,26 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480A:
-		setCallback2(AnimationCallback(&KmScene1201::sub40DF00));
+		GotoState(&KmScene1201::sub40DF00);
 		break;
 	case 0x4812:
-		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4813:
-		setCallback2(AnimationCallback(&KmScene1201::sub40DD20));
+		GotoState(&KmScene1201::stFetchMatch);
 		break;
 	case 0x4814:
-		setCallback2(AnimationCallback(&KmScene1201::sub40DFA0));
+		GotoState(&KmScene1201::stTumbleHeadless);
 		break;
 	case 0x4815:
-		setCallback2(AnimationCallback(&KmScene1201::sub40E040));
+		GotoState(&KmScene1201::sub40E040);
 		break;
 	case 0x4816:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stPressButtonSide);
 		}
 		break;
 	case 0x4817:
@@ -2834,13 +2816,13 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x481F:
-		setCallback2(AnimationCallback(&Klayman::sub420830));
+		GotoState(&Klayman::stWonderAbout);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -2862,7 +2844,7 @@ void KmScene1201::update40DBE0() {
 	Klayman::update();		
 }
 
-uint32 KmScene1201::handleMessage40DC00(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1201::hmMatch(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2882,27 +2864,27 @@ uint32 KmScene1201::handleMessage40DC00(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene1201::sub40DD20() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DD20))) {
+void KmScene1201::stFetchMatch() {
+	if (!stStartAction(AnimationCallback(&KmScene1201::stFetchMatch))) {
 		_status2 = 0;
 		_flagE5 = false;
-		setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		setFileHash(0x9CAA0218, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(NULL);
-		SetMessageHandler(&KmScene1201::handleMessage40DC00);
-		SetAnimationCallback3(&KmScene1201::sub40DD90);
+		SetMessageHandler(&KmScene1201::hmMatch);
+		NextState(&KmScene1201::stLightMatch);
 	}
 }
 
-void KmScene1201::sub40DD90() {
+void KmScene1201::stLightMatch() {
 	_status2 = 1;
 	_flagE5 = false;
-	setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0);
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	setFileHash(0x1222A513, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
-	SetMessageHandler(&KmScene1201::handleMessage40DC00);
+	SetMessageHandler(&KmScene1201::hmMatch);
 }
 
 uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2916,7 +2898,7 @@ uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam &para
 		} else if (param.asInteger() == 0x02421405) {
 			if (_countdown != 0) {
 				_countdown--;
-				sub40DF60();
+				stMoveObjectSkipTurn();
 			} else {
 				SetMessageHandler(&Klayman::handleMessage41D480);
 			}
@@ -2926,7 +2908,7 @@ uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam &para
 	return Klayman::handleMessage41D480(messageNum, param, sender);
 }
 
-uint32 KmScene1201::handleMessage40DEA0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2939,7 +2921,7 @@ uint32 KmScene1201::handleMessage40DEA0(int messageNum, const MessageParam &para
 }
 
 void KmScene1201::sub40DF00() {
-	if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DF00))) {
+	if (!stStartAction(AnimationCallback(&KmScene1201::sub40DF00))) {
 		_status2 = 2;
 		_flagE5 = false;
 		_countdown = 8;
@@ -2951,31 +2933,31 @@ void KmScene1201::sub40DF00() {
 	}
 }
 
-void KmScene1201::sub40DF60() {
-		_flagE5 = false;
-		setFileHash2(0x0C1CA072, 0x01084280, 0);
-		SetUpdateHandler(&KmScene1201::update40DBE0);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1201::handleMessage40DDF0);
+void KmScene1201::stMoveObjectSkipTurn() {
+	_flagE5 = false;
+	setFileHash2(0x0C1CA072, 0x01084280, 0);
+	SetUpdateHandler(&KmScene1201::update40DBE0);
+	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&KmScene1201::handleMessage40DDF0);
 }
 
-void KmScene1201::sub40DFA0() {
-	if (!sub41CF10(AnimationCallback(&KmScene1201::sub40DFA0))) {
+void KmScene1201::stTumbleHeadless() {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stTumbleHeadless))) {
 		_status2 = 1;
 		_flagE5 = false;
 		setDoDeltaX(0);
 		setFileHash(0x2821C590, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1201::handleMessage40DEA0);
-		SetAnimationCallback3(&Klayman::sub41FC80);
+		SetMessageHandler(&KmScene1201::hmTumbleHeadless);
+		NextState(&Klayman::stTryStandIdle);
 		sendMessage(_class464, 0x2006, 0);
 		_soundResource1.play(0x62E0A356);
 	}
 }
 
 void KmScene1201::sub40E040() {
-	if (!sub41CF10(AnimationCallback(&KmScene1201::sub40E040))) {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::sub40E040))) {
 		_status2 = 1;
 		_flagE5 = false;		
 		setFileHash(0x5420E254, 0, -1);
@@ -2994,19 +2976,19 @@ KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4804:
-		setCallback2(AnimationCallback(&KmScene1303::sub4161D0));
+		GotoState(&KmScene1303::stPeekWall1);
 		break;
 	case 0x483B:
-		setCallback2(AnimationCallback(&KmScene1303::sub4162B0));
+		GotoState(&KmScene1303::stPeekWallReturn);
 		break;
 	case 0x483C:
-		setCallback2(AnimationCallback(&KmScene1303::sub416210));
+		GotoState(&KmScene1303::stPeekWall2);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene1303::handleMessage4160A0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -3028,20 +3010,20 @@ void KmScene1303::update4161A0() {
 	Klayman::update();
 	_counter3++;
 	if (_counter3 >= _counter3Max)
-		sub416250();
+		stPeekWall3();
 }
 
-void KmScene1303::sub4161D0() {
+void KmScene1303::stPeekWall1() {
 	_status2 = 0;
 	_flagE5 = true;
 	setFileHash(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetAnimationCallback3(&KmScene1303::sub416250);
+	NextState(&KmScene1303::stPeekWall3);
 }
 
-void KmScene1303::sub416210() {
+void KmScene1303::stPeekWall2() {
 	_status2 = 1;
 	_flagE5 = false;
 	setFileHash(0xAC20C012, 43, 49);
@@ -3050,7 +3032,7 @@ void KmScene1303::sub416210() {
 	SetMessageHandler(&Klayman::handleMessage41D480);
 }
 
-void KmScene1303::sub416250() {
+void KmScene1303::stPeekWall3() {
 	_counter3 = 0;
 	_status2 = 0;
 	_flagE5 = true;
@@ -3062,13 +3044,13 @@ void KmScene1303::sub416250() {
 	_newHashListIndex = 42;
 }
 
-void KmScene1303::sub4162B0() {
+void KmScene1303::stPeekWallReturn() {
 	_status2 = 0;
 	_flagE5 = false;
 	setFileHash(0x2426932E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
-	SetMessageHandler(&KmScene1303::handleMessage4160A0);
+	SetMessageHandler(&KmScene1303::hmPeekWallReturn);
 }
 
 KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -3084,15 +3066,15 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;		
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -3108,11 +3090,11 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;						
 	case 0x481F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x483F:
@@ -3138,10 +3120,10 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;		
 	case 0x4804:
-		setCallback2(AnimationCallback(&KmScene1305::sub46BEF0));
+		GotoState(&KmScene1305::stCrashDown);
 		break;		
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3151,7 +3133,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1305::sub46BEF0() {
+void KmScene1305::stCrashDown() {
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
 	_flagE5 = false;
@@ -3159,12 +3141,12 @@ void KmScene1305::sub46BEF0() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetAnimationCallback3(&KmScene1305::sub46BF60);
+	NextState(&KmScene1305::cbCrashDownEvent);
 }
 
-void KmScene1305::sub46BF60() {
+void KmScene1305::cbCrashDownEvent() {
 	setDoDeltaX(2);
-	sub41FC80();
+	stTryStandIdle();
 }
 
 KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -3185,26 +3167,26 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub421350));
+			GotoState(&Klayman::sub421350);
 		else
-			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+			GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
+			GotoState(&Klayman::stStampFloorButton);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -3212,7 +3194,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;		
 	case 0x481A:
-		setCallback2(AnimationCallback(&Klayman::sub420680));		
+		GotoState(&Klayman::sub420680);		
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3223,27 +3205,27 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481D:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+			GotoState(&Klayman::sub4214D0);
 		else
-			setCallback2(AnimationCallback(&Klayman::sub4207A0));
+			GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub421510));
+			GotoState(&Klayman::sub421510);
 		else
-			setCallback2(AnimationCallback(&Klayman::sub4207F0));
+			GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -3252,30 +3234,30 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub421030));
+			GotoState(&Klayman::sub421030);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+			GotoState(&Klayman::sub420FE0);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+			GotoState(&Klayman::sub4210C0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub421070));
+			GotoState(&Klayman::sub421070);
 		}
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
 		_flag1 = true;
-		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
 		_flag1 = false;
-		setCallback2(AnimationCallback(&Klayman::sub421310));
+		GotoState(&Klayman::sub421310);
 		break;
 	case 0x483D:
 		sub417D40();
@@ -3337,25 +3319,25 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480A:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420600));
+			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420550));
+			GotoState(&Klayman::stMoveObjectFaceObject);
 		}	
 		break;		
 	case 0x480D:
-		setCallback2(AnimationCallback(&KmScene1001::sub420C50));
+		GotoState(&KmScene1001::sub420C50);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -3364,9 +3346,9 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481A:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&KmScene1308::sub456150));		
+			GotoState(&KmScene1308::sub456150);		
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420680));		
+			GotoState(&Klayman::sub420680);		
 		}
 		break;
 	case 0x481B:
@@ -3377,16 +3359,16 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x4827:
-		setCallback2(AnimationCallback(&Klayman::sub420E20));
+		GotoState(&Klayman::sub420E20);
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -3424,7 +3406,7 @@ uint32 KmScene1308::handleMessage(int messageNum, const MessageParam &param, Ent
 }
 
 void KmScene1308::sub456150() {
-	if (!sub41CF10(AnimationCallback(&KmScene1308::sub456150))) {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::sub456150))) {
 		_status2 = 2;
 		_flag1 = false;
 		for (uint i = 0; i < 3; i++) {
@@ -3446,7 +3428,7 @@ void KmScene1308::sub456150() {
 			} 
 		}
 		if (!_flag1) {
-			setCallback2(NULL);
+			gotoState(NULL);
 			sub41C7B0();
 		} else {
 			_flagE5 = false;
@@ -3474,22 +3456,22 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;		
 	case 0x480A:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420600));
+			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420550));
+			GotoState(&Klayman::stMoveObjectFaceObject);
 		}	
 		break;		
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
+			GotoState(&Klayman::stStampFloorButton);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stPressButtonSide);
 		}
 		break;
 	case 0x4817:
@@ -3505,11 +3487,11 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;						
 	case 0x481F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -3518,16 +3500,16 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub421030));
+			GotoState(&Klayman::sub421030);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+			GotoState(&Klayman::sub420FE0);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+			GotoState(&Klayman::sub4210C0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub421070));
+			GotoState(&Klayman::sub421070);
 		}
 		break;
 	}
@@ -3549,13 +3531,13 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;		
 	case 0x480A:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420600));
+			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420550));
+			GotoState(&Klayman::stMoveObjectFaceObject);
 		}
 		break;		
 	case 0x4817:
@@ -3570,10 +3552,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;						
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	}
 	return 0;
@@ -3594,25 +3576,25 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480A:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420600));
+			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420550));
+			GotoState(&Klayman::stMoveObjectFaceObject);
 		}
 		break;		
 	case 0x480D:
-		setCallback2(AnimationCallback(&KmScene1001::sub420C50));
+		GotoState(&KmScene1001::sub420C50);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -3627,7 +3609,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4827:
-		setCallback2(AnimationCallback(&Klayman::sub420E20));
+		GotoState(&Klayman::sub420E20);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -3654,22 +3636,22 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480A:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420600));
+			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420550));
+			GotoState(&Klayman::stMoveObjectFaceObject);
 		}
 		break;		
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -3677,7 +3659,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;
 	case 0x481A:
-		setCallback2(AnimationCallback(&Klayman::sub420680));		
+		GotoState(&Klayman::sub420680);		
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3687,22 +3669,22 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -3734,17 +3716,17 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub421350));
+			GotoState(&Klayman::sub421350);
 		else
-			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+			GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -3760,23 +3742,23 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481D:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+			GotoState(&Klayman::sub4214D0);
 		break;
 	case 0x481E:
 		if (_flag)
-			setCallback2(AnimationCallback(&Klayman::sub421510));
+			GotoState(&Klayman::sub421510);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -3784,17 +3766,17 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2032, 1);
 		_flag1 = true;
-		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2032, 0);
 		_flag1 = false;
-		setCallback2(AnimationCallback(&Klayman::sub421310));
+		GotoState(&Klayman::sub421310);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -3827,21 +3809,21 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_flag) {
-			setCallback2(AnimationCallback(&Klayman::sub421350));
+			GotoState(&Klayman::sub421350);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+			GotoState(&Klayman::stTryStandIdle);
 		}
 		break;
 	case 0x4803:
-		setCallback2(AnimationCallback(&KmScene1705::sub468A80));
+		GotoState(&KmScene1705::stFallSkipJump);
 		break;				
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -3857,39 +3839,39 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481D:
 		if (_flag) {
-			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+			GotoState(&Klayman::sub4214D0);
 		}
 		break;
 	case 0x481E:
 		if (_flag) {
-			setCallback2(AnimationCallback(&Klayman::sub421510));
+			GotoState(&Klayman::sub421510);
 		}
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
 		_flag = true;
-		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
 		_flag = false;
-		setCallback2(AnimationCallback(&Klayman::sub421310));
+		GotoState(&Klayman::sub421310);
 		break;
 	case 0x483D:
 		sub468AD0();
@@ -3925,14 +3907,14 @@ void KmScene1705::spriteUpdate468A30() {
 	}
 }
 
-void KmScene1705::sub468A80() {
+void KmScene1705::stFallSkipJump() {
 	_status2 = 2;
 	_flagE5 = false;
 	setFileHash2(0xB93AB151, 0x40A100F8, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&KmScene1705::spriteUpdate468A30);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetAnimationCallback3(&Klayman::sub420420);
+	NextState(&Klayman::stLandOnFeet);
 }
 
 void KmScene1705::sub468AD0() {
@@ -3966,17 +3948,17 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		sub41C7B0();
 		break;		
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4009,17 +3991,17 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_flag) {
-			setCallback2(AnimationCallback(&Klayman::sub421350));
+			GotoState(&Klayman::sub421350);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+			GotoState(&Klayman::stTryStandIdle);
 		}
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&Klayman::sub41F9E0));
+			GotoState(&Klayman::stWalking);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4817:
@@ -4028,32 +4010,32 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481D:
 		if (_flag) {
-			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+			GotoState(&Klayman::sub4214D0);
 		}
 		break;
 	case 0x481E:
 		if (_flag) {
-			setCallback2(AnimationCallback(&Klayman::sub421510));
+			GotoState(&Klayman::sub421510);
 		}
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
 		_flag = true;
-		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		GotoState(&Klayman::stSitInTeleporter);
 		break;
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
 		_flag = false;
-		setCallback2(AnimationCallback(&Klayman::sub421310));
+		GotoState(&Klayman::sub421310);
 		break;
 	case 0x483D:
 		sub440230();
 		break;
 	case 0x483E:
-		sub440270();
+		stDoTeleport();
 		break;
 	}
 	return 0;
@@ -4082,7 +4064,7 @@ void KmScene2001::sub440230() {
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
-void KmScene2001::sub440270() {
+void KmScene2001::stDoTeleport() {
 	_status2 = 0;
 	_flagE5 = false;
 	setFileHash(0x18AB4ED4, 0, -1);
@@ -4110,29 +4092,29 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub421350));
+			GotoState(&Klayman::sub421350);
 		else
-			setCallback2(AnimationCallback(&Klayman::sub41FC80));
+			GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4811:
-		setCallback2(AnimationCallback(&KmScene2101::sub4862C0));
+		GotoState(&KmScene2101::sub4862C0);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
-		}else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -4148,24 +4130,24 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481D:
 		if (_flag1)
-			setCallback2(AnimationCallback(&Klayman::sub4214D0));
+			GotoState(&Klayman::sub4214D0);
 		break;
 	case 0x481E:
 		if (_flag)
-			setCallback2(AnimationCallback(&Klayman::sub421510));
+			GotoState(&Klayman::sub421510);
 		break;
 	case 0x4834:
-		setCallback2(AnimationCallback(&Klayman::sub421160));
+		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
 		_flag1 = true;
-		setCallback2(AnimationCallback(&Klayman::sub4212C0));
+		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
 		_flag1 = false;
-		setCallback2(AnimationCallback(&Klayman::sub421310));
+		GotoState(&Klayman::sub421310);
 		break;
 	case 0x483D:
 		sub486320();
@@ -4257,14 +4239,14 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4812:
-		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4816:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stPressButtonSide);
 		}
 		break;
 	case 0x4817:
@@ -4282,10 +4264,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4293,16 +4275,16 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub421030));
+			GotoState(&Klayman::sub421030);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+			GotoState(&Klayman::sub420FE0);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+			GotoState(&Klayman::sub4210C0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub421070));
+			GotoState(&Klayman::sub421070);
 		}
 		break;
 	case 0x483F:
@@ -4327,24 +4309,24 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
-		}else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -4355,10 +4337,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4819:
-		setCallback2(AnimationCallback(&Klayman::sub420750));
+		GotoState(&Klayman::sub420750);
 		break;
 	case 0x481A:
-		setCallback2(AnimationCallback(&Klayman::sub420680));		
+		GotoState(&Klayman::sub420680);		
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4368,10 +4350,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		setCallback2(AnimationCallback(&Klayman::sub4207A0));
+		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		setCallback2(AnimationCallback(&Klayman::sub4207F0));
+		GotoState(&Klayman::sub4207F0);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4403,19 +4385,19 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&KmScene2205::sub423980));
+			GotoState(&KmScene2205::sub423980);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4816:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -4446,8 +4428,8 @@ void KmScene2205::sub423980() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	SetAnimationCallback3(&Klayman::sub41FA40);
-	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+	NextState(&Klayman::sub41FA40);
+	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4471,33 +4453,33 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4803:
-		setCallback2(AnimationCallback(&KmScene2206::sub482490));
+		GotoState(&KmScene2206::sub482490);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&KmScene2206::sub482530));
+			GotoState(&KmScene2206::sub482530);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4812:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
-		}else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -4513,15 +4495,15 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -4530,16 +4512,16 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub421030));
+			GotoState(&Klayman::sub421030);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420FE0));
+			GotoState(&Klayman::sub420FE0);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4210C0));
+			GotoState(&Klayman::sub4210C0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub421070));
+			GotoState(&Klayman::sub421070);
 		}
 		break;
 	case 0x4837:
@@ -4564,7 +4546,7 @@ void KmScene2206::spriteUpdate482450() {
 }
 
 void KmScene2206::sub482490() {
-	if (!sub41CF10(AnimationCallback(&KmScene2206::sub482490))) {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::sub482490))) {
 		_status2 = 1;
 		sendMessage(_parentScene, 0x4803, 0);
 		_flagE5 = false;
@@ -4588,8 +4570,8 @@ void KmScene2206::sub482530() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	SetAnimationCallback3(&Klayman::sub41FA40);
-	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+	NextState(&Klayman::sub41FA40);
+	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
 KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4600,32 +4582,32 @@ KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2001:
-		setCallback2(AnimationCallback(&KmScene2207::sub442460));
+		GotoState(&KmScene2207::sub442460);
 		break;
 	case 0x2005:
 		spriteUpdate442430();
-		setCallback2(AnimationCallback(&KmScene2207::sub41FC80));
+		GotoState(&KmScene2207::stTryStandIdle);
 		break;
 	case 0x4001:
 	case 0x4800:
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480D:
-		setCallback2(AnimationCallback(&KmScene2207::sub4424B0));
+		GotoState(&KmScene2207::sub4424B0);
 		break;
 	case 0x4812:
-		setCallback2(AnimationCallback(&Klayman::sub41FF80));
+		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4816:
 		if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub420120));
+			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420170));
-		}else {
-			setCallback2(AnimationCallback(&Klayman::sub4200D0));
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
 		} 
 		break;
 	case 0x4817:
@@ -4640,7 +4622,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4827:
-		setCallback2(AnimationCallback(&Klayman::sub420E20));
+		GotoState(&Klayman::sub420E20);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4657,13 +4639,13 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene2207::spriteUpdate442430() {
-	_x = ((Sprite*)_attachedSprite)->getX() - 20;
-	_y = ((Sprite*)_attachedSprite)->getY() + 46;
+	_x = _attachedSprite->getX() - 20;
+	_y = _attachedSprite->getY() + 46;
 	processDelta();
 }
 
 void KmScene2207::sub442460() {
-	if (!sub41CF10(AnimationCallback(&KmScene2207::sub442460))) {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::sub442460))) {
 		_status2 = 1;
 		_flagE5 = true;
 		setFileHash(0x5420E254, 0, -1);
@@ -4674,43 +4656,43 @@ void KmScene2207::sub442460() {
 }
 
 void KmScene2207::sub4424B0() {
-	if (!sub41CEB0(AnimationCallback(&KmScene2207::sub4424B0))) {
+	if (!stStartAction(AnimationCallback(&KmScene2207::sub4424B0))) {
 		_status2 = 0;
 		if (_flagF7) {
-			sub420D50();
+			stReleaseLeverUp();
 		} else {
 			_flagE5 = false;
 			setFileHash(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
 			SetMessageHandler(&Klayman::handleMessage41E210);
-			SetAnimationCallback3(&KmScene2207::sub442520);
+			NextState(&KmScene2207::sub442520);
 		}
 	}
 }
 
 void KmScene2207::sub442520() {
 	setFileHash(0x0D318140, 0, -1);
-	SetAnimationCallback3(&KmScene2207::sub442560);
 	sendMessage(_attachedSprite, 0x480F, 0);
+	NextState(&KmScene2207::sub442560);
 }
 
 void KmScene2207::sub442560() {
-	_flagE5 = true;
-	_flagF7 = true;
 	setFileHash(0x1564A2C0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
-	SetAnimationCallback3(&KmScene2207::sub4425A0);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	NextState(&KmScene2207::sub4425A0);
+	_flagE5 = true;
+	_flagF7 = true;
 }
 
 void KmScene2207::sub4425A0() {
-	_flagE5 = true;
-	_flagF7 = true;
 	setFileHash(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
+	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41D360);
+	_flagE5 = true;
+	_flagF7 = true;
 }
 
 KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4729,23 +4711,23 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&KmScene2242::sub444D20));
+			GotoState(&KmScene2242::sub444D20);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
-			setCallback2(AnimationCallback(&Klayman::sub420060));
+			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub41FFF0));
+			GotoState(&Klayman::sub41FFF0);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FF80));
+			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
 	case 0x4817:
@@ -4761,15 +4743,15 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -4794,8 +4776,8 @@ void KmScene2242::sub444D20() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	SetAnimationCallback3(&Klayman::sub41FA40);
-	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+	NextState(&Klayman::sub41FA40);
+	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
 KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4814,14 +4796,14 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&KmHallOfRecords::sub43B130));
+			GotoState(&KmHallOfRecords::sub43B130);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4817:
@@ -4830,15 +4812,15 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 		break;		
 	case 0x481F:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -4863,8 +4845,8 @@ void KmHallOfRecords::sub43B130() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	SetAnimationCallback3(&Klayman::sub41FA40);
-	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+	NextState(&Klayman::sub41FA40);
+	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
 KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4883,14 +4865,14 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		setCallback2(AnimationCallback(&Klayman::sub41FC80));
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_x4 = param.asInteger();
-			setCallback2(AnimationCallback(&KmScene2247::sub453520));
+			GotoState(&KmScene2247::sub453520);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub41FC40));
+			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case 0x4817:
@@ -4899,15 +4881,15 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481F:
 		if (param.asInteger() == 0) {
-			setCallback2(AnimationCallback(&Klayman::sub420870));
+			GotoState(&Klayman::stWonderAboutHalf);
 		} else if (param.asInteger() == 1) {
-			setCallback2(AnimationCallback(&Klayman::sub4208B0));
+			GotoState(&Klayman::stWonderAboutAfter);
 		} else if (param.asInteger() == 3) {
-			setCallback2(AnimationCallback(&Klayman::sub4208F0));
+			GotoState(&Klayman::stTurnToUseHalf);
 		} else if (param.asInteger() == 4) {
-			setCallback2(AnimationCallback(&Klayman::sub420930));
+			GotoState(&Klayman::stTurnAwayFromUse);
 		} else {
-			setCallback2(AnimationCallback(&Klayman::sub420830));
+			GotoState(&Klayman::stWonderAbout);
 		}
 		break;
 	case 0x482D:
@@ -4932,8 +4914,8 @@ void KmScene2247::sub453520() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	SetAnimationCallback3(&Klayman::sub41FA40);
-	setCallback1(AnimationCallback(&Klayman::sub41FB30));
+	NextState(&Klayman::sub41FA40);
+	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index eb6ab40..645ed74 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -47,25 +47,25 @@ public:
 
 	void update();
 
-	void sub41FD30();
+	void stDoIdlePickEar();
 	void sub41FDA0();
 	void sub41FDF0();
-	void sub41FE60();
+	void stDoIdleChest();
 	void sub41FEB0();
-	void sub41FC80();
-	void sub4211F0();
-	void sub4211B0();
-	void sub41FF80();
-	void sub420120();
-	void sub420170();
-	void sub4200D0();
-	void sub41FBC0();
-	void sub420870();
-	void sub4208B0();
-	void sub4208F0();
-	void sub420930();
-	void sub420830();
-	void sub41FC40();
+	void stTryStandIdle();
+	void stWakeUp();
+	void stSleeping();
+	void stPickUpGeneric();
+	void stTurnPressButton();
+	void stStampFloorButton();
+	void stPressButtonSide();
+	void stLargeStep();
+	void stWonderAboutHalf();
+	void stWonderAboutAfter();
+	void stTurnToUseHalf();
+	void stTurnAwayFromUse();
+	void stWonderAbout();
+	void stPeekWall();
 	void sub420210();
 	void sub4201C0();
 	void sub420340();
@@ -82,45 +82,43 @@ public:
 	void sub420FE0();
 	void sub4210C0();
 	void sub421070();
-	void sub420420();
+	void stLandOnFeet();
 	void sub420ED0();
 	void sub420750();
-	void sub4207A0();
+	void stTurnToUse();
 	void sub4207F0();
 	void sub420F20();
 	void sub421350();
-	void sub4213F0();
-	void sub4213B0();
-	void sub420060();
+	void stIdleSitBlink();
+	void stIdleSitBlinkSecond();
+	void stPickUpNeedle();
 	void sub41FFF0();
 	void sub4214D0();
 	void sub421510();
-	void sub421160();
-	void sub4212C0();
+	void stStepOver();
+	void stSitInTeleporter();
 	void sub421310();
-	void sub420600();
+	void stMoveObjectSkipTurnFaceObject();
 	void sub420660();
-	void sub4205C0();
-	void sub420550();
+	void stMoveObjectSkipTurn();
+	void stMoveObjectFaceObject();
 	void sub420C50();
-	void sub420CD0();
-	void sub420D10();
-	void sub420D50();
-	void sub420DA0();
-	void sub420DE0();
+	void stPullLeverDown();
+	void stHoldLeverDown();
+	void stReleaseLeverUp();
 	void sub420E20();
 	void sub420E90();
 	void sub420EB0();
 	void sub420680();
-	void sub41F9E0();
+	void stWalking();
 	void sub41FA40();
-	void sub41FB30();
+	void stStartWalkingDone();
 
 	void sub41CE70();
 	
 	void spriteUpdate41F250();
 	void spriteUpdate41F5F0();
-	void spriteUpdate41F780();
+	void suLargeStep();
 	void spriteUpdate41F230();
 	void spriteUpdate41F5A0();
 	void spriteUpdate41F300();
@@ -140,7 +138,7 @@ public:
 
 protected:
 	Entity *_parentScene;
-	Entity *_attachedSprite;
+	Sprite *_attachedSprite;
 	int _statusE0;
 	bool _flagE1;
 	bool _flagE2;
@@ -172,9 +170,9 @@ protected:
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
-	void sub41FD40();
-	void sub41FD90();
-	uint32 handleMessage41EB10(int messageNum, const MessageParam &param, Entity *sender);
+	void stIdlePickEar();
+	void evIdlePickEarDone();
+	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
 
 	void sub41FDB0();
 	uint32 handleMessage41E980(int messageNum, const MessageParam &param, Entity *sender);
@@ -183,8 +181,8 @@ protected:
 	void sub41FE50();
 	uint32 handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub41FE70();
-	uint32 handleMessage41EF80(int messageNum, const MessageParam &param, Entity *sender);
+	void stIdleChest();
+	uint32 hmIdleChest(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void sub41FEC0();
 	uint32 handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender);
@@ -192,45 +190,44 @@ protected:
 	void sub41D320(uint32 fileHash, AnimationCb callback);
 	void update41D2B0();
 
-	bool sub41CF10(AnimationCb callback);
+	bool stStartActionFromIdle(AnimationCb callback);
 	void sub41C7B0();
 	void sub41C770();
 	void sub41C790();
 	
 	void update41D0F0();
 
-	void sub41FF00();
-	
-	void sub41FCF0();
+	void stStand();
+	void stStandAround();
 	
 	uint32 handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender);
 
 	void sub41C930(int16 x, bool flag);
 
-	uint32 handleMessage41E920(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmSleeping(int messageNum, const MessageParam &param, Entity *sender);
 	
-	bool sub41CEB0(AnimationCb callback3);
+	bool stStartAction(AnimationCb callback3);
 	
-	void sub41FB40();
-	void sub41FBB0();
+	void stSneak();
+	void stSneakDone();
 	uint32 handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender);
 	void sub41CD70(int16 x);
-	void sub41F950();
+	void stStartWalking();
 	uint32 handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender);
 
-	uint32 handleMessage41D4C0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPickUpGeneric(int messageNum, const MessageParam &param, Entity *sender);
 	
-	uint32 handleMessage41DAD0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPressButton(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void sub41CD00(int16 x);
 	void sub41CC40(int16 x1, int16 x2);
 	void sub41CAC0(int16 x);
 	void sub41CCE0(int16 x);
-	void sub41FC30();
+	void stLargeStepDone();
 	
-	uint32 handleMessage41DF10(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41E3C0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPeekWall(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D790(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D880(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41DAA0(int messageNum, const MessageParam &param, Entity *sender);
@@ -272,28 +269,28 @@ protected:
 	void update4497D0();
 	uint32 handleMessage449800(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage449990(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage449A30(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate449DC0();
+	void suFallDown();
 	void sub449E20();
 	void sub449E90();
 	void sub449EF0();
 	void sub449F70();
-	void sub44A050();
+	void stSpitOutFall();
 	void sub44A0D0();
 	void sub44A150();
 	void sub44A230();
-	void sub44A250();
-	void sub44A2C0();
-	void sub44A330();
-	void sub44A370();
-	void sub44A3C0();
-	void sub44A3E0();
-	void sub44A460();
-	void sub44A4B0();
+	void stJumpAndFall();
+	void stDropFromRing();
+	void stPressDoorButton();
+	void stHitByBoxingGlove();
+	void stHitByBoxingGloveDone();
+	void stMoveVenusFlyTrap();
+	void stContinueMovingVenusFlyTrap();
+	void stMoveVenusFlyTrapDone();
 };
 
 class KmScene1004 : public Klayman {
@@ -301,8 +298,8 @@ public:
 	KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage478110(int messageNum, const MessageParam &param, Entity *sender);
-	void sub478170();
+	uint32 hmReadNote(int messageNum, const MessageParam &param, Entity *sender);
+	void stReadNote();
 };
 
 class KmScene1109 : public Klayman {
@@ -324,14 +321,14 @@ protected:
 	int _countdown;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	void update40DBE0();
-	uint32 handleMessage40DC00(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40DD20();
-	void sub40DD90();
+	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
+	void stFetchMatch();
+	void stLightMatch();
 	uint32 handleMessage40DDF0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40DEA0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
 	void sub40DF00();
-	void sub40DF60();
-	void sub40DFA0();
+	void stMoveObjectSkipTurn();
+	void stTumbleHeadless();
 	void sub40E040();
 };
 
@@ -340,12 +337,12 @@ public:
 	KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage4160A0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
 	void update4161A0();
-	void sub4161D0();
-	void sub416210();
-	void sub416250();
-	void sub4162B0();
+	void stPeekWall1();
+	void stPeekWall2();
+	void stPeekWall3();
+	void stPeekWallReturn();
 };
 
 class KmScene1304 : public Klayman {
@@ -360,8 +357,8 @@ public:
 	KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub46BEF0();
-	void sub46BF60();
+	void stCrashDown();
+	void cbCrashDownEvent();
 };
 
 class KmScene1306 : public Klayman {
@@ -429,7 +426,7 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage4689A0(int messageNum, const MessageParam &param, Entity *sender);
 	void spriteUpdate468A30();
-	void sub468A80();
+	void stFallSkipJump();
 	void sub468AD0();
 	void sub468B10();
 };
@@ -449,7 +446,7 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage4401A0(int messageNum, const MessageParam &param, Entity *sender);
 	void sub440230();
-	void sub440270();
+	void stDoTeleport();
 };
 
 class KmScene2101 : public Klayman {
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 26b68e1..b60c318 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -145,12 +145,12 @@ void AsScene1001Door::handleMessage2000h() {
 	case 1:
 		_soundResource1.play(0x65482F03);
 		setFileHash(0x624C0498, 1, 3);
-		SetAnimationCallback3(&AsScene1001Door::callback1);		
+		NextState(&AsScene1001Door::callback1);		
 		break;
 	case 2:
 		_soundResource2.play();
 		setFileHash(0x624C0498, 6, 6);
-		SetAnimationCallback3(&AsScene1001Door::callback2);		
+		NextState(&AsScene1001Door::callback2);		
 		break;
 	default:
 		// Nothing
@@ -170,7 +170,7 @@ void AsScene1001Door::callback1() {
 		_newHashListIndex = 1;
 		break;
 	case 3:
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 		break;
 	default:
@@ -183,13 +183,13 @@ void AsScene1001Door::callback1() {
 void AsScene1001Door::callback2() {
 	setGlobalVar(0xD217189D, 1);
 	setFileHash(0x624C0498, 6, 6);
-	SetAnimationCallback3(&AsScene1001Door::callback3);
+	NextState(&AsScene1001Door::callback3);
 	_x = 30;
 }
 
 void AsScene1001Door::callback3() {
 	_soundResource1.play();
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);	
 }
 	
@@ -734,7 +734,7 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam &param, Entity
 		setVisible(true);
 		break;
 	case 0x3002:
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 		break;
 	}
@@ -799,7 +799,7 @@ void AsScene1002DoorSpy::sub448B10() {
 	_parentScene->setSurfacePriority(getSurface(), 1200);
 	setFileHash(0x586C1D48, 1, -1);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60);
-	SetAnimationCallback3(&AsScene1002DoorSpy::sub448AC0);
+	NextState(&AsScene1002DoorSpy::sub448AC0);
 }
 
 Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
@@ -1071,14 +1071,14 @@ void AsScene1002VenusFlyTrap::sub4484F0() {
 	setFileHash(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+	NextState(&AsScene1002VenusFlyTrap::sub448660);
 }
 
 void AsScene1002VenusFlyTrap::sub448530() {
 	setFileHash(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+	NextState(&AsScene1002VenusFlyTrap::sub448660);
 }
 
 void AsScene1002VenusFlyTrap::sub448560() {
@@ -1086,7 +1086,7 @@ void AsScene1002VenusFlyTrap::sub448560() {
 	setFileHash(0x82292851, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+	NextState(&AsScene1002VenusFlyTrap::sub448660);
 }
 
 void AsScene1002VenusFlyTrap::sub4485B0() {
@@ -1094,7 +1094,7 @@ void AsScene1002VenusFlyTrap::sub4485B0() {
 	setFileHash(0x86A82A11, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4485F0);
+	NextState(&AsScene1002VenusFlyTrap::sub4485F0);
 }
 
 void AsScene1002VenusFlyTrap::sub4485F0() {
@@ -1107,7 +1107,7 @@ void AsScene1002VenusFlyTrap::sub448620() {
 	setFileHash(0x31303094, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(NULL);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448720);
+	NextState(&AsScene1002VenusFlyTrap::sub448720);
 	_countdown = 24;
 }
 
@@ -1119,14 +1119,14 @@ void AsScene1002VenusFlyTrap::sub448660() {
 		if (_x >= 154 && _x <= 346) {
 			setGlobalVar(0x86341E88, (_x - 186) / 32);
 		} else {
-			SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0);
+			NextState(&AsScene1002VenusFlyTrap::sub4484F0);
 			_countdown = 12;
 		}
 	} else {
 		if (_x >= 174 && _x <= 430) {
 			setGlobalVar(0x1B144052, (_x - 174) / 32);
 		} else {
-			SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0);
+			NextState(&AsScene1002VenusFlyTrap::sub4484F0);
 			_countdown = 12;
 		}
 	}
@@ -1136,14 +1136,14 @@ void AsScene1002VenusFlyTrap::sub448720() {
 	setFileHash(0x152920C4, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448750);
+	NextState(&AsScene1002VenusFlyTrap::sub448750);
 }
 
 void AsScene1002VenusFlyTrap::sub448750() {
 	setFileHash(0x84001117, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-	SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660);
+	NextState(&AsScene1002VenusFlyTrap::sub448660);
 }
 
 void AsScene1002VenusFlyTrap::sub448780() {
@@ -1157,7 +1157,7 @@ void AsScene1002VenusFlyTrap::sub448780() {
 		setFileHash(0x8C2C80D4, 0, -1);
 		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 		SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-		SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448620);
+		NextState(&AsScene1002VenusFlyTrap::sub448620);
 	}
 }
 
@@ -1224,13 +1224,13 @@ void Class506::sub449280() {
 	setFileHash(0x004A4495, -1, -1);
 	_playBackwards = true;
 	SetMessageHandler(&Class506::handleMessage449210);
-	SetAnimationCallback3(&Class506::sub4492C0);
+	NextState(&Class506::sub4492C0);
 	setVisible(true);
 }
 
 void Class506::sub4492C0() {
 	setVisible(false);
-	setFileHash1();
+	stopAnimation();
 }
 
 Class478::Class478(NeverhoodEngine *vm, Klayman *klayman)
@@ -1610,7 +1610,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa
 		setVisible(true);
 		break;
 	case 0x3002:
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 		break;
 	}
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 740e487..52c9d92 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -371,7 +371,7 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p
 		break;
 	case 0x3002:
 		sendMessage(_parentScene, 0x2003, 0);
-		setFileHash1();
+		stopAnimation();
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index ffb4f20..25abf95 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -278,7 +278,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 		_newHashListIndex = -2;
 		_countdown = 25;
 	} else {
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 	}
 }
@@ -315,11 +315,11 @@ void AsScene1201RightDoor::sub40D830() {
 	_playBackwards = true;
 	setVisible(true);
 	_soundResource.play(calcHash("fxDoorClose20"));
-	SetAnimationCallback3(&AsScene1201RightDoor::sub40D880);
+	NextState(&AsScene1201RightDoor::sub40D880);
 }
 
 void AsScene1201RightDoor::sub40D880() {
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 		
@@ -343,7 +343,7 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity
 		setVisible(true);
 		break;
 	case 0x3002:
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 		removeCallbacks();
 		break;
@@ -422,7 +422,7 @@ void AsScene1201TntMan::sub40CD60() {
 	setFileHash(0x356803D0, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	SetAnimationCallback3(&AsScene1201TntMan::sub40CD30);
+	NextState(&AsScene1201TntMan::sub40CD30);
 }
 
 void AsScene1201TntMan::sub40CD90() {
@@ -547,9 +547,9 @@ void AsScene1201Match::sub40C3E0() {
 	setFileHash(0x00842374, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
 	if (_status == 0) {
-		SetAnimationCallback3(&AsScene1201Match::sub40C420);
+		NextState(&AsScene1201Match::sub40C420);
 	} else {
-		SetAnimationCallback3(&AsScene1201Match::sub40C470);
+		NextState(&AsScene1201Match::sub40C470);
 	}
 }
 
@@ -559,7 +559,7 @@ void AsScene1201Match::sub40C420() {
 	_y += 119;
 	setFileHash(0x018D0240, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
-	SetAnimationCallback3(&AsScene1201Match::sub40C4F0);
+	NextState(&AsScene1201Match::sub40C4F0);
 }
 
 void AsScene1201Match::sub40C470() {
@@ -569,7 +569,7 @@ void AsScene1201Match::sub40C470() {
 	if (_status != 0) {
 		_countdown = 36;
 		_status--;
-		SetAnimationCallback3(&AsScene1201Match::sub40C3E0);
+		NextState(&AsScene1201Match::sub40C3E0);
 	}
 }
 
@@ -623,10 +623,10 @@ uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessagePar
 		}
 		break;
 	case 0x2004:
-		setCallback2(AnimationCallback(&AsScene1201Creature::sub40C960));
+		GotoState(&AsScene1201Creature::sub40C960);
 		break;
 	case 0x2006:
-		setCallback2(AnimationCallback(&AsScene1201Creature::sub40C9B0));
+		GotoState(&AsScene1201Creature::sub40C9B0);
 		break;
 	}
 	return messageResult;
@@ -672,7 +672,7 @@ void AsScene1201Creature::sub40C8E0() {
 		_countdown3 = 3;
 	setFileHash(0x08081513, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
-	SetAnimationCallback3(&AsScene1201Creature::sub40C930);
+	NextState(&AsScene1201Creature::sub40C930);
 	_countdown1 = 36;
 }
 
@@ -680,14 +680,14 @@ void AsScene1201Creature::sub40C930() {
 	if (!_flag) {
 		setFileHash(0xCA287133, 0, -1);
 		SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0);
-		SetAnimationCallback3(&AsScene1201Creature::sub40C8E0);
+		NextState(&AsScene1201Creature::sub40C8E0);
 	}
 }
 
 void AsScene1201Creature::sub40C960() {
 	setFileHash(0x08081513, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
-	SetAnimationCallback3(&AsScene1201Creature::sub40C9E0);
+	NextState(&AsScene1201Creature::sub40C9E0);
 	_countdown1 = 48;
 }
 
@@ -698,7 +698,7 @@ void AsScene1201Creature::sub40C990() {
 void AsScene1201Creature::sub40C9B0() {
 	setFileHash(0xCA287133, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C830);
-	SetAnimationCallback3(&AsScene1201Creature::sub40C8E0);
+	NextState(&AsScene1201Creature::sub40C8E0);
 	_countdown1 = 0;
 }
 
@@ -1091,7 +1091,7 @@ void AsScene1202TntItem::sub4540A0() {
 void AsScene1202TntItem::sub4540D0() {
 	setFileHash(kScene1202FileHashes[_index], 0, -1);
 	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
-	SetAnimationCallback3(&AsScene1202TntItem::sub454100);
+	NextState(&AsScene1202TntItem::sub454100);
 }
 
 void AsScene1202TntItem::sub454100() {
@@ -1099,7 +1099,7 @@ void AsScene1202TntItem::sub454100() {
 	_y = kScene1202Points[_index2].y;
 	setFileHash(kScene1202FileHashes[_index], 6, -1);
 	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
-	SetAnimationCallback3(&AsScene1202TntItem::sub454160);
+	NextState(&AsScene1202TntItem::sub454160);
 	_playBackwards = true;
 }
 
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 26b61f0..cb5ed15 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -324,7 +324,7 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &para
 
 void AsScene1302Bridge::stLowerBridge() {
 	setFileHash(0x88148150, 0, -1);
-	SetAnimationCallback3(&AsScene1302Bridge::cbLowerBridgeEvent);
+	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
 	_soundResource2.play();
 }
 
@@ -618,7 +618,7 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p
 		break;
 	case 0x3002:
 		_soundResource.play(0x470007EE);
-		setFileHash1();
+		stopAnimation();
 		SetMessageHandler(NULL);
 		setVisible(false);
 		break;
@@ -849,7 +849,7 @@ void AsScene1306Elevator::stGoingUp() {
 	_isDown = false;
 	SetUpdateHandler(&AsScene1306Elevator::update);
 	setFileHash(0x043B0270, 0, -1);
-	SetAnimationCallback3(&AsScene1306Elevator::cbGoingUpEvent);
+	NextState(&AsScene1306Elevator::cbGoingUpEvent);
 	_soundResource1.play();
 }
 
@@ -858,7 +858,7 @@ void AsScene1306Elevator::cbGoingUpEvent() {
 	sendMessage(_parentScene, 0x4808, 0);
 	_isUp = true;
 	_countdown = 144;
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
@@ -868,7 +868,7 @@ void AsScene1306Elevator::stGoingDown() {
 	setVisible(true);
 	setFileHash(0x043B0270, -1, -1);
 	_playBackwards = true;
-	SetAnimationCallback3(&AsScene1306Elevator::cbGoingDownEvent);
+	NextState(&AsScene1306Elevator::cbGoingDownEvent);
 	_soundResource2.play();
 }
 
@@ -876,7 +876,7 @@ void AsScene1306Elevator::cbGoingDownEvent() {
 	_isDown = true;
 	sendMessage(_parentScene, 0x4809, 0);
 	SetUpdateHandler(&AsScene1306Elevator::update);
-	setFileHash1();
+	stopAnimation();
 }
 
 Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1433,7 +1433,7 @@ Class549::Class549(NeverhoodEngine *vm, Scene *parentScene)
 	
 	SetMessageHandler(&Class549::handleMessage);
 	setVisible(false);
-	setFileHash1();
+	stopAnimation();
 }
 
 uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1455,13 +1455,13 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity
 void Class549::sub455470() {
 	setFileHash(0xBA0AE050, 0, -1);
 	setVisible(true);
-	SetAnimationCallback3(&Class549::hide);
+	NextState(&Class549::hide);
 	_soundResource.play(calcHash("fxDoorOpen38"));
 }
 
 void Class549::hide() {
 	sendMessage(_parentScene, 0x2000, 0);
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
@@ -1469,13 +1469,13 @@ void Class549::sub4554F0() {
 	setFileHash(0xBA0AE050, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
-	SetAnimationCallback3(&Class549::sub455550);
+	NextState(&Class549::sub455550);
 	_soundResource.play(calcHash("fxDoorClose38"));
 }
 
 void Class549::sub455550() {
 	sendMessage(_parentScene, 0x2001, 0);
-	setFileHash1();
+	stopAnimation();
 }
 
 Class592::Class592(NeverhoodEngine *vm, Scene *parentScene)
@@ -1483,7 +1483,7 @@ Class592::Class592(NeverhoodEngine *vm, Scene *parentScene)
 	_parentScene(parentScene) {
 	
 	SetMessageHandler(&Class592::handleMessage);
-	SetAnimationCallback3(&Class592::sub455710);
+	NextState(&Class592::sub455710);
 	_soundResource.play(0x51456049);
 }
  
@@ -1499,14 +1499,14 @@ uint32 Class592::handleMessage(int messageNum, const MessageParam &param, Entity
 
 void Class592::sub455710() {
 	setFileHash(0x6238B191, 0, -1);
-	SetAnimationCallback3(&Class592::sub455740);
+	NextState(&Class592::sub455740);
 	_x = 580;
 	_y = 383;
 }
 
 void Class592::sub455740() {
 	sendMessage(_parentScene, 0x2004, 0);
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
@@ -1515,7 +1515,7 @@ Class593::Class593(NeverhoodEngine *vm, Scene *parentScene)
 	
 	SetMessageHandler(&Class593::handleMessage);
 	setVisible(false);
-	setFileHash1();
+	stopAnimation();
 	Entity::_priority = 1200;
 }
 
@@ -1543,12 +1543,12 @@ void Class593::sub4558F0() {
 void Class593::sub455920() {
 	setFileHash(0x80180A10, -1, -1);
 	_playBackwards = true;
-	SetAnimationCallback3(&Class593::sub455950);
+	NextState(&Class593::sub455950);
 }
 
 void Class593::sub455950() {
 	sendMessage(_parentScene, 0x2003, 0);
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 8d42c7f..42dfdb3 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -257,7 +257,7 @@ void Class526::spriteUpdate466720() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
 		_soundResource.play(0x0E32247F);
-		setFileHash1();
+		stopAnimation();
 		SetSpriteCallback(NULL);
 		SetMessageHandler(NULL);
 		setVisible(false);
@@ -295,7 +295,7 @@ void Class527::spriteUpdate466920() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
 		_soundResource.play(0x18020439);
-		setFileHash1();
+		stopAnimation();
 		SetSpriteCallback(NULL);
 		SetMessageHandler(NULL);
 		setVisible(false);
@@ -322,7 +322,7 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 		_countdown = 48;
 	} else {
 		_flag = false;
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 	}
 }
@@ -369,11 +369,11 @@ void Class528::sub466C50() {
 	setFileHash(0x04551900, -1, -1);
 	_soundResource.play(calcHash("fxDoorClose24"));
 	_playBackwards = true;
-	SetAnimationCallback3(&Class528::sub466CB0);
+	NextState(&Class528::sub466CB0);
 }
 
 void Class528::sub466CB0() {
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
@@ -575,7 +575,7 @@ void Class489::sub434D80() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
 		sendMessage(_class525, 0x483A, 0);
-		setFileHash1();
+		stopAnimation();
 		SetMessageHandler(&Sprite::handleMessage);
 		SetSpriteCallback(NULL);
 		setVisible(false);
@@ -600,7 +600,7 @@ void Class489::sub434E60() {
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	setFileHash(0x80C32213, 0, -1);
-	SetAnimationCallback3(&Class489::sub434E90);
+	NextState(&Class489::sub434E90);
 }
 
 void Class489::sub434E90() {
@@ -613,7 +613,7 @@ void Class489::sub434EC0() {
 	setFileHash(0x50A80517, 0, -1);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	SetSpriteCallback(NULL);
-	SetAnimationCallback3(&Class489::sub434F40);
+	NextState(&Class489::sub434F40);
 	setGlobalVar(0x12A10DB3, 1);
 	_soundResource1.play(0xCC4A8456);
 	// TODO Sound1ChList_addSoundResource(0x05331081, 0xCE428854, true);
@@ -631,7 +631,7 @@ void Class489::sub434F80() {
 	setFileHash(0x50A94417, 0, -1);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage434B20);
-	SetAnimationCallback3(&Class489::sub434E90);
+	NextState(&Class489::sub434E90);
 	setGlobalVar(0x12A10DB3, 0);
 	_soundResource1.play(0xCC4A8456);
 	// TODO Sound1ChList_deleteSoundByHash(0xCE428854);
@@ -642,7 +642,7 @@ void Class489::sub434FF0() {
 	setFileHash(0x22CB4A33, 0, -1);
 	SetSpriteCallback(&Class489::spriteUpdate434B60);
 	SetMessageHandler(&Class489::handleMessage434B20);
-	SetAnimationCallback3(&Class489::sub434DF0);
+	NextState(&Class489::sub434DF0);
 }
 
 void Class489::sub435040() {
@@ -845,7 +845,7 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 		_soundResource2.play();
 		setFileHash(0x20060259, -1, -1);
 		_playBackwards = true;
-		SetAnimationCallback3(&Class482::sub428530);
+		NextState(&Class482::sub428530);
 		break;
 	case 0x3002:
 		removeCallbacks();
@@ -856,19 +856,19 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 
 void Class482::sub428500() {
 	sendMessage(_parentScene, 0x2000, 0);
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
 void Class482::sub428530() {
 	sendMessage(_parentScene, 0x2001, 0);
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
 void Class482::sub428560() {
 	sendMessage(_parentScene, 0x2003, 0);
-	setFileHash1();
+	stopAnimation();
 }
 
 Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1218,7 +1218,7 @@ void AsScene1407Mouse::stWalkToDest() {
 		setFileHash(0x22291510, 0, -1);
 		SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
 		SetMessageHandler(&AsScene1407Mouse::handleMessage);
-		SetAnimationCallback3(&AsScene1407Mouse::stIdleLookAtGoodHole);
+		NextState(&AsScene1407Mouse::stIdleLookAtGoodHole);
 	}
 }
 
@@ -1227,7 +1227,7 @@ void AsScene1407Mouse::stWalkToHole() {
 	setFileHash(0x22291510, 0, -1);
 	SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
-	SetAnimationCallback3(&AsScene1407Mouse::stGoThroughHole);
+	NextState(&AsScene1407Mouse::stGoThroughHole);
 }
 
 void AsScene1407Mouse::stGoThroughHole() {
@@ -1235,7 +1235,7 @@ void AsScene1407Mouse::stGoThroughHole() {
 	SetSpriteCallback(NULL);
 	SetMessageHandler(NULL);
 	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
-	SetAnimationCallback3(&AsScene1407Mouse::stArriveAtHole);
+	NextState(&AsScene1407Mouse::stArriveAtHole);
 	setVisible(false);
 	_countdown = 12;
 }
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 15e2474..c510601 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -206,7 +206,7 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 }
 
 Class521::~Class521() {
-	if (_callback1Cb == AnimationCallback(&Class521::sub45D620)) {
+	if (_finalizeStateCb == AnimationCallback(&Class521::sub45D620)) {
 		setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190));
 	}
 }
@@ -407,11 +407,11 @@ void Class521::sub45CD00() {
 	_flag11A = 0;
 	_rectList = NULL;
 	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetAnimationCallback3(&Class521::sub45CFE0);
+	NextState(&Class521::sub45CFE0);
 	setFileHash(0x35698F78, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update45C790);
-	setCallback1(AnimationCallback(&Class521::sub45D040));
+	FinalizeState(&Class521::sub45D040);
 	setDoDeltaX(doDeltaX ? 1 : 0);
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
@@ -442,14 +442,14 @@ void Class521::sub45CE10() {
 		setFileHash(0x192ADD30, 0, -1);
 		SetMessageHandler(&Class521::handleMessage45CC30);
 		SetUpdateHandler(&Class521::update);
-		SetAnimationCallback3(&Class521::sub45CFE0);
+		NextState(&Class521::sub45CFE0);
 	} else if (!_flag10E && _steps && _flag113) {
 		removeCallbacks();
 		_flag113 = 0;
 		setFileHash(0x9966B138, 0, -1);
 		SetMessageHandler(&Class521::handleMessage45CC30);
 		SetUpdateHandler(&Class521::update);
-		SetAnimationCallback3(&Class521::sub45D100);
+		NextState(&Class521::sub45D100);
 	} else {
 		bool flag = false;
 		uint index = 0;
@@ -478,7 +478,7 @@ void Class521::sub45CF80() {
 	setFileHash(0xA86A9538, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	SetAnimationCallback3(&Class521::sub45CFE0);
+	NextState(&Class521::sub45CFE0);
 }
 
 void Class521::sub45CFB0() {
@@ -492,7 +492,7 @@ void Class521::sub45CFE0() {
 	setFileHash(0x35698F78, 0, -1);
 	SetMessageHandler(&Class521::handleMessage);
 	SetUpdateHandler(&Class521::update45C790);
-	setCallback1(AnimationCallback(&Class521::sub45D040));
+	FinalizeState(&Class521::sub45D040);
 	_idleCounter = 0;
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
@@ -508,7 +508,7 @@ void Class521::sub45D050() {
 	setFileHash(0xB579A77C, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	SetAnimationCallback3(&Class521::sub45CFE0);
+	NextState(&Class521::sub45CFE0);
 	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
@@ -519,7 +519,7 @@ void Class521::sub45D0A0() {
 	setFileHash(0x9C220DA4, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	setCallback1(AnimationCallback(&Class521::sub45D0E0));
+	FinalizeState(&Class521::sub45D0E0);
 }
 
 void Class521::sub45D0E0() {
@@ -549,7 +549,7 @@ void Class521::sub45D180() {
 	_value112 = 0;
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	setCallback1(AnimationCallback(&Class521::sub45D620));
+	FinalizeState(&Class521::sub45D620);
 	sub45CDC0();
 }
 
@@ -578,7 +578,7 @@ void Class521::moveToNextPoint() {
 				setFileHash(0x9966B138, 0, -1);
 				SetMessageHandler(&Class521::handleMessage45CC30);
 				SetUpdateHandler(&Class521::update);
-				SetAnimationCallback3(&Class521::sub45D100);
+				NextState(&Class521::sub45D100);
 			}
 			_flag10E = 0;
 			SetSpriteCallback(&Class521::suMoveToNextPoint);
@@ -594,7 +594,7 @@ void Class521::sub45D350() {
 	setFileHash(0x192ADD30, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	SetAnimationCallback3(&Class521::sub45D390);
+	NextState(&Class521::sub45D390);
 }
 
 void Class521::sub45D390() {
@@ -603,7 +603,7 @@ void Class521::sub45D390() {
 	setFileHash(0xF46A0324, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	setCallback1(AnimationCallback(&Class521::sub45D620));
+	FinalizeState(&Class521::sub45D620);
 	_value112 = 1;
 	sub45CDC0();
 }
@@ -640,7 +640,7 @@ void Class521::moveToPrevPoint() {
 				setFileHash(0x9966B138, 0, -1);
 				SetMessageHandler(&Class521::handleMessage45CC30);
 				SetUpdateHandler(&Class521::update);
-				SetAnimationCallback3(&Class521::sub45D100);
+				NextState(&Class521::sub45D100);
 			}
 			_flag10E = 0;
 			SetSpriteCallback(&Class521::suMoveToPrevPoint);
@@ -652,20 +652,20 @@ void Class521::moveToPrevPoint() {
 void Class521::sub45D580() {
 	_flag10F = 1;
 	_flag10E = 1;
-	setCallback1(NULL);
+	FinalizeState(NULL);
 	setFileHash(0x192ADD30, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	SetAnimationCallback3(&Class521::sub45D5D0);
+	NextState(&Class521::sub45D5D0);
 }
 
 void Class521::sub45D5D0() {
 	_flag10F = 1;
-	setCallback1(NULL);
+	FinalizeState(NULL);
 	setFileHash(0xF46A0324, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
-	setCallback1(AnimationCallback(&Class521::sub45D620));
+	FinalizeState(&Class521::sub45D620);
 	_value112 = 2;
 	sub45CDC0();
 }
@@ -979,7 +979,7 @@ Class546::Class546(NeverhoodEngine *vm, Scene *parentScene)
 
 	setVisible(false);
 	SetMessageHandler(&Class546::handleMessage);
-	setFileHash1();
+	stopAnimation();
 }
 
 uint32 Class546::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1001,26 +1001,26 @@ uint32 Class546::handleMessage(int messageNum, const MessageParam &param, Entity
 void Class546::sub44D710() {
 	setFileHash(0x08C80144, 0, -1);
 	setVisible(true);
-	SetAnimationCallback3(&Class546::sub44D760);
+	NextState(&Class546::sub44D760);
 	_soundResource.play(calcHash("fxDoorOpen23"));
 }
 
 void Class546::sub44D760() {
 	sendMessage(_parentScene, 0x2033, 0);
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
 void Class546::sub44D790() {
 	setFileHash(0x08C80144, -1, -1);
 	setVisible(true);
-	SetAnimationCallback3(&Class546::sub44D7F0);
+	NextState(&Class546::sub44D7F0);
 	_soundResource.play(calcHash("fxDoorClose23"));
 }
 
 void Class546::sub44D7F0() {
 	sendMessage(_parentScene, 0x2034, 0);
-	setFileHash1();
+	stopAnimation();
 }
 
 Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y)
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 7a34a2b..7bac3ff 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -355,10 +355,10 @@ void AsScene1907Symbol::tryToPlugIn() {
 	_deltaY = (_y - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y) / 16;
 	_smallDeltaY = _y - _deltaY * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y;
 	if (_elementIndex == _newPositionIndex) {
-		SetAnimationCallback3(&AsScene1907Symbol::stPlugIn);
+		NextState(&AsScene1907Symbol::stPlugIn);
 	} else {
 		_symbolFlag1 = 1;
-		SetAnimationCallback3(&AsScene1907Symbol::stPlugInFail);
+		NextState(&AsScene1907Symbol::stPlugInFail);
 	}
 }
 
@@ -389,7 +389,7 @@ void AsScene1907Symbol::stFallOffHitGround() {
 	_vm->_collisionMan->removeSprite(this);
 	_vm->_collisionMan->addSprite(this);
 	SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround);
-	SetAnimationCallback3(&AsScene1907Symbol::cbFallOffHitGroundEvent);
+	NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent);
 	_newHashListIndex = 0;
 	_currStep = 0;
 	_yAccel = 30;
@@ -417,7 +417,7 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() {
 void AsScene1907Symbol::stPlugIn() {
 	_soundResource1.play();
 	_currPositionIndex = _newPositionIndex;
-	setFileHash1();
+	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteCallback(NULL);
 	if (_elementIndex == 8)
@@ -426,13 +426,13 @@ void AsScene1907Symbol::stPlugIn() {
 
 void AsScene1907Symbol::stPlugInFail() {
 	_currPositionIndex = _newPositionIndex;
-	setFileHash1();
+	stopAnimation();
 	_parentScene->plugInFailed();
 }
 
 void AsScene1907Symbol::moveUp() {
 	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
-	setFileHash1();
+	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteCallback(&AsScene1907Symbol::suMoveUp);
 	_yIncr = 1;
@@ -441,7 +441,7 @@ void AsScene1907Symbol::moveUp() {
 
 void AsScene1907Symbol::moveDown() {
 	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
-	setFileHash1();
+	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteCallback(&AsScene1907Symbol::suMoveDown);
 	_yIncr = 4;
@@ -541,11 +541,11 @@ void AsScene1907WaterHint::show() {
 	setVisible(true);
 	setFileHash(0x110A1061, 0, -1);
 	SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20);
-	SetAnimationCallback3(&AsScene1907WaterHint::hide);
+	NextState(&AsScene1907WaterHint::hide);
 }
 
 void AsScene1907WaterHint::hide() {
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 	SetMessageHandler(&Sprite::handleMessage);
 }
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index fa0d111..66f8631 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -121,12 +121,12 @@ void Class538::closeDoor() {
 	setFileHash(0xC222A8D4, 0, -1);
 	_newHashListIndex = -2;
 	setVisible(true);
-	SetAnimationCallback3(&Class538::hide);
+	NextState(&Class538::hide);
 	_soundResource.play(calcHash("fxDoorClose32"));
 }
 
 void Class538::hide() {
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
@@ -149,7 +149,7 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity
 		setVisible(true);
 		break;
 	case 0x3002:
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 		break;
 	}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index ff0afa6..ab1fac8 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -1088,7 +1088,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 	case 0x3002:
 		if (_index == getGlobalVar(0x9A500914))
 			sendMessage(_parentScene, 0x4808, 0);
-		setFileHash1();
+		stopAnimation();
 		break;
 	case 0x4808:
 		setGlobalVar(0x9A500914, _index);
@@ -1832,7 +1832,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 		break;
 	case 0x3002:
 		removeCallbacks();
-		setFileHash1();
+		stopAnimation();
 		break;
 	case 0x4807:
 		stLeverUp();
@@ -1852,7 +1852,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 
 void AsScene2207Lever::stLeverDown() {
 	setFileHash(0x80880090, 1, -1);
-	setCallback1(AnimationCallback(&AsScene2207Lever::stLeverDownEvent));
+	FinalizeState(&AsScene2207Lever::stLeverDownEvent);
 	_soundResource.play(0x40581882);
 }
 
@@ -1862,7 +1862,7 @@ void AsScene2207Lever::stLeverDownEvent() {
 
 void AsScene2207Lever::stLeverUp() {
 	setFileHash(0x80880090, 6, -1);
-	setCallback1(AnimationCallback(&AsScene2207Lever::stLeverUpEvent));
+	FinalizeState(&AsScene2207Lever::stLeverUpEvent);
 	_playBackwards = true;
 	_soundResource.play(0x40581882);
 }
@@ -1931,7 +1931,7 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
 
 void AsScene2207WallRobotAnimation::stStartAnimation() {
 	if (!_idle) {
-		SetAnimationCallback3(NULL);
+		NextState(NULL);
 	} else {
 		setFileHash(0xCCFD6090, 0, -1);
 		_idle = false;
@@ -1940,11 +1940,11 @@ void AsScene2207WallRobotAnimation::stStartAnimation() {
 }
 
 void AsScene2207WallRobotAnimation::stStopAnimation() {
-	SetAnimationCallback3(&AsScene2207WallRobotAnimation::cbStopAnimation);
+	NextState(&AsScene2207WallRobotAnimation::cbStopAnimation);
 }
 
 void AsScene2207WallRobotAnimation::cbStopAnimation() {
-	setFileHash1();
+	stopAnimation();
 	_soundResource1.stop();
 	_soundResource2.stop();
 	_soundResource3.stop();
@@ -1984,7 +1984,7 @@ uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const Messa
 
 void AsScene2207WallCannonAnimation::stStartAnimation() {
 	if (!_idle) {
-		SetAnimationCallback3(NULL);
+		NextState(NULL);
 	} else {
 		setVisible(true);
 		setFileHash(0x8CAA0099, 0, -1);
@@ -1993,11 +1993,11 @@ void AsScene2207WallCannonAnimation::stStartAnimation() {
 }
 
 void AsScene2207WallCannonAnimation::stStopAnimation() {
-	SetAnimationCallback3(&AsScene2207WallCannonAnimation::cbStopAnimation);
+	NextState(&AsScene2207WallCannonAnimation::cbStopAnimation);
 }
 
 void AsScene2207WallCannonAnimation::cbStopAnimation() {
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 	_idle = true;
 }
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 0163e97..5823e4d 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -279,7 +279,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2001:
-		setFileHash1();
+		stopAnimation();
 		setVisible(false);
 		// TODO Sound1ChList_stop(0xDC2769B0);
 		break;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index d979bbb..783e616 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1200,7 +1200,7 @@ uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam &para
 }
 
 void AsScene3010DeadBolt::stIdle() {
-	setFileHash1();
+	stopAnimation();
 	SetUpdateHandler(&AsScene3010DeadBolt::update);
 	SetMessageHandler(&Sprite::handleMessage);
 	_locked = false;
@@ -1215,8 +1215,8 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) {
 		} else {
 			setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 			SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
-			setCallback1(AnimationCallback(&AsScene3010DeadBolt::stIdleMessage));
-			SetAnimationCallback3(&AsScene3010DeadBolt::stIdle);
+			FinalizeState(&AsScene3010DeadBolt::stIdleMessage);
+			NextState(&AsScene3010DeadBolt::stIdle);
 			_soundResource1.play();
 		}
 		_unlocked = true;
@@ -1225,7 +1225,7 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) {
 }
 
 void AsScene3010DeadBolt::stIdleMessage() {
-	setFileHash1();
+	stopAnimation();
 	SetMessageHandler(&Sprite::handleMessage);
 	sendMessage(_parentScene, 0x2001, _boltIndex);
 }
@@ -1236,8 +1236,8 @@ void AsScene3010DeadBolt::lock() {
 		setVisible(true);
 		setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
 		SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
-		setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage));
-		SetAnimationCallback3(&AsScene3010DeadBolt::stIdle);
+		FinalizeState(&AsScene3010DeadBolt::stDisabledMessage);
+		NextState(&AsScene3010DeadBolt::stIdle);
 		if (_soundToggle) {
 			_soundResource1.play();
 		} else {
@@ -1255,8 +1255,8 @@ void AsScene3010DeadBolt::stDisabled() {
 	setVisible(true);
 	setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 	SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
-	setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage));
-	SetAnimationCallback3(&AsScene3010DeadBolt::stIdle);
+	FinalizeState(&AsScene3010DeadBolt::stDisabledMessage);
+	NextState(&AsScene3010DeadBolt::stIdle);
 	_playBackwards = true;
 	_soundResource3.play();
 }
@@ -1493,7 +1493,7 @@ void AsScene3011Symbol::show(bool flag) {
 }
 
 void AsScene3011Symbol::hide() {
-	setFileHash1();
+	stopAnimation();
 	setVisible(false);
 }
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index d94d3db..f1f4bab 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -92,63 +92,8 @@ Common::Error NeverhoodEngine::run() {
 	}
 
 #if 0
-	BlbArchive *blb = new BlbArchive();
-	blb->open("m.blb");
-	delete blb;
-#endif
-
-#if 0
-	ResourceFileEntry *r = _res->findEntry(0x50A80517);
-#endif
-
-#if 0
-	int resourceHandle = _res->useResource(0x0CA04202);
-	debug("resourceHandle = %d", resourceHandle);
-	byte *data = _res->loadResource(resourceHandle);
-	bool rle;
-	NDimensions dimensions;
-	NUnknown unknown;
-	byte *palette, *pixels;
-	parseBitmapResource(data, &rle, &dimensions, &unknown, &palette, &pixels);
-	debug("%d, %d", dimensions.width, dimensions.height);
-	byte *rawpixels = new byte[dimensions.width * dimensions.height];
-	memset(rawpixels, 0, dimensions.width * dimensions.height);
-	debug("rle = %d", rle);
-	unpackSpriteRle(pixels, dimensions.width, dimensions.height, rawpixels, dimensions.width, false, false);
-	Common::DumpFile d;
-	d.open("dump.0");
-	d.write(rawpixels, dimensions.width * dimensions.height);
-	d.close();
-	delete[] rawpixels;
-	_res->unloadResource(resourceHandle);
-	_res->unuseResource(resourceHandle);
-#endif
-	
-#if 0
-	{ // Create a new scope
-		SpriteResource r(this);
-		BaseSurface *surf = new BaseSurface(this, 0, 640, 480);
-		r.load(0x0CA04202);
-		debug("r: width = %d; height = %d", r.getDimensions().width, r.getDimensions().height);
-		surf->drawSpriteResource(r);
-		delete surf;
-	}
-#endif
-	
-#if 0
-	{ // Create a new scope
-		AnimResource r(this);
-		r.load(0x000540B0);
-	}
-#endif
-
-#if 0
-	{ // Create a new scope
-		DataResource dataResource(this);
-		//dataResource.load(0x01801002);
-		//dataResource.load(0x84500132);
-		dataResource.load(0x81120132);
-	}
+	// TODO: This should probably be implemented as debug command later 
+	dumpAllResources();
 #endif
 
 #if 1
@@ -220,5 +165,84 @@ NPoint NeverhoodEngine::getMousePos() {
 	pt.y = _mouseY;
 	return pt;
 }
+
+void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, int16 height) {
+	byte identsize = 0;
+	byte colourmaptype = 1;
+	byte imagetype = 1;
+	uint16 colourmapstart = 0;
+	uint16 colourmaplength = 256;
+	byte colourmapbits = 24;
+	uint16 xstart = 0;
+	uint16 ystart = 0;
+	byte bits = 8;
+	byte descriptor = 0x20;
+	Common::DumpFile tga;
+	tga.open(filename);
+	tga.writeByte(identsize);
+	tga.writeByte(colourmaptype);
+	tga.writeByte(imagetype);
+	tga.writeUint16LE(colourmapstart);
+	tga.writeUint16LE(colourmaplength);
+	tga.writeByte(colourmapbits);
+	tga.writeUint16LE(xstart);
+	tga.writeUint16LE(ystart);
+	tga.writeUint16LE(width);
+	tga.writeUint16LE(height);
+	tga.writeByte(bits);
+	tga.writeByte(descriptor);
+	tga.write(palette, 768);
+	tga.write(pixels, width * height);
+	tga.close();
+}
+
+void NeverhoodEngine::dumpAllResources() {
+
+	PaletteResource paletteResource(this);
+	byte *vgaPalette = new byte[768];
+	paletteResource.load(0x4086520E);
+	byte *srcpalette = paletteResource.palette();
+	for (int i = 0; i < 256; i++) {
+		vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0];
+		vgaPalette[i * 3 + 1] = srcpalette[i * 4 + 1];
+		vgaPalette[i * 3 + 0] = srcpalette[i * 4 + 2];
+	}
+
+#if 0
+	for (int i = 0; i < 768; i++)
+		vgaPalette[i] <<= 2;
+#endif
+
+	uint entriesCount = _res->getEntryCount();
+	debug("%d entries", entriesCount);
+
+	for (uint i = 0; i < entriesCount; i++) {
+		const ResourceFileEntry &entry = _res->getEntry(i);
+		int type = _res->getResourceTypeByHash(entry.fileHash);
+		debug("hash: %08X; type: %d", entry.fileHash, type);
+		if (type == 4) {
+			AnimResource anim(this);
+			anim.load(entry.fileHash);
+			for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) {
+				const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex);
+				int16 width = (frameInfo.rect.width + 3) & 0xFFFC;
+				byte *pixels = new byte[width * frameInfo.rect.height];
+				memset(pixels, 0, width * frameInfo.rect.height);
+				anim.draw(frameIndex, pixels, width, false, false);
+				Common::String filename = 
+					frameInfo.frameHash != 0
+					? Common::String::format("%08X_%03d_%08X.tga", entry.fileHash, frameIndex, frameInfo.frameHash) 
+					: Common::String::format("%08X_%03d.tga", entry.fileHash, frameIndex);
+				writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height);
+				delete[] pixels;
+			}
+			static int n = 0;
+			//if (n++ == 25) break;
+		}
+	}
+	
+	delete[] vgaPalette;
+
+}
 	
 } // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index b4bc333..adc4619 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -124,6 +124,8 @@ public:
 	int16 getMouseY() const { return _mouseY; }
 	NPoint getMousePos();
 
+	void dumpAllResources();
+
 public:
 
 };
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index 2261440..ed5bffa 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -68,6 +68,8 @@ public:
 	void unloadResource(int resourceHandle);
 	void freeResource(Resource *resource);
 	Common::SeekableReadStream *createStream(uint32 fileHash);
+	const ResourceFileEntry& getEntry(uint index) { return _entries[index]; }
+	uint getEntryCount() { return _entries.size(); }
 private:
 	Common::Array<BlbArchive*> _archives;
 	Common::Array<ResourceFileEntry> _entries;
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 480e9e9..697bd6e 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -237,9 +237,9 @@ void AnimatedSprite::init() {
 	_frameIndex3 = 0;
 	_frameIndex = 0;
 	_hashListIndex = -1;
-	_callback1Cb = NULL;
-	_callback2Cb = NULL;
-	_callback3Cb = NULL;
+	_finalizeStateCb = NULL;
+	_currStateCb = NULL;
+	_nextStateCb = NULL;
 	_newHashListIndex = -1;
 	_fileHash4 = 0;
 	_flag = false;
@@ -458,7 +458,7 @@ void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frame
 	_hashListIndex = -1;
 }
 
-void AnimatedSprite::setFileHash1() {
+void AnimatedSprite::stopAnimation() {
 	_fileHash1 = 1;
 	_animStatus = 2;
 }
@@ -486,52 +486,43 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil
 	_hashListIndex = -1;
 }
 
-void AnimatedSprite::setCallback1(AnimationCb callback1) {
-	if (_callback1Cb) {
-		(this->*_callback1Cb)();
-	}
-	_callback1Cb = callback1;
+void AnimatedSprite::setFinalizeState(AnimationCb finalizeStateCb) {
+	if (_finalizeStateCb)
+		(this->*_finalizeStateCb)();
+	_finalizeStateCb = finalizeStateCb;
 }
 
-void AnimatedSprite::setCallback2(AnimationCb callback2) {
-
-	if (_callback1Cb) {
-		AnimationCb cb = _callback1Cb;
-		_callback1Cb = NULL;
+void AnimatedSprite::gotoState(AnimationCb currStateCb) {
+	if (_finalizeStateCb) {
+		AnimationCb cb = _finalizeStateCb;
+		_finalizeStateCb = NULL;
 		(this->*cb)();
 	}
-
 	// TODO _callbackList = NULL;
-	_callback3Cb = NULL;
-	_callback2Cb = callback2;
-	
-	if (_callback2Cb) {
-		(this->*_callback2Cb)();
-	}
-
+	_nextStateCb = NULL;
+	_currStateCb = currStateCb;
+	if (_currStateCb)
+		(this->*_currStateCb)();
 }
 
 void AnimatedSprite::removeCallbacks() {
-
-	if (_callback1Cb) {
-		AnimationCb cb = _callback1Cb;
-		_callback1Cb = NULL;
+	if (_finalizeStateCb) {
+		AnimationCb cb = _finalizeStateCb;
+		_finalizeStateCb = NULL;
 		(this->*cb)();
 	}
-
-	if (_callback3Cb) {
-		_callback2Cb = _callback3Cb;
-		_callback3Cb = NULL;
-		debug("Fire _callback3Cb '%s'", _callback3CbName.c_str());
-		(this->*_callback2Cb)();
+	if (_nextStateCb) {
+		_currStateCb = _nextStateCb;
+		_nextStateCb = NULL;
+		debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str());
+		(this->*_currStateCb)();
 #if 0 // TODO		
 	} else if (_callbackList) {
 		removeCallbackList();
 #endif		
 	} else {
-		_callback2Cb = NULL;
+		_currStateCb = NULL;
 	}
-
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 10ebc19..aa22724 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -107,10 +107,10 @@ protected:
 	void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 };
 
-#define SetAnimationCallback1(callback) _callback1Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback
-#define SetAnimationCallback2(callback) _callback2Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback
-#define SetAnimationCallback3(callback) _callback3Cb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback
 #define AnimationCallback(callback) static_cast <void (AnimatedSprite::*)()> (callback)
+#define GotoState(callback) gotoState(static_cast <void (AnimatedSprite::*)()> (callback))
+#define NextState(callback) _nextStateCb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "NextState(" #callback ")"); _nextStateCbName = #callback
+#define FinalizeState(callback) setFinalizeState(static_cast <void (AnimatedSprite::*)()> (callback));
 
 class AnimatedSprite : public Sprite {
 public:
@@ -152,24 +152,24 @@ protected:
 	callbackListCount dw ?
 	callbackList	dd ?
 	*/
-	AnimationCb _callback1Cb;
-	AnimationCb _callback2Cb;
-	AnimationCb _callback3Cb;
+	AnimationCb _finalizeStateCb;
+	AnimationCb _currStateCb;
+	AnimationCb _nextStateCb;
 	// For debugging purposes
-	Common::String _callback1CbName;
-	Common::String _callback2CbName;
-	Common::String _callback3CbName;
+	Common::String _finalizeStateCbName;
+	Common::String _currStateCbName;
+	Common::String _nextStateCbName;
 	void init();
 	void updateAnim();
 	void updatePosition();
 	void updateFrameIndex();
 	void updateFrameInfo();
 	void createSurface1(uint32 fileHash, int surfacePriority);
-	void setFileHash1();
+	void stopAnimation();
 	void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5);
 	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);
-	void setCallback1(AnimationCb callback1);
-	void setCallback2(AnimationCb callback2);
+	void setFinalizeState(AnimationCb finalizeStateCb);
+	void gotoState(AnimationCb currStateCb);
 	void removeCallbacks();
 };
 


Commit: 01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6
    https://github.com/scummvm/scummvm/commit/01f3f3a8dd0ad2891939d03b0ce47cbf36ea9bc6
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-05-08T11:39:44-07:00

Commit Message:
Merge branch 'master'

Changed paths:
  A audio/decoders/codec.h
  A audio/decoders/xa.cpp
  A audio/decoders/xa.h
  A backends/events/maemosdl/maemosdl-events.cpp
  A backends/events/maemosdl/maemosdl-events.h
  A backends/events/ps3sdl/ps3sdl-events.cpp
  A backends/events/ps3sdl/ps3sdl-events.h
  A backends/fs/ps3/ps3-fs-factory.cpp
  A backends/fs/ps3/ps3-fs-factory.h
  A backends/graphics/sdl/sdl-graphics.cpp
  A backends/graphics/sdl/sdl-graphics.h
  A backends/mixer/sdl13/sdl13-mixer.cpp
  A backends/mixer/sdl13/sdl13-mixer.h
  A backends/platform/bada/README.TXT
  A backends/platform/bada/application.cpp
  A backends/platform/bada/application.h
  A backends/platform/bada/audio.cpp
  A backends/platform/bada/audio.h
  A backends/platform/bada/bada.mk
  A backends/platform/bada/form.cpp
  A backends/platform/bada/form.h
  A backends/platform/bada/fs.cpp
  A backends/platform/bada/fs.h
  A backends/platform/bada/graphics.cpp
  A backends/platform/bada/graphics.h
  A backends/platform/bada/main.cpp
  A backends/platform/bada/missing.cpp
  A backends/platform/bada/portdefs.h
  A backends/platform/bada/sscanf.cpp
  A backends/platform/bada/system.cpp
  A backends/platform/bada/system.h
  A backends/platform/gph/devices/gp2x/mmuhack/README
  A backends/platform/gph/gph.h
  A backends/platform/maemo/debian/changelog
  A backends/platform/maemo/debian/compat
  A backends/platform/maemo/debian/control
  A backends/platform/maemo/debian/copyright
  A backends/platform/maemo/debian/postinst
  A backends/platform/maemo/debian/rules
  A backends/platform/maemo/debian/scummvm.dirs
  A backends/platform/maemo/maemo-common.h
  A backends/platform/maemo/maemo.cpp
  A backends/platform/maemo/maemo.h
  A backends/platform/maemo/main.cpp
  A backends/platform/maemo/module.mk
  A backends/platform/openpandora/build/PXML_schema.xsd
  A backends/platform/sdl/macosx/appmenu_osx.h
  A backends/platform/sdl/macosx/appmenu_osx.mm
  A backends/platform/sdl/ps3/ps3-main.cpp
  A backends/platform/sdl/ps3/ps3.cpp
  A backends/platform/sdl/ps3/ps3.h
  A backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
  A backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
  A backends/timer/bada/timer.cpp
  A backends/timer/bada/timer.h
  A backends/updates/macosx/macosx-updates.h
  A backends/updates/macosx/macosx-updates.mm
  A common/bitstream.h
  A common/cosinetables.cpp
  A common/cosinetables.h
  A common/dct.cpp
  A common/dct.h
  A common/fft.cpp
  A common/fft.h
  A common/huffman.cpp
  A common/huffman.h
  A common/localization.cpp
  A common/localization.h
  A common/math.h
  A common/rdft.cpp
  A common/rdft.h
  A common/sinetables.cpp
  A common/sinetables.h
  A common/updates.h
  A dists/bada/Icons/mainMenu1.png
  A dists/bada/Icons/mainMenu2.png
  A dists/bada/Icons/splash1.png
  A dists/bada/Icons/splash2.png
  A dists/bada/Res/scummmobile/THEMERC
  A dists/bada/Res/scummmobile/checkbox.bmp
  A dists/bada/Res/scummmobile/checkbox_empty.bmp
  A dists/bada/Res/scummmobile/clR6x12-iso-8859-2.fcc
  A dists/bada/Res/scummmobile/clR6x12-iso-8859-5.fcc
  A dists/bada/Res/scummmobile/cursor.bmp
  A dists/bada/Res/scummmobile/cursor_small.bmp
  A dists/bada/Res/scummmobile/fixed5x8-iso-8859-2.fcc
  A dists/bada/Res/scummmobile/fixed5x8-iso-8859-5.fcc
  A dists/bada/Res/scummmobile/helvB14-ASCII.fcc
  A dists/bada/Res/scummmobile/helvB14.bdf
  A dists/bada/Res/scummmobile/helvB18-ASCII.fcc
  A dists/bada/Res/scummmobile/helvB18.bdf
  A dists/bada/Res/scummmobile/helvB24-ASCII.fcc
  A dists/bada/Res/scummmobile/helvB24.bdf
  A dists/bada/Res/scummmobile/helvb12-iso-8859-1.fcc
  A dists/bada/Res/scummmobile/helvb12-iso-8859-2.fcc
  A dists/bada/Res/scummmobile/helvb12-iso-8859-5.fcc
  A dists/bada/Res/scummmobile/logo.bmp
  A dists/bada/Res/scummmobile/logo_small.bmp
  A dists/bada/Res/scummmobile/radiobutton.bmp
  A dists/bada/Res/scummmobile/radiobutton_empty.bmp
  A dists/bada/Res/scummmobile/scummmobile_gfx.stx
  A dists/bada/Res/scummmobile/scummmobile_layout.stx
  A dists/bada/Res/scummmobile/search.bmp
  A dists/bada/Res/vkeybd_bada/lowercase-symbols800x399.bmp
  A dists/bada/Res/vkeybd_bada/lowercase800x399.bmp
  A dists/bada/Res/vkeybd_bada/uppercase-symbols800x399.bmp
  A dists/bada/Res/vkeybd_bada/uppercase800x399.bmp
  A dists/bada/Res/vkeybd_bada/vkeybd_bada.xml
  A dists/macosx/scummvm_osx_appcast.xml
  A dists/ps3/ICON0.PNG
  A dists/ps3/PIC1.PNG
  A dists/ps3/readme-ps3.md
  A dists/ps3/sfo.xml
  A dists/win32/graphics/left.bmp
  A dists/win32/graphics/scummvm-install.ico
  A dists/win32/plugins/Games.dll
  A dists/win32/scummvm.gdf.xml
  A dists/win32/scummvm.nsi
  A dists/win32/scummvm.nsi.in
  A doc/QuickStart
  A doc/cz/PrectiMe
  A doc/de/Liesmich
  A doc/de/Neues
  A doc/de/Schnellstart
  A doc/es/Inicio rápido
  A doc/fr/DemarrageRapide
  A doc/it/GuidaRapida
  A doc/no-nb/HurtigStart
  A engines/agi/loader_v1.cpp
  A engines/agi/opcodes.cpp
  A engines/agos/installshield_cab.cpp
  A engines/agos/installshield_cab.h
  A engines/cge/bitmap.cpp
  A engines/cge/bitmap.h
  A engines/cge/cge.cpp
  A engines/cge/cge.h
  A engines/cge/cge_main.cpp
  A engines/cge/cge_main.h
  A engines/cge/console.cpp
  A engines/cge/console.h
  A engines/cge/detection.cpp
  A engines/cge/events.cpp
  A engines/cge/events.h
  A engines/cge/fileio.cpp
  A engines/cge/fileio.h
  A engines/cge/game.cpp
  A engines/cge/game.h
  A engines/cge/general.h
  A engines/cge/module.mk
  A engines/cge/snail.cpp
  A engines/cge/snail.h
  A engines/cge/sound.cpp
  A engines/cge/sound.h
  A engines/cge/talk.cpp
  A engines/cge/talk.h
  A engines/cge/text.cpp
  A engines/cge/text.h
  A engines/cge/vga13h.cpp
  A engines/cge/vga13h.h
  A engines/cge/vmenu.cpp
  A engines/cge/vmenu.h
  A engines/cge/walk.cpp
  A engines/cge/walk.h
  A engines/composer/composer.cpp
  A engines/composer/composer.h
  A engines/composer/detection.cpp
  A engines/composer/graphics.cpp
  A engines/composer/graphics.h
  A engines/composer/module.mk
  A engines/composer/resource.cpp
  A engines/composer/resource.h
  A engines/composer/scripting.cpp
  A engines/dreamweb/backdrop.cpp
  A engines/dreamweb/object.cpp
  A engines/dreamweb/pathfind.cpp
  A engines/dreamweb/print.cpp
  A engines/dreamweb/saveload.cpp
  A engines/dreamweb/sprite.cpp
  A engines/dreamweb/structs.h
  A engines/dreamweb/stubs.h
  A engines/dreamweb/use.cpp
  A engines/dreamweb/vgagrafx.cpp
  A engines/gob/anifile.cpp
  A engines/gob/anifile.h
  A engines/gob/aniobject.cpp
  A engines/gob/aniobject.h
  A engines/gob/decfile.cpp
  A engines/gob/decfile.h
  A engines/gob/init_geisha.cpp
  A engines/gob/inter_geisha.cpp
  A engines/gob/minigames/geisha/diving.cpp
  A engines/gob/minigames/geisha/diving.h
  A engines/gob/minigames/geisha/evilfish.cpp
  A engines/gob/minigames/geisha/evilfish.h
  A engines/gob/minigames/geisha/penetration.cpp
  A engines/gob/minigames/geisha/penetration.h
  A engines/gob/rxyfile.cpp
  A engines/gob/rxyfile.h
  A engines/gob/save/saveload_geisha.cpp
  A engines/lastexpress/fight/fight.cpp
  A engines/lastexpress/fight/fight.h
  A engines/lastexpress/fight/fighter.cpp
  A engines/lastexpress/fight/fighter.h
  A engines/lastexpress/fight/fighter_anna.cpp
  A engines/lastexpress/fight/fighter_anna.h
  A engines/lastexpress/fight/fighter_ivo.cpp
  A engines/lastexpress/fight/fighter_ivo.h
  A engines/lastexpress/fight/fighter_milos.cpp
  A engines/lastexpress/fight/fighter_milos.h
  A engines/lastexpress/fight/fighter_salko.cpp
  A engines/lastexpress/fight/fighter_salko.h
  A engines/lastexpress/fight/fighter_vesna.cpp
  A engines/lastexpress/fight/fighter_vesna.h
  A engines/lastexpress/menu/clock.cpp
  A engines/lastexpress/menu/clock.h
  A engines/lastexpress/menu/menu.cpp
  A engines/lastexpress/menu/menu.h
  A engines/lastexpress/menu/trainline.cpp
  A engines/lastexpress/menu/trainline.h
  A engines/lastexpress/sound/entry.cpp
  A engines/lastexpress/sound/entry.h
  A engines/lastexpress/sound/queue.cpp
  A engines/lastexpress/sound/queue.h
  A engines/lastexpress/sound/sound.cpp
  A engines/lastexpress/sound/sound.h
  A engines/sci/graphics/text32.cpp
  A engines/sci/graphics/text32.h
  A engines/scumm/he/logic/baseball2001.cpp
  A engines/scumm/he/logic/basketball.cpp
  A engines/scumm/he/logic/football.cpp
  A engines/scumm/he/logic/funshop.cpp
  A engines/scumm/he/logic/moonbase.cpp
  A engines/scumm/he/logic/puttrace.cpp
  A engines/scumm/he/logic/soccer.cpp
  A engines/scumm/imuse/pcspk.cpp
  A engines/scumm/imuse/pcspk.h
  A engines/tsage/blue_force/blueforce_dialogs.cpp
  A engines/tsage/blue_force/blueforce_dialogs.h
  A engines/tsage/blue_force/blueforce_logic.cpp
  A engines/tsage/blue_force/blueforce_logic.h
  A engines/tsage/blue_force/blueforce_scenes0.cpp
  A engines/tsage/blue_force/blueforce_scenes0.h
  A engines/tsage/blue_force/blueforce_scenes1.cpp
  A engines/tsage/blue_force/blueforce_scenes1.h
  A engines/tsage/blue_force/blueforce_scenes2.cpp
  A engines/tsage/blue_force/blueforce_scenes2.h
  A engines/tsage/blue_force/blueforce_scenes3.cpp
  A engines/tsage/blue_force/blueforce_scenes3.h
  A engines/tsage/blue_force/blueforce_scenes4.cpp
  A engines/tsage/blue_force/blueforce_scenes4.h
  A engines/tsage/blue_force/blueforce_scenes5.cpp
  A engines/tsage/blue_force/blueforce_scenes5.h
  A engines/tsage/blue_force/blueforce_scenes6.cpp
  A engines/tsage/blue_force/blueforce_scenes6.h
  A engines/tsage/blue_force/blueforce_scenes7.cpp
  A engines/tsage/blue_force/blueforce_scenes7.h
  A engines/tsage/blue_force/blueforce_scenes8.cpp
  A engines/tsage/blue_force/blueforce_scenes8.h
  A engines/tsage/blue_force/blueforce_scenes9.cpp
  A engines/tsage/blue_force/blueforce_scenes9.h
  A engines/tsage/blue_force/blueforce_speakers.cpp
  A engines/tsage/blue_force/blueforce_speakers.h
  A engines/tsage/ringworld/ringworld_demo.cpp
  A engines/tsage/ringworld/ringworld_demo.h
  A engines/tsage/ringworld/ringworld_dialogs.cpp
  A engines/tsage/ringworld/ringworld_dialogs.h
  A engines/tsage/ringworld/ringworld_logic.cpp
  A engines/tsage/ringworld/ringworld_logic.h
  A engines/tsage/ringworld/ringworld_scenes1.cpp
  A engines/tsage/ringworld/ringworld_scenes1.h
  A engines/tsage/ringworld/ringworld_scenes10.cpp
  A engines/tsage/ringworld/ringworld_scenes10.h
  A engines/tsage/ringworld/ringworld_scenes2.cpp
  A engines/tsage/ringworld/ringworld_scenes2.h
  A engines/tsage/ringworld/ringworld_scenes3.cpp
  A engines/tsage/ringworld/ringworld_scenes3.h
  A engines/tsage/ringworld/ringworld_scenes4.cpp
  A engines/tsage/ringworld/ringworld_scenes4.h
  A engines/tsage/ringworld/ringworld_scenes5.cpp
  A engines/tsage/ringworld/ringworld_scenes5.h
  A engines/tsage/ringworld/ringworld_scenes6.cpp
  A engines/tsage/ringworld/ringworld_scenes6.h
  A engines/tsage/ringworld/ringworld_scenes8.cpp
  A engines/tsage/ringworld/ringworld_scenes8.h
  A engines/tsage/ringworld/ringworld_speakers.cpp
  A engines/tsage/ringworld/ringworld_speakers.h
  A engines/tsage/ringworld2/ringworld2_dialogs.cpp
  A engines/tsage/ringworld2/ringworld2_dialogs.h
  A engines/tsage/ringworld2/ringworld2_logic.cpp
  A engines/tsage/ringworld2/ringworld2_logic.h
  A engines/tsage/ringworld2/ringworld2_scenes0.cpp
  A engines/tsage/ringworld2/ringworld2_scenes0.h
  A engines/tsage/user_interface.cpp
  A engines/tsage/user_interface.h
  A graphics/cursor.h
  A graphics/fonts/bdf.cpp
  A graphics/fonts/bdf.h
  A icons/count.ico
  A test/common/math.h
  A test/cxxtest_mingw.h
  A video/bink_decoder.cpp
  A video/bink_decoder.h
  A video/binkdata.h
  R engines/tsage/blueforce_logic.h
  R audio/decoders/vag.cpp
  R audio/decoders/vag.h
  R backends/platform/gph/devices/gp2x/mmuhack/readme.txt
  R backends/platform/gph/gph-sdl.h
  R backends/platform/maemo/scummvm-1.1.0-maemo.patch
  R devtools/create_drascula/Makefile
  R devtools/create_drascula/dists/msvc8/create_drascula.sln
  R devtools/create_drascula/dists/msvc8/create_drascula.vcproj
  R devtools/create_drascula/dists/msvc8_to_msvc9.bat
  R devtools/create_drascula/dists/msvc9/create_drascula.sln
  R devtools/create_drascula/dists/msvc9/create_drascula.vcproj
  R devtools/create_drascula/dists/msvc9_to_msvc8.bat
  R devtools/create_hugo/dists/msvc10/create_hugo.sln
  R devtools/create_hugo/dists/msvc10/create_hugo.vcxproj
  R devtools/create_hugo/dists/msvc9/create_hugo.sln
  R devtools/create_hugo/dists/msvc9/create_hugo.vcproj
  R devtools/create_lure/Makefile
  R devtools/create_lure/dists/msvc8/create_lure.sln
  R devtools/create_lure/dists/msvc8/create_lure.vcproj
  R devtools/create_lure/dists/msvc8_to_msvc9.bat
  R devtools/create_lure/dists/msvc9/create_lure.sln
  R devtools/create_lure/dists/msvc9/create_lure.vcproj
  R devtools/create_lure/dists/msvc9_to_msvc8.bat
  R devtools/create_mads/Makefile
  R devtools/create_mads/dists/msvc9/create_mads.sln
  R devtools/create_mads/dists/msvc9/create_mads.vcproj
  R devtools/create_toon/dists/msvc9/create_toon.sln
  R devtools/create_toon/dists/msvc9/create_toon.vcproj
  R devtools/skycpt/AsciiCptCompile.sln
  R devtools/skycpt/AsciiCptCompile.vcproj
  R dists/nsis/graphics/scummvm-install.ico
  R dists/nsis/graphics/left.bmp
  R dists/nsis/scummvm.nsi
  R dists/nsis/scummvm.nsi.in
  R doc/translations/README-translation_template.txt
  R doc/translations/README-fr.txt
  R doc/he/bink-md5s.txt
  R doc/he/md5s.txt
  R doc/he/smacker-md5s.txt
  R doc/he/u32.txt
  R doc/he/versions.html
  R doc/translations/README-de.txt
  R engines/agi/preagi_common.cpp
  R engines/agi/preagi_common.h
  R engines/lastexpress/game/fight.cpp
  R engines/lastexpress/game/fight.h
  R engines/lastexpress/game/sound.cpp
  R engines/lastexpress/game/sound.h
  R engines/lastexpress/game/menu.cpp
  R engines/lastexpress/game/menu.h
  R engines/tsage/blueforce_logic.cpp
  R engines/tsage/ringworld_demo.cpp
  R engines/tsage/ringworld_demo.h
  R engines/tsage/ringworld_scenes1.cpp
  R engines/tsage/ringworld_scenes1.h
  R engines/tsage/ringworld_scenes10.cpp
  R engines/tsage/ringworld_scenes10.h
  R engines/tsage/ringworld_scenes2.cpp
  R engines/tsage/ringworld_scenes2.h
  R engines/tsage/ringworld_scenes3.cpp
  R engines/tsage/ringworld_scenes3.h
  R engines/tsage/ringworld_scenes4.cpp
  R engines/tsage/ringworld_scenes4.h
  R engines/tsage/ringworld_scenes5.cpp
  R engines/tsage/ringworld_scenes5.h
  R engines/tsage/ringworld_scenes6.cpp
  R engines/tsage/ringworld_scenes6.h
  R engines/tsage/ringworld_scenes8.cpp
  R engines/tsage/ringworld_scenes8.h
  R engines/tsage/ringworld_logic.cpp
  R engines/tsage/ringworld_logic.h
  R graphics/dither.cpp
  R graphics/dither.h
    .gitignore
    AUTHORS
    COPYING
    COPYING.LGPL
    Makefile
    NEWS
    README
    audio/audiostream.cpp
    audio/audiostream.h
    audio/decoders/aac.cpp
    audio/decoders/aac.h
    audio/decoders/adpcm.cpp
    audio/decoders/adpcm_intern.h
    audio/decoders/mp3.cpp
    audio/decoders/qdm2.cpp
    audio/decoders/qdm2.h
    audio/decoders/quicktime.cpp
    audio/decoders/quicktime.h
    audio/decoders/quicktime_intern.h
    audio/decoders/raw.cpp
    audio/decoders/voc.cpp
    audio/decoders/voc.h
    audio/decoders/vorbis.cpp
    audio/fmopl.cpp
    audio/fmopl.h
    audio/mididrv.cpp
    audio/mididrv.h
    audio/mixer.cpp
    audio/mods/maxtrax.cpp
    audio/module.mk
    audio/mpu401.cpp
    audio/rate.cpp
    audio/rate_arm.cpp
    audio/softsynth/appleiigs.cpp
    audio/softsynth/cms.cpp
    audio/softsynth/eas.cpp
    audio/softsynth/emumidi.h
    audio/softsynth/fmtowns_pc98/towns_audio.h
    audio/softsynth/fmtowns_pc98/towns_euphony.h
    audio/softsynth/fmtowns_pc98/towns_midi.cpp
    audio/softsynth/fmtowns_pc98/towns_midi.h
    audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
    audio/softsynth/fmtowns_pc98/towns_pc98_driver.h
    audio/softsynth/fmtowns_pc98/towns_pc98_fmsynth.h
    audio/softsynth/mt32.cpp
    audio/softsynth/mt32/mt32_file.cpp
    audio/softsynth/opl/dbopl.cpp
    audio/softsynth/opl/dbopl.h
    audio/softsynth/opl/dosbox.h
    audio/softsynth/opl/mame.cpp
    backends/base-backend.cpp
    backends/events/dinguxsdl/dinguxsdl-events.cpp
    backends/events/gph/gph-events.cpp
    backends/events/linuxmotosdl/linuxmotosdl-events.cpp
    backends/events/openpandora/op-events.cpp
    backends/events/sdl/sdl-events.cpp
    backends/events/sdl/sdl-events.h
    backends/events/symbiansdl/symbiansdl-events.cpp
    backends/events/symbiansdl/symbiansdl-events.h
    backends/events/webossdl/webossdl-events.cpp
    backends/events/webossdl/webossdl-events.h
    backends/events/wincesdl/wincesdl-events.cpp
    backends/events/wincesdl/wincesdl-events.h
    backends/fs/ds/ds-fs-factory.cpp
    backends/fs/n64/n64-fs-factory.cpp
    backends/fs/n64/n64-fs.cpp
    backends/fs/n64/romfsstream.cpp
    backends/fs/posix/posix-fs-factory.cpp
    backends/fs/posix/posix-fs-factory.h
    backends/fs/posix/posix-fs.cpp
    backends/fs/ps2/ps2-fs-factory.cpp
    backends/fs/psp/psp-fs-factory.cpp
    backends/fs/stdiostream.cpp
    backends/fs/symbian/symbian-fs.cpp
    backends/fs/symbian/symbianstream.cpp
    backends/fs/wii/wii-fs-factory.cpp
    backends/fs/wii/wii-fs-factory.h
    backends/fs/wii/wii-fs.cpp
    backends/fs/windows/windows-fs.cpp
    backends/fs/windows/windows-fs.h
    backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
    backends/graphics/dinguxsdl/dinguxsdl-graphics.h
    backends/graphics/gph/gph-graphics.cpp
    backends/graphics/gph/gph-graphics.h
    backends/graphics/graphics.h
    backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
    backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
    backends/graphics/opengl/gltexture.h
    backends/graphics/opengl/opengl-graphics.cpp
    backends/graphics/opengl/opengl-graphics.h
    backends/graphics/openglsdl/openglsdl-graphics.cpp
    backends/graphics/openglsdl/openglsdl-graphics.h
    backends/graphics/openpandora/op-graphics.h
    backends/graphics/surfacesdl/surfacesdl-graphics.cpp
    backends/graphics/surfacesdl/surfacesdl-graphics.h
    backends/graphics/symbiansdl/symbiansdl-graphics.cpp
    backends/graphics/symbiansdl/symbiansdl-graphics.h
    backends/graphics/wincesdl/wincesdl-graphics.cpp
    backends/graphics/wincesdl/wincesdl-graphics.h
    backends/log/log.cpp
    backends/log/log.h
    backends/mixer/symbiansdl/symbiansdl-mixer.cpp
    backends/mixer/symbiansdl/symbiansdl-mixer.h
    backends/mixer/wincesdl/wincesdl-mixer.cpp
    backends/mixer/wincesdl/wincesdl-mixer.h
    backends/module.mk
    backends/platform/android/android.cpp
    backends/platform/android/android.h
    backends/platform/android/android.mk
    backends/platform/android/asset-archive.h
    backends/platform/android/events.cpp
    backends/platform/android/gfx.cpp
    backends/platform/android/jni.cpp
    backends/platform/android/jni.h
    backends/platform/android/module.mk
    backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java
    backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java
    backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
    backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java
    backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java
    backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java
    backends/platform/android/org/inodes/gus/scummvm/Unpacker.java
    backends/platform/android/texture.cpp
    backends/platform/android/texture.h
    backends/platform/dc/DCLauncherDialog.h
    backends/platform/dc/README
    backends/platform/dc/audio.cpp
    backends/platform/dc/cache.S
    backends/platform/dc/dc-fs.cpp
    backends/platform/dc/dc.h
    backends/platform/dc/dcmain.cpp
    backends/platform/dc/display.cpp
    backends/platform/dc/input.cpp
    backends/platform/dc/label.cpp
    backends/platform/dc/plugin_head.S
    backends/platform/dc/selector.cpp
    backends/platform/dingux/README.DINGUX
    backends/platform/dingux/scummvm.gpe
    backends/platform/ds/arm7/source/libcartreset/cartreset.c
    backends/platform/ds/arm7/source/libcartreset/cartreset_nolibfat.h
    backends/platform/ds/arm7/source/main.cpp
    backends/platform/ds/arm9/dist/readme_ds.txt
    backends/platform/ds/arm9/source/dsoptions.cpp
    backends/platform/ds/arm9/source/fat/disc_io.h
    backends/platform/ds/arm9/source/fat/io_m3_common.c
    backends/platform/ds/arm9/source/fat/io_m3_common.h
    backends/platform/ds/arm9/source/fat/io_m3sd_asm.s
    backends/platform/ds/arm9/source/fat/io_njsd.c
    backends/platform/ds/arm9/source/fat/io_scsd.c
    backends/platform/ds/arm9/source/fat/io_scsd_asm.s
    backends/platform/ds/arm9/source/fat/io_sd_common.c
    backends/platform/ds/arm9/source/fat/m3sd.s
    backends/platform/ds/arm9/source/keys.cpp
    backends/platform/ds/arm9/source/osystem_ds.cpp
    backends/platform/ds/arm9/source/scummhelp.cpp
    backends/platform/ds/ds.mk
    backends/platform/gph/build/gp2xwiz-bundle.sh
    backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h
    backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s
    backends/platform/gph/gph-backend.cpp
    backends/platform/gph/gph-hw.cpp
    backends/platform/gph/gph-hw.h
    backends/platform/gph/gph-main.cpp
    backends/platform/iphone/iphone_main.m
    backends/platform/iphone/iphone_video.m
    backends/platform/n64/Makefile
    backends/platform/n64/README.N64
    backends/platform/n64/framfs_save_manager.cpp
    backends/platform/n64/framfs_save_manager.h
    backends/platform/n64/n64.mk
    backends/platform/n64/nintendo64.cpp
    backends/platform/n64/osys_n64.h
    backends/platform/n64/osys_n64_base.cpp
    backends/platform/n64/osys_n64_events.cpp
    backends/platform/n64/osys_n64_utilities.cpp
    backends/platform/n64/pad_rom.sh
    backends/platform/n64/pakfs_save_manager.cpp
    backends/platform/n64/pakfs_save_manager.h
    backends/platform/n64/portdefs.h
    backends/platform/openpandora/build/PXML.xml
    backends/platform/openpandora/build/pnd_make.sh
    backends/platform/openpandora/build/runscummvm.sh
    backends/platform/openpandora/op-backend.cpp
    backends/platform/openpandora/op-bundle.mk
    backends/platform/openpandora/op-main.cpp
    backends/platform/openpandora/op-options.cpp
    backends/platform/openpandora/op-options.h
    backends/platform/openpandora/op-sdl.h
    backends/platform/ps2/DmaPipe.h
    backends/platform/ps2/Gs2dScreen.cpp
    backends/platform/ps2/Makefile.gdb
    backends/platform/ps2/Makefile.ps2
    backends/platform/ps2/asyncfio.cpp
    backends/platform/ps2/asyncfio.h
    backends/platform/ps2/eecodyvdfs.c
    backends/platform/ps2/eecodyvdfs.h
    backends/platform/ps2/iop/CoDyVDfs/iop/cdtypes.h
    backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.c
    backends/platform/ps2/iop/CoDyVDfs/iop/codyvdfs.h
    backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.c
    backends/platform/ps2/iop/CoDyVDfs/iop/fiofs.h
    backends/platform/ps2/iop/CoDyVDfs/iop/imports.lst
    backends/platform/ps2/iop/CoDyVDfs/iop/rpcfs.c
    backends/platform/ps2/iop/rpckbd/src/imports.lst
    backends/platform/ps2/irxboot.cpp
    backends/platform/ps2/irxboot.h
    backends/platform/ps2/ps2debug.cpp
    backends/platform/ps2/ps2debug.h
    backends/platform/ps2/ps2input.cpp
    backends/platform/ps2/ps2input.h
    backends/platform/ps2/ps2mutex.cpp
    backends/platform/ps2/ps2pad.cpp
    backends/platform/ps2/ps2pad.h
    backends/platform/ps2/rpckbd.c
    backends/platform/ps2/rpckbd.h
    backends/platform/ps2/sdlkeys.h
    backends/platform/ps2/systemps2.cpp
    backends/platform/psp/Makefile
    backends/platform/psp/README.PSP
    backends/platform/psp/README.PSP.in
    backends/platform/psp/display_manager.cpp
    backends/platform/psp/dummy.cpp
    backends/platform/psp/image_viewer.cpp
    backends/platform/psp/image_viewer.h
    backends/platform/psp/input.cpp
    backends/platform/psp/memory.h
    backends/platform/psp/mp3.cpp
    backends/platform/psp/mp3.h
    backends/platform/psp/png_loader.cpp
    backends/platform/psp/png_loader.h
    backends/platform/psp/portdefs.h
    backends/platform/psp/powerman.cpp
    backends/platform/psp/pspkeyboard.cpp
    backends/platform/psp/rtc.cpp
    backends/platform/psp/thread.cpp
    backends/platform/psp/thread.h
    backends/platform/psp/trace.cpp
    backends/platform/sdl/macosx/macosx.cpp
    backends/platform/sdl/macosx/macosx.h
    backends/platform/sdl/main.cpp
    backends/platform/sdl/module.mk
    backends/platform/sdl/posix/posix-main.cpp
    backends/platform/sdl/sdl-sys.h
    backends/platform/sdl/sdl.cpp
    backends/platform/sdl/sdl.h
    backends/platform/sdl/win32/win32.cpp
    backends/platform/sdl/win32/win32.h
    backends/platform/symbian/.placeholder
    backends/platform/symbian/BuildPackageUpload_AllVersions.pl
    backends/platform/symbian/README
    backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg
    backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
    backends/platform/symbian/S60v3/ScummVM_Loc.rss
    backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
    backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg
    backends/platform/symbian/S60v3/scummvm_A0000658_loc.rss
    backends/platform/symbian/S60v3/scummvm_A0000658_reg.rss
    backends/platform/symbian/S60v3/scummvm_reg.rss
    backends/platform/symbian/S80/ScummVM_S80.mmp.in
    backends/platform/symbian/S90/Scummvm_S90.mmp.in
    backends/platform/symbian/UIQ2/ScummVM.rss
    backends/platform/symbian/UIQ2/ScummVM_UIQ2.mmp.in
    backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2_SE.pkg
    backends/platform/symbian/UIQ3/ScummVM.rss
    backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
    backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
    backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
    backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg
    backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
    backends/platform/symbian/UIQ3/scummvm_A0000658_reg.rss
    backends/platform/symbian/UIQ3/scummvm_loc.rss
    backends/platform/symbian/UIQ3/scummvm_reg.rss
    backends/platform/symbian/mmp/scummvm_agi.mmp.in
    backends/platform/symbian/mmp/scummvm_agos.mmp.in
    backends/platform/symbian/mmp/scummvm_base.mmp.in
    backends/platform/symbian/mmp/scummvm_cine.mmp.in
    backends/platform/symbian/mmp/scummvm_cruise.mmp.in
    backends/platform/symbian/mmp/scummvm_draci.mmp.in
    backends/platform/symbian/mmp/scummvm_drascula.mmp.in
    backends/platform/symbian/mmp/scummvm_gob.mmp.in
    backends/platform/symbian/mmp/scummvm_groovie.mmp.in
    backends/platform/symbian/mmp/scummvm_hugo.mmp.in
    backends/platform/symbian/mmp/scummvm_kyra.mmp.in
    backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
    backends/platform/symbian/mmp/scummvm_lure.mmp.in
    backends/platform/symbian/mmp/scummvm_m4.mmp.in
    backends/platform/symbian/mmp/scummvm_made.mmp.in
    backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
    backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
    backends/platform/symbian/mmp/scummvm_queen.mmp.in
    backends/platform/symbian/mmp/scummvm_saga.mmp.in
    backends/platform/symbian/mmp/scummvm_sci.mmp.in
    backends/platform/symbian/mmp/scummvm_scumm.mmp.in
    backends/platform/symbian/mmp/scummvm_sky.mmp.in
    backends/platform/symbian/mmp/scummvm_sword1.mmp.in
    backends/platform/symbian/mmp/scummvm_sword2.mmp.in
    backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
    backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
    backends/platform/symbian/mmp/scummvm_toon.mmp.in
    backends/platform/symbian/mmp/scummvm_touche.mmp.in
    backends/platform/symbian/mmp/scummvm_tsage.mmp.in
    backends/platform/symbian/mmp/scummvm_tucker.mmp.in
    backends/platform/symbian/res/ScummVmAif.rss
    backends/platform/symbian/src/ScummApp.cpp
    backends/platform/symbian/src/ScummApp.h
    backends/platform/symbian/src/portdefs.h
    backends/platform/webos/webos.mk
    backends/platform/wii/gdb.txt
    backends/platform/wii/main.cpp
    backends/platform/wii/module.mk
    backends/platform/wii/options.cpp
    backends/platform/wii/options.h
    backends/platform/wii/osystem_events.cpp
    backends/platform/wii/osystem_gfx.cpp
    backends/platform/wii/osystem_sfx.cpp
    backends/platform/wii/wii.mk
    backends/platform/wince/CEActionsPocket.cpp
    backends/platform/wince/CEActionsSmartphone.cpp
    backends/platform/wince/CELauncherDialog.cpp
    backends/platform/wince/CEScaler.cpp
    backends/platform/wince/CEgui/CEGUI.h
    backends/platform/wince/CEgui/PanelKeyboard.cpp
    backends/platform/wince/CEkeys/CEKeys.h
    backends/platform/wince/CEkeys/EventsBuffer.cpp
    backends/platform/wince/README-WinCE.txt
    backends/platform/wince/missing/assert.h
    backends/platform/wince/missing/io.h
    backends/platform/wince/wince-sdl.cpp
    backends/platform/wince/wince-sdl.h
    backends/platform/wince/wince.mk
    backends/plugins/ds/ds-provider.cpp
    backends/plugins/ds/ds-provider.h
    backends/plugins/elf/arm-loader.cpp
    backends/plugins/elf/arm-loader.h
    backends/plugins/elf/elf-loader.cpp
    backends/plugins/elf/elf-loader.h
    backends/plugins/elf/elf-provider.cpp
    backends/plugins/elf/elf-provider.h
    backends/plugins/elf/elf32.h
    backends/plugins/elf/memory-manager.cpp
    backends/plugins/elf/mips-loader.cpp
    backends/plugins/elf/mips-loader.h
    backends/plugins/elf/ppc-loader.cpp
    backends/plugins/elf/ppc-loader.h
    backends/plugins/elf/shorts-segment-manager.cpp
    backends/plugins/elf/shorts-segment-manager.h
    backends/plugins/elf/version.cpp
    backends/plugins/elf/version.h
    backends/plugins/ps2/ps2-provider.cpp
    backends/plugins/ps2/ps2-provider.h
    backends/plugins/psp/psp-provider.cpp
    backends/plugins/psp/psp-provider.h
    backends/plugins/wii/wii-provider.cpp
    backends/plugins/wii/wii-provider.h
    backends/saves/psp/psp-saves.cpp
    backends/taskbar/unity/unity-taskbar.cpp
    backends/taskbar/unity/unity-taskbar.h
    backends/taskbar/win32/mingw-compat.h
    backends/taskbar/win32/win32-taskbar.cpp
    backends/taskbar/win32/win32-taskbar.h
    backends/timer/default/default-timer.cpp
    backends/timer/default/default-timer.h
    backends/vkeybd/virtual-keyboard-parser.cpp
    backends/vkeybd/virtual-keyboard.cpp
    base/commandLine.cpp
    base/internal_version.h
    base/main.cpp
    base/plugins.cpp
    base/version.cpp
    common/EventDispatcher.cpp
    common/EventRecorder.cpp
    common/EventRecorder.h
    common/algorithm.h
    common/archive.cpp
    common/archive.h
    common/array.h
    common/config-file.cpp
    common/config-file.h
    common/config-manager.cpp
    common/config-manager.h
    common/dcl.cpp
    common/dcl.h
    common/debug.cpp
    common/events.h
    common/file.cpp
    common/file.h
    common/forbidden.h
    common/fs.cpp
    common/func.h
    common/hashmap.h
    common/iff_container.cpp
    common/iff_container.h
    common/keyboard.h
    common/macresman.cpp
    common/memorypool.cpp
    common/module.mk
    common/ptr.h
    common/quicktime.cpp
    common/quicktime.h
    common/rational.cpp
    common/scummsys.h
    common/serializer.h
    common/singleton.h
    common/str.cpp
    common/str.h
    common/stream.cpp
    common/substream.h
    common/system.cpp
    common/system.h
    common/taskbar.h
    common/timer.h
    common/tokenizer.cpp
    common/translation.cpp
    common/unarj.cpp
    common/unzip.cpp
    common/util.cpp
    common/util.h
    common/winexe_pe.cpp
    common/xmlparser.cpp
    common/xmlparser.h
    common/zlib.cpp
    common/zlib.h
    configure
    devtools/convbdf.c
    devtools/create_hugo/README
    devtools/create_hugo/staticdata.h
    devtools/create_kyradat/create_kyradat.cpp
    devtools/create_kyradat/create_kyradat.h
    devtools/create_kyradat/extract.cpp
    devtools/create_kyradat/extract.h
    devtools/create_kyradat/games.cpp
    devtools/create_kyradat/search.cpp
    devtools/create_kyradat/search.h
    devtools/create_kyradat/tables.cpp
    devtools/create_kyradat/tables.h
    devtools/create_kyradat/util.cpp
    devtools/create_mads/main.cpp
    devtools/create_mads/scripts/rex_nebular.txt
    devtools/create_project/codeblocks.cpp
    devtools/create_project/codeblocks.h
    devtools/create_project/create_project.cpp
    devtools/create_project/create_project.h
    devtools/create_project/msbuild.cpp
    devtools/create_project/msbuild.h
    devtools/create_project/msvc.cpp
    devtools/create_project/msvc.h
    devtools/create_project/msvc10/create_project.vcxproj
    devtools/create_project/msvc10/create_project.vcxproj.filters
    devtools/create_project/scripts/installer.vbs
    devtools/create_project/scripts/postbuild.cmd
    devtools/create_project/visualstudio.cpp
    devtools/create_project/visualstudio.h
    devtools/create_toon/create_toon.cpp
    devtools/create_toon/create_toon.h
    devtools/create_toon/staticdata.h
    devtools/credits.pl
    devtools/sci/musicplayer.cpp
    devtools/sci/scitrace.asm
    devtools/scumm-md5.txt
    devtools/skycpt/KmpSearch.h
    devtools/skycpt/skycpt-engine.patch
    devtools/tasmrecover/.gitignore
    devtools/tasmrecover/dreamweb/backdrop.asm
    devtools/tasmrecover/dreamweb/dreamweb.asm
    devtools/tasmrecover/dreamweb/keypad.asm
    devtools/tasmrecover/dreamweb/look.asm
    devtools/tasmrecover/dreamweb/monitor.asm
    devtools/tasmrecover/dreamweb/newplace.asm
    devtools/tasmrecover/dreamweb/object.asm
    devtools/tasmrecover/dreamweb/print.asm
    devtools/tasmrecover/dreamweb/saveload.asm
    devtools/tasmrecover/dreamweb/sblaster.asm
    devtools/tasmrecover/dreamweb/sprite.asm
    devtools/tasmrecover/dreamweb/talk.asm
    devtools/tasmrecover/dreamweb/titles.asm
    devtools/tasmrecover/dreamweb/use.asm
    devtools/tasmrecover/dreamweb/vars.asm
    devtools/tasmrecover/dreamweb/vgafades.asm
    devtools/tasmrecover/dreamweb/vgagrafx.asm
    devtools/tasmrecover/tasm-recover
    devtools/tasmrecover/tasm/cpp.py
    devtools/tasmrecover/tasm/lex.py
    devtools/tasmrecover/tasm/op.py
    devtools/tasmrecover/tasm/parser.py
    devtools/tasmrecover/tasm/proc.py
    devtools/themeparser.py
    devtools/update-version.pl
    dists/android/AndroidManifest.xml
    dists/android/AndroidManifest.xml.in
    dists/android/README.Android
    dists/android/mkplugin.sh
    dists/android/plugin-manifest.xml
    dists/android/plugin-manifest.xml.in
    dists/android/plugin-strings.xml
    dists/android/res/layout/main.xml
    dists/engine-data/README
    dists/engine-data/kyra.dat
    dists/iphone/Info.plist
    dists/irix/scummvm.spec
    dists/macosx/Info.plist
    dists/macosx/Info.plist.in
    dists/maemo/scummvm.servicewrapper
    dists/motomagx/mgx/readme-motomagx-mgx.txt
    dists/motomagx/mgx/scummvm.cfg
    dists/motomagx/pep/description.ini
    dists/msvc10/create_msvc10.bat
    dists/msvc8/create_msvc8.bat
    dists/msvc9/create_msvc9.bat
    dists/os2/readme.os2
    dists/redhat/scummvm-tools.spec
    dists/redhat/scummvm.spec
    dists/redhat/scummvm.spec.in
    dists/scummvm.rc
    dists/scummvm.rc.in
    dists/slackware/scummvm.SlackBuild
    dists/wii/READMII
    dists/wii/meta.xml
    dists/wii/meta.xml.in
    dists/win32/ScummVM.iss
    engines/advancedDetector.cpp
    engines/advancedDetector.h
    engines/agi/agi.cpp
    engines/agi/agi.h
    engines/agi/checks.cpp
    engines/agi/console.cpp
    engines/agi/console.h
    engines/agi/cycle.cpp
    engines/agi/detection.cpp
    engines/agi/detection_tables.h
    engines/agi/graphics.cpp
    engines/agi/id.cpp
    engines/agi/keyboard.cpp
    engines/agi/module.mk
    engines/agi/motion.cpp
    engines/agi/objects.cpp
    engines/agi/op_cmd.cpp
    engines/agi/op_dbg.cpp
    engines/agi/op_test.cpp
    engines/agi/opcodes.h
    engines/agi/preagi.cpp
    engines/agi/preagi.h
    engines/agi/preagi_mickey.cpp
    engines/agi/preagi_mickey.h
    engines/agi/preagi_troll.cpp
    engines/agi/preagi_troll.h
    engines/agi/preagi_winnie.cpp
    engines/agi/preagi_winnie.h
    engines/agi/saveload.cpp
    engines/agi/sound.cpp
    engines/agi/sound.h
    engines/agi/sound_2gs.cpp
    engines/agi/sound_2gs.h
    engines/agi/sound_coco3.cpp
    engines/agi/sound_coco3.h
    engines/agi/sound_midi.cpp
    engines/agi/sound_midi.h
    engines/agi/sound_pcjr.cpp
    engines/agi/sound_pcjr.h
    engines/agi/sound_sarien.cpp
    engines/agi/sound_sarien.h
    engines/agi/sprite.cpp
    engines/agi/text.cpp
    engines/agi/view.cpp
    engines/agi/view.h
    engines/agi/wagparser.cpp
    engines/agi/words.cpp
    engines/agos/agos.cpp
    engines/agos/agos.h
    engines/agos/animation.cpp
    engines/agos/animation.h
    engines/agos/charset-fontdata.cpp
    engines/agos/charset.cpp
    engines/agos/contain.cpp
    engines/agos/cursor.cpp
    engines/agos/debug.cpp
    engines/agos/debug.h
    engines/agos/debugger.cpp
    engines/agos/detection.cpp
    engines/agos/detection_tables.h
    engines/agos/draw.cpp
    engines/agos/event.cpp
    engines/agos/feeble.cpp
    engines/agos/gfx.cpp
    engines/agos/icons.cpp
    engines/agos/input.cpp
    engines/agos/input_pn.cpp
    engines/agos/intern.h
    engines/agos/items.cpp
    engines/agos/menus.cpp
    engines/agos/midi.cpp
    engines/agos/midiparser_s1d.cpp
    engines/agos/module.mk
    engines/agos/oracle.cpp
    engines/agos/res.cpp
    engines/agos/res_ami.cpp
    engines/agos/res_snd.cpp
    engines/agos/rooms.cpp
    engines/agos/saveload.cpp
    engines/agos/script.cpp
    engines/agos/script_dp.cpp
    engines/agos/script_pn.cpp
    engines/agos/script_s1.cpp
    engines/agos/script_s2.cpp
    engines/agos/script_ww.cpp
    engines/agos/sound.cpp
    engines/agos/sound.h
    engines/agos/string.cpp
    engines/agos/string_pn.cpp
    engines/agos/subroutine.cpp
    engines/agos/verb.cpp
    engines/agos/verb_pn.cpp
    engines/agos/vga.cpp
    engines/agos/vga_e2.cpp
    engines/agos/vga_s2.cpp
    engines/agos/window.cpp
    engines/agos/zones.cpp
    engines/cine/detection.cpp
    engines/cine/detection_tables.h
    engines/cine/prc.cpp
    engines/cine/texte.cpp
    engines/cine/texte.h
    engines/cine/various.cpp
    engines/cruise/cruise.h
    engines/cruise/cruise_main.cpp
    engines/cruise/detection.cpp
    engines/cruise/mainDraw.cpp
    engines/cruise/module.mk
    engines/cruise/saveload.cpp
    engines/cruise/script.cpp
    engines/cruise/sound.cpp
    engines/cruise/sound.h
    engines/dialogs.cpp
    engines/draci/detection.cpp
    engines/draci/game.cpp
    engines/draci/saveload.cpp
    engines/draci/script.cpp
    engines/draci/sound.cpp
    engines/drascula/detection.cpp
    engines/drascula/drascula.h
    engines/drascula/interface.cpp
    engines/drascula/resource.cpp
    engines/drascula/saveload.cpp
    engines/drascula/sound.cpp
    engines/dreamweb/console.cpp
    engines/dreamweb/console.h
    engines/dreamweb/detection.cpp
    engines/dreamweb/detection_tables.h
    engines/dreamweb/dreamgen.cpp
    engines/dreamweb/dreamgen.h
    engines/dreamweb/dreamweb.cpp
    engines/dreamweb/dreamweb.h
    engines/dreamweb/module.mk
    engines/dreamweb/runtime.h
    engines/dreamweb/stubs.cpp
    engines/engine.cpp
    engines/engine.h
    engines/engines.mk
    engines/game.cpp
    engines/game.h
    engines/gob/console.cpp
    engines/gob/console.h
    engines/gob/dataio.cpp
    engines/gob/dataio.h
    engines/gob/detection.cpp
    engines/gob/detection_tables.h
    engines/gob/draw.cpp
    engines/gob/draw.h
    engines/gob/draw_v1.cpp
    engines/gob/draw_v2.cpp
    engines/gob/game.cpp
    engines/gob/gob.cpp
    engines/gob/hotspots.cpp
    engines/gob/hotspots.h
    engines/gob/init.cpp
    engines/gob/init.h
    engines/gob/init_v1.cpp
    engines/gob/init_v2.cpp
    engines/gob/init_v6.cpp
    engines/gob/inter.h
    engines/gob/inter_bargon.cpp
    engines/gob/inter_v1.cpp
    engines/gob/inter_v3.cpp
    engines/gob/inter_v6.cpp
    engines/gob/module.mk
    engines/gob/palanim.cpp
    engines/gob/save/saveload.h
    engines/gob/scenery.cpp
    engines/gob/sound/sound.cpp
    engines/gob/util.cpp
    engines/gob/util.h
    engines/gob/videoplayer.cpp
    engines/gob/videoplayer.h
    engines/groovie/detection.cpp
    engines/groovie/groovie.cpp
    engines/groovie/music.cpp
    engines/groovie/music.h
    engines/groovie/roq.cpp
    engines/groovie/roq.h
    engines/groovie/saveload.cpp
    engines/groovie/script.cpp
    engines/hugo/detection.cpp
    engines/hugo/display.cpp
    engines/hugo/file.cpp
    engines/hugo/file_v1d.cpp
    engines/hugo/file_v1w.cpp
    engines/hugo/file_v2d.cpp
    engines/hugo/file_v2w.cpp
    engines/hugo/file_v3d.cpp
    engines/hugo/hugo.cpp
    engines/hugo/intro.cpp
    engines/hugo/object.cpp
    engines/hugo/parser.cpp
    engines/hugo/schedule.cpp
    engines/hugo/sound.cpp
    engines/hugo/sound.h
    engines/hugo/util.cpp
    engines/kyra/animator_hof.cpp
    engines/kyra/animator_lok.cpp
    engines/kyra/animator_lok.h
    engines/kyra/animator_mr.cpp
    engines/kyra/animator_v2.cpp
    engines/kyra/debugger.cpp
    engines/kyra/debugger.h
    engines/kyra/detection.cpp
    engines/kyra/detection_tables.h
    engines/kyra/gui.cpp
    engines/kyra/gui.h
    engines/kyra/gui_hof.cpp
    engines/kyra/gui_hof.h
    engines/kyra/gui_lok.cpp
    engines/kyra/gui_lok.h
    engines/kyra/gui_lol.cpp
    engines/kyra/gui_lol.h
    engines/kyra/gui_mr.cpp
    engines/kyra/gui_mr.h
    engines/kyra/gui_v2.cpp
    engines/kyra/gui_v2.h
    engines/kyra/item.h
    engines/kyra/items_hof.cpp
    engines/kyra/items_lok.cpp
    engines/kyra/items_lol.cpp
    engines/kyra/items_mr.cpp
    engines/kyra/items_v2.cpp
    engines/kyra/kyra_hof.cpp
    engines/kyra/kyra_hof.h
    engines/kyra/kyra_lok.cpp
    engines/kyra/kyra_lok.h
    engines/kyra/kyra_mr.cpp
    engines/kyra/kyra_mr.h
    engines/kyra/kyra_v1.cpp
    engines/kyra/kyra_v1.h
    engines/kyra/kyra_v2.cpp
    engines/kyra/kyra_v2.h
    engines/kyra/lol.cpp
    engines/kyra/lol.h
    engines/kyra/module.mk
    engines/kyra/resource.cpp
    engines/kyra/resource.h
    engines/kyra/saveload.cpp
    engines/kyra/saveload_hof.cpp
    engines/kyra/saveload_lok.cpp
    engines/kyra/saveload_lol.cpp
    engines/kyra/saveload_mr.cpp
    engines/kyra/scene_hof.cpp
    engines/kyra/scene_lok.cpp
    engines/kyra/scene_lol.cpp
    engines/kyra/scene_mr.cpp
    engines/kyra/scene_v2.cpp
    engines/kyra/screen.cpp
    engines/kyra/screen.h
    engines/kyra/screen_hof.cpp
    engines/kyra/screen_hof.h
    engines/kyra/screen_lol.cpp
    engines/kyra/screen_lol.h
    engines/kyra/screen_v2.cpp
    engines/kyra/screen_v2.h
    engines/kyra/script.cpp
    engines/kyra/script.h
    engines/kyra/script_hof.cpp
    engines/kyra/script_lok.cpp
    engines/kyra/script_lol.cpp
    engines/kyra/script_tim.cpp
    engines/kyra/script_tim.h
    engines/kyra/script_v1.cpp
    engines/kyra/script_v2.cpp
    engines/kyra/seqplayer.cpp
    engines/kyra/seqplayer.h
    engines/kyra/sequences_hof.cpp
    engines/kyra/sequences_lok.cpp
    engines/kyra/sequences_lol.cpp
    engines/kyra/sequences_mr.cpp
    engines/kyra/sequences_v2.cpp
    engines/kyra/sound.cpp
    engines/kyra/sound.h
    engines/kyra/sound_adlib.cpp
    engines/kyra/sound_adlib.h
    engines/kyra/sound_amiga.cpp
    engines/kyra/sound_digital.cpp
    engines/kyra/sound_lol.cpp
    engines/kyra/sound_midi.cpp
    engines/kyra/sound_pcspk.cpp
    engines/kyra/sound_towns.cpp
    engines/kyra/sprites.cpp
    engines/kyra/sprites.h
    engines/kyra/sprites_lol.cpp
    engines/kyra/staticres.cpp
    engines/kyra/staticres_lol.cpp
    engines/kyra/text.h
    engines/kyra/text_hof.cpp
    engines/kyra/text_hof.h
    engines/kyra/text_lol.cpp
    engines/kyra/text_lol.h
    engines/kyra/text_mr.cpp
    engines/kyra/timer.h
    engines/kyra/timer_lok.cpp
    engines/kyra/timer_lol.cpp
    engines/kyra/util.cpp
    engines/kyra/util.h
    engines/kyra/wsamovie.cpp
    engines/kyra/wsamovie.h
    engines/lastexpress/data/animation.cpp
    engines/lastexpress/data/background.cpp
    engines/lastexpress/data/font.cpp
    engines/lastexpress/data/scene.cpp
    engines/lastexpress/data/sequence.cpp
    engines/lastexpress/data/snd.cpp
    engines/lastexpress/data/snd.h
    engines/lastexpress/data/subtitle.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/detection.cpp
    engines/lastexpress/entities/abbot.cpp
    engines/lastexpress/entities/alexei.cpp
    engines/lastexpress/entities/alouan.cpp
    engines/lastexpress/entities/anna.cpp
    engines/lastexpress/entities/august.cpp
    engines/lastexpress/entities/boutarel.cpp
    engines/lastexpress/entities/chapters.cpp
    engines/lastexpress/entities/cooks.cpp
    engines/lastexpress/entities/coudert.cpp
    engines/lastexpress/entities/entity.cpp
    engines/lastexpress/entities/entity.h
    engines/lastexpress/entities/entity_intern.h
    engines/lastexpress/entities/francois.cpp
    engines/lastexpress/entities/gendarmes.cpp
    engines/lastexpress/entities/gendarmes.h
    engines/lastexpress/entities/hadija.cpp
    engines/lastexpress/entities/ivo.cpp
    engines/lastexpress/entities/kahina.cpp
    engines/lastexpress/entities/kronos.cpp
    engines/lastexpress/entities/mahmud.cpp
    engines/lastexpress/entities/max.cpp
    engines/lastexpress/entities/mertens.cpp
    engines/lastexpress/entities/milos.cpp
    engines/lastexpress/entities/mmeboutarel.cpp
    engines/lastexpress/entities/pascale.cpp
    engines/lastexpress/entities/rebecca.cpp
    engines/lastexpress/entities/salko.cpp
    engines/lastexpress/entities/servers0.cpp
    engines/lastexpress/entities/servers1.cpp
    engines/lastexpress/entities/sophie.cpp
    engines/lastexpress/entities/tables.cpp
    engines/lastexpress/entities/tatiana.cpp
    engines/lastexpress/entities/train.cpp
    engines/lastexpress/entities/vassili.cpp
    engines/lastexpress/entities/verges.cpp
    engines/lastexpress/entities/vesna.cpp
    engines/lastexpress/entities/yasmin.cpp
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/entities.cpp
    engines/lastexpress/game/inventory.cpp
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/object.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/savepoint.cpp
    engines/lastexpress/game/scenes.cpp
    engines/lastexpress/game/state.cpp
    engines/lastexpress/game/state.h
    engines/lastexpress/graphics.cpp
    engines/lastexpress/helpers.h
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/lastexpress.h
    engines/lastexpress/module.mk
    engines/lastexpress/resource.cpp
    engines/lastexpress/resource.h
    engines/lastexpress/shared.h
    engines/lure/debugger.cpp
    engines/lure/detection.cpp
    engines/lure/disk.cpp
    engines/lure/hotspots.cpp
    engines/lure/memory.cpp
    engines/lure/module.mk
    engines/lure/sound.cpp
    engines/lure/sound.h
    engines/m4/converse.cpp
    engines/m4/detection.cpp
    engines/m4/dialogs.cpp
    engines/m4/globals.cpp
    engines/m4/globals.h
    engines/m4/m4.h
    engines/m4/m4_views.cpp
    engines/m4/mads_logic.cpp
    engines/m4/midi.h
    engines/m4/saveload.cpp
    engines/m4/scripttab.h
    engines/made/database.cpp
    engines/made/database.h
    engines/made/detection.cpp
    engines/made/graphics.cpp
    engines/made/graphics.h
    engines/made/made.cpp
    engines/made/made.h
    engines/made/music.cpp
    engines/made/music.h
    engines/made/pmvplayer.cpp
    engines/made/pmvplayer.h
    engines/made/redreader.cpp
    engines/made/redreader.h
    engines/made/resource.cpp
    engines/made/resource.h
    engines/made/screen.cpp
    engines/made/screen.h
    engines/made/screenfx.cpp
    engines/made/screenfx.h
    engines/made/script.cpp
    engines/made/script.h
    engines/made/scriptfuncs.cpp
    engines/made/scriptfuncs.h
    engines/made/sound.cpp
    engines/made/sound.h
    engines/mohawk/console.cpp
    engines/mohawk/cstime.cpp
    engines/mohawk/cstime.h
    engines/mohawk/cursors.cpp
    engines/mohawk/cursors.h
    engines/mohawk/detection_tables.h
    engines/mohawk/dialogs.cpp
    engines/mohawk/dialogs.h
    engines/mohawk/graphics.cpp
    engines/mohawk/graphics.h
    engines/mohawk/livingbooks.cpp
    engines/mohawk/livingbooks.h
    engines/mohawk/livingbooks_code.cpp
    engines/mohawk/livingbooks_code.h
    engines/mohawk/mohawk.cpp
    engines/mohawk/mohawk.h
    engines/mohawk/myst.cpp
    engines/mohawk/myst.h
    engines/mohawk/myst_scripts.cpp
    engines/mohawk/myst_stacks/channelwood.cpp
    engines/mohawk/myst_stacks/demo.cpp
    engines/mohawk/myst_stacks/demo.h
    engines/mohawk/myst_stacks/dni.cpp
    engines/mohawk/myst_stacks/mechanical.cpp
    engines/mohawk/myst_stacks/myst.cpp
    engines/mohawk/myst_stacks/myst.h
    engines/mohawk/myst_stacks/preview.cpp
    engines/mohawk/myst_stacks/preview.h
    engines/mohawk/myst_stacks/slides.cpp
    engines/mohawk/myst_stacks/slides.h
    engines/mohawk/myst_state.cpp
    engines/mohawk/resource.cpp
    engines/mohawk/resource.h
    engines/mohawk/riven.cpp
    engines/mohawk/riven.h
    engines/mohawk/riven_external.cpp
    engines/mohawk/riven_saveload.cpp
    engines/mohawk/riven_vars.cpp
    engines/mohawk/sound.cpp
    engines/mohawk/sound.h
    engines/neverhood/detection.cpp
    engines/parallaction/detection.cpp
    engines/parallaction/gfxbase.cpp
    engines/parallaction/graphics.h
    engines/parallaction/gui_br.cpp
    engines/parallaction/objects.cpp
    engines/parallaction/parallaction.cpp
    engines/parallaction/parser_br.cpp
    engines/parallaction/parser_ns.cpp
    engines/parallaction/sound.h
    engines/parallaction/walk.cpp
    engines/queen/command.h
    engines/queen/credits.cpp
    engines/queen/graphics.cpp
    engines/queen/input.cpp
    engines/queen/input.h
    engines/queen/musicdata.cpp
    engines/queen/queen.cpp
    engines/queen/resource.cpp
    engines/queen/resource.h
    engines/queen/sound.h
    engines/queen/talk.cpp
    engines/saga/actor.cpp
    engines/saga/actor.h
    engines/saga/actor_walk.cpp
    engines/saga/detection.cpp
    engines/saga/detection_tables.h
    engines/saga/input.cpp
    engines/saga/interface.cpp
    engines/saga/introproc_ite.cpp
    engines/saga/music.cpp
    engines/saga/palanim.h
    engines/saga/puzzle.cpp
    engines/saga/render.cpp
    engines/saga/resource.cpp
    engines/saga/saga.cpp
    engines/saga/saga.h
    engines/saga/saveload.cpp
    engines/saga/scene.cpp
    engines/saga/script.cpp
    engines/saga/shorten.cpp
    engines/saga/shorten.h
    engines/saga/sndres.cpp
    engines/saga/sthread.cpp
    engines/savestate.cpp
    engines/savestate.h
    engines/sci/console.cpp
    engines/sci/decompressor.cpp
    engines/sci/decompressor.h
    engines/sci/detection.cpp
    engines/sci/detection_tables.h
    engines/sci/engine/kernel.cpp
    engines/sci/engine/kernel.h
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kfile.cpp
    engines/sci/engine/kgraphics.cpp
    engines/sci/engine/klists.cpp
    engines/sci/engine/kmath.cpp
    engines/sci/engine/kmisc.cpp
    engines/sci/engine/kmovement.cpp
    engines/sci/engine/kstring.cpp
    engines/sci/engine/kvideo.cpp
    engines/sci/engine/object.cpp
    engines/sci/engine/savegame.cpp
    engines/sci/engine/script_patches.cpp
    engines/sci/engine/scriptdebug.cpp
    engines/sci/engine/seg_manager.cpp
    engines/sci/engine/selector.cpp
    engines/sci/engine/selector.h
    engines/sci/engine/static_selectors.cpp
    engines/sci/engine/vm.cpp
    engines/sci/engine/workarounds.cpp
    engines/sci/graphics/animate.cpp
    engines/sci/graphics/cache.cpp
    engines/sci/graphics/cache.h
    engines/sci/graphics/compare.cpp
    engines/sci/graphics/compare.h
    engines/sci/graphics/controls.cpp
    engines/sci/graphics/cursor.cpp
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/paint.h
    engines/sci/graphics/paint16.cpp
    engines/sci/graphics/paint16.h
    engines/sci/graphics/paint32.h
    engines/sci/graphics/palette.cpp
    engines/sci/graphics/palette.h
    engines/sci/graphics/picture.cpp
    engines/sci/graphics/picture.h
    engines/sci/graphics/screen.cpp
    engines/sci/graphics/text16.cpp
    engines/sci/graphics/view.cpp
    engines/sci/graphics/view.h
    engines/sci/module.mk
    engines/sci/parser/said.cpp
    engines/sci/resource.cpp
    engines/sci/resource.h
    engines/sci/resource_audio.cpp
    engines/sci/sci.cpp
    engines/sci/sci.h
    engines/sci/sound/drivers/cms.cpp
    engines/sci/sound/drivers/gm_names.h
    engines/sci/sound/midiparser_sci.cpp
    engines/sci/sound/music.cpp
    engines/sci/sound/soundcmd.cpp
    engines/sci/sound/soundcmd.h
    engines/scumm/actor.cpp
    engines/scumm/charset.cpp
    engines/scumm/charset.h
    engines/scumm/costume.cpp
    engines/scumm/cursor.cpp
    engines/scumm/detection.cpp
    engines/scumm/detection.h
    engines/scumm/detection_tables.h
    engines/scumm/dialogs.cpp
    engines/scumm/gfx.cpp
    engines/scumm/he/animation_he.cpp
    engines/scumm/he/animation_he.h
    engines/scumm/he/intern_he.h
    engines/scumm/he/logic_he.cpp
    engines/scumm/he/logic_he.h
    engines/scumm/he/resource_he.cpp
    engines/scumm/he/script_v100he.cpp
    engines/scumm/he/script_v60he.cpp
    engines/scumm/he/script_v72he.cpp
    engines/scumm/he/script_v80he.cpp
    engines/scumm/he/script_v90he.cpp
    engines/scumm/he/sprite_he.cpp
    engines/scumm/he/sprite_he.h
    engines/scumm/he/wiz_he.cpp
    engines/scumm/help.cpp
    engines/scumm/help.h
    engines/scumm/imuse/imuse.cpp
    engines/scumm/imuse/imuse.h
    engines/scumm/imuse/imuse_internal.h
    engines/scumm/imuse/imuse_part.cpp
    engines/scumm/imuse/imuse_player.cpp
    engines/scumm/imuse/instrument.cpp
    engines/scumm/imuse/instrument.h
    engines/scumm/imuse/sysex.h
    engines/scumm/imuse/sysex_samnmax.cpp
    engines/scumm/imuse/sysex_scumm.cpp
    engines/scumm/imuse_digi/dimuse.cpp
    engines/scumm/imuse_digi/dimuse_codecs.cpp
    engines/scumm/input.cpp
    engines/scumm/insane/insane_enemy.cpp
    engines/scumm/insane/insane_iact.cpp
    engines/scumm/insane/insane_scenes.cpp
    engines/scumm/module.mk
    engines/scumm/palette.cpp
    engines/scumm/player_towns.cpp
    engines/scumm/player_v2.h
    engines/scumm/player_v2base.h
    engines/scumm/player_v2cms.cpp
    engines/scumm/player_v2cms.h
    engines/scumm/resource.cpp
    engines/scumm/resource.h
    engines/scumm/room.cpp
    engines/scumm/saveload.cpp
    engines/scumm/saveload.h
    engines/scumm/script_v0.cpp
    engines/scumm/script_v4.cpp
    engines/scumm/script_v5.cpp
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h
    engines/scumm/smush/channel.cpp
    engines/scumm/smush/codec37.cpp
    engines/scumm/smush/smush_font.cpp
    engines/scumm/smush/smush_player.cpp
    engines/scumm/sound.cpp
    engines/scumm/sound.h
    engines/scumm/string.cpp
    engines/scumm/vars.cpp
    engines/scumm/verbs.cpp
    engines/sky/autoroute.h
    engines/sky/compact.cpp
    engines/sky/compact.h
    engines/sky/debug.cpp
    engines/sky/detection.cpp
    engines/sky/disk.cpp
    engines/sky/logic.cpp
    engines/sky/sound.cpp
    engines/sword1/animation.cpp
    engines/sword1/control.cpp
    engines/sword1/control.h
    engines/sword1/debug.h
    engines/sword1/detection.cpp
    engines/sword1/eventman.cpp
    engines/sword1/logic.cpp
    engines/sword1/logic.h
    engines/sword1/memman.cpp
    engines/sword1/memman.h
    engines/sword1/menu.cpp
    engines/sword1/mouse.cpp
    engines/sword1/mouse.h
    engines/sword1/music.cpp
    engines/sword1/music.h
    engines/sword1/object.h
    engines/sword1/objectman.cpp
    engines/sword1/objectman.h
    engines/sword1/resman.cpp
    engines/sword1/resman.h
    engines/sword1/router.cpp
    engines/sword1/router.h
    engines/sword1/screen.cpp
    engines/sword1/screen.h
    engines/sword1/sound.cpp
    engines/sword1/sound.h
    engines/sword1/staticres.cpp
    engines/sword1/sword1.cpp
    engines/sword1/sword1.h
    engines/sword1/sworddefs.h
    engines/sword1/text.cpp
    engines/sword1/text.h
    engines/sword2/controls.cpp
    engines/sword2/music.cpp
    engines/sword2/render.cpp
    engines/sword2/sound.cpp
    engines/sword2/sword2.cpp
    engines/sword25/detection.cpp
    engines/sword25/detection_tables.h
    engines/sword25/fmv/theora_decoder.cpp
    engines/sword25/gfx/animationtemplateregistry.cpp
    engines/sword25/gfx/graphicengine.cpp
    engines/sword25/gfx/image/art.cpp
    engines/sword25/gfx/image/art.h
    engines/sword25/gfx/image/renderedimage.cpp
    engines/sword25/gfx/image/vectorimage.cpp
    engines/sword25/gfx/image/vectorimagerenderer.cpp
    engines/sword25/gfx/staticbitmap.cpp
    engines/sword25/kernel/inputpersistenceblock.cpp
    engines/sword25/kernel/inputpersistenceblock.h
    engines/sword25/kernel/outputpersistenceblock.cpp
    engines/sword25/kernel/persistenceblock.h
    engines/sword25/kernel/persistenceservice.cpp
    engines/sword25/kernel/persistenceservice.h
    engines/sword25/math/regionregistry.cpp
    engines/sword25/package/packagemanager.h
    engines/sword25/sfx/soundengine.cpp
    engines/sword25/sfx/soundengine.h
    engines/sword25/sword25.cpp
    engines/sword25/util/lua/lapi.cpp
    engines/sword25/util/lua/lauxlib.cpp
    engines/sword25/util/lua/lauxlib.h
    engines/sword25/util/lua/lbaselib.cpp
    engines/sword25/util/lua/lcode.cpp
    engines/sword25/util/lua/ldblib.cpp
    engines/sword25/util/lua/ldebug.cpp
    engines/sword25/util/lua/ldo.cpp
    engines/sword25/util/lua/ldo.h
    engines/sword25/util/lua/lfunc.cpp
    engines/sword25/util/lua/lgc.cpp
    engines/sword25/util/lua/linit.cpp
    engines/sword25/util/lua/liolib.cpp
    engines/sword25/util/lua/llex.cpp
    engines/sword25/util/lua/lmathlib.cpp
    engines/sword25/util/lua/lmem.cpp
    engines/sword25/util/lua/lmem.h
    engines/sword25/util/lua/loadlib.cpp
    engines/sword25/util/lua/lobject.h
    engines/sword25/util/lua/lopcodes.cpp
    engines/sword25/util/lua/loslib.cpp
    engines/sword25/util/lua/lstate.cpp
    engines/sword25/util/lua/lstate.h
    engines/sword25/util/lua/lstring.cpp
    engines/sword25/util/lua/lstrlib.cpp
    engines/sword25/util/lua/ltablib.cpp
    engines/sword25/util/lua/ltm.cpp
    engines/sword25/util/lua/luaconf.h
    engines/sword25/util/lua/lvm.cpp
    engines/sword25/util/lua/lzio.cpp
    engines/sword25/util/pluto/CHANGELOG
    engines/sword25/util/pluto/FILEFORMAT
    engines/sword25/util/pluto/THANKS
    engines/sword25/util/pluto/plzio.cpp
    engines/teenagent/actor.cpp
    engines/teenagent/animation.cpp
    engines/teenagent/animation.h
    engines/teenagent/callbacks.cpp
    engines/teenagent/console.cpp
    engines/teenagent/detection.cpp
    engines/teenagent/font.h
    engines/teenagent/inventory.cpp
    engines/teenagent/music.cpp
    engines/teenagent/objects.cpp
    engines/teenagent/objects.h
    engines/teenagent/pack.cpp
    engines/teenagent/pack.h
    engines/teenagent/resources.cpp
    engines/teenagent/scene.cpp
    engines/teenagent/scene.h
    engines/teenagent/surface.cpp
    engines/teenagent/surface.h
    engines/teenagent/surface_list.cpp
    engines/teenagent/surface_list.h
    engines/teenagent/teenagent.cpp
    engines/teenagent/teenagent.h
    engines/testbed/config-params.cpp
    engines/testbed/detection.cpp
    engines/testbed/misc.cpp
    engines/tinsel/actors.cpp
    engines/tinsel/actors.h
    engines/tinsel/adpcm.cpp
    engines/tinsel/config.cpp
    engines/tinsel/coroutine.cpp
    engines/tinsel/detection.cpp
    engines/tinsel/detection_tables.h
    engines/tinsel/pcode.h
    engines/tinsel/saveload.cpp
    engines/tinsel/savescn.cpp
    engines/tinsel/sound.cpp
    engines/tinsel/strres.h
    engines/tinsel/tinsel.cpp
    engines/tinsel/tinsel.h
    engines/toon/anim.cpp
    engines/toon/anim.h
    engines/toon/audio.cpp
    engines/toon/character.cpp
    engines/toon/detection.cpp
    engines/toon/drew.cpp
    engines/toon/font.cpp
    engines/toon/hotspot.cpp
    engines/toon/movie.cpp
    engines/toon/path.cpp
    engines/toon/path.h
    engines/toon/picture.cpp
    engines/toon/picture.h
    engines/toon/resource.cpp
    engines/toon/script.cpp
    engines/toon/script.h
    engines/toon/script_func.cpp
    engines/toon/tools.cpp
    engines/toon/toon.cpp
    engines/touche/detection.cpp
    engines/touche/menu.cpp
    engines/touche/resource.cpp
    engines/tsage/converse.cpp
    engines/tsage/converse.h
    engines/tsage/core.cpp
    engines/tsage/core.h
    engines/tsage/debugger.cpp
    engines/tsage/debugger.h
    engines/tsage/detection.cpp
    engines/tsage/detection_tables.h
    engines/tsage/dialogs.cpp
    engines/tsage/dialogs.h
    engines/tsage/events.cpp
    engines/tsage/events.h
    engines/tsage/globals.cpp
    engines/tsage/globals.h
    engines/tsage/graphics.cpp
    engines/tsage/graphics.h
    engines/tsage/module.mk
    engines/tsage/resources.cpp
    engines/tsage/resources.h
    engines/tsage/saveload.cpp
    engines/tsage/saveload.h
    engines/tsage/scenes.cpp
    engines/tsage/scenes.h
    engines/tsage/sound.cpp
    engines/tsage/sound.h
    engines/tsage/staticres.cpp
    engines/tsage/staticres.h
    engines/tsage/tsage.cpp
    engines/tsage/tsage.h
    engines/tucker/detection.cpp
    engines/tucker/staticres.cpp
    engines/tucker/tucker.h
    graphics/cursorman.cpp
    graphics/font.cpp
    graphics/font.h
    graphics/fontman.cpp
    graphics/fontman.h
    graphics/fonts/consolefont.cpp
    graphics/fonts/newfont.cpp
    graphics/fonts/newfont_big.cpp
    graphics/fonts/winfont.cpp
    graphics/imagedec.h
    graphics/maccursor.h
    graphics/module.mk
    graphics/pict.cpp
    graphics/pict.h
    graphics/png.cpp
    graphics/primitives.h
    graphics/scaler.cpp
    graphics/scaler/aspect.cpp
    graphics/scaler/hq2x_i386.asm
    graphics/scaler/hq3x_i386.asm
    graphics/scaler/scale2x.cpp
    graphics/scaler/scale2x.h
    graphics/scaler/scale3x.cpp
    graphics/scaler/scale3x.h
    graphics/scaler/scalebit.cpp
    graphics/scaler/scalebit.h
    graphics/scaler/thumbnail_intern.cpp
    graphics/sjis.cpp
    graphics/sjis.h
    graphics/surface.cpp
    graphics/thumbnail.cpp
    graphics/thumbnail.h
    graphics/wincursor.cpp
    graphics/wincursor.h
    graphics/yuv_to_rgb.cpp
    graphics/yuv_to_rgb.h
    gui/ThemeEngine.cpp
    gui/console.cpp
    gui/credits.h
    gui/debugger.h
    gui/gui-manager.cpp
    gui/launcher.cpp
    gui/options.cpp
    gui/options.h
    gui/saveload.cpp
    gui/themebrowser.cpp
    gui/themebrowser.h
    gui/themes/fonts/topaz/README.ScummVM
    gui/themes/translations.dat
    gui/widget.cpp
    gui/widget.h
    gui/widgets/scrollbar.cpp
    icons/scummvm.ico
    icons/scummvm.svg
    po/POTFILES
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DA.po
    po/de_DE.po
    po/es_ES.po
    po/fr_FR.po
    po/hu_HU.po
    po/it_IT.po
    po/module.mk
    po/nb_NO.po
    po/nn_NO.po
    po/pl_PL.po
    po/pt_BR.po
    po/ru_RU.po
    po/scummvm.pot
    po/se_SE.po
    po/uk_UA.po
    ports.mk
    test/README
    test/audio/audiostream.h
    test/audio/helper.h
    test/common/algorithm.h
    test/common/array.h
    test/common/fixedstack.h
    test/common/queue.h
    test/common/stack.h
    test/common/tokenizer.h
    test/cxxtest/COPYING
    test/cxxtest/TODO
    test/cxxtest/cxxtest.spec
    test/cxxtest/cxxtest/Descriptions.h
    test/cxxtest/cxxtest/DummyDescriptions.cpp
    test/cxxtest/cxxtest/DummyDescriptions.h
    test/cxxtest/cxxtest/GlobalFixture.cpp
    test/cxxtest/cxxtest/GlobalFixture.h
    test/cxxtest/cxxtest/LinkedList.h
    test/cxxtest/cxxtest/RealDescriptions.cpp
    test/cxxtest/cxxtest/RealDescriptions.h
    test/cxxtest/docs/guide.html
    test/cxxtest/sample/Construct
    test/cxxtest/sample/aborter.tpl
    test/cxxtest/sample/file_printer.tpl
    test/cxxtest/sample/mock/Dice.cpp
    test/cxxtest/sample/mock/Dice.h
    test/cxxtest/sample/msvc/CxxTest_Workspace.dsw
    test/cxxtest/sample/only.tpl
    test/cxxtest/sample/winddk/SOURCES
    test/module.mk
    video/codecs/cdtoons.cpp
    video/codecs/cinepak.cpp
    video/module.mk
    video/qt_decoder.cpp
    video/smk_decoder.cpp



diff --cc engines/neverhood/detection.cpp
index b80379b,0000000..df9eca3
mode 100644,000000..100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@@ -1,285 -1,0 +1,282 @@@
 +/* 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 "base/plugins.h"
 +
 +#include "engines/advancedDetector.h"
 +#include "common/file.h"
 +
 +#include "neverhood/neverhood.h"
 +
 +
 +namespace Neverhood {
 +
 +struct NeverhoodGameDescription {
 +	ADGameDescription desc;
 +
 +	int gameID;
 +	int gameType;
 +	uint32 features;
 +	uint16 version;
 +};
 +
 +const char *NeverhoodEngine::getGameId() const {
 +	return _gameDescription->desc.gameid;
 +}
 +
 +uint32 NeverhoodEngine::getFeatures() const {
 +	return _gameDescription->features;
 +}
 +
 +Common::Platform NeverhoodEngine::getPlatform() const {
 +	return _gameDescription->desc.platform;
 +}
 +
 +uint16 NeverhoodEngine::getVersion() const {
 +	return _gameDescription->version;
 +}
 +
 +}
 +
 +static const PlainGameDescriptor neverhoodGames[] = {
 +	{"neverhood", "The Neverhood Chronicles"},
 +	{0, 0}
 +};
 +
 +namespace Neverhood {
 +
- using Common::GUIO_NONE;
- using Common::GUIO_NOSPEECH;
- 
 +static const NeverhoodGameDescription gameDescriptions[] = {
 +
 +	{
 +		// Neverhood English version
 +		// TODO: Maybe additional files are needed to properly detect different versions
 +		{
 +			"neverhood",
 +			0,
 +			AD_ENTRY1s("hd.blb", "22958d968458c9ff221aee38577bb2b2", 4279716),
 +			Common::EN_ANY,
 +			Common::kPlatformWindows,
 +			ADGF_NO_FLAGS,
- 			GUIO_NONE
++			GUIO1(GUIO_NONE)
 +		},
 +		0,
 +		0,
 +		0,
 +		0,
 +	},
 +
 +	{ AD_TABLE_END_MARKER, 0, 0, 0, 0 }
 +};
 +
 +/**
 + * The fallback game descriptor used by the Neverhood engine's fallbackDetector.
 + * Contents of this struct are to be overwritten by the fallbackDetector.
 + */
 +static NeverhoodGameDescription g_fallbackDesc = {
 +	{
 +		"",
 +		"",
 +		AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor
 +		Common::UNK_LANG,
 +		Common::kPlatformPC,
 +		ADGF_NO_FLAGS,
 +		GUIO_NONE
 +	},
 +	0,
 +	0,
 +	0,
 +	0,
 +};
 +
 +} // End of namespace Neverhood
 +
 +class NeverhoodMetaEngine : public AdvancedMetaEngine {
 +public:
 +	NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) {
 +		_singleid = "neverhood";
 +	}
 +
 +	virtual const char *getName() const {
 +		return "Neverhood Engine";
 +	}
 +
 +	virtual const char *getOriginalCopyright() const {
 +		return "Neverhood Engine (C) Infogrames";
 +	}
 +
 +	virtual bool hasFeature(MetaEngineFeature f) const;
 +	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
 +
 +#if 0 // Not used yet but let's keep it for later when it is	
 +	SaveStateList listSaves(const char *target) const;
 +	virtual int getMaximumSaveSlot() const;
 +	void removeSaveState(const char *target, int slot) const;
 +	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
 +#endif
 +
 +	const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const;
 +
 +};
 +
 +bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
 +	return
 +		false; // Nothing yet :(
 +//		(f == kSupportsListSaves) ||
 +//		(f == kSupportsLoadingDuringStartup) ||
 +//		(f == kSupportsDeleteSave) ||
 +//	   	(f == kSavesSupportMetaInfo) ||
 +//		(f == kSavesSupportThumbnail);
 +}
 +
 +bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const {
 +	return
 +		false; // Nothing yet :(
 +//		(f == kSupportsRTL) || // TODO: Not yet...
 +//		(f == kSupportsLoadingDuringRuntime) ||
 +//		(f == kSupportsSavingDuringRuntime);
 +}
 +
 +bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
 +	const Neverhood::NeverhoodGameDescription *gd = (const Neverhood::NeverhoodGameDescription *)desc;
 +	if (gd) {
 +		*engine = new Neverhood::NeverhoodEngine(syst, gd);
 +	}
 +	return gd != 0;
 +}
 +
 +const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSList &fslist) const {
 +	// Set the default values for the fallback descriptor's ADGameDescription part.
 +	Neverhood::g_fallbackDesc.desc.language = Common::UNK_LANG;
 +	Neverhood::g_fallbackDesc.desc.platform = Common::kPlatformPC;
 +	Neverhood::g_fallbackDesc.desc.flags = ADGF_NO_FLAGS;
 +
 +	// Set default values for the fallback descriptor's NeverhoodGameDescription part.
 +	Neverhood::g_fallbackDesc.gameID = 0;
 +	Neverhood::g_fallbackDesc.features = 0;
 +	Neverhood::g_fallbackDesc.version = 3;
 +
 +	return NULL;
 +}
 +
 +#if 0 // Not used yet but let's keep it for later when it is	
 +
 +SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const {
 +	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 +	Neverhood::NeverhoodEngine::SaveHeader header;
 +	Common::String pattern = target;
 +	pattern += ".???";
 +
 +	Common::StringArray filenames;
 +	filenames = saveFileMan->listSavefiles(pattern.c_str());
 +	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
 +
 +	SaveStateList saveList;
 +	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) {
 +		// Obtain the last 3 digits of the filename, since they correspond to the save slot
 +		int slotNum = atoi(file->c_str() + file->size() - 3);
 +
 +		if (slotNum >= 0 && slotNum <= 999) {
 +			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
 +			if (in) {
 +				if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) {
 +					saveList.push_back(SaveStateDescriptor(slotNum, header.description));
 +				}
 +				delete in;
 +			}
 +		}
 +	}
 +
 +	return saveList;
 +}
 +
 +int NeverhoodMetaEngine::getMaximumSaveSlot() const {
 +	return 999;
 +}
 +
 +void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const {
 +	// Slot 0 can't be deleted, it's for restarting the game(s)
 +	if (slot == 0)
 +		return;
 +
 +	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 +	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot);
 +
 +	saveFileMan->removeSavefile(filename.c_str());
 +
 +	Common::StringArray filenames;
 +	Common::String pattern = target;
 +	pattern += ".???";
 +	filenames = saveFileMan->listSavefiles(pattern.c_str());
 +	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
 +
 +	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
 +		// Obtain the last 3 digits of the filename, since they correspond to the save slot
 +		int slotNum = atoi(file->c_str() + file->size() - 3);
 +
 +		// Rename every slot greater than the deleted slot,
 +		// Also do not rename quicksaves.
 +		if (slotNum > slot && slotNum < 990) {
 +			// FIXME: Our savefile renaming done here is inconsitent with what we do in
 +			// GUI_v2::deleteMenu. While here we rename every slot with a greater equal
 +			// number of the deleted slot to deleted slot, deleted slot + 1 etc.,
 +			// we only rename the following slots in GUI_v2::deleteMenu until a slot
 +			// is missing.
 +			saveFileMan->renameSavefile(file->c_str(), filename.c_str());
 +
 +			filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot);
 +		}
 +	}
 +
 +}
 +
 +SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
 +	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot);
 +	Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str());
 +
 +	if (in) {
 +		Neverhood::NeverhoodEngine::SaveHeader header;
 +		Neverhood::NeverhoodEngine::kReadSaveHeaderError error;
 +
 +		error = Neverhood::NeverhoodEngine::readSaveHeader(in, true, header);
 +		delete in;
 +
 +		if (error == Neverhood::NeverhoodEngine::kRSHENoError) {
 +			SaveStateDescriptor desc(slot, header.description);
 +
 +			desc.setDeletableFlag(false);
 +			desc.setWriteProtectedFlag(false);
 +			desc.setThumbnail(header.thumbnail);
 +
 +			return desc;
 +		}
 +	}
 +
 +	return SaveStateDescriptor();
 +}
 +
 +#endif
 +
 +#if PLUGIN_ENABLED_DYNAMIC(NEVERHOOD)
 +	REGISTER_PLUGIN_DYNAMIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
 +#else
 +	REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
 +#endif


Commit: dac95f3f7361a69dbd5eacfd181f294f9def53d9
    https://github.com/scummvm/scummvm/commit/dac95f3f7361a69dbd5eacfd181f294f9def53d9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:03-07:00

Commit Message:
NEVERHOOD: More renaming (mostly in Klayman and AnimatedSprite)

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 4fdc736..94a5323 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -161,8 +161,8 @@ Class494::Class494(NeverhoodEngine *vm)
 	createSurface1(0x100B90B4, 1200);
 	_x = 211;
 	_y = 195;
-	setFileHash(0x100B90B4, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x100B90B4, 0, -1);
+	_newStickFrameIndex = 0;
 	_needRefresh = true;
 	updatePosition();
 	_surface->setVisible(false);
@@ -172,7 +172,7 @@ uint32 Class494::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -186,7 +186,7 @@ void Class494::sub43BE00() {
 }
 
 void Class494::sub43BE20() {
-	setFileHash(0x100B90B4, 0, -1);
+	startAnimation(0x100B90B4, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class494::handleMessage);
 	NextState(&Class494::sub43BE00);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 567788b..2358df4 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -27,7 +27,7 @@
 
 namespace Neverhood {
 
-static const KlaymanTableItem klaymanTable1[] = {
+static const KlaymanIdleTableItem klaymanTable1[] = {
 	{1, &Klayman::stDoIdlePickEar},
 	{1, &Klayman::sub41FDA0},
 	{1, &Klayman::sub41FDF0},
@@ -35,7 +35,7 @@ static const KlaymanTableItem klaymanTable1[] = {
 	{1, &Klayman::sub41FEB0}
 }; 
 
-static const KlaymanTableItem klaymanTable2[] = {
+static const KlaymanIdleTableItem klaymanTable2[] = {
 	{1, &Klayman::stDoIdlePickEar},
 	{1, &Klayman::sub41FDA0},
 	{1, &Klayman::stDoIdleChest},
@@ -43,13 +43,13 @@ static const KlaymanTableItem klaymanTable2[] = {
 }; 
 
 #if 0
-static const KlaymanTableItem klaymanTable3[] = {
+static const KlaymanIdleTableItem klaymanTable3[] = {
 	{1, &Klayman::sub421430},
 	{1, &Klayman::sub421480}
 }; 
 #endif
 
-static const KlaymanTableItem klaymanTable4[] = {
+static const KlaymanIdleTableItem klaymanTable4[] = {
 	{1, &Klayman::sub41FDA0},
 	{1, &Klayman::stDoIdleChest},
 	{1, &Klayman::sub41FEB0},
@@ -60,8 +60,8 @@ static const KlaymanTableItem klaymanTable4[] = {
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
 	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
-	_counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false),
-	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false),
+	_counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _flagE1(false),
+	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _isLeverDown(false),
 	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
 	// TODO DirtySurface
@@ -71,7 +71,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_x4 = x;
 	_y4 = y;
 	_flags = 2;
-	setKlaymanTable1();
+	setKlaymanIdleTable1();
 	stTryStandIdle();
 	SetUpdateHandler(&Klayman::update);
 }
@@ -101,25 +101,25 @@ void Klayman::update() {
 	xUpdate();
 }
 
-void Klayman::setKlaymanTable(const KlaymanTableItem *table, int tableCount) {
-	_table = table;
-	_tableCount = tableCount;
-	_tableMaxValue = 0;
+void Klayman::setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount) {
+	_idleTable = table;
+	_idleTableCount = tableCount;
+	_idleTableMaxValue = 0;
 	for (int i = 0; i < tableCount; i++) {
-		_tableMaxValue += table[i].value;
+		_idleTableMaxValue += table[i].value;
 	}
 }
 
-void Klayman::setKlaymanTable1() {
-	setKlaymanTable(klaymanTable1, ARRAYSIZE(klaymanTable1));
+void Klayman::setKlaymanIdleTable1() {
+	setKlaymanIdleTable(klaymanTable1, ARRAYSIZE(klaymanTable1));
 }
 
-void Klayman::setKlaymanTable2() {
-	setKlaymanTable(klaymanTable2, ARRAYSIZE(klaymanTable2));
+void Klayman::setKlaymanIdleTable2() {
+	setKlaymanIdleTable(klaymanTable2, ARRAYSIZE(klaymanTable2));
 }
 
-void Klayman::setKlaymanTable3() {
-	// TODO setKlaymanTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
+void Klayman::setKlaymanIdleTable3() {
+	// TODO setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
 }
 
 void Klayman::stDoIdlePickEar() {
@@ -128,8 +128,8 @@ void Klayman::stDoIdlePickEar() {
 
 void Klayman::stIdlePickEar() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x5B20C814, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5B20C814, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmIdlePickEar);
 	SetSpriteCallback(NULL);
@@ -159,8 +159,8 @@ void Klayman::sub41FDA0() {
 
 void Klayman::sub41FDB0() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0xD122C137, 0, -1);
+	_acceptInput = true;
+	startAnimation(0xD122C137, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41E980);
 	SetSpriteCallback(NULL);
@@ -185,8 +185,8 @@ void Klayman::sub41FDF0() {
 
 void Klayman::sub41FE00() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x543CD054, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x543CD054, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41E9E0);
 	SetSpriteCallback(NULL);
@@ -220,8 +220,8 @@ void Klayman::stDoIdleChest() {
 
 void Klayman::stIdleChest() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x40A0C034, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x40A0C034, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmIdleChest);
 	SetSpriteCallback(NULL);
@@ -246,8 +246,8 @@ void Klayman::sub41FEB0() {
 
 void Klayman::sub41FEC0() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x5120E137, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5120E137, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EFE0);
 	SetSpriteCallback(NULL);
@@ -274,8 +274,8 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, E
 
 void Klayman::sub421350() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x582EC138, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x582EC138, 0, -1);
 	_counter = 0;
 	SetSpriteCallback(NULL);
 	SetUpdateHandler(&Klayman::update41D1C0);
@@ -290,15 +290,15 @@ void Klayman::update41D1C0() {
 	_counter++;
 	if (_counter >= _counterMax) {
 		_counter = 0;
-		if (_table) {
-			int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue);
-			for (int i = 0; i < _tableCount; i++) {
-				if (randomValue < _table[_tableCount].value) {
-					(this->*(_table[_tableCount].callback))();
+		if (_idleTable) {
+			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
+			for (int i = 0; i < _idleTableCount; i++) {
+				if (randomValue < _idleTable[_idleTableCount].value) {
+					(this->*(_idleTable[_idleTableCount].callback))();
 					_counterMax = _vm->_rnd->getRandomNumber(128) + 24;
 					break;
 				}
-				randomValue -= _table[_tableCount].value;
+				randomValue -= _idleTable[_idleTableCount].value;
 			}
 		}
 	} else {
@@ -313,8 +313,8 @@ void Klayman::update41D1C0() {
 
 void Klayman::stIdleSitBlink() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x5C24C018, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -323,8 +323,8 @@ void Klayman::stIdleSitBlink() {
 
 void Klayman::stIdleSitBlinkSecond() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x5C24C018, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update41D1C0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(NULL);
@@ -334,8 +334,8 @@ void Klayman::stPickUpNeedle() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klayman::stPickUpNeedle))) {
 		_status2 = 1;
-		_flagE5 = false;
-		setFileHash(0x1449C169, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x1449C169, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPickUpGeneric);
 		SetSpriteCallback(NULL);
@@ -346,8 +346,8 @@ void Klayman::sub41FFF0() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klayman::sub41FFF0))) {
 		_status2 = 1;
-		_flagE5 = false;
-		setFileHash(0x0018C032, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x0018C032, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D640);
 		SetSpriteCallback(NULL);
@@ -377,19 +377,19 @@ uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub4214D0() {
+void Klayman::stTurnToUseInTeleporter() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0xD229823D, 0, -1);
+	_acceptInput = false;
+	startAnimation(0xD229823D, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub421510() {
+void Klayman::stReturnFromUseInTeleporter() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x9A2801E0, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x9A2801E0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -398,10 +398,10 @@ void Klayman::sub421510() {
 void Klayman::stStepOver() {
 	if (!stStartAction(AnimationCallback(&Klayman::stStepOver))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x004AA310, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x004AA310, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41EC70);
+		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	}
 }
@@ -409,15 +409,15 @@ void Klayman::stStepOver() {
 void Klayman::stSitInTeleporter() {
 	if (!stStartAction(AnimationCallback(&Klayman::stSitInTeleporter))) {
 		_status2 = 0;
-		_flagE5 = false;
-		setFileHash(0x392A0330, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x392A0330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41EAB0);
+		SetMessageHandler(&Klayman::hmSitInTeleporter);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	}
 }
 
-uint32 Klayman::handleMessage41EAB0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -429,10 +429,10 @@ uint32 Klayman::handleMessage41EAB0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421310() {
+void Klayman::stGetUpFromTeleporter() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x913AB120, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x913AB120, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
@@ -473,10 +473,10 @@ void Klayman::update41D2B0() {
 bool Klayman::stStartActionFromIdle(AnimationCb callback) {
 	if (_status2 == 2) {
 		_status2 = 1;
-		_flagE5 = false; 
-		setFileHash(0x9A7020B8, 0, -1);
+		_acceptInput = false; 
+		startAnimation(0x9A7020B8, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41F140);
+		SetMessageHandler(&Klayman::hmStartAction);
 		SetSpriteCallback(NULL);
 		NextState(callback);
 		return true;
@@ -516,8 +516,8 @@ void Klayman::sub41C790() {
 void Klayman::stTryStandIdle() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTryStandIdle))) {
 		_status2 = 1;
-		_flagE5 = true;
-		setFileHash(0x5420E254, 0, -1);
+		_acceptInput = true;
+		startAnimation(0x5420E254, 0, -1);
 		_counter = 0;
 		_counter3 = 0;
 		_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
@@ -529,26 +529,22 @@ void Klayman::stTryStandIdle() {
 
 void Klayman::update41D0F0() {
 	update();
-	_counter++;
-	if (_counter >= 720) {
+	if (++_counter >= 720) {
 		_counter = 0;
-		if (_table) {
-			int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue);
-			for (int i = 0; i < _tableCount; i++) {
-				if (randomValue < _table[_tableCount].value) {
-					(this->*(_table[_tableCount].callback))();
+		if (_idleTable) {
+			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
+			for (int i = 0; i < _idleTableCount; i++) {
+				if (randomValue < _idleTable[_idleTableCount].value) {
+					(this->*(_idleTable[_idleTableCount].callback))();
 					break;
 				}
-				randomValue -= _table[_tableCount].value;
+				randomValue -= _idleTable[_idleTableCount].value;
 			}
 		}
-	} else {
-		_counter3++;
-		if (_counter3 >= _counter3Max) {
-			_counter3 = 0;
-			_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
-			stStand();
-		}
+	} else if (++_counter3 >= _counter3Max) {
+		_counter3 = 0;
+		_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+		stStand();
 	}
 }
 
@@ -557,7 +553,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 	uint32 messageResult = xHandleMessage(messageNum, param);
 	switch (messageNum) {
 	case 0x1008:
-		messageResult = _flagE5;
+		messageResult = _acceptInput;
 		break;
 	case 0x1014:
 		_attachedSprite = (Sprite*)(param.asEntity());
@@ -591,8 +587,8 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 
 void Klayman::stStand() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x5900C41E, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5900C41E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -611,14 +607,14 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, E
 
 void Klayman::stStandAround() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x5420E254, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update41D0F0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(NULL);
 }
 
-uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmStartAction(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -666,8 +662,8 @@ void Klayman::sub41C930(int16 x, bool flag) {
 
 void Klayman::stWakeUp() {
 	_status2 = 1;
-	_flagE5 = false;
-	setFileHash(0x527AC970, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x527AC970, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -675,8 +671,8 @@ void Klayman::stWakeUp() {
 
 void Klayman::stSleeping() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x5A38C110, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x5A38C110, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmSleeping);
 	SetSpriteCallback(NULL);
@@ -697,10 +693,10 @@ uint32 Klayman::hmSleeping(int messageNum, const MessageParam &param, Entity *se
 bool Klayman::stStartAction(AnimationCb callback3) {
 	if (_status2 == 1) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x5C7080D4, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x5C7080D4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41F140);
+		SetMessageHandler(&Klayman::hmStartAction);
 		SetSpriteCallback(&Klayman::spriteUpdate41F250);
 		NextState(callback3);
 		return true;
@@ -728,7 +724,7 @@ void Klayman::spriteUpdate41F250() {
 	}
 	_deltaY = 0;
 	
-	if (_flag) {
+	if (_frameChanged) {
 		if (xdiff > 6)
 			_x += 6;
 		else if (xdiff < -6)
@@ -741,11 +737,11 @@ void Klayman::spriteUpdate41F250() {
 	
 }
 
-void Klayman::spriteUpdate41F5F0() {
+void Klayman::suWalking() {
 	
 	int16 xdiff = _x4 - _x;
 	
-	if (_frameIndex == 9) {
+	if (_currFrameIndex == 9) {
 		if (xdiff > 26)
 			_deltaX += xdiff - 26;
 		else if (xdiff < -26)			
@@ -792,20 +788,20 @@ void Klayman::spriteUpdate41F5F0() {
 void Klayman::stSneak() {
 	_status2 = 1;
 	_flagE2 = true;
-	_flagE5 = true;
+	_acceptInput = true;
 	setDoDeltaX(_x4 < _x ? 1 : 0);
-	setFileHash(0x5C48C506, 0, -1);
+	startAnimation(0x5C48C506, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41DD80);
-	SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
-	FinalizeState(&Klayman::stSneakDone);	
+	SetMessageHandler(&Klayman::hmWalking);
+	SetSpriteCallback(&Klayman::suWalking);
+	FinalizeState(&Klayman::stWalkingDone);	
 }
 
-void Klayman::stSneakDone() {
+void Klayman::stWalkingDone() {
 	_flagE2 = false;
 }
 
-uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -855,11 +851,11 @@ void Klayman::stStartWalking() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) {
 		_status2 = 0;
 		_flagE1 = true;
-		_flagE5 = true;
+		_acceptInput = true;
 		setDoDeltaX(_x4 < _x ? 1 : 0);
-		setFileHash(0x242C0198, 0, -1);
+		startAnimation(0x242C0198, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41EC70);
+		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteCallback(&Klayman::spriteUpdate41F320);
 		FinalizeState(&Klayman::stStartWalkingDone);	
 		NextState(&Klayman::stWalking);
@@ -870,7 +866,7 @@ void Klayman::stStartWalkingDone() {
 	_flagE1 = false;
 }
 
-uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -895,13 +891,13 @@ uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam &param, E
 void Klayman::stWalking() {
 	_status2 = 0;
 	_flagE1 = true;
-	_flagE5 = true;
-	setFileHash(0x1A249001, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x1A249001, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
 	FinalizeState(&Klayman::stStartWalkingDone);	
-	NextState(&Klayman::sub41FA40);
+	NextState(&Klayman::stUpdateWalking);
 }
 
 void Klayman::spriteUpdate41F300() {
@@ -931,35 +927,35 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FA40() {
+void Klayman::stUpdateWalking() {
 	if (_status3 == 2) {
 		sub41C7B0();
 	} else if (_status3 == 3) {
-		sub420F20();
+		stWalkingOpenDoor();
 	} else {
 		_flagE2 = true;
-		_flagE5 = true;
-		if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
+		_acceptInput = true;
+		if (ABS(_x4 - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
 			if (_status3 == 0) {
 				_status2 = 1;
-				setFileHash(0xF234EE31, 0, -1);
+				startAnimation(0xF234EE31, 0, -1);
 			} else {
 				_status2 = 2;
-				setFileHash(0xF135CC21, 0, -1);
+				startAnimation(0xF135CC21, 0, -1);
 			}
-		} else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
+		} else if (ABS(_x4 - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
 			if (_status3 == 0) {
 				_status2 = 1;
-				setFileHash(0x8604A152, 0, -1);
+				startAnimation(0x8604A152, 0, -1);
 			} else {
 				_status2 = 2;
-				setFileHash(0xA246A132, 0, -1);
+				startAnimation(0xA246A132, 0, -1);
 			}
 		}
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41DD80);
-		SetSpriteCallback(&Klayman::spriteUpdate41F5F0);
-		FinalizeState(&Klayman::stSneakDone);	
+		SetMessageHandler(&Klayman::hmWalking);
+		SetSpriteCallback(&Klayman::suWalking);
+		FinalizeState(&Klayman::stWalkingDone);	
 	}
 }
 
@@ -976,13 +972,13 @@ void Klayman::spriteUpdate41F320() {
 
 	if (xdiff == 0) {
 		sendMessage(this, 0x1019, 0);
-	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) {
+	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
 		sendMessage(this, 0x1019, 0);
-	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) {
+	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
 		sendMessage(this, 0x1019, 0);
 	} else if (_status3 == 3 && xdiff < 30) {
 		sendMessage(this, 0x1019, 0);
-	} else if (_status3 == 3 && xdiff < 150 && _frameIndex >= 6) {
+	} else if (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6) {
 		sendMessage(this, 0x1019, 0);
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
@@ -1039,8 +1035,8 @@ void Klayman::stPickUpGeneric() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klayman::stPickUpGeneric))) {
 		_status2 = 1;
-		_flagE5 = false;
-		setFileHash(0x1C28C178, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x1C28C178, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPickUpGeneric);
 		SetSpriteCallback(NULL);
@@ -1076,8 +1072,8 @@ uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam &param, Entit
 void Klayman::stTurnPressButton() {
 	if (!stStartAction(AnimationCallback(&Klayman::stTurnPressButton))) {
 		_status2 = 2;
-		_flagE5 = true;
-		setFileHash(0x1C02B03D, 0, -1);
+		_acceptInput = true;
+		startAnimation(0x1C02B03D, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
 		SetSpriteCallback(NULL);
@@ -1105,8 +1101,8 @@ uint32 Klayman::hmPressButton(int messageNum, const MessageParam &param, Entity
 void Klayman::stStampFloorButton() {
 	if (!stStartAction(AnimationCallback(&Klayman::stStampFloorButton))) {
 		_status2 = 2;
-		_flagE5 = true;
-		setFileHash(0x1C16B033, 0, -1);
+		_acceptInput = true;
+		startAnimation(0x1C16B033, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
 		SetSpriteCallback(NULL);
@@ -1116,8 +1112,8 @@ void Klayman::stStampFloorButton() {
 void Klayman::stPressButtonSide() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stPressButtonSide))) {
 		_status2 = 1;
-		_flagE5 = true;
-		setFileHash(0x1CD89029, 0, -1);
+		_acceptInput = true;
+		startAnimation(0x1CD89029, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
 		SetSpriteCallback(&Klayman::spriteUpdate41F250);
@@ -1194,9 +1190,9 @@ void Klayman::sub41CAC0(int16 x) {
 void Klayman::stLargeStep() {
 	_status2 = 2;
 	_flagE3 = true;
-	_flagE5 = true;
+	_acceptInput = true;
 	setDoDeltaX(_x4 >= _x ? 1 : 0);
-	setFileHash(0x08B28116, 0, -1);
+	startAnimation(0x08B28116, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLargeStep);
 	SetSpriteCallback(&Klayman::suLargeStep);
@@ -1214,7 +1210,7 @@ void Klayman::suLargeStep() {
 		_deltaX = -_deltaX;
 	}
 	
-	if (_frameIndex == 7) {
+	if (_currFrameIndex == 7) {
 		_deltaX = xdiff;
 	}
 
@@ -1273,8 +1269,8 @@ uint32 Klayman::hmLargeStep(int messageNum, const MessageParam &param, Entity *s
 
 void Klayman::stWonderAboutHalf() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0xD820A114, 0, 10);
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, 10);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -1282,8 +1278,8 @@ void Klayman::stWonderAboutHalf() {
 
 void Klayman::stWonderAboutAfter() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0xD820A114, 30, -1);
+	_acceptInput = true;
+	startAnimation(0xD820A114, 30, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -1291,14 +1287,14 @@ void Klayman::stWonderAboutAfter() {
 
 void Klayman::stTurnToUseHalf() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x9B250AD2, 0, 7);
+	_acceptInput = true;
+	startAnimation(0x9B250AD2, 0, 7);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EEF0);
+	SetMessageHandler(&Klayman::hmTurnToUse);
 	SetSpriteCallback(NULL);
 }
 
-uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1314,17 +1310,17 @@ uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam &param, E
 
 void Klayman::stTurnAwayFromUse() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x98F88391, 4, -1);
+	_acceptInput = true;
+	startAnimation(0x98F88391, 4, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EEF0);
+	SetMessageHandler(&Klayman::hmTurnToUse);
 	SetSpriteCallback(NULL);
 }
 
 void Klayman::stWonderAbout() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0xD820A114, 0, -1);
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -1332,8 +1328,8 @@ void Klayman::stWonderAbout() {
 
 void Klayman::stPeekWall() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0xAC20C012, 0, -1);
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmPeekWall);
 	SetSpriteCallback(NULL);
@@ -1344,8 +1340,8 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *se
 	switch (messageNum) {
 	case 0x1008:
 		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_frameIndex < speedUpFrameIndex)
-			setFileHash(0xAC20C012, speedUpFrameIndex, -1);
+		if (_currFrameIndex < speedUpFrameIndex)
+			startAnimation(0xAC20C012, speedUpFrameIndex, -1);
 		return 0;
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -1358,24 +1354,24 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *se
 	return handleMessage41D480(messageNum, param, sender);
 }
 
-void Klayman::sub420210() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420210))) {
+void Klayman::stJumpToRing1() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing1))) {
 		_status2 = 0;
-		setFileHash(0xD82890BA, 0, -1);
-		sub4201C0();
+		startAnimation(0xD82890BA, 0, -1);
+		setupJumpToRing();
 	}
 }
 
-void Klayman::sub4201C0() {
-	_flagE5 = false;
+void Klayman::setupJumpToRing() {
+	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D790);
+	SetMessageHandler(&Klayman::hmJumpToRing);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	NextState(&Klayman::sub420340);
 	sendMessage(_attachedSprite, 0x482B, 0);
 }
 
-uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1383,7 +1379,7 @@ uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam &param, E
 			if (_attachedSprite) {
 				sendMessage(_attachedSprite, 0x4806, 0);
 			}
-			_flagE5 = true;
+			_acceptInput = true;
 		} else if (param.asInteger() == 0x320AC306) {
 			_soundResource1.play(0x5860C640);
 		} else if (param.asInteger() == 0x4AB28209) {
@@ -1403,35 +1399,35 @@ void Klayman::spriteUpdate41F230() {
 
 void Klayman::sub420340() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x4829E0B8, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x4829E0B8, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub420250() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420250))) {
+void Klayman::stJumpToRing2() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing2))) {
 		_status2 = 0;
-		setFileHash(0x900980B2, 0, -1);
-		sub4201C0();
+		startAnimation(0x900980B2, 0, -1);
+		setupJumpToRing();
 	}
 }
 
-void Klayman::sub420290() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420290))) {
+void Klayman::stJumpToRing3() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing3))) {
 		_status2 = 0;
-		_flagE5 = false;
-		setFileHash(0xBA1910B2, 0, -1);
+		_acceptInput = false;
+		startAnimation(0xBA1910B2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		SetMessageHandler(&Klayman::handleMessage41D880);
-		NextState(&Klayman::sub420380);
+		SetMessageHandler(&Klayman::hmJumpToRing3);
+		NextState(&Klayman::stHoldRing);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
 
-uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1451,41 +1447,41 @@ uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420380() {
+void Klayman::stHoldRing() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0x4A293FB0, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x4A293FB0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41DAA0);
+	SetMessageHandler(&Klayman::hmHoldRing);
 	SetSpriteCallback(NULL);
 }
 
-uint32 Klayman::handleMessage41DAA0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmHoldRing(int messageNum, const MessageParam &param, Entity *sender) {
 	if (messageNum == 0x1008) {
-		sub4203C0();
+		stReleaseRing();
 		return 0;
 	}
 	return handleMessage41D360(messageNum, param, sender);
 }
 
-void Klayman::sub4203C0() {
+void Klayman::stReleaseRing() {
 	_status2 = 1;
-	_flagE5 = false;
+	_acceptInput = false;
 	if (_attachedSprite) {
 		sendMessage(_attachedSprite, 0x4807, 0);
 		_attachedSprite = NULL;
 	}
-	setFileHash(0xB869A4B9, 0, -1);
+	startAnimation(0xB869A4B9, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteCallback(NULL);
 }
 
-void Klayman::sub420300() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420300))) {
+void Klayman::stJumpToRing4() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing4))) {
 		_status2 = 0;
-		setFileHash(0xB8699832, 0, -1);
-		sub4201C0();
+		startAnimation(0xB8699832, 0, -1);
+		setupJumpToRing();
 	}
 }
 
@@ -1493,12 +1489,12 @@ void Klayman::sub41CCE0(int16 x) {
 	sub41CC40(_attachedSprite->getX(), x);
 }
 
-void Klayman::sub420970() {
+void Klayman::stContinueClimbLadderUp() {
 	_status2 = 0;
-	_flagE5 = true;
+	_acceptInput = true;
 	_statusE0 = 3;
-	setFileHash2(0x3A292504, 0x01084280, 0);
-	_fileHash4 = 0x01084280;
+	startAnimationByHash(0x3A292504, 0x01084280, 0);
+	_newStickFrameHash = 0x01084280;
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(NULL);
@@ -1517,22 +1513,22 @@ void Klayman::sub4209D0() {
 			}
 		} else if (_statusE0 == 0) {
 			_statusE0 = 2;
-			_flagE5 = false;
-			setFileHash(0x122D1505, 0, -1);
+			_acceptInput = false;
+			startAnimation(0x122D1505, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::handleMessage41E0D0);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		} else if (_statusE0 == 3) {
 			_statusE0 = 2;
-			_flagE5 = false;
-			setFileHash2(0x122D1505, 0x01084280, 0);
+			_acceptInput = false;
+			startAnimationByHash(0x122D1505, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::handleMessage41E0D0);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		} else if (_statusE0 == 1) {
 			_statusE0 = 2;
-			_flagE5 = true;
-			setFileHash(0x122D1505, 29 - _frameIndex, -1);
+			_acceptInput = true;
+			startAnimation(0x122D1505, 29 - _currFrameIndex, -1);
 		} 
 	}
 }
@@ -1541,15 +1537,15 @@ void Klayman::sub420BC0() {
 	_status2 = 2;
 	if (_statusE0 == 1) {
 		_statusE0 = 0;
-		_flagE5 = false;
-		setFileHash2(0x3A292504, 0x02421405, 0);
+		_acceptInput = false;
+		startAnimationByHash(0x3A292504, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	} else if (_statusE0 == 1) {
 		_statusE0 = 0;
-		_flagE5 = false;
-		setFileHash2(0x122D1505, 0x02421405, 0);
+		_acceptInput = false;
+		startAnimationByHash(0x122D1505, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
@@ -1581,16 +1577,16 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
-			_flagE5 = true;
+			_acceptInput = true;
 		} else if (param.asInteger() == 0x489B025C) {
 			_soundResource1.play(0x52C4C2D7);
 		} else if (param.asInteger() == 0x400A0E64) {
 			_soundResource1.play(0x50E081D9);
 		} else if (param.asInteger() == 0x02421405) {
 			if (_statusE0 == 1) {
-				setFileHash2(0x3A292504, 0x01084280, 0);
+				startAnimationByHash(0x3A292504, 0x01084280, 0);
 			} else {
-				setFileHash2(0x122D1505, 0x01084280, 0);
+				startAnimationByHash(0x122D1505, 0x01084280, 0);
 			}
 			if (_statusE0 == 1) {
 				if (_y4 >= _y - 30) {
@@ -1614,36 +1610,36 @@ void Klayman::sub420AD0() {
 			sub41C7B0();
 		} else if (_statusE0 == 0) {
 			_statusE0 = 1;
-			_flagE5 = false;
-			setFileHash(0x3A292504, 0, -1);
+			_acceptInput = false;
+			startAnimation(0x3A292504, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::handleMessage41E0D0);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		} else if (_statusE0 == 3) {
 			_statusE0 = 1;
-			_flagE5 = true;
-			setFileHash2(0x3A292504, 0x01084280, 0);
+			_acceptInput = true;
+			startAnimationByHash(0x3A292504, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::handleMessage41E0D0);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		} else if (_statusE0 == 2) {
 			_statusE0 = 1;
-			_flagE5 = true;
-			setFileHash(0x3A292504, 29 - _frameIndex, -1);
+			_acceptInput = true;
+			startAnimation(0x3A292504, 29 - _currFrameIndex, -1);
 		}
 	}
 }
 
-void Klayman::sub421030() {
+void Klayman::stWalkToFrontNoStep() {
 	_status2 = 2;
-	_flagE5 = false;
-	setFileHash2(0xF229C003, 0x14884392, 0);
+	_acceptInput = false;
+	startAnimationByHash(0xF229C003, 0x14884392, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E490);
+	SetMessageHandler(&Klayman::hmWalkToFront);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 }
 
-uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1669,49 +1665,49 @@ uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420FE0() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420FE0))) {
+void Klayman::stWalkToFront() {
+	if (!stStartAction(AnimationCallback(&Klayman::stWalkToFront))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0xF229C003, 0, -1);
+		_acceptInput = false;
+		startAnimation(0xF229C003, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E490);
+		SetMessageHandler(&Klayman::hmWalkToFront);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	}
 }
 
-void Klayman::sub4210C0() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub4210C0))) {
+void Klayman::stTurnToFront() {
+	if (!stStartAction(AnimationCallback(&Klayman::stTurnToFront))) {
 		_status2 = 0;
-		_flagE5 = false;
-		setFileHash2(0xCA221107, 0x8520108C, 0);
+		_acceptInput = false;
+		startAnimationByHash(0xCA221107, 0x8520108C, 0);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E490);
+		SetMessageHandler(&Klayman::hmWalkToFront);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	}
 }
 
-void Klayman::sub421070() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub421070))) {
+void Klayman::stTurnToBack() {
+	if (!stStartAction(AnimationCallback(&Klayman::stTurnToBack))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0xCA221107, 0, -1);
+		_acceptInput = false;
+		startAnimation(0xCA221107, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E490);
+		SetMessageHandler(&Klayman::hmWalkToFront);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	}
 }
 
 void Klayman::stLandOnFeet() {
 	_status2 = 1;
-	_flagE5 = true;
-	setFileHash(0x18118554, 0, -1);
+	_acceptInput = true;
+	startAnimation(0x18118554, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E290);
+	SetMessageHandler(&Klayman::hmLandOnFeet);
 	SetSpriteCallback(NULL);
 }
 
-uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1723,18 +1719,18 @@ uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420ED0() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420ED0))) {
+void Klayman::stTurnToBackToUse() {
+	if (!stStartAction(AnimationCallback(&Klayman::stTurnToBackToUse))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x91540140, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x91540140, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E2F0);
+		SetMessageHandler(&Klayman::hmTurnToBackToUse);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	}
 }
 
-uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1750,47 +1746,61 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420750() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420750))) {
+void Klayman::stClayDoorOpen() {
+	if (!stStartAction(AnimationCallback(&Klayman::stClayDoorOpen))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x5CCCB330, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x5CCCB330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		SetMessageHandler(&Klayman::handleMessage41DD20);
+		SetMessageHandler(&Klayman::hmClayDoorOpen);
+	}
+}
+
+uint32 Klayman::hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x040D4186) {
+			if (_attachedSprite) {
+				sendMessage(_attachedSprite, 0x4808, 0);
+			}
+		}
+		break;
 	}
+	return messageResult;
 }
 
 void Klayman::stTurnToUse() {
 	if (!stStartAction(AnimationCallback(&Klayman::stTurnToUse))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x9B250AD2, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x9B250AD2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		SetMessageHandler(&Klayman::handleMessage41EEF0);
+		SetMessageHandler(&Klayman::hmTurnToUse);
 	}
 }
 
-void Klayman::sub4207F0() {
+void Klayman::stReturnFromUse() {
 	_status2 = 2;
-	_flagE5 = false;
-	setFileHash(0x98F88391, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x98F88391, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
-	SetMessageHandler(&Klayman::handleMessage41EEF0);
+	SetMessageHandler(&Klayman::hmTurnToUse);
 }
 
-void Klayman::sub420F20() {
+void Klayman::stWalkingOpenDoor() {
 	_flagF8 = false;
-	_flagE5 = false;
-	setFileHash(0x11A8E012, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x11A8E012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F5A0);
-	SetMessageHandler(&Klayman::handleMessage41EC70);
+	SetSpriteCallback(&Klayman::suWalkingOpenDoor);
+	SetMessageHandler(&Klayman::hmStartWalking);
 }
 
-void Klayman::spriteUpdate41F5A0() {
+void Klayman::suWalkingOpenDoor() {
 	if (!_flagF8 && ABS(_x4 - _x) < 80) {
 		sendMessage(_parentScene, 0x4829, 0);
 		_flagF8 = true;
@@ -1801,18 +1811,18 @@ void Klayman::spriteUpdate41F5A0() {
 void Klayman::stMoveObjectSkipTurnFaceObject() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	_flagE4 = false;
-	_flagE5 = true;
-	setFileHash2(0x0C1CA072, 0x01084280, 0);
+	_acceptInput = true;
+	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
-	SetMessageHandler(&Klayman::handleMessage41D970);
+	SetMessageHandler(&Klayman::hmMoveObjectTurn);
 }
 
 void Klayman::sub420660() {
 	sendMessage(_attachedSprite, 0x4807, 0);
 }
 
-uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
@@ -1840,11 +1850,11 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam &param, E
 
 void Klayman::stMoveObjectSkipTurn() {
 	_flagE4 = false;
-	_flagE5 = true;
-	setFileHash2(0x0C1CA072, 0x01084280, 0);
+	_acceptInput = true;
+	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
-	SetMessageHandler(&Klayman::handleMessage41D970);
+	SetMessageHandler(&Klayman::hmMoveObjectTurn);
 }
 
 void Klayman::stMoveObjectFaceObject() {
@@ -1852,84 +1862,84 @@ void Klayman::stMoveObjectFaceObject() {
 	if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) {
 		_status2 = 2;
 		_flagE4 = false;
-		_flagE5 = true;
-		setFileHash(0x0C1CA072, 0, -1);
+		_acceptInput = true;
+		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		SetMessageHandler(&Klayman::handleMessage41D970);
+		SetMessageHandler(&Klayman::hmMoveObjectTurn);
 	}
 }
 
-void Klayman::sub420C50() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420C50))) {
+void Klayman::stUseLever() {
+	if (!stStartAction(AnimationCallback(&Klayman::stUseLever))) {
 		_status2 = 0;
-		if (_flagF7) {
-			stReleaseLeverUp();
+		if (_isLeverDown) {
+			stUseLeverRelease();
 		} else {
 			sendMessage(_attachedSprite, 0x482B, 0);
-			setFileHash(0x0C303040, 0, -1);
+			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
 			SetMessageHandler(&Klayman::handleMessage41E210);
 			NextState(&Klayman::stPullLeverDown);
-			_flagE5 = false;
+			_acceptInput = false;
 		}
 	}
 }
 
 // Exactly the same code as sub420DA0 which was removed
 void Klayman::stPullLeverDown() {
-	setFileHash(0x0D318140, 0, -1);
+	startAnimation(0x0D318140, 0, -1);
 	sendMessage(_attachedSprite, 0x480F, 0);
 	NextState(&Klayman::stHoldLeverDown);
 }
 
 void Klayman::stHoldLeverDown() {
-	setFileHash(0x4464A440, 0, -1);
+	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	_flagF7 = true;
-	_flagE5 = true;
+	_isLeverDown = true;
+	_acceptInput = true;
 }
 
-void Klayman::stReleaseLeverUp() {
-	setFileHash(0x09018068, 0, -1);
+void Klayman::stUseLeverRelease() {
+	startAnimation(0x09018068, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41E210);
 	sendMessage(_attachedSprite, 0x4807, 0);
 	NextState(&Klayman::stPullLeverDown);
-	_flagE5 = false;
+	_acceptInput = false;
 }
 
-void Klayman::sub420E20() {
-	if (_flagF7) {
+void Klayman::stReleaseLever() {
+	if (_isLeverDown) {
 		_status2 = 2;
-		setFileHash(0x09018068, 0, -1);
+		startAnimation(0x09018068, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::handleMessage41E210);
 		sendMessage(_attachedSprite, 0x4807, 0);
-		NextState(&Klayman::sub420E90);
-		_flagE5 = false;
-		_flagF7 = false;
+		NextState(&Klayman::stLetGoOfLever);
+		_acceptInput = false;
+		_isLeverDown = false;
 	} else {
 		sub41C7B0();
 	}
 }
 
-void Klayman::sub420E90() {
-	setFileHash(0x0928C048, 0, -1);
-	FinalizeState(&Klayman::sub420EB0);
+void Klayman::stLetGoOfLever() {
+	startAnimation(0x0928C048, 0, -1);
+	FinalizeState(&Klayman::cbLeverReleasedEvent);
 }
 
-void Klayman::sub420EB0() {
+void Klayman::cbLeverReleasedEvent() {
 	sendMessage(_attachedSprite, 0x482A, 0);
 }
 
-void Klayman::sub420680() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub420680))) {
+void Klayman::stInsertDisk() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) {
 		_status2 = 2;
 		_counter2 = 0;
 		for (uint32 i = 0; i < 20; i++) {
@@ -1943,27 +1953,27 @@ void Klayman::sub420680() {
 			gotoState(NULL);
 			sub41C7B0();
 		} else {
-			setFileHash(0xD8C8D100, 0, -1);
+			startAnimation(0xD8C8D100, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&Klayman::spriteUpdate41F250);
-			SetMessageHandler(&Klayman::handleMessage41DB90);
-			_flagE5 = false;
+			SetMessageHandler(&Klayman::hmInsertDisk);
+			_acceptInput = false;
 			_counter2--;
 		}
 	}
 }
 
-uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x06040580) {
 			if (_counter2 == 0) {
 				// TODO: Calc calcHash value somewhere else 
-				setFileHash3(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
+				nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
 			}
 		} else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
 			_counter2--;
-			setFileHash2(0xD8C8D100, 0x01084280, 0);
+			startAnimationByHash(0xD8C8D100, 0x01084280, 0);
 		} else if (param.asInteger() == 0x062A1510) {
 			_soundResource1.play(0x41688704);
 		} else if (param.asInteger() == 0x02B20220) {
@@ -1979,20 +1989,6 @@ uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam &param, E
 	return handleMessage41D480(messageNum, param, sender);
 }
 
-uint32 Klayman::handleMessage41DD20(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x040D4186) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x4808, 0);
-			}
-		}
-		break;
-	}
-	return messageResult;
-}
-
 //##############################################################################
 
 // KmScene1001
@@ -2077,8 +2073,8 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 void KmScene1001::sub44FA50() {
 	if (!stStartAction(AnimationCallback(&KmScene1001::sub44FA50))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x00648953, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x00648953, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1001::handleMessage44FA00);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
@@ -2103,18 +2099,18 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _class599(class599), _ssLadderArch(ssLadderArch),
 	_status(0) {
 	
-	setKlaymanTable1();
+	setKlaymanIdleTable1();
 	
 }
 
 void KmScene1002::xUpdate() {
 	if (_x >= 250 && _x <= 435 && _y >= 420) {
 		if (_status == 0) {
-			// TODO setKlaymanTable(stru_4B44C8);
+			// TODO setKlaymanIdleTable(stru_4B44C8);
 			_status = 1;
 		}
 	} else if (_status == 1) {
-		setKlaymanTable1();
+		setKlaymanIdleTable1();
 		_status = 0;
 	}
 }
@@ -2147,16 +2143,16 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4805:
 		switch (param.asInteger()) {
 		case 1:
-			GotoState(&Klayman::sub420210);
+			GotoState(&Klayman::stJumpToRing1);
 			break;
 		case 2:
-			GotoState(&Klayman::sub420250);
+			GotoState(&Klayman::stJumpToRing2);
 			break;
 		case 3:
-			GotoState(&Klayman::sub420290);
+			GotoState(&Klayman::stJumpToRing3);
 			break;
 		case 4:
-			GotoState(&Klayman::sub420300);
+			GotoState(&Klayman::stJumpToRing4);
 			break;
 		}
 		break;
@@ -2180,7 +2176,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4820:  
 		sendMessage(_parentScene, 0x2005, 0);
-		GotoState(&Klayman::sub420970);	 
+		GotoState(&Klayman::stContinueClimbLadderUp);	 
 		break;
 	case 0x4821:	
 		sendMessage(_parentScene, 0x2005, 0);
@@ -2198,16 +2194,16 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421030);
+			GotoState(&Klayman::stWalkToFrontNoStep);
 		} else {
-			GotoState(&Klayman::sub420FE0);
+			GotoState(&Klayman::stWalkToFront);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub4210C0);
+			GotoState(&Klayman::stTurnToFront);
 		} else {
-			GotoState(&Klayman::sub421070);
+			GotoState(&Klayman::stTurnToBack);
 		}
 		break;
 	case 0x483F:
@@ -2282,12 +2278,12 @@ uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x942D2081) {
-			_flagE5 = false;
+			_acceptInput = false;
 			sendMessage(_attachedSprite, 0x2003, 0);
 		} else if (param.asInteger() == 0xDA600012) {
 			stHitByBoxingGlove();
 		} else if (param.asInteger() == 0x0D01B294) {
-			_flagE5 = false;
+			_acceptInput = false;
 			sendMessage(_attachedSprite, 0x480B, 0);
 		}
 		break;
@@ -2353,8 +2349,8 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x1008:
 		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_frameIndex < speedUpFrameIndex) {
-			setFileHash(0x35AA8059, speedUpFrameIndex, -1);
+		if (_currFrameIndex < speedUpFrameIndex) {
+			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
 			_y = 435;
 		}
 		messageResult = 0;
@@ -2396,8 +2392,8 @@ void KmScene1002::suFallDown() {
 void KmScene1002::sub449E20() {
 	if (!stStartAction(AnimationCallback(&KmScene1002::sub449E20))) {
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0x584984B4, 0, -1);
+		_acceptInput = false;
+		startAnimation(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1002::handleMessage449800);
@@ -2409,9 +2405,9 @@ void KmScene1002::sub449E20() {
 void KmScene1002::sub449E90() {
 	_soundResource1.play(0x56548280);
 	_status2 = 0;
-	_flagE5 = false;
+	_acceptInput = false;
 	_surface->setVisible(false);
-	setFileHash(0x5420E254, 0, -1);
+	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage4498E0);
@@ -2420,8 +2416,8 @@ void KmScene1002::sub449E90() {
 void KmScene1002::sub449EF0() {
 	_counter1 = 1;
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x000BAB02, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x000BAB02, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
 	// Weird stuff happening
 	SetMessageHandler(&Klayman::handleMessage41D360);
@@ -2436,9 +2432,9 @@ void KmScene1002::sub449F70() {
 	sendMessage(_parentScene, 0x1024, 1);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
-	_flagE5 = false;
+	_acceptInput = false;
 	_flagE1 = false;
-	setFileHash2(0x000BAB02, 0x88003000, 0);
+	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
@@ -2453,8 +2449,8 @@ void KmScene1002::sub449F70() {
 void KmScene1002::stSpitOutFall() {
 	_counter1 = 1;
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x9308C132, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x9308C132, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
 	SetSpriteCallback(&KmScene1002::suFallDown);
 	SetMessageHandler(&Klayman::handleMessage41D480);
@@ -2466,8 +2462,8 @@ void KmScene1002::stSpitOutFall() {
 void KmScene1002::sub44A0D0() {
 	_counter1 = 1;
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x0013A206, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x0013A206, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(&KmScene1002::suFallDown);
@@ -2480,9 +2476,9 @@ void KmScene1002::sub44A150() {
 	sendMessage(_parentScene, 0x1024, 1);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
-	_flagE5 = false;
+	_acceptInput = false;
 	_flagE1 = false;
-	setFileHash2(0x0013A206, 0x88003000, 0);
+	startAnimationByHash(0x0013A206, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
 	SetSpriteCallback(NULL);
@@ -2503,8 +2499,8 @@ void KmScene1002::stJumpAndFall() {
 	if (!stStartAction(AnimationCallback(&KmScene1002::stJumpAndFall))) {
 		sendMessage(_parentScene, 0x1024, 3);
 		_status2 = 2;
-		_flagE5 = false;
-		setFileHash(0xB93AB151, 0, -1);
+		_acceptInput = false;
+		startAnimation(0xB93AB151, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1002::handleMessage449D60);
 		SetSpriteCallback(&KmScene1002::suFallDown);
@@ -2519,8 +2515,8 @@ void KmScene1002::stDropFromRing() {
 		_attachedSprite = NULL;
 	}
 	_status2 = 2;
-	_flagE5 = false;
-	setFileHash(0x586984B1, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x586984B1, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D360);
 	SetSpriteCallback(&KmScene1002::suFallDown);
@@ -2529,9 +2525,9 @@ void KmScene1002::stDropFromRing() {
 
 void KmScene1002::stPressDoorButton() {
 	_status2 = 2;
-	_flagE5 = true;
+	_acceptInput = true;
 	setDoDeltaX(0);
-	setFileHash(0x1CD89029, 0, -1);
+	startAnimation(0x1CD89029, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::hmPressDoorButton);
 	SetSpriteCallback(&Klayman::spriteUpdate41F250);
@@ -2539,8 +2535,8 @@ void KmScene1002::stPressDoorButton() {
 
 void KmScene1002::stHitByBoxingGlove() {
 	_status2 = 1;
-	_flagE5 = false;
-	setFileHash(0x35AA8059, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage449C90);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
@@ -2555,9 +2551,9 @@ void KmScene1002::stMoveVenusFlyTrap() {
 	if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) {
 		_status2 = 2;
 		_flagE4 = false;
-		_flagE5 = true;
+		_acceptInput = true;
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-		setFileHash(0x5C01A870, 0, -1);
+		startAnimation(0x5C01A870, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
@@ -2567,8 +2563,8 @@ void KmScene1002::stMoveVenusFlyTrap() {
 
 void KmScene1002::stContinueMovingVenusFlyTrap() {
 	_flagE4 = false;
-	_flagE5 = true;
-	setFileHash2(0x5C01A870, 0x01084280, 0);
+	_acceptInput = true;
+	startAnimationByHash(0x5C01A870, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
@@ -2608,7 +2604,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4820:
 		sendMessage(_parentScene, 0x2000, 0);
-		GotoState(&Klayman::sub420970);
+		GotoState(&Klayman::stContinueClimbLadderUp);
 		break;
 	case 0x4821:
 		sendMessage(_parentScene, 0x2000, 0);
@@ -2635,7 +2631,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::sub420AD0);
 		break;
 	case 0x4828:
-		GotoState(&Klayman::sub420ED0);
+		GotoState(&Klayman::stTurnToBackToUse);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -2652,7 +2648,7 @@ uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x04684052) {
-			_flagE5 = true;
+			_acceptInput = true;
 			sendMessage(_parentScene, 0x2002, 0);
 		}
 		break;
@@ -2662,15 +2658,15 @@ uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam &param, Entity
 
 void KmScene1004::stReadNote() {
 	_status2 = 2;
-	_flagE5 = false;
-	setFileHash(0x123E9C9F, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x123E9C9F, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1004::hmReadNote);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 }
 
 KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	
 	// Empty
 }
@@ -2678,14 +2674,14 @@ KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2000:
-		_flag1 = param.asInteger() != 0;
+		_isSittingInTeleporter = param.asInteger() != 0;
 		break;
 	case 0x4001:
 	case 0x4800:
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_flag1)
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::sub421350);
 		else
 			GotoState(&Klayman::stTryStandIdle);
@@ -2703,25 +2699,25 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;
 	case 0x481D:
-		if (_flag1)
-			GotoState(&Klayman::sub4214D0);
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_flag)
-			GotoState(&Klayman::sub421510);
+		if (_isSittingInTeleporter)//CHECKME
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		break;
 	case 0x4834:
 		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
-		_flag1 = true;
+		_isSittingInTeleporter = true;
 		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
-		_flag1 = false;
-		GotoState(&Klayman::sub421310);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
 		sub461F30();
@@ -2749,20 +2745,20 @@ uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam &para
 
 void KmScene1109::sub461F30() {
 	_status2 = 0;
-	_flagE5 = false;
+	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1109::handleMessage461EA0);
-	setFileHash(0x2C2A4A1C, 0, -1);
+	startAnimation(0x2C2A4A1C, 0, -1);
 }
 
 void KmScene1109::sub461F70() {
 	_status2 = 0;
-	_flagE5 = false;
+	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1109::handleMessage461EA0);
-	setFileHash(0x3C2E4245, 0, -1);
+	startAnimation(0x3C2E4245, 0, -1);
 }
 
 // KmScene1201
@@ -2770,7 +2766,7 @@ void KmScene1109::sub461F70() {
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) {
 	
-	// TODO setKlaymanTable(dword_4AEF10, 3);
+	// TODO setKlaymanIdleTable(dword_4AEF10, 3);
 	_flagF6 = true;
 	
 }
@@ -2785,7 +2781,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480A:
-		GotoState(&KmScene1201::sub40DF00);
+		GotoState(&KmScene1201::stMoveObject);
 		break;
 	case 0x4812:
 		GotoState(&Klayman::stPickUpGeneric);
@@ -2819,7 +2815,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x481F:
 		GotoState(&Klayman::stWonderAbout);
@@ -2867,9 +2863,9 @@ uint32 KmScene1201::hmMatch(int messageNum, const MessageParam &param, Entity *s
 void KmScene1201::stFetchMatch() {
 	if (!stStartAction(AnimationCallback(&KmScene1201::stFetchMatch))) {
 		_status2 = 0;
-		_flagE5 = false;
+		_acceptInput = false;
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-		setFileHash(0x9CAA0218, 0, -1);
+		startAnimation(0x9CAA0218, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(NULL);
 		SetMessageHandler(&KmScene1201::hmMatch);
@@ -2879,15 +2875,15 @@ void KmScene1201::stFetchMatch() {
 
 void KmScene1201::stLightMatch() {
 	_status2 = 1;
-	_flagE5 = false;
+	_acceptInput = false;
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	setFileHash(0x1222A513, 0, -1);
+	startAnimation(0x1222A513, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1201::hmMatch);
 }
 
-uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1201::hmMoveObject(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
@@ -2920,33 +2916,33 @@ uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-void KmScene1201::sub40DF00() {
-	if (!stStartAction(AnimationCallback(&KmScene1201::sub40DF00))) {
+void KmScene1201::stMoveObject() {
+	if (!stStartAction(AnimationCallback(&KmScene1201::stMoveObject))) {
 		_status2 = 2;
-		_flagE5 = false;
+		_acceptInput = false;
 		_countdown = 8;
 		setDoDeltaX(0);
-		setFileHash(0x0C1CA072, 0, -1);
+		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&KmScene1201::update40DBE0);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1201::handleMessage40DDF0);
+		SetMessageHandler(&KmScene1201::hmMoveObject);
 	}
 }
 
 void KmScene1201::stMoveObjectSkipTurn() {
-	_flagE5 = false;
-	setFileHash2(0x0C1CA072, 0x01084280, 0);
+	_acceptInput = false;
+	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&KmScene1201::update40DBE0);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene1201::handleMessage40DDF0);
+	SetMessageHandler(&KmScene1201::hmMoveObject);
 }
 
 void KmScene1201::stTumbleHeadless() {
 	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stTumbleHeadless))) {
 		_status2 = 1;
-		_flagE5 = false;
+		_acceptInput = false;
 		setDoDeltaX(0);
-		setFileHash(0x2821C590, 0, -1);
+		startAnimation(0x2821C590, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1201::hmTumbleHeadless);
@@ -2959,8 +2955,8 @@ void KmScene1201::stTumbleHeadless() {
 void KmScene1201::sub40E040() {
 	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::sub40E040))) {
 		_status2 = 1;
-		_flagE5 = false;		
-		setFileHash(0x5420E254, 0, -1);
+		_acceptInput = false;		
+		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(NULL);
 		SetMessageHandler(&Klayman::handleMessage41D360);
@@ -3015,8 +3011,8 @@ void KmScene1303::update4161A0() {
 
 void KmScene1303::stPeekWall1() {
 	_status2 = 0;
-	_flagE5 = true;
-	setFileHash(0xAC20C012, 8, 37);
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
@@ -3025,8 +3021,8 @@ void KmScene1303::stPeekWall1() {
 
 void KmScene1303::stPeekWall2() {
 	_status2 = 1;
-	_flagE5 = false;
-	setFileHash(0xAC20C012, 43, 49);
+	_acceptInput = false;
+	startAnimation(0xAC20C012, 43, 49);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
@@ -3035,19 +3031,19 @@ void KmScene1303::stPeekWall2() {
 void KmScene1303::stPeekWall3() {
 	_counter3 = 0;
 	_status2 = 0;
-	_flagE5 = true;
+	_acceptInput = true;
 	_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
-	setFileHash(0xAC20C012, 38, 42);
+	startAnimation(0xAC20C012, 38, 42);
 	SetUpdateHandler(&KmScene1303::update4161A0);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	_newHashListIndex = 42;
+	_newStickFrameIndex = 42;
 }
 
 void KmScene1303::stPeekWallReturn() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x2426932E, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x2426932E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1303::hmPeekWallReturn);
@@ -3136,8 +3132,8 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 void KmScene1305::stCrashDown() {
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
-	_flagE5 = false;
-	setFileHash2(0x000BAB02, 0x88003000, 0);
+	_acceptInput = false;
+	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
@@ -3152,21 +3148,21 @@ void KmScene1305::cbCrashDownEvent() {
 KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
-	_flag1 = false;	
+	_isSittingInTeleporter = false;	
 }
 
 uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2000:
-		_flag1 = param.asInteger() != 0;
+		_isSittingInTeleporter = param.asInteger() != 0;
 		break;
 	case 0x4001:
 	case 0x4800:
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_flag1)
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::sub421350);
 		else
 			GotoState(&Klayman::stTryStandIdle);
@@ -3194,7 +3190,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;		
 	case 0x481A:
-		GotoState(&Klayman::sub420680);		
+		GotoState(&Klayman::stInsertDisk);		
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3204,16 +3200,16 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		if (_flag1)
-			GotoState(&Klayman::sub4214D0);
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stTurnToUseInTeleporter);
 		else
 			GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		if (_flag1)
-			GotoState(&Klayman::sub421510);
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		else
-			GotoState(&Klayman::sub4207F0);
+			GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
@@ -3234,16 +3230,16 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421030);
+			GotoState(&Klayman::stWalkToFrontNoStep);
 		} else {
-			GotoState(&Klayman::sub420FE0);
+			GotoState(&Klayman::stWalkToFront);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub4210C0);
+			GotoState(&Klayman::stTurnToFront);
 		} else {
-			GotoState(&Klayman::sub421070);
+			GotoState(&Klayman::stTurnToBack);
 		}
 		break;
 	case 0x4834:
@@ -3251,13 +3247,13 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
-		_flag1 = true;
+		_isSittingInTeleporter = true;
 		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
-		_flag1 = false;
-		GotoState(&Klayman::sub421310);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
 		sub417D40();
@@ -3277,8 +3273,8 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 
 void KmScene1306::sub417D40() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0xEE084A04, 0, -1);
+	_acceptInput = false;
+	startAnimation(0xEE084A04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1306::handleMessage417CB0);
@@ -3286,8 +3282,8 @@ void KmScene1306::sub417D40() {
 
 void KmScene1306::sub417D80() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0xB86A4274, 0, -1);
+	_acceptInput = false;
+	startAnimation(0xB86A4274, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1306::handleMessage417CB0);
@@ -3307,9 +3303,9 @@ uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam &para
 }
 
 KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	_flag1 = false;
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+
+	// Empty	
 }
 
 uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3329,7 +3325,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		}	
 		break;		
 	case 0x480D:
-		GotoState(&KmScene1001::sub420C50);
+		GotoState(&KmScene1001::stUseLever);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
@@ -3348,7 +3344,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 1) {
 			GotoState(&KmScene1308::sub456150);		
 		} else {
-			GotoState(&Klayman::sub420680);		
+			GotoState(&Klayman::stInsertDisk);		
 		}
 		break;
 	case 0x481B:
@@ -3362,10 +3358,10 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x4827:
-		GotoState(&Klayman::sub420E20);
+		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x4834:
 		GotoState(&Klayman::stStepOver);
@@ -3385,10 +3381,10 @@ uint32 KmScene1308::handleMessage(int messageNum, const MessageParam &param, Ent
 	switch (messageNum) {
 	case 0x100D:
 		if (!_flag1 && param.asInteger() == 0x06040580) {
-			setFileHash3(0xDC409440, 0x46431401, 0);
+			nextAnimationByHash(0xDC409440, 0x46431401, 0);
 		} else if (_flag1 && param.asInteger() == 0x46431401) {
 			_flag1 = false;
-			setFileHash2(0xDC409440, 0x01084280, 0);
+			startAnimationByHash(0xDC409440, 0x01084280, 0);
 		} else if (param.asInteger() == 0x062A1510) {
 			_soundResource1.play(0x41688704);
 		} else if (param.asInteger() == 0x02B20220) {
@@ -3431,8 +3427,8 @@ void KmScene1308::sub456150() {
 			gotoState(NULL);
 			sub41C7B0();
 		} else {
-			_flagE5 = false;
-			setFileHash(0xDC409440, 0, -1);
+			_acceptInput = false;
+			startAnimation(0xDC409440, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&Klayman::spriteUpdate41F250);
 			SetMessageHandler(&KmScene1308::handleMessage);
@@ -3500,16 +3496,16 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421030);
+			GotoState(&Klayman::stWalkToFrontNoStep);
 		} else {
-			GotoState(&Klayman::sub420FE0);
+			GotoState(&Klayman::stWalkToFront);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub4210C0);
+			GotoState(&Klayman::stTurnToFront);
 		} else {
-			GotoState(&Klayman::sub421070);
+			GotoState(&Klayman::stTurnToBack);
 		}
 		break;
 	}
@@ -3555,7 +3551,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	}
 	return 0;
@@ -3566,7 +3562,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene1403::KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
-	setKlaymanTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
+	setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
 }
 
 uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3586,7 +3582,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;		
 	case 0x480D:
-		GotoState(&KmScene1001::sub420C50);
+		GotoState(&KmScene1001::stUseLever);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2) {
@@ -3609,7 +3605,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4827:
-		GotoState(&Klayman::sub420E20);
+		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -3659,7 +3655,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;
 	case 0x481A:
-		GotoState(&Klayman::sub420680);		
+		GotoState(&Klayman::stInsertDisk);		
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3672,7 +3668,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
@@ -3702,20 +3698,20 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 }
 
 uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2032:
-		_flag1 = param.asInteger() != 0;
+		_isSittingInTeleporter = param.asInteger() != 0;
 		break;
 	case 0x4001:
 	case 0x4800:
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_flag1)
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::sub421350);
 		else
 			GotoState(&Klayman::stTryStandIdle);
@@ -3741,12 +3737,12 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		if (_flag1)
-			GotoState(&Klayman::sub4214D0);
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_flag)
-			GotoState(&Klayman::sub421510);
+		if (_isSittingInTeleporter)//CHECKME
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1) {
@@ -3770,13 +3766,13 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2032, 1);
-		_flag1 = true;
+		_isSittingInTeleporter = true;
 		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2032, 0);
-		_flag1 = false;
-		GotoState(&Klayman::sub421310);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483F:
 		sub41CD00(param.asInteger());
@@ -3791,7 +3787,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1705
 
 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 
 	// Empty	
 }
@@ -3800,7 +3796,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2000:
-		_flag = param.asInteger() != 0;
+		_isSittingInTeleporter = param.asInteger() != 0;
 		messageResult = 1;
 		break;
 	case 0x4001:
@@ -3808,7 +3804,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_flag) {
+		if (_isSittingInTeleporter) {
 			GotoState(&Klayman::sub421350);
 		} else {
 			GotoState(&Klayman::stTryStandIdle);
@@ -3838,13 +3834,13 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		if (_flag) {
-			GotoState(&Klayman::sub4214D0);
+		if (_isSittingInTeleporter) {
+			GotoState(&Klayman::stTurnToUseInTeleporter);
 		}
 		break;
 	case 0x481E:
-		if (_flag) {
-			GotoState(&Klayman::sub421510);
+		if (_isSittingInTeleporter) {
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		}
 		break;
 	case 0x481F:
@@ -3865,13 +3861,13 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
-		_flag = true;
+		_isSittingInTeleporter = true;
 		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
-		_flag = false;
-		GotoState(&Klayman::sub421310);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
 		sub468AD0();
@@ -3909,8 +3905,8 @@ void KmScene1705::spriteUpdate468A30() {
 
 void KmScene1705::stFallSkipJump() {
 	_status2 = 2;
-	_flagE5 = false;
-	setFileHash2(0xB93AB151, 0x40A100F8, 0);
+	_acceptInput = false;
+	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&KmScene1705::spriteUpdate468A30);
 	SetMessageHandler(&Klayman::handleMessage41D360);
@@ -3919,8 +3915,8 @@ void KmScene1705::stFallSkipJump() {
 
 void KmScene1705::sub468AD0() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x5E0A4905, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x5E0A4905, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1705::handleMessage4689A0);
@@ -3928,8 +3924,8 @@ void KmScene1705::sub468AD0() {
 
 void KmScene1705::sub468B10() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0xD86E4477, 0, -1);
+	_acceptInput = false;
+	startAnimation(0xD86E4477, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene1705::handleMessage4689A0);
@@ -3958,7 +3954,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -3975,7 +3971,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 
 	// Empty	
 }
@@ -3983,14 +3979,14 @@ KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2000:
-		_flag = param.asInteger() != 0;
+		_isSittingInTeleporter = param.asInteger() != 0;
 		break;
 	case 0x4001:
 	case 0x4800:
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_flag) {
+		if (_isSittingInTeleporter) {
 			GotoState(&Klayman::sub421350);
 		} else {
 			GotoState(&Klayman::stTryStandIdle);
@@ -4009,13 +4005,13 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C7B0();
 		break;
 	case 0x481D:
-		if (_flag) {
-			GotoState(&Klayman::sub4214D0);
+		if (_isSittingInTeleporter) {
+			GotoState(&Klayman::stTurnToUseInTeleporter);
 		}
 		break;
 	case 0x481E:
-		if (_flag) {
-			GotoState(&Klayman::sub421510);
+		if (_isSittingInTeleporter) {
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		}
 		break;
 	case 0x4834:
@@ -4023,13 +4019,13 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
-		_flag = true;
+		_isSittingInTeleporter = true;
 		GotoState(&Klayman::stSitInTeleporter);
 		break;
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
-		_flag = false;
-		GotoState(&Klayman::sub421310);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
 		sub440230();
@@ -4057,8 +4053,8 @@ uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam &para
 
 void KmScene2001::sub440230() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0xBE68CC54, 0, -1);
+	_acceptInput = false;
+	startAnimation(0xBE68CC54, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
@@ -4066,15 +4062,15 @@ void KmScene2001::sub440230() {
 
 void KmScene2001::stDoTeleport() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x18AB4ED4, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x18AB4ED4, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
 KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	
 	// Empty
 }
@@ -4083,7 +4079,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2000:
-		_flag1 = param.asInteger() != 0;
+		_isSittingInTeleporter = param.asInteger() != 0;
 		messageResult = 1;
 		break;
 	case 0x4001:
@@ -4091,7 +4087,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_flag1)
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::sub421350);
 		else
 			GotoState(&Klayman::stTryStandIdle);
@@ -4129,25 +4125,25 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481D:
-		if (_flag1)
-			GotoState(&Klayman::sub4214D0);
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_flag)
-			GotoState(&Klayman::sub421510);
+		if (_isSittingInTeleporter)//CHECKME
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		break;
 	case 0x4834:
 		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4835:
 		sendMessage(_parentScene, 0x2000, 1);
-		_flag1 = true;
+		_isSittingInTeleporter = true;
 		GotoState(&Klayman::stSitInTeleporter);
 		break;																		
 	case 0x4836:
 		sendMessage(_parentScene, 0x2000, 0);
-		_flag1 = false;
-		GotoState(&Klayman::sub421310);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
 		sub486320();
@@ -4165,8 +4161,8 @@ uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x1008:
 		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_frameIndex < speedUpFrameIndex) {
-			setFileHash(0x35AA8059, speedUpFrameIndex, -1);
+		if (_currFrameIndex < speedUpFrameIndex) {
+			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
 			_y = 438;
 		}
 		messageResult = 0;
@@ -4198,8 +4194,8 @@ uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam &para
 
 void KmScene2101::sub4862C0() {
 	_status2 = 1;
-	_flagE5 = false;
-	setFileHash(0x35AA8059, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene2101::handleMessage486160);
@@ -4208,8 +4204,8 @@ void KmScene2101::sub4862C0() {
 
 void KmScene2101::sub486320() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0xFF290E30, 0, -1);
+	_acceptInput = false;
+	startAnimation(0xFF290E30, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene2101::handleMessage486230);
@@ -4217,8 +4213,8 @@ void KmScene2101::sub486320() {
 
 void KmScene2101::sub486360() {
 	_status2 = 0;
-	_flagE5 = false;
-	setFileHash(0x9A28CA1C, 0, -1);
+	_acceptInput = false;
+	startAnimation(0x9A28CA1C, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&KmScene2101::handleMessage486230);
@@ -4267,7 +4263,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4275,16 +4271,16 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421030);
+			GotoState(&Klayman::stWalkToFrontNoStep);
 		} else {
-			GotoState(&Klayman::sub420FE0);
+			GotoState(&Klayman::stWalkToFront);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub4210C0);
+			GotoState(&Klayman::stTurnToFront);
 		} else {
-			GotoState(&Klayman::sub421070);
+			GotoState(&Klayman::stTurnToBack);
 		}
 		break;
 	case 0x483F:
@@ -4337,10 +4333,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4819:
-		GotoState(&Klayman::sub420750);
+		GotoState(&Klayman::stClayDoorOpen);
 		break;
 	case 0x481A:
-		GotoState(&Klayman::sub420680);		
+		GotoState(&Klayman::stInsertDisk);		
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4353,7 +4349,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTurnToUse);
 		break;
 	case 0x481E:
-		GotoState(&Klayman::sub4207F0);
+		GotoState(&Klayman::stReturnFromUse);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4375,7 +4371,7 @@ KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 void KmScene2205::xUpdate() {
-	setGlobalVar(0x18288913, _frameIndex);
+	setGlobalVar(0x18288913, _currFrameIndex);
 }
 	
 uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4423,12 +4419,12 @@ void KmScene2205::sub423980() {
 		frameIndex = 0;
 	_status2 = 0;
 	_flagE1 = true;
-	_flagE5 = true;
-	setFileHash(0x1A249001, frameIndex, -1);
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::sub41FA40);
+	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
@@ -4443,7 +4439,7 @@ KmScene2206::~KmScene2206() {
 }
 
 void KmScene2206::xUpdate() {
-	setGlobalVar(0x18288913, _frameIndex);
+	setGlobalVar(0x18288913, _currFrameIndex);
 }
 	
 uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4512,16 +4508,16 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421030);
+			GotoState(&Klayman::stWalkToFrontNoStep);
 		} else {
-			GotoState(&Klayman::sub420FE0);
+			GotoState(&Klayman::stWalkToFront);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub4210C0);
+			GotoState(&Klayman::stTurnToFront);
 		} else {
-			GotoState(&Klayman::sub421070);
+			GotoState(&Klayman::stTurnToBack);
 		}
 		break;
 	case 0x4837:
@@ -4549,9 +4545,9 @@ void KmScene2206::sub482490() {
 	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::sub482490))) {
 		_status2 = 1;
 		sendMessage(_parentScene, 0x4803, 0);
-		_flagE5 = false;
+		_acceptInput = false;
 		_yDelta = 0;
-		setFileHash(0x5420E254, 0, -1);
+		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 		SetSpriteCallback(&KmScene2206::spriteUpdate482450);
@@ -4565,12 +4561,12 @@ void KmScene2206::sub482530() {
 		frameIndex = 0;
 	_status2 = 0;
 	_flagE1 = true;
-	_flagE5 = true;
-	setFileHash(0x1A249001, frameIndex, -1);
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::sub41FA40);
+	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
@@ -4622,7 +4618,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4827:
-		GotoState(&Klayman::sub420E20);
+		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4647,8 +4643,8 @@ void KmScene2207::spriteUpdate442430() {
 void KmScene2207::sub442460() {
 	if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::sub442460))) {
 		_status2 = 1;
-		_flagE5 = true;
-		setFileHash(0x5420E254, 0, -1);
+		_acceptInput = true;
+		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteCallback(&KmScene2207::spriteUpdate442430);
 		SetMessageHandler(&Klayman::handleMessage41D360);
@@ -4658,11 +4654,11 @@ void KmScene2207::sub442460() {
 void KmScene2207::sub4424B0() {
 	if (!stStartAction(AnimationCallback(&KmScene2207::sub4424B0))) {
 		_status2 = 0;
-		if (_flagF7) {
-			stReleaseLeverUp();
+		if (_isLeverDown) {
+			stUseLeverRelease();
 		} else {
-			_flagE5 = false;
-			setFileHash(0x0C303040, 0, -1);
+			_acceptInput = false;
+			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
 			SetMessageHandler(&Klayman::handleMessage41E210);
@@ -4672,27 +4668,27 @@ void KmScene2207::sub4424B0() {
 }
 
 void KmScene2207::sub442520() {
-	setFileHash(0x0D318140, 0, -1);
+	startAnimation(0x0D318140, 0, -1);
 	sendMessage(_attachedSprite, 0x480F, 0);
 	NextState(&KmScene2207::sub442560);
 }
 
 void KmScene2207::sub442560() {
-	setFileHash(0x1564A2C0, 0, -1);
+	startAnimation(0x1564A2C0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	NextState(&KmScene2207::sub4425A0);
-	_flagE5 = true;
-	_flagF7 = true;
+	_acceptInput = true;
+	_isLeverDown = true;
 }
 
 void KmScene2207::sub4425A0() {
-	setFileHash(0x4464A440, 0, -1);
+	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	_flagE5 = true;
-	_flagF7 = true;
+	_acceptInput = true;
+	_isLeverDown = true;
 }
 
 KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4701,7 +4697,7 @@ KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 void KmScene2242::xUpdate() {
-	setGlobalVar(0x18288913, _frameIndex);
+	setGlobalVar(0x18288913, _currFrameIndex);
 }
 
 uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4771,12 +4767,12 @@ void KmScene2242::sub444D20() {
 		frameIndex = 0;
 	_status2 = 0;
 	_flagE1 = true;
-	_flagE5 = true;
-	setFileHash(0x1A249001, frameIndex, -1);
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::sub41FA40);
+	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
@@ -4786,7 +4782,7 @@ KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16
 }
 
 void KmHallOfRecords::xUpdate() {
-	setGlobalVar(0x18288913, _frameIndex);
+	setGlobalVar(0x18288913, _currFrameIndex);
 }
 
 uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4840,12 +4836,12 @@ void KmHallOfRecords::sub43B130() {
 		frameIndex = 0;
 	_status2 = 0;
 	_flagE1 = true;
-	_flagE5 = true;
-	setFileHash(0x1A249001, frameIndex, -1);
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::sub41FA40);
+	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
@@ -4855,7 +4851,7 @@ KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 void KmScene2247::xUpdate() {
-	setGlobalVar(0x18288913, _frameIndex);
+	setGlobalVar(0x18288913, _currFrameIndex);
 }
 
 uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4909,12 +4905,12 @@ void KmScene2247::sub453520() {
 		frameIndex = 0;
 	_status2 = 0;
 	_flagE1 = true;
-	_flagE5 = true;
-	setFileHash(0x1A249001, frameIndex, -1);
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
 	SetSpriteCallback(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::sub41FA40);
+	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 645ed74..3b8ee69 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -36,7 +36,7 @@ class Klayman;
 
 const uint32 kKlaymanSpeedUpHash = 0x004A2148;
 
-struct KlaymanTableItem {
+struct KlaymanIdleTableItem {
 	int value;
 	void (Klayman::*callback)();
 };
@@ -66,61 +66,61 @@ public:
 	void stTurnAwayFromUse();
 	void stWonderAbout();
 	void stPeekWall();
-	void sub420210();
-	void sub4201C0();
+	void stJumpToRing1();
+	void setupJumpToRing();
 	void sub420340();
-	void sub420250();
-	void sub420290();
-	void sub420380();
-	void sub4203C0();
-	void sub420300();
-	void sub420970();
+	void stJumpToRing2();
+	void stJumpToRing3();
+	void stHoldRing();
+	void stReleaseRing();
+	void stJumpToRing4();
+	void stContinueClimbLadderUp();
 	void sub4209D0();
 	void sub420BC0();
 	void sub420AD0();
-	void sub421030();
-	void sub420FE0();
-	void sub4210C0();
-	void sub421070();
+	void stWalkToFrontNoStep();
+	void stWalkToFront();
+	void stTurnToFront();
+	void stTurnToBack();
 	void stLandOnFeet();
-	void sub420ED0();
-	void sub420750();
+	void stTurnToBackToUse();
+	void stClayDoorOpen();
 	void stTurnToUse();
-	void sub4207F0();
-	void sub420F20();
+	void stReturnFromUse();
+	void stWalkingOpenDoor();
 	void sub421350();
 	void stIdleSitBlink();
 	void stIdleSitBlinkSecond();
 	void stPickUpNeedle();
 	void sub41FFF0();
-	void sub4214D0();
-	void sub421510();
+	void stTurnToUseInTeleporter();
+	void stReturnFromUseInTeleporter();
 	void stStepOver();
 	void stSitInTeleporter();
-	void sub421310();
+	void stGetUpFromTeleporter();
 	void stMoveObjectSkipTurnFaceObject();
 	void sub420660();
 	void stMoveObjectSkipTurn();
 	void stMoveObjectFaceObject();
-	void sub420C50();
+	void stUseLever();
 	void stPullLeverDown();
 	void stHoldLeverDown();
-	void stReleaseLeverUp();
-	void sub420E20();
-	void sub420E90();
-	void sub420EB0();
-	void sub420680();
+	void stUseLeverRelease();
+	void stReleaseLever();
+	void stLetGoOfLever();
+	void cbLeverReleasedEvent();
+	void stInsertDisk();
 	void stWalking();
-	void sub41FA40();
+	void stUpdateWalking();
 	void stStartWalkingDone();
 
 	void sub41CE70();
 	
 	void spriteUpdate41F250();
-	void spriteUpdate41F5F0();
+	void suWalking();
 	void suLargeStep();
 	void spriteUpdate41F230();
-	void spriteUpdate41F5A0();
+	void suWalkingOpenDoor();
 	void spriteUpdate41F300();
 	void spriteUpdate41F320();
 
@@ -129,10 +129,10 @@ public:
 	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
 
-	void setKlaymanTable(const KlaymanTableItem *table, int tableCount);
-	void setKlaymanTable1();
-	void setKlaymanTable2();
-	void setKlaymanTable3();
+	void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount);
+	void setKlaymanIdleTable1();
+	void setKlaymanIdleTable2();
+	void setKlaymanIdleTable3();
 	
 	void setSoundFlag(bool value) { _soundFlag = value; }
 
@@ -144,23 +144,23 @@ protected:
 	bool _flagE2;
 	bool _flagE3;
 	bool _flagE4;
-	bool _flagE5;
+	bool _acceptInput;
 	int16 _x4, _y4;
 	int16 _counter, _counterMax;
 	int16 _counter3, _counter3Max;
 	int16 _counter1;
 	int16 _counter2;
 	bool _flagF6;
-	bool _flagF7;
+	bool _isLeverDown;
 	bool _flagF8;
 	int _status2;
 	bool _flagFA;
 	SoundResource _soundResource1;
 	SoundResource _soundResource2;
 	int _status3;
-	const KlaymanTableItem *_table;
-	int _tableCount;
-	int _tableMaxValue;
+	const KlaymanIdleTableItem *_idleTable;
+	int _idleTableCount;
+	int _idleTableMaxValue;
 	uint32 _field114;
 	/*
 	00000118 field118		dw ?
@@ -200,7 +200,7 @@ protected:
 	void stStand();
 	void stStandAround();
 	
-	uint32 handleMessage41F140(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
 
 	void sub41C930(int16 x, bool flag);
 
@@ -209,11 +209,11 @@ protected:
 	bool stStartAction(AnimationCb callback3);
 	
 	void stSneak();
-	void stSneakDone();
-	uint32 handleMessage41DD80(int messageNum, const MessageParam &param, Entity *sender);
+	void stWalkingDone();
+	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
 	void sub41CD70(int16 x);
 	void stStartWalking();
-	uint32 handleMessage41EC70(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
 
 	uint32 hmPickUpGeneric(int messageNum, const MessageParam &param, Entity *sender);
 	
@@ -226,24 +226,24 @@ protected:
 	void stLargeStepDone();
 	
 	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41EEF0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmPeekWall(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41D790(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41D880(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41DAA0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmHoldRing(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E0D0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41E490(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41E290(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41E2F0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D640(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41EAB0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41D970(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41DD20(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void update41D1C0();
 	
-	uint32 handleMessage41DB90(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
 	
 };
 
@@ -306,7 +306,7 @@ class KmScene1109 : public Klayman {
 public:
 	KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag1;
+	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage461EA0(int messageNum, const MessageParam &param, Entity *sender);
 	void sub461F30();
@@ -324,9 +324,9 @@ protected:
 	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
 	void stFetchMatch();
 	void stLightMatch();
-	uint32 handleMessage40DDF0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40DF00();
+	void stMoveObject();
 	void stMoveObjectSkipTurn();
 	void stTumbleHeadless();
 	void sub40E040();
@@ -365,7 +365,7 @@ class KmScene1306 : public Klayman {
 public:
 	KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag1;
+	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage417CB0(int messageNum, const MessageParam &param, Entity *sender);
 	void sub417D40();
@@ -414,7 +414,7 @@ class KmScene1608 : public Klayman {
 public:
 	KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag1;
+	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
@@ -422,7 +422,7 @@ class KmScene1705 : public Klayman {
 public:
 	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag;
+	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage4689A0(int messageNum, const MessageParam &param, Entity *sender);
 	void spriteUpdate468A30();
@@ -442,7 +442,7 @@ class KmScene2001 : public Klayman {
 public:
 	KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag;
+	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage4401A0(int messageNum, const MessageParam &param, Entity *sender);
 	void sub440230();
@@ -453,7 +453,7 @@ class KmScene2101 : public Klayman {
 public:
 	KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag1;
+	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 handleMessage486160(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage486230(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index b60c318..ea1400e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -133,7 +133,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param,
 		handleMessage2000h();
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return 0;
@@ -144,12 +144,12 @@ void AsScene1001Door::handleMessage2000h() {
 	case 0:
 	case 1:
 		_soundResource1.play(0x65482F03);
-		setFileHash(0x624C0498, 1, 3);
+		startAnimation(0x624C0498, 1, 3);
 		NextState(&AsScene1001Door::callback1);		
 		break;
 	case 2:
 		_soundResource2.play();
-		setFileHash(0x624C0498, 6, 6);
+		startAnimation(0x624C0498, 6, 6);
 		NextState(&AsScene1001Door::callback2);		
 		break;
 	default:
@@ -162,27 +162,27 @@ void AsScene1001Door::handleMessage2000h() {
 void AsScene1001Door::callback1() {
 	switch (getGlobalVar(0x52371C95)) {
 	case 1:
-		setFileHash(0x624C0498, 4, -1);
-		_newHashListIndex = 4;
+		startAnimation(0x624C0498, 4, -1);
+		_newStickFrameIndex = 4;
 		break;
 	case 2:
-		setFileHash(0x624C0498, 1, -1);
-		_newHashListIndex = 1;
+		startAnimation(0x624C0498, 1, -1);
+		_newStickFrameIndex = 1;
 		break;
 	case 3:
 		stopAnimation();
 		setVisible(false);
 		break;
 	default:
-		setFileHash(0x624C0498, 0, -1);
-		_newHashListIndex = 0;
+		startAnimation(0x624C0498, 0, -1);
+		_newStickFrameIndex = 0;
 		break;
 	}
 }
 
 void AsScene1001Door::callback2() {
 	setGlobalVar(0xD217189D, 1);
-	setFileHash(0x624C0498, 6, 6);
+	startAnimation(0x624C0498, 6, 6);
 	NextState(&AsScene1001Door::callback3);
 	_x = 30;
 }
@@ -199,8 +199,8 @@ AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
 	_x = 547;
 	_y = 206;
 	createSurface(900, 177, 192);
-	setFileHash(0x022C90D4, -1, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x022C90D4, -1, -1);
+	_newStickFrameIndex = -2;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1001Hammer::handleMessage);
 }
@@ -216,9 +216,9 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 		}
 		break;
 	case 0x2000:
-		setFileHash(0x022C90D4, 1, -1);
+		startAnimation(0x022C90D4, 1, -1);
 		_soundResource.play(0xE741020A);
-		_newHashListIndex = -2;
+		_newStickFrameIndex = -2;
 		break;
 	}
 	return 0;
@@ -230,8 +230,8 @@ AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm)
 	_x = 320;
 	_y = 240;
 	createSurface(100, 66, 129);
-	setFileHash(0xC68C2299, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0xC68C2299, 0, -1);
+	_newStickFrameIndex = 0;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1001Window::handleMessage);
 }
@@ -245,7 +245,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 		}
 		break;
 	case 0x2001:
-		setFileHash(0xC68C2299, 0, -1);
+		startAnimation(0xC68C2299, 0, -1);
 		break;
 	case 0x3002:
 		SetMessageHandler(NULL);
@@ -261,8 +261,8 @@ AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int1
 	
 	createSurface(1010, 71, 73);
 	setDoDeltaX(deltaXType);
-	setFileHash(0x04A98C36, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x04A98C36, 0, -1);
+	_newStickFrameIndex = 0;
 	_x = x;
 	_y = y;
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -284,11 +284,11 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 		messageResult = 1;
 		break;
 	case 0x3002:
-		setFileHash(0x04A98C36, 0, -1);
-		_newHashListIndex = 0;
+		startAnimation(0x04A98C36, 0, -1);
+		_newStickFrameIndex = 0;
 		break;
 	case 0x480F:
-		setFileHash(0x04A98C36, 0, -1);
+		startAnimation(0x04A98C36, 0, -1);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -504,15 +504,15 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f
 	if (flag1) {
 		createSurface(990, 68, 314);
 		if (flag2) {
-			setFileHash(0x04103090, 0, -1);
+			startAnimation(0x04103090, 0, -1);
 			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
 		} else {
-			setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
+			startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
 			SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
 		}
 	} else {
 		createSurface(990, 68, 138);
-		setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
+		startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
 		SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
 	}
 
@@ -538,16 +538,16 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &
 		sendMessage(_parentScene, 0x4806, 0);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447760);
 		if (_flag1) {
-			setFileHash(0x87502558, 0, -1);
+			startAnimation(0x87502558, 0, -1);
 		} else {
-			setFileHash(0x80DD4010, 0, -1);
+			startAnimation(0x80DD4010, 0, -1);
 		}
 		break;
 	case 0x480F:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
 		sendMessage(_parentScene, 0x480F, 0);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447890);
-		setFileHash(0x861A2020, 0, -1);
+		startAnimation(0x861A2020, 0, -1);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -564,17 +564,17 @@ uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam &
 	switch (messageNum) {
 	case 0x3002:
 		if (_flag1) {
-			setFileHash(0x78D0A812, 0, -1);
+			startAnimation(0x78D0A812, 0, -1);
 			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
 		} else {
-			setFileHash(0xB85D2A10, 0, -1);
+			startAnimation(0xB85D2A10, 0, -1);
 			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
 		}
 		break;
 	case 0x4807:
 		sendMessage(_parentScene, 0x4807, 0);
 		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
-		setFileHash(0x8258A030, 0, -1);
+		startAnimation(0x8258A030, 0, -1);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
 		break;
 	case 0x482A:
@@ -591,7 +591,7 @@ uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam &
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		setFileHash(0x04103090, 0, -1);
+		startAnimation(0x04103090, 0, -1);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447930);
 		break;
 	case 0x482A:
@@ -610,7 +610,7 @@ uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam &
 	case 0x4807:
 		sendMessage(_parentScene, 0x4807, 0);
 		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
-		setFileHash(0x8258A030, 0, -1);
+		startAnimation(0x8258A030, 0, -1);
 		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
 		break;
 	case 0x482A:
@@ -632,7 +632,7 @@ uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam &
 		}
 		break;
 	case 0x3002:
-		setFileHash(0xA85C4011, 0, -1);
+		startAnimation(0xA85C4011, 0, -1);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -730,7 +730,7 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam &param, Entity
 	case 0x2004:
 		_x = ((Sprite*)sender)->getX() - 98;
 		_y = ((Sprite*)sender)->getY() - 111;
-		setFileHash(0x0422255A, 0, -1);
+		startAnimation(0x0422255A, 0, -1);
 		setVisible(true);
 		break;
 	case 0x3002:
@@ -752,7 +752,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce
 	setClipRect(clipRect);
 	spriteUpdate448AA0();
 	_soundResource.load(0xC0C40298);
-	setFileHash(0x586C1D48, 0, 0);
+	startAnimation(0x586C1D48, 0, 0);
 }
 
 uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam &param, Entity *sender) {
@@ -776,7 +776,7 @@ uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessagePara
 	uint32 messageResult = handleMessage4489D0(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -790,14 +790,14 @@ void AsScene1002DoorSpy::spriteUpdate448AA0() {
 void AsScene1002DoorSpy::sub448AC0() {
 	setClipRect(_rect);
 	_parentScene->setSurfacePriority(getSurface(), 800);
-	setFileHash(0x586C1D48, 0, 0);
+	startAnimation(0x586C1D48, 0, 0);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
 }
 
 void AsScene1002DoorSpy::sub448B10() {
 	setClipRect(0, 0, 640, 480);
 	_parentScene->setSurfacePriority(getSurface(), 1200);
-	setFileHash(0x586C1D48, 1, -1);
+	startAnimation(0x586C1D48, 1, -1);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60);
 	NextState(&AsScene1002DoorSpy::sub448AC0);
 }
@@ -937,7 +937,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 
 void AsScene1002VenusFlyTrap::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		removeCallbacks();
+		gotoNextState();
 	}
 	AnimatedSprite::update();
 }
@@ -1025,7 +1025,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const Messag
 	uint32 messageResult = handleMessage448000(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -1054,7 +1054,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag
 		}
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 995);
@@ -1068,14 +1068,14 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag
 
 void AsScene1002VenusFlyTrap::sub4484F0() {
 	setDoDeltaX(2);
-	setFileHash(0xC4080034, 0, -1);
+	startAnimation(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
 	NextState(&AsScene1002VenusFlyTrap::sub448660);
 }
 
 void AsScene1002VenusFlyTrap::sub448530() {
-	setFileHash(0xC4080034, 0, -1);
+	startAnimation(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
 	NextState(&AsScene1002VenusFlyTrap::sub448660);
@@ -1083,7 +1083,7 @@ void AsScene1002VenusFlyTrap::sub448530() {
 
 void AsScene1002VenusFlyTrap::sub448560() {
 	sendMessage(_parentScene, 0x4807, 0);
-	setFileHash(0x82292851, 0, -1);
+	startAnimation(0x82292851, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
 	NextState(&AsScene1002VenusFlyTrap::sub448660);
@@ -1091,20 +1091,20 @@ void AsScene1002VenusFlyTrap::sub448560() {
 
 void AsScene1002VenusFlyTrap::sub4485B0() {
 	setDoDeltaX(1);
-	setFileHash(0x86A82A11, 0, -1);
+	startAnimation(0x86A82A11, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
 	NextState(&AsScene1002VenusFlyTrap::sub4485F0);
 }
 
 void AsScene1002VenusFlyTrap::sub4485F0() {
-	setFileHash(0xB5A86034, 0, -1);
+	startAnimation(0xB5A86034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
 }
 
 void AsScene1002VenusFlyTrap::sub448620() {
-	setFileHash(0x31303094, 0, -1);
+	startAnimation(0x31303094, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(NULL);
 	NextState(&AsScene1002VenusFlyTrap::sub448720);
@@ -1112,7 +1112,7 @@ void AsScene1002VenusFlyTrap::sub448620() {
 }
 
 void AsScene1002VenusFlyTrap::sub448660() {
-	setFileHash(0xC8204250, 0, -1);
+	startAnimation(0xC8204250, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update447FB0);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
 	if (_flag) {
@@ -1133,14 +1133,14 @@ void AsScene1002VenusFlyTrap::sub448660() {
 }
 
 void AsScene1002VenusFlyTrap::sub448720() {
-	setFileHash(0x152920C4, 0, -1);
+	startAnimation(0x152920C4, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
 	NextState(&AsScene1002VenusFlyTrap::sub448750);
 }
 
 void AsScene1002VenusFlyTrap::sub448750() {
-	setFileHash(0x84001117, 0, -1);
+	startAnimation(0x84001117, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
 	NextState(&AsScene1002VenusFlyTrap::sub448660);
@@ -1154,7 +1154,7 @@ void AsScene1002VenusFlyTrap::sub448780() {
 			setDoDeltaX(_x > 320 ? 1 : 0);
 		}
 		sendMessage(_klayman, 0x2001, 0);
-		setFileHash(0x8C2C80D4, 0, -1);
+		startAnimation(0x8C2C80D4, 0, -1);
 		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 		SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
 		NextState(&AsScene1002VenusFlyTrap::sub448620);
@@ -1168,8 +1168,8 @@ Class506::Class506(NeverhoodEngine *vm)
 	_x = 320;
 	_y = 240;
 	if (getGlobalVar(0x8306F218)) {
-		setFileHash(0x004A4495, -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(0x004A4495, -1, -1);
+		_newStickFrameIndex = -2;
 	} else {
 		setVisible(false);
 	}
@@ -1207,21 +1207,21 @@ uint32 Class506::handleMessage449210(int messageNum, const MessageParam &param,
 	uint32 messageResult = handleMessage4491B0(messageNum, param, sender);
 	switch (messageResult) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
 }
 
 void Class506::sub449250() {
-	setFileHash(0x004A4495, 0, -1);
+	startAnimation(0x004A4495, 0, -1);
 	SetMessageHandler(&Class506::handleMessage4491B0);
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 	setVisible(true);
 }
 
 void Class506::sub449280() {
-	setFileHash(0x004A4495, -1, -1);
+	startAnimation(0x004A4495, -1, -1);
 	_playBackwards = true;
 	SetMessageHandler(&Class506::handleMessage449210);
 	NextState(&Class506::sub4492C0);
@@ -1244,15 +1244,15 @@ Class478::Class478(NeverhoodEngine *vm, Klayman *klayman)
 
 void Class478::update() {
 	if (_klayman->getCurrAnimFileHash() == 0x3A292504) {
-		setFileHash(0xBA280522, _frameIndex, -1);
-		_newHashListIndex = _klayman->getFrameIndex();
+		startAnimation(0xBA280522, _currFrameIndex, -1);
+		_newStickFrameIndex = _klayman->getFrameIndex();
 		setVisible(true);
 		_x = _klayman->getX(); 
 		_y = _klayman->getY(); 
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
 	} else if (_klayman->getCurrAnimFileHash() == 0x122D1505) {
-		setFileHash(0x1319150C, _frameIndex, -1);
-		_newHashListIndex = _klayman->getFrameIndex();
+		startAnimation(0x1319150C, _currFrameIndex, -1);
+		_newStickFrameIndex = _klayman->getFrameIndex();
 		setVisible(true);
 		_x = _klayman->getX(); 
 		_y = _klayman->getY(); 
@@ -1275,8 +1275,8 @@ Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman)
 
 void Class479::update() {
 	if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) {
-		setFileHash(0x9820C913, _klayman->getFrameIndex(), -1);
-		_newHashListIndex = _klayman->getFrameIndex();
+		startAnimation(0x9820C913, _klayman->getFrameIndex(), -1);
+		_newStickFrameIndex = _klayman->getFrameIndex();
 		setVisible(true);
 		_x = _klayman->getX();
 		_y = _klayman->getY();
@@ -1606,7 +1606,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa
 		}
 		break;
 	case 0x2002:
-		setFileHash(0xEB312C11, 0, -1);
+		startAnimation(0xEB312C11, 0, -1);
 		setVisible(true);
 		break;
 	case 0x3002:
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 52c9d92..1efd7e3 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -348,8 +348,8 @@ AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentSce
 	_y = 240;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1105TeddyBear::handleMessage);
-	setFileHash(0x65084002, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x65084002, 0, -1);
+	_newStickFrameIndex = 0;
 	setVisible(false);
 	_needRefresh = true;
 	updatePosition();
@@ -362,10 +362,10 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x2002:
 		if (getGlobalVar(0x610210B7)) {
-			setFileHash(0x6B0C0432, 0, -1);
+			startAnimation(0x6B0C0432, 0, -1);
 			_soundResource1.play();
 		} else {
-			setFileHash(0x65084002, 0, -1);
+			startAnimation(0x65084002, 0, -1);
 			_soundResource2.play();
 		}
 		break;
@@ -706,10 +706,10 @@ uint32 Scene1109::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (param.asInteger()) {
 			setRectList(0x004B63A8);
-			_klayman->setKlaymanTable3();
+			_klayman->setKlaymanIdleTable3();
 		} else {
 			setRectList(0x004B6398);
-			_klayman->setKlaymanTable1();
+			_klayman->setKlaymanIdleTable1();
 		}
 		break;
 	}
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 25abf95..fc28917 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -250,18 +250,18 @@ uint32 Class466::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Class466::sub40D340() {
-	setFileHash(0x928F0C10, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x928F0C10, 0, -1);
+	_newStickFrameIndex = 0;
 }
 
 void Class466::sub40D360() {
-	setFileHash(0x928F0C10, 1, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x928F0C10, 1, -1);
+	_newStickFrameIndex = -2;
 }
 
 void Class466::sub40D380() {
-	setFileHash(0x928F0C10, 15, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x928F0C10, 15, -1);
+	_newStickFrameIndex = -2;
 }
 
 AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag)
@@ -272,10 +272,10 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 	_y = 240;
 	SetUpdateHandler(&AsScene1201RightDoor::update);
 	SetMessageHandler(&AsScene1201RightDoor::handleMessage);
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 	if (flag) {
-		setFileHash(0xD088AC30, -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(0xD088AC30, -1, -1);
+		_newStickFrameIndex = -2;
 		_countdown = 25;
 	} else {
 		stopAnimation();
@@ -294,7 +294,7 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4829:
 		sub40D7E0();
@@ -304,14 +304,14 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p
 }
 
 void AsScene1201RightDoor::sub40D7E0() {
-	setFileHash(0xD088AC30, 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(0xD088AC30, 0, -1);
+	_newStickFrameIndex = -2;
 	setVisible(true);
 	_soundResource.play(calcHash("fxDoorOpen20"));
 }
 
 void AsScene1201RightDoor::sub40D830() {
-	setFileHash(0xD088AC30, -1, -1);
+	startAnimation(0xD088AC30, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
 	_soundResource.play(calcHash("fxDoorClose20"));
@@ -339,13 +339,13 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity
 	case 0x2006:
 		_x = 436;
 		_y = 339;
-		setFileHash(0xA060C599, 0, -1);
+		startAnimation(0xA060C599, 0, -1);
 		setVisible(true);
 		break;
 	case 0x3002:
 		stopAnimation();
 		setVisible(false);
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -402,7 +402,7 @@ uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam
 	uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -413,13 +413,13 @@ void AsScene1201TntMan::spriteUpdate40CD10() {
 }
 
 void AsScene1201TntMan::sub40CD30() {
-	setFileHash(0x654913D0, 0, -1);
+	startAnimation(0x654913D0, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	SetSpriteCallback(NULL);
 }
 
 void AsScene1201TntMan::sub40CD60() {
-	setFileHash(0x356803D0, 0, -1);
+	startAnimation(0x356803D0, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 	NextState(&AsScene1201TntMan::sub40CD30);
@@ -429,10 +429,10 @@ void AsScene1201TntMan::sub40CD90() {
 	// TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true);
 	// TODO Sound1ChList_playLooping(0x4B044624);
 	_flag = true;
-	setFileHash(0x85084190, 0, -1);
+	startAnimation(0x85084190, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	SetSpriteCallback(&AsScene1201TntMan::spriteUpdate40CD10);
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 }
 
 Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
@@ -442,7 +442,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
 	SetUpdateHandler(&Class465::update);
 	SetMessageHandler(&Sprite::handleMessage);
 	SetSpriteCallback(&Class465::spriteUpdate40D150);
-	setFileHash(0x828C0411, 0, -1);
+	startAnimation(0x828C0411, 0, -1);
 	setVisible(false);
 }
 
@@ -499,7 +499,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
 
 void AsScene1201Match::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		removeCallbacks();
+		gotoNextState();
 	}
 	updateAnim();
 	handleSpriteUpdate();
@@ -522,7 +522,7 @@ uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam
 	uint32 messageResult = handleMessage40C2D0(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -544,7 +544,7 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam
 }
 
 void AsScene1201Match::sub40C3E0() {
-	setFileHash(0x00842374, 0, -1);
+	startAnimation(0x00842374, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
 	if (_status == 0) {
 		NextState(&AsScene1201Match::sub40C420);
@@ -557,15 +557,15 @@ void AsScene1201Match::sub40C420() {
 	setGlobalVar(0x0112090A, 2);
 	_x -= 199;
 	_y += 119;
-	setFileHash(0x018D0240, 0, -1);
+	startAnimation(0x018D0240, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
 	NextState(&AsScene1201Match::sub40C4F0);
 }
 
 void AsScene1201Match::sub40C470() {
-	setFileHash(0x00842374, 0, -1);
+	startAnimation(0x00842374, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C2D0);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 	if (_status != 0) {
 		_countdown = 36;
 		_status--;
@@ -574,18 +574,18 @@ void AsScene1201Match::sub40C470() {
 }
 
 void AsScene1201Match::sub40C4C0() {
-	setFileHash(0x00842374, 0, -1);
+	startAnimation(0x00842374, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C360);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 void AsScene1201Match::sub40C4F0() {
 	setDoDeltaX(1);
 	_x = 403;
 	_y = 337;
-	setFileHash(0x00842374, 0, -1);
+	startAnimation(0x00842374, 0, -1);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C360);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman)
@@ -607,7 +607,7 @@ void AsScene1201Creature::update() {
 	if (_flag != oldFlag)
 		sub40C8E0();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
-		removeCallbacks();
+		gotoNextState();
 	}
 	updateAnim();
 	handleSpriteUpdate();
@@ -643,7 +643,7 @@ uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessagePar
 		}
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -660,7 +660,7 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar
 		}
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -670,7 +670,7 @@ void AsScene1201Creature::sub40C8E0() {
 	_countdown3--;
 	if (_countdown3 == 0)
 		_countdown3 = 3;
-	setFileHash(0x08081513, 0, -1);
+	startAnimation(0x08081513, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
 	NextState(&AsScene1201Creature::sub40C930);
 	_countdown1 = 36;
@@ -678,32 +678,32 @@ void AsScene1201Creature::sub40C8E0() {
 
 void AsScene1201Creature::sub40C930() {
 	if (!_flag) {
-		setFileHash(0xCA287133, 0, -1);
+		startAnimation(0xCA287133, 0, -1);
 		SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0);
 		NextState(&AsScene1201Creature::sub40C8E0);
 	}
 }
 
 void AsScene1201Creature::sub40C960() {
-	setFileHash(0x08081513, 0, -1);
+	startAnimation(0x08081513, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
 	NextState(&AsScene1201Creature::sub40C9E0);
 	_countdown1 = 48;
 }
 
 void AsScene1201Creature::sub40C990() {
-	setFileHash2(0x0B6E13FB, 0x01084280, 0);
+	startAnimationByHash(0x0B6E13FB, 0x01084280, 0);
 }
 
 void AsScene1201Creature::sub40C9B0() {
-	setFileHash(0xCA287133, 0, -1);
+	startAnimation(0xCA287133, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C830);
 	NextState(&AsScene1201Creature::sub40C8E0);
 	_countdown1 = 0;
 }
 
 void AsScene1201Creature::sub40C9E0() {
-	setFileHash(0x5A201453, 0, -1);
+	startAnimation(0x5A201453, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
 	_countdown1 = 0;
 }
@@ -715,12 +715,12 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
 	_y = 240;
 	createSurface(800, 55, 199);
 	if (_klayman->getX() < 100) {
-		setFileHash(0x508A111B, 0, -1);
-		_newHashListIndex = -2;
+		startAnimation(0x508A111B, 0, -1);
+		_newStickFrameIndex = -2;
 		_soundResource.play(calcHash("fxDoorOpen03"));
 	} else {
-		setFileHash(0x508A111B, -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(0x508A111B, -1, -1);
+		_newStickFrameIndex = -2;
 	}
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1201LeftDoor::handleMessage);
@@ -737,9 +737,9 @@ uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &pa
 }
 
 void AsScene1201LeftDoor::sub40D590() {
-	setFileHash(0x508A111B, -1, -1);
+	startAnimation(0x508A111B, -1, -1);
 	_playBackwards = true;
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1076,20 +1076,20 @@ uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessagePara
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
 }
 
 void AsScene1202TntItem::sub4540A0() {
-	setFileHash(kScene1202FileHashes[_index], 0, -1);
+	startAnimation(kScene1202FileHashes[_index], 0, -1);
 	SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 void AsScene1202TntItem::sub4540D0() {
-	setFileHash(kScene1202FileHashes[_index], 0, -1);
+	startAnimation(kScene1202FileHashes[_index], 0, -1);
 	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
 	NextState(&AsScene1202TntItem::sub454100);
 }
@@ -1097,7 +1097,7 @@ void AsScene1202TntItem::sub4540D0() {
 void AsScene1202TntItem::sub454100() {
 	_x = kScene1202Points[_index2].x;
 	_y = kScene1202Points[_index2].y;
-	setFileHash(kScene1202FileHashes[_index], 6, -1);
+	startAnimation(kScene1202FileHashes[_index], 6, -1);
 	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
 	NextState(&AsScene1202TntItem::sub454160);
 	_playBackwards = true;
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index cb5ed15..38dd356 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -296,11 +296,11 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1302Bridge::handleMessage);
 	if (!getGlobalVar(0x13206309)) {
-		setFileHash(0x88148150, 0, -1);
-		_newHashListIndex = 0;
+		startAnimation(0x88148150, 0, -1);
+		_newStickFrameIndex = 0;
 	} else {
-		setFileHash(0x88148150, -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(0x88148150, -1, -1);
+		_newStickFrameIndex = -2;
 	}
 	_soundResource1.load(0x68895082);
 	_soundResource2.load(0x689BD0C1);
@@ -310,7 +310,7 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &para
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		stLowerBridge();
@@ -323,22 +323,22 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &para
 }
 
 void AsScene1302Bridge::stLowerBridge() {
-	setFileHash(0x88148150, 0, -1);
+	startAnimation(0x88148150, 0, -1);
 	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
 	_soundResource2.play();
 }
 
 void AsScene1302Bridge::stRaiseBridge() {
-	setFileHash(0x88148150, 7, -1);
+	startAnimation(0x88148150, 7, -1);
 	_playBackwards = true;
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 	_soundResource1.play();
 }
 
 void AsScene1302Bridge::cbLowerBridgeEvent() {
 	sendMessage(_parentScene, 0x2032, 0);
-	setFileHash(0x88148150, -1, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x88148150, -1, -1);
+	_newStickFrameIndex = -2;
 }
 
 SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
@@ -591,7 +591,7 @@ AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1303Balloon::handleMessage);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
-	setFileHash(0x800278D2, 0, -1);
+	startAnimation(0x800278D2, 0, -1);
 }
 
 uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -627,7 +627,7 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p
 }
 
 void AsScene1303Balloon::stPopBalloon() {
-	setFileHash(0xAC004CD0, 0, -1);
+	startAnimation(0xAC004CD0, 0, -1);
 	SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped);
 }
 
@@ -799,8 +799,8 @@ AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene
 	_x = 320;
 	_y = 240;
 	createSurface1(0x043B0270, 100);
-	setFileHash(0x043B0270, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x043B0270, 0, -1);
+	_newStickFrameIndex = 0;
 	SetMessageHandler(&AsScene1306Elevator::handleMessage);
 	_soundResource1.load(0x1C100E83);
 	_soundResource2.load(0x1C08CEC5);
@@ -812,7 +812,7 @@ void AsScene1306Elevator::update() {
 		stGoingDown();
 	}
 	AnimatedSprite::update();
-	if (_frameIndex == 7) {
+	if (_currFrameIndex == 7) {
 		_soundResource3.play();
 		_asElevatorDoor->setVisible(false);
 	}
@@ -820,7 +820,7 @@ void AsScene1306Elevator::update() {
 
 void AsScene1306Elevator::upGoingDown() {
 	AnimatedSprite::update();
-	if (_frameIndex == 5) {
+	if (_currFrameIndex == 5) {
 		_asElevatorDoor->setVisible(true);
 	}
 }
@@ -834,7 +834,7 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa
 		messageResult = _isUp ? 1 : 0;
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		if (_isDown)
@@ -848,7 +848,7 @@ void AsScene1306Elevator::stGoingUp() {
 	setVisible(true);
 	_isDown = false;
 	SetUpdateHandler(&AsScene1306Elevator::update);
-	setFileHash(0x043B0270, 0, -1);
+	startAnimation(0x043B0270, 0, -1);
 	NextState(&AsScene1306Elevator::cbGoingUpEvent);
 	_soundResource1.play();
 }
@@ -866,7 +866,7 @@ void AsScene1306Elevator::stGoingDown() {
 	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
 	_isUp = false;
 	setVisible(true);
-	setFileHash(0x043B0270, -1, -1);
+	startAnimation(0x043B0270, -1, -1);
 	_playBackwards = true;
 	NextState(&AsScene1306Elevator::cbGoingDownEvent);
 	_soundResource2.play();
@@ -902,7 +902,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape = insertSprite<AsScene1201Tape>(this, 19, 1100, 359, 445, 0x9148A011);
 
 	_asElevatorDoor = insertSprite<AnimatedSprite>(0x043B0270, 90, 320, 240);
-	_asElevatorDoor->setFileHash(0x043B0270, 6, -1);
+	_asElevatorDoor->startAnimation(0x043B0270, 6, -1);
 	_asElevatorDoor->setNewHashListIndex(6);
 
 	_asElevator = insertSprite<AsScene1306Elevator>(this, _asElevatorDoor);
@@ -987,10 +987,10 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (param.asInteger() != 0) {
 			setRectList(0x004AFD28);
-			_klayman->setKlaymanTable3();
+			_klayman->setKlaymanIdleTable3();
 		} else {
 			setRectList(0x004AFD18);
-			_klayman->setKlaymanTable1();
+			_klayman->setKlaymanIdleTable1();
 		}
 		break;
 	case 0x480B:
@@ -1134,7 +1134,7 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1307Key::handleMessage);
 	
-	setFileHash(fileHashes[0], 0, -1);
+	startAnimation(fileHashes[0], 0, -1);
 	
 	_soundResource1.load(0xDC4A1280);
 	_soundResource2.load(0xCC021233);
@@ -1199,9 +1199,9 @@ void AsScene1307Key::suInsertKey() {
 
 void AsScene1307Key::suMoveKey() {
 	if (_pointIndex < kAsScene1307KeyFrameIndicesCount) {
-		_frameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
-		_x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue;
-		_y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue;
+		_currFrameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
+		_x = _prevX + (_deltaX * _currFrameIndex) / kAsScene1307KeyDivValue;
+		_y = _prevY + (_deltaY * _currFrameIndex) / kAsScene1307KeyDivValue;
 		processDelta();
 		_pointIndex++;
 	} else {
@@ -1216,7 +1216,7 @@ void AsScene1307Key::stRemoveKey() {
 	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
 	_pointIndex = 0;
 	SetSpriteCallback(&AsScene1307Key::suRemoveKey);
-	setFileHash(fileHashes[0], 0, -1);
+	startAnimation(fileHashes[0], 0, -1);
 	_soundResource2.play();
 }
 
@@ -1225,7 +1225,7 @@ void AsScene1307Key::stInsertKey() {
 	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]);
 	setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]);
 	SetSpriteCallback(&AsScene1307Key::suInsertKey);
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 }
 
 void AsScene1307Key::stMoveKey() {
@@ -1241,24 +1241,24 @@ void AsScene1307Key::stMoveKey() {
 	} else {
 		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
 		_pointIndex = 0;
-		_frameIndex = 0;
+		_currFrameIndex = 0;
 		_deltaX = newX - _x;
 		_deltaY = newY - _y;
 		SetSpriteCallback(&AsScene1307Key::suMoveKey);
-		setFileHash(fileHashes[0], 0, -1);
+		startAnimation(fileHashes[0], 0, -1);
 	}
 }
 
 void AsScene1307Key::stUnlock() {
 	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
-	setFileHash(fileHashes[1], 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(fileHashes[1], 0, -1);
+	_newStickFrameIndex = -2;
 }
 
 void AsScene1307Key::stInsert() {
 	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
-	setFileHash(fileHashes[2], 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(fileHashes[2], 0, -1);
+	_newStickFrameIndex = -2;
 }
 
 Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1440,7 +1440,7 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		sub455470();
@@ -1453,7 +1453,7 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Class549::sub455470() {
-	setFileHash(0xBA0AE050, 0, -1);
+	startAnimation(0xBA0AE050, 0, -1);
 	setVisible(true);
 	NextState(&Class549::hide);
 	_soundResource.play(calcHash("fxDoorOpen38"));
@@ -1466,7 +1466,7 @@ void Class549::hide() {
 }
 
 void Class549::sub4554F0() {
-	setFileHash(0xBA0AE050, -1, -1);
+	startAnimation(0xBA0AE050, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
 	NextState(&Class549::sub455550);
@@ -1491,14 +1491,14 @@ uint32 Class592::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
 }
 
 void Class592::sub455710() {
-	setFileHash(0x6238B191, 0, -1);
+	startAnimation(0x6238B191, 0, -1);
 	NextState(&Class592::sub455740);
 	_x = 580;
 	_y = 383;
@@ -1528,20 +1528,20 @@ uint32 Class593::handleMessage(int messageNum, const MessageParam &param, Entity
 	case 0x2003:
 		sub455920();
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
 }
 
 void Class593::sub4558F0() {
-	setFileHash(0x80180A10, 0, -1);
+	startAnimation(0x80180A10, 0, -1);
 	setVisible(false);
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 }
 
 void Class593::sub455920() {
-	setFileHash(0x80180A10, -1, -1);
+	startAnimation(0x80180A10, -1, -1);
 	_playBackwards = true;
 	NextState(&Class593::sub455950);
 }
@@ -1568,7 +1568,7 @@ Class513::Class513(NeverhoodEngine *vm)
 	_x = 286;
 	_y = 429;
 	createSurface1(0xA282C472, 100);
-	setFileHash(0xA282C472, 0, -1);
+	startAnimation(0xA282C472, 0, -1);
 }
 
 uint32 Class513::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 42dfdb3..ecf6326 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -144,7 +144,7 @@ Class525::Class525(NeverhoodEngine *vm)
 	_y = 217;
 	SetUpdateHandler(&Class525::update4662A0);
 	SetMessageHandler(&Class525::handleMessage466320);
-	setFileHash(0x4C210500, 0, -1);
+	startAnimation(0x4C210500, 0, -1);
 }
 
 Class525::~Class525() {
@@ -206,18 +206,18 @@ uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam &param,
 }
 
 void Class525::sub466420() {
-	setFileHash(0x4C240100, 0, -1);
+	startAnimation(0x4C240100, 0, -1);
 	_soundResource1.play(0x4A30063F);
 }
 
 void Class525::sub466460() {
 	// TODO Sound1ChList_deleteSoundByHash(0x4A116437);
 	_soundResource1.play(0x4A120435);
-	setFileHash(0x4C210500, 0, -1);
+	startAnimation(0x4C210500, 0, -1);
 }
 
 void Class525::sub4664B0() {
-	setFileHash(0x6C210810, 0, -1);
+	startAnimation(0x6C210810, 0, -1);
 		SetMessageHandler(&Class525::handleMessage4663C0);
 		SetUpdateHandler(&Class525::update466300);
 }
@@ -231,7 +231,7 @@ Class526::Class526(NeverhoodEngine *vm, Sprite *class525)
 	_y = 433;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class526::handleMessage);
-	setFileHash(0xA282C472, 0, -1);
+	startAnimation(0xA282C472, 0, -1);
 }
 
 uint32 Class526::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -265,7 +265,7 @@ void Class526::spriteUpdate466720() {
 }
 
 void Class526::sub466770() {
-	setFileHash(0x34880040, 0, -1);
+	startAnimation(0x34880040, 0, -1);
 	SetSpriteCallback(&Class526::spriteUpdate466720);
 }
 
@@ -278,7 +278,7 @@ Class527::Class527(NeverhoodEngine *vm, Sprite *class526)
 	_y = 433;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class527::handleMessage);
-	setFileHash(0x461A1490, 0, -1);
+	startAnimation(0x461A1490, 0, -1);
 }
 
 uint32 Class527::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -303,7 +303,7 @@ void Class527::spriteUpdate466920() {
 }
 
 void Class527::sub466970() {
-	setFileHash(0x103B8020, 0, -1);
+	startAnimation(0x103B8020, 0, -1);
 	SetSpriteCallback(&Class527::spriteUpdate466920);
 }
 
@@ -315,10 +315,10 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 	createSurface1(0x04551900, 100);
 	SetUpdateHandler(&Class528::update);
 	SetMessageHandler(&Class528::handleMessage);
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 	if (flag) {
 		_flag = true;
-		setFileHash(0x04551900, -1,- 1);
+		startAnimation(0x04551900, -1,- 1);
 		_countdown = 48;
 	} else {
 		_flag = false;
@@ -344,7 +344,7 @@ uint32 Class528::handleMessage(int messageNum, const MessageParam &param, Entity
 		messageResult = _flag ? 1 : 0;			
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		_countdown = 168;
@@ -358,15 +358,15 @@ uint32 Class528::handleMessage(int messageNum, const MessageParam &param, Entity
 void Class528::sub466BF0() {
 	_flag = true;
 	setVisible(true);
-	setFileHash(0x04551900, 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x04551900, 0, -1);
+	_newStickFrameIndex = -2;
 	_soundResource.play(calcHash("fxDoorOpen24"));
 }
 
 void Class528::sub466C50() {
 	_flag = false;
 	setVisible(true);
-	setFileHash(0x04551900, -1, -1);
+	startAnimation(0x04551900, -1, -1);
 	_soundResource.play(calcHash("fxDoorClose24"));
 	_playBackwards = true;
 	NextState(&Class528::sub466CB0);
@@ -392,7 +392,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr
 	_class489Item = &kClass489Items[getGlobalVar(0x04A105B3)];
 	// TODO createSurface3(990, dword_4B26D8);
 	createSurface(990, 640, 480); //TODO: Remeove once the line above is done
-	setFileHash(0x10E3042B, 0, -1);
+	startAnimation(0x10E3042B, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class489::handleMessage);
 	_x = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
@@ -504,7 +504,7 @@ uint32 Class489::handleMessage434B20(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -585,12 +585,12 @@ void Class489::sub434D80() {
 void Class489::sub434DD0() {
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage);
-	setFileHash(0x10E3042B, 0, -1);
+	startAnimation(0x10E3042B, 0, -1);
 }
 
 void Class489::sub434DF0() {
 	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
-	setFileHash(0x14A10137, 0, -1);
+	startAnimation(0x14A10137, 0, -1);
 	SetSpriteCallback(&Class489::spriteUpdate434B60);
 	SetMessageHandler(&Class489::handleMessage);
 	_soundResource2.play(0xEC008474);
@@ -599,18 +599,18 @@ void Class489::sub434DF0() {
 void Class489::sub434E60() {
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage434B20);
-	setFileHash(0x80C32213, 0, -1);
+	startAnimation(0x80C32213, 0, -1);
 	NextState(&Class489::sub434E90);
 }
 
 void Class489::sub434E90() {
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage4348E0);
-	setFileHash(0xD23B207F, 0, -1);
+	startAnimation(0xD23B207F, 0, -1);
 }
 
 void Class489::sub434EC0() {
-	setFileHash(0x50A80517, 0, -1);
+	startAnimation(0x50A80517, 0, -1);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	SetSpriteCallback(NULL);
 	NextState(&Class489::sub434F40);
@@ -622,13 +622,13 @@ void Class489::sub434EC0() {
 
 void Class489::sub434F40() {
 	sendMessage(_parentScene, 0x480F, 0);
-	setFileHash(0xD833207F, 0, -1);
+	startAnimation(0xD833207F, 0, -1);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage4348E0);
 }
 
 void Class489::sub434F80() {
-	setFileHash(0x50A94417, 0, -1);
+	startAnimation(0x50A94417, 0, -1);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	NextState(&Class489::sub434E90);
@@ -639,7 +639,7 @@ void Class489::sub434F80() {
 
 void Class489::sub434FF0() {
 	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
-	setFileHash(0x22CB4A33, 0, -1);
+	startAnimation(0x22CB4A33, 0, -1);
 	SetSpriteCallback(&Class489::spriteUpdate434B60);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	NextState(&Class489::sub434DF0);
@@ -650,7 +650,7 @@ void Class489::sub435040() {
 	setGlobalVar(0x04A10F33, 0);
 	SetSpriteCallback(&Class489::sub434D80);
 	SetMessageHandler(&Sprite::handleMessage);
-	setFileHash(0x708D4712, 0, -1);
+	startAnimation(0x708D4712, 0, -1);
 	_soundResource3.play();
 }
 
@@ -825,16 +825,16 @@ Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which)
 	_x = 279;
 	_y = 270;
 	if (which == 2) {
-		setFileHash(0x20060259, 0, -1);
+		startAnimation(0x20060259, 0, -1);
 		_soundResource1.play(0x419014AC);
 		_soundResource2.load(0x61901C29);
 	} else if (which == 1) {
-		setFileHash(0x210A0213, 0, -1);
+		startAnimation(0x210A0213, 0, -1);
 		_soundResource1.play(0x41809C6C);
 	} else {
-		setFileHash(0x20060259, 0, -1);
+		startAnimation(0x20060259, 0, -1);
 		_soundResource2.load(0x61901C29);
-		_newHashListIndex = -2;
+		_newStickFrameIndex = -2;
 	}
 }
 
@@ -843,12 +843,12 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x2002:
 		_soundResource2.play();
-		setFileHash(0x20060259, -1, -1);
+		startAnimation(0x20060259, -1, -1);
 		_playBackwards = true;
 		NextState(&Class482::sub428530);
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -1142,7 +1142,7 @@ void AsScene1407Mouse::suWalkTo() {
 void AsScene1407Mouse::upGoThroughHole() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		SetUpdateHandler(&AnimatedSprite::update);
-		removeCallbacks();
+		gotoNextState();
 	}
 	AnimatedSprite::update();
 }
@@ -1178,7 +1178,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
 		}
 		break;
 	case 0x1019:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x2001:
 		{
@@ -1207,7 +1207,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
 
 void AsScene1407Mouse::stIdleLookAtGoodHole() {
 	setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0);
-	setFileHash(0x72215194, 0, -1);
+	startAnimation(0x72215194, 0, -1);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
 }
@@ -1215,7 +1215,7 @@ void AsScene1407Mouse::stIdleLookAtGoodHole() {
 void AsScene1407Mouse::stWalkToDest() {
 	if (_walkDestX != _x) {
 		setDoDeltaX(_walkDestX < _x ? 1 : 0);
-		setFileHash(0x22291510, 0, -1);
+		startAnimation(0x22291510, 0, -1);
 		SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
 		SetMessageHandler(&AsScene1407Mouse::handleMessage);
 		NextState(&AsScene1407Mouse::stIdleLookAtGoodHole);
@@ -1224,14 +1224,14 @@ void AsScene1407Mouse::stWalkToDest() {
 
 void AsScene1407Mouse::stWalkToHole() {
 	setDoDeltaX(_walkDestX < _x ? 1 : 0);
-	setFileHash(0x22291510, 0, -1);
+	startAnimation(0x22291510, 0, -1);
 	SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
 	NextState(&AsScene1407Mouse::stGoThroughHole);
 }
 
 void AsScene1407Mouse::stGoThroughHole() {
-	setFileHash(0x72215194, 0, -1);
+	startAnimation(0x72215194, 0, -1);
 	SetSpriteCallback(NULL);
 	SetMessageHandler(NULL);
 	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
@@ -1603,8 +1603,8 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui
 	
 	debug("getSubVar(0x0C65F80B, _index) = %d", getSubVar(0x0C65F80B, _index));
 	
-	setFileHash(0x844B805C, getSubVar(0x0C65F80B, _index), -1);
-	_newHashListIndex = (int16)getSubVar(0x0C65F80B, _index);
+	startAnimation(0x844B805C, getSubVar(0x0C65F80B, _index), -1);
+	_newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _index);
 }
 
 void AsScene1405Tile::update() {
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index c510601..44c8721 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -200,7 +200,7 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	_pathPoints = NULL;
 	_rectList = NULL;
 	
-	setFileHash(0xD4220027, 0, -1);
+	startAnimation(0xD4220027, 0, -1);
 	setDoDeltaX(getGlobalVar(0x21E60190));
 
 }
@@ -372,11 +372,11 @@ uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x100D:
 		if (_flag10F && param.asInteger() == 0x025424A2) {
-			removeCallbacks();
+			gotoNextState();
 		}
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -408,7 +408,7 @@ void Class521::sub45CD00() {
 	_rectList = NULL;
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	NextState(&Class521::sub45CFE0);
-	setFileHash(0x35698F78, 0, -1);
+	startAnimation(0x35698F78, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update45C790);
 	FinalizeState(&Class521::sub45D040);
@@ -436,17 +436,17 @@ void Class521::sub45CDC0() {
 
 void Class521::sub45CE10() {
 	if (_flag10E && !_flag113 && !_flag10F) {
-		removeCallbacks();
+		gotoNextState();
 		_flag114 = 0;
 		_flag113 = 1;
-		setFileHash(0x192ADD30, 0, -1);
+		startAnimation(0x192ADD30, 0, -1);
 		SetMessageHandler(&Class521::handleMessage45CC30);
 		SetUpdateHandler(&Class521::update);
 		NextState(&Class521::sub45CFE0);
 	} else if (!_flag10E && _steps && _flag113) {
-		removeCallbacks();
+		gotoNextState();
 		_flag113 = 0;
-		setFileHash(0x9966B138, 0, -1);
+		startAnimation(0x9966B138, 0, -1);
 		SetMessageHandler(&Class521::handleMessage45CC30);
 		SetUpdateHandler(&Class521::update);
 		NextState(&Class521::sub45D100);
@@ -464,10 +464,10 @@ void Class521::sub45CE10() {
 			_flag11A = index < _rectList->size();
 		}
 		if (flag) {
-			removeCallbacks();
+			gotoNextState();
 			sub45D0A0();
 		} else if (_newMoveDirection != _currMoveDirection && _flag114 && !_flag10F) {
-			removeCallbacks();
+			gotoNextState();
 			_currMoveDirection = _newMoveDirection;
 			sub45D100();
 		}
@@ -475,21 +475,21 @@ void Class521::sub45CE10() {
 }
 
 void Class521::sub45CF80() {
-	setFileHash(0xA86A9538, 0, -1);
+	startAnimation(0xA86A9538, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	NextState(&Class521::sub45CFE0);
 }
 
 void Class521::sub45CFB0() {
-	setFileHash(0xA86A9538, -1, -1);
+	startAnimation(0xA86A9538, -1, -1);
 	_playBackwards = true;
 	SetMessageHandler(&Class521::handleMessage45CCA0);
 	SetUpdateHandler(&Class521::update);
 }
 
 void Class521::sub45CFE0() {
-	setFileHash(0x35698F78, 0, -1);
+	startAnimation(0x35698F78, 0, -1);
 	SetMessageHandler(&Class521::handleMessage);
 	SetUpdateHandler(&Class521::update45C790);
 	FinalizeState(&Class521::sub45D040);
@@ -505,7 +505,7 @@ void Class521::sub45D040() {
 }
 
 void Class521::sub45D050() {
-	setFileHash(0xB579A77C, 0, -1);
+	startAnimation(0xB579A77C, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	NextState(&Class521::sub45CFE0);
@@ -515,8 +515,8 @@ void Class521::sub45D050() {
 
 void Class521::sub45D0A0() {
 	_flag10F = 1;
-	removeCallbacks();
-	setFileHash(0x9C220DA4, 0, -1);
+	gotoNextState();
+	startAnimation(0x9C220DA4, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	FinalizeState(&Class521::sub45D0E0);
@@ -531,21 +531,21 @@ void Class521::sub45D0E0() {
 void Class521::sub45D100() {
 	_flag114 = 1;
 	if (_currMoveDirection == 1) {
-		setFileHash(0xD4AA03A4, 0, -1);
+		startAnimation(0xD4AA03A4, 0, -1);
 	} else if (_currMoveDirection == 3) {
-		setFileHash(0xD00A1364, 0, -1);
+		startAnimation(0xD00A1364, 0, -1);
 	} else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) {
 		sub45D180();
 	} else {
-		setFileHash(0xD4220027, 0, -1);
+		startAnimation(0xD4220027, 0, -1);
 	}
 	setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0);
 }
 
 void Class521::sub45D180() {
 	_flag10F = 1;
-	removeCallbacks();
-	setFileHash(0xF46A0324, 0, -1);
+	gotoNextState();
+	startAnimation(0xF46A0324, 0, -1);
 	_value112 = 0;
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
@@ -573,9 +573,9 @@ void Class521::moveToNextPoint() {
 				sub45D350();
 		} else {
 			if (_steps == 0) {
-				removeCallbacks();
+				gotoNextState();
 				_flag113 = 0;
-				setFileHash(0x9966B138, 0, -1);
+				startAnimation(0x9966B138, 0, -1);
 				SetMessageHandler(&Class521::handleMessage45CC30);
 				SetUpdateHandler(&Class521::update);
 				NextState(&Class521::sub45D100);
@@ -588,19 +588,19 @@ void Class521::moveToNextPoint() {
 }
 
 void Class521::sub45D350() {
-	removeCallbacks();
+	gotoNextState();
 	_flag10F = 1;
 	_flag10E = 1;
-	setFileHash(0x192ADD30, 0, -1);
+	startAnimation(0x192ADD30, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	NextState(&Class521::sub45D390);
 }
 
 void Class521::sub45D390() {
-	removeCallbacks();
+	gotoNextState();
 	_flag10F = 1;
-	setFileHash(0xF46A0324, 0, -1);
+	startAnimation(0xF46A0324, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	FinalizeState(&Class521::sub45D620);
@@ -635,9 +635,9 @@ void Class521::moveToPrevPoint() {
 				sub45D580();
 		} else {
 			if (_steps == 0) {
-				removeCallbacks();
+				gotoNextState();
 				_flag113 = 0;
-				setFileHash(0x9966B138, 0, -1);
+				startAnimation(0x9966B138, 0, -1);
 				SetMessageHandler(&Class521::handleMessage45CC30);
 				SetUpdateHandler(&Class521::update);
 				NextState(&Class521::sub45D100);
@@ -653,7 +653,7 @@ void Class521::sub45D580() {
 	_flag10F = 1;
 	_flag10E = 1;
 	FinalizeState(NULL);
-	setFileHash(0x192ADD30, 0, -1);
+	startAnimation(0x192ADD30, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	NextState(&Class521::sub45D5D0);
@@ -662,7 +662,7 @@ void Class521::sub45D580() {
 void Class521::sub45D5D0() {
 	_flag10F = 1;
 	FinalizeState(NULL);
-	setFileHash(0xF46A0324, 0, -1);
+	startAnimation(0xF46A0324, 0, -1);
 	SetMessageHandler(&Class521::handleMessage45CC30);
 	SetUpdateHandler(&Class521::update);
 	FinalizeState(&Class521::sub45D620);
@@ -986,7 +986,7 @@ uint32 Class546::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		sub44D710();
@@ -999,7 +999,7 @@ uint32 Class546::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Class546::sub44D710() {
-	setFileHash(0x08C80144, 0, -1);
+	startAnimation(0x08C80144, 0, -1);
 	setVisible(true);
 	NextState(&Class546::sub44D760);
 	_soundResource.play(calcHash("fxDoorOpen23"));
@@ -1012,7 +1012,7 @@ void Class546::sub44D760() {
 }
 
 void Class546::sub44D790() {
-	setFileHash(0x08C80144, -1, -1);
+	startAnimation(0x08C80144, -1, -1);
 	setVisible(true);
 	NextState(&Class546::sub44D7F0);
 	_soundResource.play(calcHash("fxDoorClose23"));
@@ -1027,15 +1027,15 @@ Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
 
 	setDoDeltaX(1);
-	setFileHash(0x1209E09F, 1, -1);
-	_newHashListIndex = 1;
+	startAnimation(0x1209E09F, 1, -1);
+	_newStickFrameIndex = 1;
 }
 
 Class548::Class548(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
 
 	setDoDeltaX(1);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 Class518::Class518(NeverhoodEngine *vm, Class521 *class521)
@@ -1043,8 +1043,8 @@ Class518::Class518(NeverhoodEngine *vm, Class521 *class521)
 	
 	SetUpdateHandler(&Class518::update);
 	createSurface1(0x60281C10, 150);
-	setFileHash(0x60281C10, -1, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x60281C10, -1, -1);
+	_newStickFrameIndex = -2;
 }
 
 void Class518::update() {
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index ae7a7fd..f9dc6b7 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -259,10 +259,10 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (param.asInteger()) {
 			setRectList(0x004B6B40);
-			_klayman->setKlaymanTable3();
+			_klayman->setKlaymanIdleTable3();
 		} else {
 			setRectList(0x004B6B30);
-			_klayman->setKlaymanTable1();
+			_klayman->setKlaymanIdleTable1();
 		}
 		break;
 	case 0x4826:
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 7bac3ff..e9be86a 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -200,8 +200,8 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 			_y = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].y;
 		}
 		createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex);
-		setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);
+		_newStickFrameIndex = -2;
 	} else {
 		_isPluggedIn = false;
 		_currPositionIndex = positionIndex;
@@ -212,8 +212,8 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 		_x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x;
 		_y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y;
 		createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex);
-		setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
-		_newHashListIndex = 0;
+		startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
+		_newStickFrameIndex = 0;
 	}
 	_deltaRect.set(0, 0, 80, 80);
 	Sprite::processDelta();
@@ -249,7 +249,7 @@ uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam &para
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -345,7 +345,7 @@ void AsScene1907Symbol::tryToPlugIn() {
 	_newPositionIndex = _parentScene->getNextPosition();
 	_parentScene->setPositionFree(_currPositionIndex, true);
 	sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex);
-	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
 	SetUpdateHandler(&AsScene1907Symbol::update);
 	SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn);
 	SetSpriteCallback(&AsScene1907Symbol::suTryToPlugIn);
@@ -371,9 +371,9 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
 	_y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y;
 	_someX = _x;
 	_someY = _y;
-	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0);
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0);
 	_playBackwards = true;
-	_newHashListIndex = -2;
+	_newStickFrameIndex = -2;
 	_currStep = 0;
 	_yAccel = 1;
 	SetUpdateHandler(&AsScene1907Symbol::update);
@@ -390,7 +390,7 @@ void AsScene1907Symbol::stFallOffHitGround() {
 	_vm->_collisionMan->addSprite(this);
 	SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround);
 	NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 	_currStep = 0;
 	_yAccel = 30;
 	_deltaX = (_x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x) / 15;
@@ -405,8 +405,8 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() {
 	_currPositionIndex = _newPositionIndex;
 	if (_symbolFlag2)
 		_symbolFlag2--;
-	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
+	_newStickFrameIndex = 0;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteCallback(NULL);
@@ -431,7 +431,7 @@ void AsScene1907Symbol::stPlugInFail() {
 }
 
 void AsScene1907Symbol::moveUp() {
-	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteCallback(&AsScene1907Symbol::suMoveUp);
@@ -440,7 +440,7 @@ void AsScene1907Symbol::moveUp() {
 }
 
 void AsScene1907Symbol::moveDown() {
-	setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteCallback(&AsScene1907Symbol::suMoveDown);
@@ -513,8 +513,8 @@ AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm)
 	createSurface1(0x110A1061, 1500);
 	_x = 320;
 	_y = 240;
-	setFileHash(0x110A1061, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x110A1061, 0, -1);
+	_newStickFrameIndex = 0;
 	setVisible(false);
 	_needRefresh = true;
 	AnimatedSprite::updatePosition();
@@ -531,7 +531,7 @@ uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessagePa
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -539,7 +539,7 @@ uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessagePa
 
 void AsScene1907WaterHint::show() {
 	setVisible(true);
-	setFileHash(0x110A1061, 0, -1);
+	startAnimation(0x110A1061, 0, -1);
 	SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20);
 	NextState(&AsScene1907WaterHint::hide);
 }
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 9c0843c..bd22c7b 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -143,10 +143,10 @@ uint32 Scene2001::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (param.asInteger()) {
 			setRectList(0x004B3680);
-			_klayman->setKlaymanTable3();
+			_klayman->setKlaymanIdleTable3();
 		} else {
 			setRectList(0x004B3670);
-			_klayman->setKlaymanTable1();
+			_klayman->setKlaymanIdleTable1();
 		}
 	}	
 	return 0;
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 66f8631..c6de482 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -87,8 +87,8 @@ Class538::Class538(NeverhoodEngine *vm, bool flag)
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class538::handleMessage);
 	if (flag) {
-		setFileHash(0x0C202B9C, -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(0x0C202B9C, -1, -1);
+		_newStickFrameIndex = -2;
 	} else {
 		setVisible(false);
 	}
@@ -98,7 +98,7 @@ uint32 Class538::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		openDoor();
@@ -111,15 +111,15 @@ uint32 Class538::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 void Class538::openDoor() {
-	setFileHash(0x0C202B9C, 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(0x0C202B9C, 0, -1);
+	_newStickFrameIndex = -2;
 	setVisible(true);
 	_soundResource.play(calcHash("fxDoorOpen32"));
 }
 
 void Class538::closeDoor() {
-	setFileHash(0xC222A8D4, 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(0xC222A8D4, 0, -1);
+	_newStickFrameIndex = -2;
 	setVisible(true);
 	NextState(&Class538::hide);
 	_soundResource.play(calcHash("fxDoorClose32"));
@@ -145,7 +145,7 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity
 	case 0x2001:
 		_x = _klayman->getX();
 		_y = _klayman->getY() - 132;
-		setFileHash(0x0422255A, 0, -1);
+		startAnimation(0x0422255A, 0, -1);
 		setVisible(true);
 		break;
 	case 0x3002:
@@ -311,10 +311,10 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (param.asInteger() != 0) {
 			setRectList(0x004B9008);
-			_klayman->setKlaymanTable3();
+			_klayman->setKlaymanIdleTable3();
 		} else {
 			setRectList(0x004B8FF8);
-			_klayman->setKlaymanTable1();
+			_klayman->setKlaymanIdleTable1();
 		}
 		break;
 	case 0x480B:
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index ab1fac8..e886acc 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -407,7 +407,7 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
 	_x = 403;
 	_y = 259;
 	createSurface(100, 233, 96);
-	setFileHash(0x8600866, 0, -1);
+	startAnimation(0x8600866, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 }
 
@@ -421,12 +421,12 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *
 	SetUpdateHandler(&AsScene2201Door::update);
 	SetMessageHandler(&AsScene2201Door::handleMessage);
 	if (_doorOpen) {
-		setFileHash(0xE2CB0412, -1, -1);
+		startAnimation(0xE2CB0412, -1, -1);
 		_countdown = 48;
-		_newHashListIndex = -2;
+		_newStickFrameIndex = -2;
 	} else {
-		setFileHash(0xE2CB0412, 0, -1);
-		_newHashListIndex = 0;
+		startAnimation(0xE2CB0412, 0, -1);
+		_newStickFrameIndex = 0;
 		_doorLightSprite->setVisible(false);
 	}
 }
@@ -456,7 +456,7 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 		messageResult = _doorOpen ? 1 : 0;
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	case 0x4808:
 		_countdown = 144;
@@ -469,16 +469,16 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 
 void AsScene2201Door::stOpenDoor() {
 	_doorOpen = true;
-	setFileHash(0xE2CB0412, 0, -1);
-	_newHashListIndex = -2;
+	startAnimation(0xE2CB0412, 0, -1);
+	_newStickFrameIndex = -2;
 	_soundResource.play(calcHash("fxDoorOpen33"));
 }
 
 void AsScene2201Door::stCloseDoor() {
 	_doorOpen = false;
-	setFileHash(0xE2CB0412, -1, -1);
+	startAnimation(0xE2CB0412, -1, -1);
 	_playBackwards = true;
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 	_soundResource.play(calcHash("fxDoorClose33"));
 }
 
@@ -1064,11 +1064,11 @@ AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint i
 	_y = 240;
 	createSurface1(kAsScene2203DoorFileHashes[_index], 900);
 	if (getGlobalVar(0x9A500914) == _index) {
-		setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1);
-		_newHashListIndex = -2;
+		startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1);
+		_newStickFrameIndex = -2;
 	} else {
-		setFileHash(kAsScene2203DoorFileHashes[_index], 0, -1);
-		_newHashListIndex = 0;
+		startAnimation(kAsScene2203DoorFileHashes[_index], 0, -1);
+		_newStickFrameIndex = 0;
 	}
 }
 
@@ -1105,13 +1105,13 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 
 void AsScene2203Door::openDoor() {
 	_soundResource.play(0x341014C4);
-	setFileHash(kAsScene2203DoorFileHashes[_index], 1, -1);
+	startAnimation(kAsScene2203DoorFileHashes[_index], 1, -1);
 }
 
 void AsScene2203Door::closeDoor() {
-	setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1);
+	startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1);
 	_playBackwards = true;
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1592,7 +1592,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_klayman->setSoundFlag(true);
-	_klayman->setKlaymanTable2();
+	_klayman->setKlaymanIdleTable2();
 
 }
 
@@ -1706,11 +1706,11 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene
 	_x = pt.x;
 	_y = pt.y;
 	createSurface(1100, 129, 103);
-	setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0);
+	startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0);
 	SetUpdateHandler(&AsScene2207Elevator::update);
 	SetSpriteCallback(&AsScene2207Elevator::suSetPosition);
 	SetMessageHandler(&AsScene2207Elevator::handleMessage);
-	_newHashListIndex = 0;
+	_newStickFrameIndex = 0;
 }
 
 AsScene2207Elevator::~AsScene2207Elevator() {
@@ -1721,8 +1721,8 @@ void AsScene2207Elevator::update() {
 
 	if (_destPointIndex + _destPointIndexDelta > _pointIndex) {
 		_pointIndex++;
-		setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
-		_newHashListIndex = _pointIndex;		
+		startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
+		_newStickFrameIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
 			if (_destPointIndexDelta != 0) {
 				_destPointIndexDelta = 0;
@@ -1737,8 +1737,8 @@ void AsScene2207Elevator::update() {
 		_pointIndex--;
 		if (_pointIndex == 0)
 			sendMessage(_parentScene, 0x2003, 0);
-		setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
-		_newHashListIndex = _pointIndex;		
+		startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
+		_newStickFrameIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
 			if (_destPointIndexDelta != 0) {
 				_destPointIndexDelta = 0;
@@ -1817,8 +1817,8 @@ AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int1
 	SetMessageHandler(&AsScene2207Lever::handleMessage);
 	createSurface(1010, 71, 73);
 	setDoDeltaX(doDeltaX);
-	setFileHash(0x80880090, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x80880090, 0, -1);
+	_newStickFrameIndex = 0;
 	_x = x;
 	_y = y;
 }
@@ -1831,7 +1831,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 		messageResult = 1;
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		stopAnimation();
 		break;
 	case 0x4807:
@@ -1851,7 +1851,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 }
 
 void AsScene2207Lever::stLeverDown() {
-	setFileHash(0x80880090, 1, -1);
+	startAnimation(0x80880090, 1, -1);
 	FinalizeState(&AsScene2207Lever::stLeverDownEvent);
 	_soundResource.play(0x40581882);
 }
@@ -1861,7 +1861,7 @@ void AsScene2207Lever::stLeverDownEvent() {
 }
 
 void AsScene2207Lever::stLeverUp() {
-	setFileHash(0x80880090, 6, -1);
+	startAnimation(0x80880090, 6, -1);
 	FinalizeState(&AsScene2207Lever::stLeverUpEvent);
 	_playBackwards = true;
 	_soundResource.play(0x40581882);
@@ -1880,8 +1880,8 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm
 	createSurface1(0xCCFD6090, 100);
 	_x = 309;
 	_y = 320;
-	setFileHash(0xCCFD6090, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0xCCFD6090, 0, -1);
+	_newStickFrameIndex = 0;
 	_soundResource2.load(0x40330872);
 	_soundResource3.load(0x72A2914A);
 	_soundResource4.load(0xD4226080);
@@ -1923,7 +1923,7 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
 		stStopAnimation();
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -1933,7 +1933,7 @@ void AsScene2207WallRobotAnimation::stStartAnimation() {
 	if (!_idle) {
 		NextState(NULL);
 	} else {
-		setFileHash(0xCCFD6090, 0, -1);
+		startAnimation(0xCCFD6090, 0, -1);
 		_idle = false;
 		setVisible(true);
 	}
@@ -1962,8 +1962,8 @@ AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *
 	createSurface1(0x8CAA0099, 100);
 	_x = 309;
 	_y = 320;
-	setFileHash(0x8CAA0099, 0, -1);
-	_newHashListIndex = 0;
+	startAnimation(0x8CAA0099, 0, -1);
+	_newStickFrameIndex = 0;
 }
 
 uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1976,7 +1976,7 @@ uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const Messa
 		stStopAnimation();
 		break;
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -1987,7 +1987,7 @@ void AsScene2207WallCannonAnimation::stStartAnimation() {
 		NextState(NULL);
 	} else {
 		setVisible(true);
-		setFileHash(0x8CAA0099, 0, -1);
+		startAnimation(0x8CAA0099, 0, -1);
 		_idle = false;
 	}
 }
@@ -2593,7 +2593,7 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 	}
 
 	_klayman->setSoundFlag(true);
-	_klayman->setKlaymanTable2();
+	_klayman->setKlaymanIdleTable2();
 
 }
 
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 5823e4d..7975fcb 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -284,7 +284,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 		// TODO Sound1ChList_stop(0xDC2769B0);
 		break;
 	case 0x2002:
-		setFileHash(0x9C210C90, 0, -1);
+		startAnimation(0x9C210C90, 0, -1);
 		setVisible(true);
 		// TODO Sound1ChList_playLooping(0xDC2769B0);
 		break;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 783e616..8c5fd6c 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -639,7 +639,7 @@ AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm,
 }
 
 void AsScene3009VerticalIndicator::show() {
-	setFileHash(0xC2463913, 0, -1);
+	startAnimation(0xC2463913, 0, -1);
 	setVisible(true);
 	updatePosition();
 	_enabled = true;
@@ -705,7 +705,7 @@ void AsScene3009HorizontalIndicator::suMoveRight() {
 }
 
 void AsScene3009HorizontalIndicator::show() {
-	setFileHash(0xC0C12954, 0, -1);
+	startAnimation(0xC0C12954, 0, -1);
 	setVisible(true);
 	updatePosition();
 	_enabled = true;
@@ -729,8 +729,8 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene
 	_x = kAsScene3009SymbolPoints[_index].x;
 	_y = kAsScene3009SymbolPoints[_index].y;
 	createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200);
-	setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
-	_newHashListIndex = _symbolIndex;
+	startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+	_newStickFrameIndex = _symbolIndex;
 	_needRefresh = true;
 	updatePosition();
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -756,8 +756,8 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &para
 			else
 				_symbolIndex--;
 		}
-		setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
-		_newHashListIndex = _symbolIndex;
+		startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+		_newStickFrameIndex = _symbolIndex;
 		setSubVar(0x00000914, _index, _symbolIndex);
 		if (_index / 3 == 0) {
 			sendMessage(_parentScene, 0x2001, 0);
@@ -1162,11 +1162,11 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene
 
 	if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) {
 		createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200);
-		setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
+		startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 		_soundResource1.load(0x46005BC4);
 	} else {
 		createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200);
-		setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
+		startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
 		_soundResource1.load(0x420073DC);
 		_soundResource2.load(0x420073DC);
 	}
@@ -1193,7 +1193,7 @@ uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam &para
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		removeCallbacks();
+		gotoNextState();
 		break;
 	}
 	return messageResult;
@@ -1210,10 +1210,10 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) {
 	if (!_unlocked) {
 		setVisible(true);
 		if (skipAnim) {
-			setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0);
-			_newHashListIndex = -2;
+			startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0);
+			_newStickFrameIndex = -2;
 		} else {
-			setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
+			startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 			SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
 			FinalizeState(&AsScene3010DeadBolt::stIdleMessage);
 			NextState(&AsScene3010DeadBolt::stIdle);
@@ -1234,7 +1234,7 @@ void AsScene3010DeadBolt::lock() {
 	if (!_locked) {
 		_locked = true;
 		setVisible(true);
-		setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
+		startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
 		SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
 		FinalizeState(&AsScene3010DeadBolt::stDisabledMessage);
 		NextState(&AsScene3010DeadBolt::stIdle);
@@ -1253,7 +1253,7 @@ void AsScene3010DeadBolt::setCountdown(int count) {
 
 void AsScene3010DeadBolt::stDisabled() {
 	setVisible(true);
-	setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
+	startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 	SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
 	FinalizeState(&AsScene3010DeadBolt::stDisabledMessage);
 	NextState(&AsScene3010DeadBolt::stIdle);
@@ -1483,7 +1483,7 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
 
 void AsScene3011Symbol::show(bool flag) {
 	_flag2 = flag;
-	setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1);
+	startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1);
 	setVisible(true);
 	if (flag) {
 		_soundResource2.play();
@@ -1508,7 +1508,7 @@ void AsScene3011Symbol::stopSound() {
 void AsScene3011Symbol::change(int index, bool flag) {
 	_index = index;
 	_flag2 = flag;
-	setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1);
+	startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1);
 	setVisible(true);
 	if (flag) {
 		_soundResource2.play();
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 697bd6e..b68434b 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -223,26 +223,26 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface
 	createSurface1(fileHash, surfacePriority);
 	_x = x;
 	_y = y;
-	setFileHash(fileHash, 0, -1);
+	startAnimation(fileHash, 0, -1);
 }
 
 void AnimatedSprite::init() {
 	_name = "AnimatedSprite"; 
-	_counter = 0;
-	_fileHash1 = 0;
+	_currFrameTicks = 0;
+	_newAnimFileHash = 0;
 	_deltaX = 0;
 	_deltaY = 0;
-	_fileHash2 = 0;
+	_nextAnimFileHash = 0;
 	// TODO _callbackList = 0;
-	_frameIndex3 = 0;
-	_frameIndex = 0;
-	_hashListIndex = -1;
+	_plFirstFrameIndex = 0;
+	_currFrameIndex = 0;
+	_currStickFrameIndex = -1;
 	_finalizeStateCb = NULL;
 	_currStateCb = NULL;
 	_nextStateCb = NULL;
-	_newHashListIndex = -1;
-	_fileHash4 = 0;
-	_flag = false;
+	_newStickFrameIndex = -1;
+	_newStickFrameHash = 0;
+	_frameChanged = false;
 	_replOldColor = 0;
 	_replNewColor = 0;
 	_animResource.setReplEnabled(false);
@@ -285,24 +285,22 @@ void AnimatedSprite::clearRepl() {
 
 void AnimatedSprite::updateAnim() {
 
-	_flag = false;
+	_frameChanged = false;
 
-	if (_fileHash1 == 0) {
-		if (_newHashListIndex != -1) {
-			_hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex;
-			_newHashListIndex = -1;
-		} else if (_fileHash4 != 0) {
-			_hashListIndex = MAX<int16>(0, _animResource.getFrameIndex(_fileHash4));
-			_fileHash4 = 0;
+	if (_newAnimFileHash == 0) {
+		if (_newStickFrameIndex != -1) {
+			_currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex;
+			_newStickFrameIndex = -1;
+		} else if (_newStickFrameHash != 0) {
+			_currStickFrameIndex = MAX<int16>(0, _animResource.getFrameIndex(_newStickFrameHash));
+			_newStickFrameHash = 0;
 		}
-		if (_fileHash1 == 0 && _frameIndex != _hashListIndex) {
-			if (_counter != 0)
-				_counter--;
-			if (_counter == 0 && _animResource.getFrameCount() != 0) {
+		if (_newAnimFileHash == 0 && _currFrameIndex != _currStickFrameIndex) {
+			if (_currFrameTicks != 0 && (--_currFrameTicks == 0) && _animResource.getFrameCount() != 0) {
 				
-				if (_fileHash2 != 0) {
-					if (_animResource.loadInternal(_fileHash2)) {
-						_currAnimFileHash = _fileHash2;
+				if (_nextAnimFileHash != 0) {
+					if (_animResource.loadInternal(_nextAnimFileHash)) {
+						_currAnimFileHash = _nextAnimFileHash;
 					} else {
 						_animResource.loadInternal(calcHash("sqDefault"));
 						_currAnimFileHash = 0;
@@ -310,30 +308,30 @@ void AnimatedSprite::updateAnim() {
 					if (_replOldColor != _replNewColor) {
 						_animResource.setRepl(_replOldColor, _replNewColor);	
 					}
-					_fileHash2 = 0;
+					_nextAnimFileHash = 0;
 					if (_animStatus != 0) {
-						_frameIndex = _fileHash6 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash6)) : 0;
-						_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
+						_currFrameIndex = _plFirstFrameHash != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_plFirstFrameHash)) : 0;
+						_lastFrameIndex = _plLastFrameHash != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_plLastFrameHash)) : _animResource.getFrameCount() - 1;
 					} else {
-						_frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1;
-						_frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; 
+						_currFrameIndex = _plFirstFrameIndex != -1 ? _plFirstFrameIndex : _animResource.getFrameCount() - 1;
+						_lastFrameIndex = _plLastFrameIndex != -1 ? _plLastFrameIndex : _animResource.getFrameCount() - 1; 
 					}
 				} else {
 					updateFrameIndex();
 				}
-				if (_fileHash1 == 0)
+				if (_newAnimFileHash == 0)
 					updateFrameInfo();
 			}				
 		}
 	}
 	
-	if (_fileHash1 != 0) {
+	if (_newAnimFileHash != 0) {
 		if (_animStatus == 2) {
-			_hashListIndex = _frameIndex;
+			_currStickFrameIndex = _currFrameIndex;
 		} else {
 			if (_animStatus == 1) {
-				if (_animResource.loadInternal(_fileHash1)) {
-					_currAnimFileHash = _fileHash1;
+				if (_animResource.loadInternal(_newAnimFileHash)) {
+					_currAnimFileHash = _newAnimFileHash;
 				} else {
 					_animResource.loadInternal(calcHash("sqDefault"));
 					_currAnimFileHash = 0;
@@ -341,12 +339,12 @@ void AnimatedSprite::updateAnim() {
 				if (_replOldColor != _replNewColor) {
 					_animResource.setRepl(_replOldColor, _replNewColor);	
 				}
-				_fileHash1 = 0;
-				_frameIndex = _fileHash6 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash6)) : 0;
-				_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
+				_newAnimFileHash = 0;
+				_currFrameIndex = _plFirstFrameHash != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_plFirstFrameHash)) : 0;
+				_lastFrameIndex = _plLastFrameHash != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_plLastFrameHash)) : _animResource.getFrameCount() - 1;
 			} else {
-				if (_animResource.loadInternal(_fileHash1)) {
-					_currAnimFileHash = _fileHash1;
+				if (_animResource.loadInternal(_newAnimFileHash)) {
+					_currAnimFileHash = _newAnimFileHash;
 				} else {
 					_animResource.loadInternal(calcHash("sqDefault"));
 					_currAnimFileHash = 0;
@@ -354,19 +352,19 @@ void AnimatedSprite::updateAnim() {
 				if (_replOldColor != _replNewColor) {
 					_animResource.setRepl(_replOldColor, _replNewColor);	
 				}
-				_fileHash1 = 0;
-				_frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1;
-				_frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1;
+				_newAnimFileHash = 0;
+				_currFrameIndex = _plFirstFrameIndex != -1 ? _plFirstFrameIndex : _animResource.getFrameCount() - 1;
+				_lastFrameIndex = _plLastFrameIndex != -1 ? _plLastFrameIndex : _animResource.getFrameCount() - 1;
 			}
 			updateFrameInfo();
 		}
 
-		if (_newHashListIndex != -1) {
-			_hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex;
-			_newHashListIndex = -1;
-		} else if (_fileHash4 != 0) {
-			_hashListIndex = MAX<int16>(0, _animResource.getFrameIndex(_fileHash4));
-			_fileHash4 = 0;
+		if (_newStickFrameIndex != -1) {
+			_currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex;
+			_newStickFrameIndex = -1;
+		} else if (_newStickFrameHash != 0) {
+			_currStickFrameIndex = MAX<int16>(0, _animResource.getFrameIndex(_newStickFrameHash));
+			_newStickFrameHash = 0;
 		}
 
 	}
@@ -391,7 +389,7 @@ void AnimatedSprite::updatePosition() {
 	}
 
 	if (_needRefresh) {
-		_surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
+		_surface->drawAnimResource(_animResource, _currFrameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
 		_needRefresh = false;
 	}
 
@@ -399,46 +397,40 @@ void AnimatedSprite::updatePosition() {
 
 void AnimatedSprite::updateFrameIndex() {
 	if (!_playBackwards) {
-		if (_frameIndex < _frameIndex2) {
-			_frameIndex++;
+		if (_currFrameIndex < _lastFrameIndex) {
+			_currFrameIndex++;
 		} else {
 			// Inform self about end of current animation
 			// The caller can then e.g. set a new animation fileHash
 			sendMessage(this, 0x3002, 0);
-			if (_fileHash1 == 0)
-				_frameIndex = 0;
+			if (_newAnimFileHash == 0)
+				_currFrameIndex = 0;
 		}
 	} else {
-		if (_frameIndex > 0) {
-			_frameIndex--;
+		if (_currFrameIndex > 0) {
+			_currFrameIndex--;
 		} else {
 			sendMessage(this, 0x3002, 0);
-			if (_fileHash1 == 0)
-				_frameIndex = _frameIndex2;
+			if (_newAnimFileHash == 0)
+				_currFrameIndex = _lastFrameIndex;
 		}
 	}
 }
 
 void AnimatedSprite::updateFrameInfo() {
 	debug(8, "AnimatedSprite::updateFrameInfo()");
-
-	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex);
-	
-	_flag = true;
+	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_currFrameIndex);
+	_frameChanged = true;
 	_drawRect = frameInfo.rect;
 	_deltaX = frameInfo.deltaX;
 	_deltaY = frameInfo.deltaY;
 	_deltaRect = frameInfo.deltaRect;
-	_counter = frameInfo.counter;
-
+	_currFrameTicks = frameInfo.counter;
 	processDelta();
-
 	_needRefresh = true;
-
 	if (frameInfo.frameHash != 0) {
 		sendMessage(this, 0x100D, frameInfo.frameHash);
 	}
-
 }
 
 void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
@@ -446,44 +438,44 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
 	_surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height);
 }
 
-void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) {
-	debug(2, "AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4);
-	_fileHash1 = fileHash;
-	_frameIndex3 = frameIndex3;
-	_frameIndex4 = frameIndex4;
-	_fileHash4 = 0;
+void AnimatedSprite::startAnimation(uint32 fileHash, int16 plFirstFrameIndex, int16 plLastFrameIndex) {
+	debug(2, "AnimatedSprite::startAnimation(%08X, %d, %d)", fileHash, plFirstFrameIndex, plLastFrameIndex);
+	_newAnimFileHash = fileHash;
+	_plFirstFrameIndex = plFirstFrameIndex;
+	_plLastFrameIndex = plLastFrameIndex;
+	_newStickFrameHash = 0;
 	_animStatus = 0;
 	_playBackwards = false;
-	_newHashListIndex = -1;
-	_hashListIndex = -1;
+	_newStickFrameIndex = -1;
+	_currStickFrameIndex = -1;
 }
 
 void AnimatedSprite::stopAnimation() {
-	_fileHash1 = 1;
+	_newAnimFileHash = 1;
 	_animStatus = 2;
 }
 
-void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) {
-	debug(2, "AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5);
-	_fileHash1 = fileHash;
-	_fileHash6 = fileHash6;
-	_fileHash5 = fileHash5;
-	_fileHash4 = 0;
+void AnimatedSprite::startAnimationByHash(uint32 fileHash, uint32 plFirstFrameHash, uint32 plLastFrameHash) {
+	debug(2, "AnimatedSprite::startAnimationByHash(%08X, %08X, %08X)", fileHash, plFirstFrameHash, plLastFrameHash);
+	_newAnimFileHash = fileHash;
+	_plFirstFrameHash = plFirstFrameHash;
+	_plLastFrameHash = plLastFrameHash;
+	_newStickFrameHash = 0;
 	_animStatus = 1;
 	_playBackwards = false;
-	_newHashListIndex = -1;
-	_hashListIndex = -1;
+	_newStickFrameIndex = -1;
+	_currStickFrameIndex = -1;
 }
 
-void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5) {
-	_fileHash2 = fileHash2;
-	_fileHash6 = fileHash6;
-	_fileHash5 = fileHash5;
-	_fileHash4 = 0;
+void AnimatedSprite::nextAnimationByHash(uint32 fileHash2, uint32 plFirstFrameHash, uint32 plLastFrameHash) {
+	_nextAnimFileHash = fileHash2;
+	_plFirstFrameHash = plFirstFrameHash;
+	_plLastFrameHash = plLastFrameHash;
+	_newStickFrameHash = 0;
 	_animStatus = 1;
 	_playBackwards = false;
-	_newHashListIndex = -1;
-	_hashListIndex = -1;
+	_newStickFrameIndex = -1;
+	_currStickFrameIndex = -1;
 }
 
 void AnimatedSprite::setFinalizeState(AnimationCb finalizeStateCb) {
@@ -505,7 +497,7 @@ void AnimatedSprite::gotoState(AnimationCb currStateCb) {
 		(this->*_currStateCb)();
 }
 
-void AnimatedSprite::removeCallbacks() {
+void AnimatedSprite::gotoNextState() {
 	if (_finalizeStateCb) {
 		AnimationCb cb = _finalizeStateCb;
 		_finalizeStateCb = NULL;
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index aa22724..b9decef 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -121,32 +121,24 @@ public:
 	void setRepl(byte oldColor, byte newColor);
 	void clearRepl();
 	uint32 getCurrAnimFileHash() const { return _currAnimFileHash; }
-	int16 getFrameIndex() const { return _frameIndex; }
+	int16 getFrameIndex() const { return _currFrameIndex; }
 	int16 getFrameIndex(uint32 frameHash) { return _animResource.getFrameIndex(frameHash); }
-	void setNewHashListIndex(int value) { _newHashListIndex = value; }
-	void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4);
+	void setNewHashListIndex(int value) { _newStickFrameIndex = value; }
+	void startAnimation(uint32 fileHash, int16 plFirstFrameIndex, int16 plLastFrameIndex);
 protected:
 	typedef void (AnimatedSprite::*AnimationCb)();
 	AnimResource _animResource;
-	uint32 _currAnimFileHash;
-	uint32 _fileHash1;
-	uint32 _fileHash2;
-	int16 _frameIndex;
-	int16 _frameIndex3;
-	int16 _frameIndex2;
-	int16 _frameIndex4;
-	uint32 _fileHash6;
-	uint32 _fileHash5;
+	uint32 _currAnimFileHash, _newAnimFileHash, _nextAnimFileHash;
+	int16 _currFrameIndex, _lastFrameIndex;
+	int16 _plFirstFrameIndex, _plLastFrameIndex;
+	uint32 _plFirstFrameHash, _plLastFrameHash;
 	int16 _animStatus;
-	int16 _counter;
-	int _hashListIndex;
-	int _newHashListIndex;
-	uint32 _fileHash4;
+	int16 _currFrameTicks;
+	int _currStickFrameIndex, _newStickFrameIndex;
+	uint32 _newStickFrameHash;
 	int16 _deltaX, _deltaY;
-	byte _replOldColor;
-	byte _replNewColor;
-	bool _playBackwards;
-	bool _flag;
+	byte _replOldColor, _replNewColor;
+	bool _playBackwards, _frameChanged;
 	/* TODO
 	callbackListIndex dw ?
 	callbackListCount dw ?
@@ -166,11 +158,11 @@ protected:
 	void updateFrameInfo();
 	void createSurface1(uint32 fileHash, int surfacePriority);
 	void stopAnimation();
-	void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5);
-	void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5);
+	void startAnimationByHash(uint32 fileHash, uint32 plFirstFrameHash, uint32 plLastFrameHash);
+	void nextAnimationByHash(uint32 fileHash2, uint32 plFirstFrameHash, uint32 plLastFrameHash);
 	void setFinalizeState(AnimationCb finalizeStateCb);
 	void gotoState(AnimationCb currStateCb);
-	void removeCallbacks();
+	void gotoNextState();
 };
 
 } // End of namespace Neverhood


Commit: adb02a9f3800d7ef91d743ef38787f5fcd5ca332
    https://github.com/scummvm/scummvm/commit/adb02a9f3800d7ef91d743ef38787f5fcd5ca332
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:03-07:00

Commit Message:
NEVERHOOD: More renaming

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 95fe521..72f15a6 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -275,7 +275,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(1000, -1);
 #endif
-#if 0
+#if 1
 	_vm->gameState().sceneNum = 1;
 	createModule(1000, -1);
 #endif
@@ -296,7 +296,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 8;
 	createModule(2600, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 2358df4..bdc53d6 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -59,17 +59,17 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
 
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
-	_counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0),
-	_counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _flagE1(false),
-	_status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _isLeverDown(false),
-	_flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
+	_counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0),
+	_counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
+	_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
+	_flagFA(false), _ladderStatus(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
 	_x = x;
 	_y = y;
-	_x4 = x;
-	_y4 = y;
+	_destX = x;
+	_destY = y;
 	_flags = 2;
 	setKlaymanIdleTable1();
 	stTryStandIdle();
@@ -84,13 +84,13 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4818:
-		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	}
 	return 0;
@@ -123,7 +123,7 @@ void Klayman::setKlaymanIdleTable3() {
 }
 
 void Klayman::stDoIdlePickEar() {
-	sub41D320(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar));
+	startIdleAnimation(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar));
 }
 
 void Klayman::stIdlePickEar() {
@@ -154,7 +154,7 @@ void Klayman::evIdlePickEarDone() {
 }
 
 void Klayman::sub41FDA0() {
-	sub41D320(0xD122C137, AnimationCallback(&Klayman::sub41FDB0));
+	startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::sub41FDB0));
 }
 
 void Klayman::sub41FDB0() {
@@ -180,7 +180,7 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::sub41FDF0() {
-	sub41D320(0x543CD054, AnimationCallback(&Klayman::sub41FE00));
+	startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::sub41FE00));
 }
 
 void Klayman::sub41FE00() {
@@ -215,7 +215,7 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, E
 }
 
 void Klayman::stDoIdleChest() {
-	sub41D320(0x40A0C034, AnimationCallback(&Klayman::stIdleChest));
+	startIdleAnimation(0x40A0C034, AnimationCallback(&Klayman::stIdleChest));
 }
 
 void Klayman::stIdleChest() {
@@ -241,7 +241,7 @@ uint32 Klayman::hmIdleChest(int messageNum, const MessageParam &param, Entity *s
 }
 
 void Klayman::sub41FEB0() {
-	sub41D320(0x5120E137, AnimationCallback(&Klayman::sub41FEC0));
+	startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::sub41FEC0));
 }
 
 void Klayman::sub41FEC0() {
@@ -441,26 +441,26 @@ void Klayman::stGetUpFromTeleporter() {
 /////////////////////////////////////////////////////////////////
 
 void Klayman::sub41CE70() {
-	_x4 = _x;
-	if (!_flagE1 && !_flagE2 && !_flagE3) {
+	_destX = _x;
+	if (!_isWalking && !_isSneaking && !_isLargeStep) {
 		gotoState(NULL);
-		sub41C7B0();
+		gotoNextStateExt();
 	}
 }
 
-void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) {
+void Klayman::startIdleAnimation(uint32 fileHash, AnimationCb callback) {
 	_resourceHandle = _vm->_res->useResource(fileHash);
 	if (_resourceHandle != -1) {
 		// TODO _vm->_res->moveToFront(_resourceHandle);
 		NextState(callback);
-		SetUpdateHandler(&Klayman::update41D2B0);
+		SetUpdateHandler(&Klayman::upIdleAnimation);
 	}
 }
 
-void Klayman::update41D2B0() {
+void Klayman::upIdleAnimation() {
 	// TODO Check if this odd stuff is needed or just some cache optimization
 	if (_vm->_res->isResourceDataValid(_resourceHandle)) {
-		sub41C7B0();
+		gotoNextStateExt();
 		// TODO _vm->_res->moveToBack(_resourceHandle);
 		_vm->_res->unuseResource(_resourceHandle);
 		_resourceHandle = -1;
@@ -484,7 +484,7 @@ bool Klayman::stStartActionFromIdle(AnimationCb callback) {
 	return false;
 }
 
-void Klayman::sub41C7B0() {
+void Klayman::gotoNextStateExt() {
 	if (_finalizeStateCb) {
 		AnimationCb cb = _finalizeStateCb;
 		_finalizeStateCb = NULL;
@@ -559,7 +559,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		_attachedSprite = (Sprite*)(param.asEntity());
 		break;
 	case 0x1019:
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x101C:
 		sub41C770();
@@ -599,7 +599,7 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, E
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	}
 	return messageResult;
@@ -629,33 +629,33 @@ uint32 Klayman::hmStartAction(int messageNum, const MessageParam &param, Entity
 }
 
 
-void Klayman::sub41C930(int16 x, bool flag) {
+void Klayman::startWalkToX(int16 x, bool flag) {
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
-		_x4 = x;
-		if (!_flagE1 && !_flagE2 && !_flagE3) {
+		_destX = x;
+		if (!_isWalking && !_isSneaking && !_isLargeStep) {
 			gotoState(NULL);
-			sub41C7B0();
+			gotoNextStateExt();
 		}
-	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
-		_x4 = x;
+	} else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) {
+		_destX = x;
 		gotoState(NULL);
-		sub41C7B0();
+		gotoNextStateExt();
 	} else if (xdiff <= 42 && _status3 != 3) {
-		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
-			_x4 = x;
+		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
+			_destX = x;
 		} else {
-			_x4 = x;
+			_destX = x;
 			GotoState(&Klayman::stSneak);
 		}
-	} else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
-		_x4 = x;
+	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_destX = x;
 	} else if (flag) {
-		_x4 = x;
+		_destX = x;
 		error("// TODO AnimatedSprite_GotoState(&Klayman::sub421550));");
 		// TODO AnimatedSprite_GotoState(&Klayman::sub421550);
 	} else {
-		_x4 = x;
+		_destX = x;
 		GotoState(&Klayman::stStartWalking);
 	}
 }
@@ -701,14 +701,14 @@ bool Klayman::stStartAction(AnimationCb callback3) {
 		NextState(callback3);
 		return true;
 	} else {
-		_x = _x4;
+		_x = _destX;
 		return false;
 	}
 }
 
 void Klayman::spriteUpdate41F250() {
 
-	int16 xdiff = _x4 - _x;
+	int16 xdiff = _destX - _x;
 
 	if (_doDeltaX) {
 		_x -= _deltaX;
@@ -730,7 +730,7 @@ void Klayman::spriteUpdate41F250() {
 		else if (xdiff < -6)
 			_x -= 6;
 		else
-			_x = _x4;				
+			_x = _destX;				
 	}
 	
 	processDelta();
@@ -739,7 +739,7 @@ void Klayman::spriteUpdate41F250() {
 
 void Klayman::suWalking() {
 	
-	int16 xdiff = _x4 - _x;
+	int16 xdiff = _destX - _x;
 	
 	if (_currFrameIndex == 9) {
 		if (xdiff > 26)
@@ -754,7 +754,7 @@ void Klayman::suWalking() {
 		xdiff = -_deltaX;
 	_deltaX = 0;				
 
-	if (_x4 != _x) {
+	if (_destX != _x) {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdiff;
 		if (_field114) {
@@ -787,9 +787,9 @@ void Klayman::suWalking() {
 
 void Klayman::stSneak() {
 	_status2 = 1;
-	_flagE2 = true;
+	_isSneaking = true;
 	_acceptInput = true;
-	setDoDeltaX(_x4 < _x ? 1 : 0);
+	setDoDeltaX(_destX < _x ? 1 : 0);
 	startAnimation(0x5C48C506, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalking);
@@ -798,7 +798,7 @@ void Klayman::stSneak() {
 }
 
 void Klayman::stWalkingDone() {
-	_flagE2 = false;
+	_isSneaking = false;
 }
 
 uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
@@ -810,60 +810,36 @@ uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sen
 		} else if (param.asInteger() == 0x0A2A9098) {
 			_soundResource1.play(0x0A2AA8E0);
 		} else if (param.asInteger() == 0x32188010) {
-			if (_soundFlag) {
-				_soundResource1.play(0x48498E46);
-			} else {
-				_soundResource1.play(0x405002D8);
-			}
+			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x02A2909C) {
-			if (_soundFlag) {
-				_soundResource1.play(0x50399F64);
-			} else {
-				_soundResource1.play(0x0460E2FA);
-			}
+			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	case 0x3002:
-		_x = _x4;
-		sub41C7B0();
+		_x = _destX;
+		gotoNextStateExt();
 		break;
 	}
 	return messageResult;
 }
 
-void Klayman::sub41CD70(int16 x) {
-	if (x > _x) {
-		if (ABS(x - _x) <= 105) {
-			sub41CAC0(x);
-		} else {
-			sub41C930(x, false);
-		}
-	} else if (x == _x) {
-		_x4 = x;
-		gotoState(NULL);
-		sub41C7B0();
-	} else {
-		sub41C930(x, false);
-	}
-}
-
 void Klayman::stStartWalking() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) {
 		_status2 = 0;
-		_flagE1 = true;
+		_isWalking = true;
 		_acceptInput = true;
-		setDoDeltaX(_x4 < _x ? 1 : 0);
+		setDoDeltaX(_destX < _x ? 1 : 0);
 		startAnimation(0x242C0198, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteCallback(&Klayman::spriteUpdate41F320);
+		SetSpriteCallback(&Klayman::suWalkingTestExit);
 		FinalizeState(&Klayman::stStartWalkingDone);	
 		NextState(&Klayman::stWalking);
 	}
 }
 
 void Klayman::stStartWalkingDone() {
-	_flagE1 = false;
+	_isWalking = false;
 }
 
 uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity *sender) {
@@ -871,17 +847,9 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			if (_soundFlag) {
-				_soundResource1.play(0x48498E46);
-			} else {
-				_soundResource1.play(0x405002D8);
-			}
+			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			if (_soundFlag) {
-				_soundResource1.play(0x50399F64);
-			} else {
-				_soundResource1.play(0x0460E2FA);
-			}
+			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	}
@@ -890,7 +858,7 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity
 
 void Klayman::stWalking() {
 	_status2 = 0;
-	_flagE1 = true;
+	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, 0, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -901,7 +869,7 @@ void Klayman::stWalking() {
 }
 
 void Klayman::spriteUpdate41F300() {
-	SetSpriteCallback(&Klayman::spriteUpdate41F320);
+	SetSpriteCallback(&Klayman::suWalkingTestExit);
 	_deltaX = 0;
 }
 
@@ -910,17 +878,9 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			if (_soundFlag) {
-				_soundResource1.play(0x48498E46);
-			} else {
-				_soundResource1.play(0x405002D8);
-			}
+			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			if (_soundFlag) {
-				_soundResource1.play(0x50399F64);
-			} else {
-				_soundResource1.play(0x0460E2FA);
-			}
+			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	}
@@ -929,13 +889,13 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, E
 
 void Klayman::stUpdateWalking() {
 	if (_status3 == 2) {
-		sub41C7B0();
+		gotoNextStateExt();
 	} else if (_status3 == 3) {
 		stWalkingOpenDoor();
 	} else {
-		_flagE2 = true;
+		_isSneaking = true;
 		_acceptInput = true;
-		if (ABS(_x4 - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
+		if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
 			if (_status3 == 0) {
 				_status2 = 1;
 				startAnimation(0xF234EE31, 0, -1);
@@ -943,7 +903,7 @@ void Klayman::stUpdateWalking() {
 				_status2 = 2;
 				startAnimation(0xF135CC21, 0, -1);
 			}
-		} else if (ABS(_x4 - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
+		} else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
 			if (_status3 == 0) {
 				_status2 = 1;
 				startAnimation(0x8604A152, 0, -1);
@@ -959,9 +919,9 @@ void Klayman::stUpdateWalking() {
 	}
 }
 
-void Klayman::spriteUpdate41F320() {
-	int16 xdiff = ABS(_x4 - _x);
-	int16 xdelta = _x4 - _x;
+void Klayman::suWalkingTestExit() {
+	int16 xdiff = ABS(_destX - _x);
+	int16 xdelta = _destX - _x;
 	
 	if (xdelta > _deltaX)
 		xdelta = _deltaX;
@@ -970,15 +930,11 @@ void Klayman::spriteUpdate41F320() {
 		
 	_deltaX = 0;		
 
-	if (xdiff == 0) {
-		sendMessage(this, 0x1019, 0);
-	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
-		sendMessage(this, 0x1019, 0);
-	} else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
-		sendMessage(this, 0x1019, 0);
-	} else if (_status3 == 3 && xdiff < 30) {
-		sendMessage(this, 0x1019, 0);
-	} else if (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6) {
+	if (xdiff == 0 ||
+		(_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) ||
+		(_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) ||
+		(_status3 == 3 && xdiff < 30) ||
+		(_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
 		sendMessage(this, 0x1019, 0);
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
@@ -993,17 +949,9 @@ void Klayman::spriteUpdate41F320() {
 			} else if (hitRectNext->type == 0x5003) {
 				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
 			} else if (hitRectPrev->type == 0x5002) {
-				if (xdelta > 0) {
-					_y = hitRectPrev->rect.y2;
-				} else {
-					_y = hitRectPrev->rect.y1;
-				}
+				_y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
 			} else if (hitRectPrev->type == 0x5003) {
-				if (xdelta < 0) {
-					_y = hitRectPrev->rect.y2;
-				} else {
-					_y = hitRectPrev->rect.y1;
-				}
+				_y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
 			} else if (_flagF6 && xdelta != 0) {
 				if (hitRectNext->type == 0x5000) {
 					_y++;
@@ -1120,42 +1068,54 @@ void Klayman::stPressButtonSide() {
 	}
 }
 
-void Klayman::sub41CD00(int16 x) {
-	if (_x > x) {
-		if (_x - x <= 105) {
-			sub41CAC0(x);
-		} else {
-			sub41C930(x, false);
-		}
+void Klayman::startSpecialWalkRight(int16 x) {
+	if (_x == x) {
+		_destX = x;
+		gotoState(NULL);
+		gotoNextStateExt();
 	} else if (_x < x) {
-		sub41C930(x, false);
+		startWalkToX(x, false);
+	} else if (_x - x <= 105) {
+		sub41CAC0(x);
 	} else {
-		_x4 = x;
+		startWalkToX(x, false);
+	}
+}
+
+void Klayman::startSpecialWalkLeft(int16 x) {
+	if (x == _x) {
+		_destX = x;
 		gotoState(NULL);
-		sub41C7B0();
+		gotoNextStateExt();
+	} else if (x < _x) {
+		startWalkToX(x, false);
+	} else if (x - _x <= 105) {
+		sub41CAC0(x);
+	} else {
+		startWalkToX(x, false);
 	}
 }
 
 void Klayman::sub41CC40(int16 x1, int16 x2) {
 	if (_x > x1) {
 		if (_x == x1 + x2) {
-			_x4 = x1 + x2;
+			_destX = x1 + x2;
 			gotoState(NULL);
-			sub41C7B0();
+			gotoNextStateExt();
 		} else if (_x < x1 + x2) {
 			sub41CAC0(x1 + x2);
 		} else {
-			sub41C930(x1 + x2, false);
+			startWalkToX(x1 + x2, false);
 		}
 	} else {
 		if (_x == x1 - x2) {
-			_x4 = x1 - x2;
+			_destX = x1 - x2;
 			gotoState(NULL);
-			sub41C7B0();
+			gotoNextStateExt();
 		} else if (_x > x1 - x2) {
 			sub41CAC0(x1 - x2);
 		} else {
-			sub41C930(x1 - x2, false);
+			startWalkToX(x1 - x2, false);
 		}
 	}
 }
@@ -1163,35 +1123,35 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 void Klayman::sub41CAC0(int16 x) {
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
-		_x4 = x;
-		if (!_flagE1 && !_flagE2 && !_flagE3) {
+		_destX = x;
+		if (!_isWalking && !_isSneaking && !_isLargeStep) {
 			gotoState(NULL);
-			sub41C7B0();
+			gotoNextStateExt();
 		}
-	} else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) {
-		_x4 = x;
+	} else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) {
+		_destX = x;
 		gotoState(NULL);
-		sub41C7B0();
+		gotoNextStateExt();
 	} else if (xdiff <= 42 && _status3 != 3) {
-		if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) {
-			_x4 = x;
+		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
+			_destX = x;
 		} else {
-			_x4 = x;
+			_destX = x;
 			GotoState(&Klayman::stSneak);
 		}
-	} else if (_flagE3 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
-		_x4 = x;
+	} else if (_isLargeStep && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_destX = x;
 	} else {
-		_x4 = x;
+		_destX = x;
 		GotoState(&Klayman::stLargeStep);
 	}
 }
 
 void Klayman::stLargeStep() {
 	_status2 = 2;
-	_flagE3 = true;
+	_isLargeStep = true;
 	_acceptInput = true;
-	setDoDeltaX(_x4 >= _x ? 1 : 0);
+	setDoDeltaX(_destX >= _x ? 1 : 0);
 	startAnimation(0x08B28116, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLargeStep);
@@ -1200,11 +1160,11 @@ void Klayman::stLargeStep() {
 }
 
 void Klayman::stLargeStepDone() {
-	_flagE3 = false;
+	_isLargeStep = false;
 }
 
 void Klayman::suLargeStep() {
-	int16 xdiff = _x4 - _x;
+	int16 xdiff = _destX - _x;
 	
 	if (_doDeltaX) {
 		_deltaX = -_deltaX;
@@ -1219,7 +1179,7 @@ void Klayman::suLargeStep() {
 
 	_deltaX = 0;
 	
-	if (_x != _x4) {
+	if (_x != _destX) {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdiff;
 		if (_field114) {
@@ -1232,17 +1192,9 @@ void Klayman::suLargeStep() {
 			} else if (hitRectNext->type == 0x5003) {
 				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
 			} else if (hitRectPrev->type == 0x5002) {
-				if (xdiff > 0) {
-					_y = hitRectPrev->rect.y2;
-				} else {
-					_y = hitRectPrev->rect.y1;
-				}
+				_y = xdiff > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
 			} else if (hitRectPrev->type == 0x5003) {
-				if (xdiff < 0) {
-					_y = hitRectPrev->rect.y2;
-				} else {
-					_y = hitRectPrev->rect.y1;
-				}
+				_y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
 			}
 		}
 		processDelta();
@@ -1260,8 +1212,8 @@ uint32 Klayman::hmLargeStep(int messageNum, const MessageParam &param, Entity *s
 		}
 		break;
 	case 0x3002:
-		_x = _x4;
-		sub41C7B0();
+		_x = _destX;
+		gotoNextStateExt();
 		break;		
 	}
 	return messageResult;
@@ -1394,7 +1346,7 @@ uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam &param, Entity *
 
 void Klayman::spriteUpdate41F230() {
 	AnimatedSprite::updateDeltaXY();
-	_x4 = _x;
+	_destX = _x;
 }
 
 void Klayman::sub420340() {
@@ -1492,65 +1444,65 @@ void Klayman::sub41CCE0(int16 x) {
 void Klayman::stContinueClimbLadderUp() {
 	_status2 = 0;
 	_acceptInput = true;
-	_statusE0 = 3;
+	_ladderStatus = 3;
 	startAnimationByHash(0x3A292504, 0x01084280, 0);
 	_newStickFrameHash = 0x01084280;
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteCallback(NULL);
-	sub41C7B0();
+	gotoNextStateExt();
 }
 
-void Klayman::sub4209D0() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub4209D0))) {
+void Klayman::stStartClimbLadderDown() {
+	if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderDown))) {
 		_status2 = 0;
-		if (_y4 < _y) {
-			if (_statusE0 == 1) {
-				_statusE0 = 2;
-				sub420BC0();
+		if (_destY < _y) {
+			if (_ladderStatus == 1) {
+				_ladderStatus = 2;
+				stClimbLadderHalf();
 			} else {
-				sub41C7B0();
+				gotoNextStateExt();
 			}
-		} else if (_statusE0 == 0) {
-			_statusE0 = 2;
+		} else if (_ladderStatus == 0) {
+			_ladderStatus = 2;
 			_acceptInput = false;
 			startAnimation(0x122D1505, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		} else if (_statusE0 == 3) {
-			_statusE0 = 2;
-			_acceptInput = false;
+		} else if (_ladderStatus == 3) {
+			_ladderStatus = 2;
+			_acceptInput = true;
 			startAnimationByHash(0x122D1505, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		} else if (_statusE0 == 1) {
-			_statusE0 = 2;
+		} else if (_ladderStatus == 1) {
+			_ladderStatus = 2;
 			_acceptInput = true;
 			startAnimation(0x122D1505, 29 - _currFrameIndex, -1);
 		} 
 	}
 }
 
-void Klayman::sub420BC0() {
+void Klayman::stClimbLadderHalf() {
 	_status2 = 2;
-	if (_statusE0 == 1) {
-		_statusE0 = 0;
+	if (_ladderStatus == 1) {
+		_ladderStatus = 0;
 		_acceptInput = false;
 		startAnimationByHash(0x3A292504, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
-	} else if (_statusE0 == 1) {
-		_statusE0 = 0;
+	} else if (_ladderStatus == 2) {
+		_ladderStatus = 0;
 		_acceptInput = false;
 		startAnimationByHash(0x122D1505, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
 		SetSpriteCallback(&Klayman::spriteUpdate41F230);
 	} else {
-		sub41C7B0();
+		gotoNextStateExt();
 	}
 }
 
@@ -1572,7 +1524,7 @@ uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1583,19 +1535,14 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, E
 		} else if (param.asInteger() == 0x400A0E64) {
 			_soundResource1.play(0x50E081D9);
 		} else if (param.asInteger() == 0x02421405) {
-			if (_statusE0 == 1) {
+			if (_ladderStatus == 1) {
 				startAnimationByHash(0x3A292504, 0x01084280, 0);
-			} else {
-				startAnimationByHash(0x122D1505, 0x01084280, 0);
-			}
-			if (_statusE0 == 1) {
-				if (_y4 >= _y - 30) {
+				if (_destY >= _y - 30)
 					sendMessage(this, 0x1019, 0);
-				}
 			} else {
-				if (_y4 <= _y) {
+				startAnimationByHash(0x122D1505, 0x01084280, 0);
+				if (_destY <= _y)
 					sendMessage(this, 0x1019, 0);
-				}
 			}
 		}
 		break;
@@ -1603,27 +1550,27 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub420AD0() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420AD0))) {
+void Klayman::stStartClimbLadderUp() {
+	if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderUp))) {
 		_status2 = 0;
-		if (_y4 >= _y - 30) {
-			sub41C7B0();
-		} else if (_statusE0 == 0) {
-			_statusE0 = 1;
+		if (_destY >= _y - 30) {
+			gotoNextStateExt();
+		} else if (_ladderStatus == 0) {
+			_ladderStatus = 1;
 			_acceptInput = false;
 			startAnimation(0x3A292504, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		} else if (_statusE0 == 3) {
-			_statusE0 = 1;
+		} else if (_ladderStatus == 3) {
+			_ladderStatus = 1;
 			_acceptInput = true;
 			startAnimationByHash(0x3A292504, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::handleMessage41E0D0);
+			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
 			SetSpriteCallback(&Klayman::spriteUpdate41F230);
-		} else if (_statusE0 == 2) {
-			_statusE0 = 1;
+		} else if (_ladderStatus == 2) {
+			_ladderStatus = 1;
 			_acceptInput = true;
 			startAnimation(0x3A292504, 29 - _currFrameIndex, -1);
 		}
@@ -1648,17 +1595,9 @@ uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity
 		} else if (param.asInteger() == 0x110010D1) {
 			sendMessage(_parentScene, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
-			if (_soundFlag) {
-				_soundResource1.play(0x48498E46);
-			} else {
-				_soundResource1.play(0x405002D8);
-			}
+			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			if (_soundFlag) {
-				_soundResource1.play(0x50399F64);
-			} else {
-				_soundResource1.play(0x0460E2FA);
-			}
+			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	}
@@ -1792,7 +1731,7 @@ void Klayman::stReturnFromUse() {
 }
 
 void Klayman::stWalkingOpenDoor() {
-	_flagF8 = false;
+	_isWalkingOpenDoorNotified = false;
 	_acceptInput = false;
 	startAnimation(0x11A8E012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -1801,16 +1740,16 @@ void Klayman::stWalkingOpenDoor() {
 }
 
 void Klayman::suWalkingOpenDoor() {
-	if (!_flagF8 && ABS(_x4 - _x) < 80) {
+	if (!_isWalkingOpenDoorNotified && ABS(_destX - _x) < 80) {
 		sendMessage(_parentScene, 0x4829, 0);
-		_flagF8 = true;
+		_isWalkingOpenDoorNotified = true;
 	}
 	AnimatedSprite::updateDeltaXY();
 }
 
 void Klayman::stMoveObjectSkipTurnFaceObject() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	_flagE4 = false;
+	_isMoveObjectRequested = false;
 	_acceptInput = true;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
@@ -1829,7 +1768,7 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
 			if (_attachedSprite)
 				sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
 		} else if (param.asInteger() == 0x02421405) {
-			if (_flagE4 && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
+			if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
 				stMoveObjectSkipTurn();
 			} else {
 				FinalizeState(&Klayman::sub420660);
@@ -1842,14 +1781,14 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
 		}
 		break;
 	case 0x480A:
-		_flagE4 = true;
+		_isMoveObjectRequested = true;
 		return 0;		
 	}
 	return handleMessage41D480(messageNum, param, sender);
 }
 
 void Klayman::stMoveObjectSkipTurn() {
-	_flagE4 = false;
+	_isMoveObjectRequested = false;
 	_acceptInput = true;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
@@ -1861,7 +1800,7 @@ void Klayman::stMoveObjectFaceObject() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) {
 		_status2 = 2;
-		_flagE4 = false;
+		_isMoveObjectRequested = false;
 		_acceptInput = true;
 		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&Klayman::update);
@@ -1925,7 +1864,7 @@ void Klayman::stReleaseLever() {
 		_acceptInput = false;
 		_isLeverDown = false;
 	} else {
-		sub41C7B0();
+		gotoNextStateExt();
 	}
 }
 
@@ -1951,7 +1890,7 @@ void Klayman::stInsertDisk() {
 		}
 		if (_counter2 == 0) {
 			gotoState(NULL);
-			sub41C7B0();
+			gotoNextStateExt();
 		} else {
 			startAnimation(0xD8C8D100, 0, -1);
 			SetUpdateHandler(&Klayman::update);
@@ -2001,7 +1940,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -2027,7 +1966,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		// TODO: It's not really a point but an x1/x2 pair
@@ -2052,7 +1991,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4836:
 		if (param.asInteger() == 1) {
@@ -2061,10 +2000,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;		
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -2125,7 +2064,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004: 
 		GotoState(&Klayman::stTryStandIdle);
@@ -2169,7 +2108,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:				  
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481B:				
 		sub41CCE0(param.asInteger());
@@ -2180,17 +2119,17 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4821:	
 		sendMessage(_parentScene, 0x2005, 0);
-		_y4 = param.asInteger();
-		GotoState(&Klayman::sub4209D0);	 
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderDown);	 
 		break;
 	case 0x4822:  
 		sendMessage(_parentScene, 0x2005, 0);
-		_y4 = param.asInteger();
-		GotoState(&Klayman::sub420AD0);	 
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderUp);	 
 		break;
 	case 0x4823:
 		sendMessage(_parentScene, 0x2006, 0);
-		GotoState(&Klayman::sub420BC0);	 
+		GotoState(&Klayman::stClimbLadderHalf);	 
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
@@ -2207,10 +2146,10 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;
 	case 0x4840: 
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -2295,18 +2234,13 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX);
-			}
+			sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX);
 		} else if (param.asInteger() == 0x02421405) {
-			if (_flagE4) {
-				if (_attachedSprite) {
-					if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) {
-						stContinueMovingVenusFlyTrap();
-					}
-				}
+			if (_isMoveObjectRequested) {
+				if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0)
+					stContinueMovingVenusFlyTrap();
 			} else {
-				SetMessageHandler(&KmScene1002::handleMessage449BA0);
+				SetMessageHandler(&KmScene1002::hmFirstMoveVenusFlyTrap);
 			}
 		} else if (param.asInteger() == 0x4AB28209) {
 			sendMessage(_attachedSprite, 0x482A, 0);
@@ -2319,13 +2253,13 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
 		}
 		break;
 	case 0x480A:
-		_flagE4 = true;
+		_isMoveObjectRequested = true;
 		return 0;
 	}
 	return handleMessage41D480(messageNum, param, sender);
 }
 
-uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2433,7 +2367,7 @@ void KmScene1002::sub449F70() {
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
 	_acceptInput = false;
-	_flagE1 = false;
+	_isWalking = false;
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteCallback(NULL);
@@ -2477,7 +2411,7 @@ void KmScene1002::sub44A150() {
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
 	_acceptInput = false;
-	_flagE1 = false;
+	_isWalking = false;
 	startAnimationByHash(0x0013A206, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
@@ -2550,7 +2484,7 @@ void KmScene1002::stHitByBoxingGloveDone() {
 void KmScene1002::stMoveVenusFlyTrap() {
 	if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) {
 		_status2 = 2;
-		_flagE4 = false;
+		_isMoveObjectRequested = false;
 		_acceptInput = true;
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		startAnimation(0x5C01A870, 0, -1);
@@ -2562,7 +2496,7 @@ void KmScene1002::stMoveVenusFlyTrap() {
 }
 
 void KmScene1002::stContinueMovingVenusFlyTrap() {
-	_flagE4 = false;
+	_isMoveObjectRequested = false;
 	_acceptInput = true;
 	startAnimationByHash(0x5C01A870, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
@@ -2587,17 +2521,17 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4818:
-		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x481E:
 		GotoState(&KmScene1004::stReadNote);
@@ -2608,36 +2542,36 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4821:
 		sendMessage(_parentScene, 0x2000, 0);
-		_y4 = param.asInteger();
-		GotoState(&Klayman::sub4209D0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderDown);
 		break;
 	case 0x4822:
 		sendMessage(_parentScene, 0x2000, 0);
-		_y4 = param.asInteger();
-		GotoState(&Klayman::sub420AD0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderUp);
 		break;
 	case 0x4823:
 		sendMessage(_parentScene, 0x2001, 0);
-		GotoState(&Klayman::sub420BC0);
+		GotoState(&Klayman::stClimbLadderHalf);
 		break;
 	case 0x4824:
 		sendMessage(_parentScene, 0x2000, 0);
-		_y4 = _dataResource.getPoint(param.asInteger()).y;
-		GotoState(&Klayman::sub4209D0);
+		_destY = _dataResource.getPoint(param.asInteger()).y;
+		GotoState(&Klayman::stStartClimbLadderDown);
 		break;
 	case 0x4825:
 		sendMessage(_parentScene, 0x2000, 0);
-		_y4 = _dataResource.getPoint(param.asInteger()).y;
-		GotoState(&Klayman::sub420AD0);
+		_destY = _dataResource.getPoint(param.asInteger()).y;
+		GotoState(&Klayman::stStartClimbLadderUp);
 		break;
 	case 0x4828:
 		GotoState(&Klayman::stTurnToBackToUse);
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -2678,7 +2612,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
@@ -2688,7 +2622,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&Klayman::stWalking);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -2696,7 +2630,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter)
@@ -2775,7 +2709,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -2802,7 +2736,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -2822,13 +2756,13 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -2836,7 +2770,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 
 void KmScene1201::update40DBE0() {
 	if (_x >= 380)
-		sub41C7B0();
+		gotoNextStateExt();
 	Klayman::update();		
 }
 
@@ -3059,7 +2993,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3075,7 +3009,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3094,10 +3028,10 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -3113,7 +3047,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3123,7 +3057,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	}
 	return 0;
@@ -3159,7 +3093,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
@@ -3187,7 +3121,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481A:
 		GotoState(&Klayman::stInsertDisk);		
@@ -3226,7 +3160,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1) {
@@ -3262,10 +3196,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub417D80();
 		break;																				
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return messageResult;
@@ -3312,7 +3246,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3338,7 +3272,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481A:
 		if (param.asInteger() == 1) {
@@ -3367,10 +3301,10 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -3425,7 +3359,7 @@ void KmScene1308::sub456150() {
 		}
 		if (!_flag1) {
 			gotoState(NULL);
-			sub41C7B0();
+			gotoNextStateExt();
 		} else {
 			_acceptInput = false;
 			startAnimation(0xDC409440, 0, -1);
@@ -3449,7 +3383,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3472,7 +3406,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3492,7 +3426,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1) {
@@ -3524,7 +3458,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3538,7 +3472,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3569,7 +3503,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3595,7 +3529,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3608,10 +3542,10 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -3629,7 +3563,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -3652,7 +3586,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481A:
 		GotoState(&Klayman::stInsertDisk);		
@@ -3685,13 +3619,13 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -3708,7 +3642,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
@@ -3727,7 +3661,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3759,7 +3693,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4834:
 		GotoState(&Klayman::stStepOver);
@@ -3775,10 +3709,10 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -3801,7 +3735,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter) {
@@ -3824,7 +3758,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -3941,14 +3875,14 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481D:
 		GotoState(&Klayman::stTurnToUse);
@@ -3958,13 +3892,13 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -3983,7 +3917,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter) {
@@ -3994,7 +3928,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&Klayman::stWalking);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -4002,7 +3936,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter) {
@@ -4084,7 +4018,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
@@ -4115,7 +4049,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4232,7 +4166,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -4247,10 +4181,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4818:
-		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4267,7 +4201,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
@@ -4284,10 +4218,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;	
@@ -4302,7 +4236,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -4327,10 +4261,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x4818:
-		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4819:
 		GotoState(&Klayman::stClayDoorOpen);
@@ -4353,13 +4287,13 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -4378,14 +4312,14 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&KmScene2205::sub423980);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -4398,16 +4332,16 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x4818:
-		sub41C930(_dataResource.getPoint(param.asInteger()).x, false);
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -4418,7 +4352,7 @@ void KmScene2205::sub423980() {
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
-	_flagE1 = true;
+	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -4446,7 +4380,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -4456,7 +4390,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&KmScene2206::sub482530);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -4480,7 +4414,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4504,7 +4438,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
@@ -4524,10 +4458,10 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		sub41CE70();
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -4536,9 +4470,8 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 void KmScene2206::spriteUpdate482450() {
 	_yDelta++;
 	_y += _yDelta;
-	if (_y > 600) {
+	if (_y > 600)
 		sendMessage(this, 0x1019, 0);
-	}
 }
 
 void KmScene2206::sub482490() {
@@ -4560,7 +4493,7 @@ void KmScene2206::sub482530() {
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
-	_flagE1 = true;
+	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -4586,7 +4519,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
@@ -4608,7 +4541,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4622,13 +4555,13 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x483F:
-		sub41CD00(param.asInteger());
+		startSpecialWalkRight(param.asInteger());
 		break;		
 	case 0x4840:
-		sub41CD70(param.asInteger());
+		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
 	return 0;
@@ -4704,14 +4637,14 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&KmScene2242::sub444D20);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -4728,7 +4661,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0) {
@@ -4752,7 +4685,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4837:
 		sub41CE70();
@@ -4766,7 +4699,7 @@ void KmScene2242::sub444D20() {
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
-	_flagE1 = true;
+	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -4789,14 +4722,14 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&KmHallOfRecords::sub43B130);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -4804,7 +4737,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481F:
 		if (param.asInteger() == 0) {
@@ -4821,7 +4754,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4837:
 		sub41CE70();
@@ -4835,7 +4768,7 @@ void KmHallOfRecords::sub43B130() {
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
-	_flagE1 = true;
+	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -4858,14 +4791,14 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41C930(param.asPoint().x, false);
+		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
-			_x4 = param.asInteger();
+			_destX = param.asInteger();
 			GotoState(&KmScene2247::sub453520);
 		} else {
 			GotoState(&Klayman::stPeekWall);
@@ -4873,7 +4806,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
-		sub41C7B0();
+		gotoNextStateExt();
 		break;		
 	case 0x481F:
 		if (param.asInteger() == 0) {
@@ -4890,7 +4823,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		sub41C7B0();
+		gotoNextStateExt();
 		break;
 	case 0x4837:
 		sub41CE70();
@@ -4904,7 +4837,7 @@ void KmScene2247::sub453520() {
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
-	_flagE1 = true;
+	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3b8ee69..c19e884 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -75,9 +75,9 @@ public:
 	void stReleaseRing();
 	void stJumpToRing4();
 	void stContinueClimbLadderUp();
-	void sub4209D0();
-	void sub420BC0();
-	void sub420AD0();
+	void stStartClimbLadderDown();
+	void stClimbLadderHalf();
+	void stStartClimbLadderUp();
 	void stWalkToFrontNoStep();
 	void stWalkToFront();
 	void stTurnToFront();
@@ -122,7 +122,7 @@ public:
 	void spriteUpdate41F230();
 	void suWalkingOpenDoor();
 	void spriteUpdate41F300();
-	void spriteUpdate41F320();
+	void suWalkingTestExit();
 
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
@@ -139,20 +139,20 @@ public:
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
-	int _statusE0;
-	bool _flagE1;
-	bool _flagE2;
-	bool _flagE3;
-	bool _flagE4;
+	int _ladderStatus;
+	bool _isWalking;
+	bool _isSneaking;
+	bool _isLargeStep;
+	bool _isMoveObjectRequested;
 	bool _acceptInput;
-	int16 _x4, _y4;
+	int16 _destX, _destY;
 	int16 _counter, _counterMax;
 	int16 _counter3, _counter3Max;
 	int16 _counter1;
 	int16 _counter2;
 	bool _flagF6;
 	bool _isLeverDown;
-	bool _flagF8;
+	bool _isWalkingOpenDoorNotified;
 	int _status2;
 	bool _flagFA;
 	SoundResource _soundResource1;
@@ -187,11 +187,11 @@ protected:
 	void sub41FEC0();
 	uint32 handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender);
 
-	void sub41D320(uint32 fileHash, AnimationCb callback);
-	void update41D2B0();
+	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
+	void upIdleAnimation();
 
 	bool stStartActionFromIdle(AnimationCb callback);
-	void sub41C7B0();
+	void gotoNextStateExt();
 	void sub41C770();
 	void sub41C790();
 	
@@ -202,7 +202,7 @@ protected:
 	
 	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
 
-	void sub41C930(int16 x, bool flag);
+	void startWalkToX(int16 x, bool flag);
 
 	uint32 hmSleeping(int messageNum, const MessageParam &param, Entity *sender);
 	
@@ -211,7 +211,7 @@ protected:
 	void stSneak();
 	void stWalkingDone();
 	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
-	void sub41CD70(int16 x);
+	void startSpecialWalkLeft(int16 x);
 	void stStartWalking();
 	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
 
@@ -219,7 +219,7 @@ protected:
 	
 	uint32 hmPressButton(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub41CD00(int16 x);
+	void startSpecialWalkRight(int16 x);
 	void sub41CC40(int16 x1, int16 x2);
 	void sub41CAC0(int16 x);
 	void sub41CCE0(int16 x);
@@ -232,7 +232,7 @@ protected:
 	uint32 hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmHoldRing(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41E0D0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender);
@@ -271,7 +271,7 @@ protected:
 	uint32 handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage449BA0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender);
 	void suFallDown();


Commit: f43b54827e543aa28701cbb1b2d46643802cbb16
    https://github.com/scummvm/scummvm/commit/f43b54827e543aa28701cbb1b2d46643802cbb16
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:03-07:00

Commit Message:
NEVERHOOD: Some renaming in Module1000

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index ea1400e..2ee98ac 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -120,7 +120,7 @@ AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
 	createSurface(800, 137, 242);
 	_x = 726;
 	_y = 440;
-	callback1();
+	stShowIdleDoor();
 	_soundResource2.load(0xED403E03);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1001Door::handleMessage);
@@ -130,7 +130,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param,
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
-		handleMessage2000h();
+		hammerHitsDoor();
 		break;
 	case 0x3002:
 		gotoNextState();
@@ -139,18 +139,18 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param,
 	return 0;
 }
 
-void AsScene1001Door::handleMessage2000h() {
+void AsScene1001Door::hammerHitsDoor() {
 	switch (getGlobalVar(0x52371C95)) {
 	case 0:
 	case 1:
 		_soundResource1.play(0x65482F03);
 		startAnimation(0x624C0498, 1, 3);
-		NextState(&AsScene1001Door::callback1);		
+		NextState(&AsScene1001Door::stShowIdleDoor);		
 		break;
 	case 2:
 		_soundResource2.play();
 		startAnimation(0x624C0498, 6, 6);
-		NextState(&AsScene1001Door::callback2);		
+		NextState(&AsScene1001Door::stBustedDoorMove);		
 		break;
 	default:
 		// Nothing
@@ -159,7 +159,7 @@ void AsScene1001Door::handleMessage2000h() {
 	incGlobalVar(0x52371C95, 1);
 }
 
-void AsScene1001Door::callback1() {
+void AsScene1001Door::stShowIdleDoor() {
 	switch (getGlobalVar(0x52371C95)) {
 	case 1:
 		startAnimation(0x624C0498, 4, -1);
@@ -180,14 +180,14 @@ void AsScene1001Door::callback1() {
 	}
 }
 
-void AsScene1001Door::callback2() {
+void AsScene1001Door::stBustedDoorMove() {
 	setGlobalVar(0xD217189D, 1);
 	startAnimation(0x624C0498, 6, 6);
-	NextState(&AsScene1001Door::callback3);
+	NextState(&AsScene1001Door::stBustedDoorGone);
 	_x = 30;
 }
 
-void AsScene1001Door::callback3() {
+void AsScene1001Door::stBustedDoorGone() {
 	_soundResource1.play();
 	stopAnimation();
 	setVisible(false);	
@@ -330,7 +330,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 }
 		
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) {
+	: Scene(vm, parentModule, true) {
 
 	_name = "Scene1001";
 
@@ -505,15 +505,15 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f
 		createSurface(990, 68, 314);
 		if (flag2) {
 			startAnimation(0x04103090, 0, -1);
-			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
 		} else {
 			startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
-			SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
+			SetMessageHandler(&AsScene1002Ring::hmRingIdle);
 		}
 	} else {
 		createSurface(990, 68, 138);
 		startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
-		SetMessageHandler(&AsScene1002Ring::handleMessage4475E0);
+		SetMessageHandler(&AsScene1002Ring::hmRingIdle);
 	}
 
 	setClipRect(0, clipY1, 640, 480);
@@ -530,13 +530,13 @@ void AsScene1002Ring::update() {
 	AnimatedSprite::updatePosition();
 }
 
-uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4806:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
 		sendMessage(_parentScene, 0x4806, 0);
-		SetMessageHandler(&AsScene1002Ring::handleMessage447760);
+		SetMessageHandler(&AsScene1002Ring::hmRingPulled1);
 		if (_flag1) {
 			startAnimation(0x87502558, 0, -1);
 		} else {
@@ -546,7 +546,7 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &
 	case 0x480F:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
 		sendMessage(_parentScene, 0x480F, 0);
-		SetMessageHandler(&AsScene1002Ring::handleMessage447890);
+		SetMessageHandler(&AsScene1002Ring::hmRingPulled2);
 		startAnimation(0x861A2020, 0, -1);
 		break;
 	case 0x482A:
@@ -559,23 +559,23 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		if (_flag1) {
 			startAnimation(0x78D0A812, 0, -1);
-			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
 		} else {
 			startAnimation(0xB85D2A10, 0, -1);
-			SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
 		}
 		break;
 	case 0x4807:
 		sendMessage(_parentScene, 0x4807, 0);
 		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
 		startAnimation(0x8258A030, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
+		SetMessageHandler(&AsScene1002Ring::hmRingReleased);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -587,12 +587,12 @@ uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		startAnimation(0x04103090, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::handleMessage447930);
+		SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -604,14 +604,14 @@ uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4807:
 		sendMessage(_parentScene, 0x4807, 0);
 		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
 		startAnimation(0x8258A030, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::handleMessage447A00);
+		SetMessageHandler(&AsScene1002Ring::hmRingReleased);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -623,8 +623,8 @@ uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage4475E0(messageNum, param, sender);
+uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmRingIdle(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x05410F72) {
@@ -715,16 +715,16 @@ void AsScene1002Door::suCloseDoor() {
 	}
 }
 
-Class505::Class505(NeverhoodEngine *vm)
+AsScene1002BoxingGloveHitEffect::AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1400) {
 
 	createSurface(1025, 88, 165);
 	setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class505::handleMessage);	
+	SetMessageHandler(&AsScene1002BoxingGloveHitEffect::handleMessage);	
 }
 
-uint32 Class505::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2004:
@@ -741,39 +741,39 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505)
-	: AnimatedSprite(vm, 1300), _rect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _class505(class505),
+AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect)
+	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(AsScene1002BoxingGloveHitEffect),
 	_soundResource(vm) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
-	SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0);
+	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
+	SetSpriteCallback(&AsScene1002DoorSpy::suDoorSpy);
 	createSurface(800, 136, 147);
 	setClipRect(clipRect);
-	spriteUpdate448AA0();
+	suDoorSpy();
 	_soundResource.load(0xC0C40298);
 	startAnimation(0x586C1D48, 0, 0);
 }
 
-uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xA61CA1C2) {
-			sendMessage(_class505, 0x2004, 0);
+			sendMessage(_asBoxingGloveHitEffect, 0x2004, 0);
 		} else if (param.asInteger() == 0x14CE0620) {
 			_soundResource.play();
 		}
 		break;
 	case 0x2003:
-		sub448B10();
+		stDoorSpyBoxingGlove();
 		break;
 	}
 	return messageResult;
 }
 
-uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage4489D0(messageNum, param, sender);
+uint32 AsScene1002DoorSpy::hmDoorSpyAnimation(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		gotoNextState();
@@ -782,24 +782,24 @@ uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessagePara
 	return messageResult;
 }
 
-void AsScene1002DoorSpy::spriteUpdate448AA0() {
+void AsScene1002DoorSpy::suDoorSpy() {
 	_x = _asDoor->getX() + 34;
 	_y = _asDoor->getY() + 175;
 }
 
-void AsScene1002DoorSpy::sub448AC0() {
-	setClipRect(_rect);
+void AsScene1002DoorSpy::stDoorSpyIdle() {
+	setClipRect(_clipRect);
 	_parentScene->setSurfacePriority(getSurface(), 800);
 	startAnimation(0x586C1D48, 0, 0);
-	SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0);
+	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
 }
 
-void AsScene1002DoorSpy::sub448B10() {
+void AsScene1002DoorSpy::stDoorSpyBoxingGlove() {
 	setClipRect(0, 0, 640, 480);
 	_parentScene->setSurfacePriority(getSurface(), 1200);
 	startAnimation(0x586C1D48, 1, -1);
-	SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60);
-	NextState(&AsScene1002DoorSpy::sub448AC0);
+	SetMessageHandler(&AsScene1002DoorSpy::hmDoorSpyAnimation);
+	NextState(&AsScene1002DoorSpy::stDoorSpyIdle);
 }
 
 Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
@@ -908,7 +908,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 	createSurface(995, 175, 195);
 
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
 	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
 
 	if (!_flag) {
@@ -916,19 +916,19 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 			setDoDeltaX(1);
 			_x = 366;
 			_y = 435;
-			sub4485F0();
+			stRingGrabbed();
 		} else {
 			_x = 174 + getGlobalVar(0x1B144052) * 32;
 			_y = 435;
-			sub448660();
+			stIdle();
 		}
 	} else {
 		_x = 186 + getGlobalVar(0x86341E88) * 32;
 		_y = 364;
 		if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) {
-			sub4485F0();
+			stRingGrabbed();
 		} else {
-			sub448660();
+			stIdle();
 		} 
 	}
 	
@@ -942,7 +942,7 @@ void AsScene1002VenusFlyTrap::update() {
 	AnimatedSprite::update();
 }
 
-void AsScene1002VenusFlyTrap::update447FB0() {
+void AsScene1002VenusFlyTrap::upIdle() {
 	if (_countdown == 0 && _klayman->getX() - 20 > _x) {
 		setDoDeltaX(1);
 	} else if (_klayman->getX() + 20 < _x) {
@@ -951,7 +951,7 @@ void AsScene1002VenusFlyTrap::update447FB0() {
 	update();
 }
 
-uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -978,15 +978,15 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
 		if (!_flag) {
 			if (getGlobalVar(0x8306F218)) {
-				sub448560();
+				stRelease();
 			} else {
-				sub448530();
+				stWalk();
 			}
 		} else {
 			if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) {
-				sub448560();
+				stRelease();
 			} else {
-				sub448530();
+				stWalk();
 			}
 		}
 		break;
@@ -1005,11 +1005,11 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 		break;
 	case 0x480E:
 		if (param.asInteger() == 1) {
-			sub4485B0();
+			stGrabRing();
 		}
 		break;
 	case 0x4810:
-		sub448780();
+		swallowKlayman();
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 995);
@@ -1021,8 +1021,8 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag
 	return messageResult;
 }
 
-uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage448000(messageNum, param, sender);
+uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		gotoNextState();
@@ -1031,7 +1031,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const Messag
 	return messageResult;
 }
 
-uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1066,87 +1066,87 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag
 	return messageResult;
 }
 
-void AsScene1002VenusFlyTrap::sub4484F0() {
+void AsScene1002VenusFlyTrap::stWalkBack() {
 	setDoDeltaX(2);
 	startAnimation(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-	NextState(&AsScene1002VenusFlyTrap::sub448660);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
+	NextState(&AsScene1002VenusFlyTrap::stIdle);
 }
 
-void AsScene1002VenusFlyTrap::sub448530() {
+void AsScene1002VenusFlyTrap::stWalk() {
 	startAnimation(0xC4080034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
-	NextState(&AsScene1002VenusFlyTrap::sub448660);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
+	NextState(&AsScene1002VenusFlyTrap::stIdle);
 }
 
-void AsScene1002VenusFlyTrap::sub448560() {
+void AsScene1002VenusFlyTrap::stRelease() {
 	sendMessage(_parentScene, 0x4807, 0);
 	startAnimation(0x82292851, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
-	NextState(&AsScene1002VenusFlyTrap::sub448660);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
+	NextState(&AsScene1002VenusFlyTrap::stIdle);
 }
 
-void AsScene1002VenusFlyTrap::sub4485B0() {
+void AsScene1002VenusFlyTrap::stGrabRing() {
 	setDoDeltaX(1);
 	startAnimation(0x86A82A11, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0);
-	NextState(&AsScene1002VenusFlyTrap::sub4485F0);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
+	NextState(&AsScene1002VenusFlyTrap::stRingGrabbed);
 }
 
-void AsScene1002VenusFlyTrap::sub4485F0() {
+void AsScene1002VenusFlyTrap::stRingGrabbed() {
 	startAnimation(0xB5A86034, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
 }
 
-void AsScene1002VenusFlyTrap::sub448620() {
+void AsScene1002VenusFlyTrap::stKlaymanInside() {
 	startAnimation(0x31303094, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(NULL);
-	NextState(&AsScene1002VenusFlyTrap::sub448720);
+	NextState(&AsScene1002VenusFlyTrap::stKlaymanInsideMoving);
 	_countdown = 24;
 }
 
-void AsScene1002VenusFlyTrap::sub448660() {
+void AsScene1002VenusFlyTrap::stIdle() {
 	startAnimation(0xC8204250, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update447FB0);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000);
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
 	if (_flag) {
 		if (_x >= 154 && _x <= 346) {
 			setGlobalVar(0x86341E88, (_x - 186) / 32);
 		} else {
-			NextState(&AsScene1002VenusFlyTrap::sub4484F0);
+			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
 			_countdown = 12;
 		}
 	} else {
 		if (_x >= 174 && _x <= 430) {
 			setGlobalVar(0x1B144052, (_x - 174) / 32);
 		} else {
-			NextState(&AsScene1002VenusFlyTrap::sub4484F0);
+			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
 			_countdown = 12;
 		}
 	}
 }
 
-void AsScene1002VenusFlyTrap::sub448720() {
+void AsScene1002VenusFlyTrap::stKlaymanInsideMoving() {
 	startAnimation(0x152920C4, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-	NextState(&AsScene1002VenusFlyTrap::sub448750);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
+	NextState(&AsScene1002VenusFlyTrap::stSpitOutKlayman);
 }
 
-void AsScene1002VenusFlyTrap::sub448750() {
+void AsScene1002VenusFlyTrap::stSpitOutKlayman() {
 	startAnimation(0x84001117, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-	NextState(&AsScene1002VenusFlyTrap::sub448660);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
+	NextState(&AsScene1002VenusFlyTrap::stIdle);
 }
 
-void AsScene1002VenusFlyTrap::sub448780() {
+void AsScene1002VenusFlyTrap::swallowKlayman() {
 	if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) {
 		if (_flag) {
 			setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0);
@@ -1156,12 +1156,12 @@ void AsScene1002VenusFlyTrap::sub448780() {
 		sendMessage(_klayman, 0x2001, 0);
 		startAnimation(0x8C2C80D4, 0, -1);
 		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-		SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320);
-		NextState(&AsScene1002VenusFlyTrap::sub448620);
+		SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
+		NextState(&AsScene1002VenusFlyTrap::stKlaymanInside);
 	}
 }
 
-Class506::Class506(NeverhoodEngine *vm)
+AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1200), _countdown(0) {
 
 	createSurface(850, 186, 212);
@@ -1173,38 +1173,38 @@ Class506::Class506(NeverhoodEngine *vm)
 	} else {
 		setVisible(false);
 	}
-	SetUpdateHandler(&Class506::update);
-	SetMessageHandler(&Class506::handleMessage4491B0);	
+	SetUpdateHandler(&AsScene1002OutsideDoorBackground::update);
+	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);	
 }
 
-void Class506::update() {
+void AsScene1002OutsideDoorBackground::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		if (_flag) {
-			sub449280();
+		if (_isDoorClosed) {
+			stCloseDoor();
 		} else {
-			sub449250();
+			stOpenDoor();
 		}
 	}
 	AnimatedSprite::update();
 }
 
-uint32 Class506::handleMessage4491B0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageResult) {
 	case 0x4808:
-		_flag = false;
+		_isDoorClosed = false;
 		_countdown = 2;
 		break;
 	case 0x4809:
-		_flag = true;
+		_isDoorClosed = true;
 		_countdown = 2;
 		break;
 	}
 	return messageResult;
 }
 
-uint32 Class506::handleMessage449210(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage4491B0(messageNum, param, sender);
+uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage(messageNum, param, sender);
 	switch (messageResult) {
 	case 0x3002:
 		gotoNextState();
@@ -1213,45 +1213,45 @@ uint32 Class506::handleMessage449210(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-void Class506::sub449250() {
+void AsScene1002OutsideDoorBackground::stOpenDoor() {
 	startAnimation(0x004A4495, 0, -1);
-	SetMessageHandler(&Class506::handleMessage4491B0);
+	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);
 	_newStickFrameIndex = -2;
 	setVisible(true);
 }
 
-void Class506::sub449280() {
+void AsScene1002OutsideDoorBackground::stCloseDoor() {
 	startAnimation(0x004A4495, -1, -1);
 	_playBackwards = true;
-	SetMessageHandler(&Class506::handleMessage449210);
-	NextState(&Class506::sub4492C0);
+	SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation);
+	NextState(&AsScene1002OutsideDoorBackground::stDoorClosed);
 	setVisible(true);
 }
 
-void Class506::sub4492C0() {
+void AsScene1002OutsideDoorBackground::stDoorClosed() {
 	setVisible(false);
 	stopAnimation();
 }
 
-Class478::Class478(NeverhoodEngine *vm, Klayman *klayman)
+AsScene1002KlaymanLadderHands::AsScene1002KlaymanLadderHands(NeverhoodEngine *vm, Klayman *klayman)
 	: AnimatedSprite(vm, 1200), _klayman(klayman) {
 	
 	createSurface(1200, 40, 163);
-	SetUpdateHandler(&Class478::update);
+	SetUpdateHandler(&AsScene1002KlaymanLadderHands::update);
 	SetMessageHandler(&Sprite::handleMessage);
 	setVisible(false);
 }
 
-void Class478::update() {
+void AsScene1002KlaymanLadderHands::update() {
 	if (_klayman->getCurrAnimFileHash() == 0x3A292504) {
-		startAnimation(0xBA280522, _currFrameIndex, -1);
+		startAnimation(0xBA280522, _klayman->getFrameIndex(), -1);
 		_newStickFrameIndex = _klayman->getFrameIndex();
 		setVisible(true);
 		_x = _klayman->getX(); 
 		_y = _klayman->getY(); 
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
 	} else if (_klayman->getCurrAnimFileHash() == 0x122D1505) {
-		startAnimation(0x1319150C, _currFrameIndex, -1);
+		startAnimation(0x1319150C, _klayman->getFrameIndex(), -1);
 		_newStickFrameIndex = _klayman->getFrameIndex();
 		setVisible(true);
 		_x = _klayman->getX(); 
@@ -1263,17 +1263,17 @@ void Class478::update() {
 	AnimatedSprite::update();
 }
 
-Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman)
+AsScene1002KlaymanPeekHand::AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman)
 	: AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman),
-	_flag1(false) {
+	_isClipRectSaved(false) {
 	
-	SetUpdateHandler(&Class479::update);
-	SetMessageHandler(&Class479::handleMessage);
+	SetUpdateHandler(&AsScene1002KlaymanPeekHand::update);
+	SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage);
 	createSurface(1000, 33, 41);
 	setVisible(false);
 }
 
-void Class479::update() {
+void AsScene1002KlaymanPeekHand::update() {
 	if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) {
 		startAnimation(0x9820C913, _klayman->getFrameIndex(), -1);
 		_newStickFrameIndex = _klayman->getFrameIndex();
@@ -1287,20 +1287,19 @@ void Class479::update() {
 	AnimatedSprite::update();
 }
 
-uint32 Class479::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
 			sendMessage(_parentScene, 0x1022, 1200);
-			_flag1 = true;
+			_isClipRectSaved = true;
 			_savedClipRect = _surface->getClipRect();
 			setClipRect(0, 0, 640, 480);
 		} else if (param.asInteger() == 0x88001184) {
 			sendMessage(_parentScene, 0x1022, 1000);
-			if (_flag1) {
+			if (_isClipRectSaved)
 				setClipRect(_savedClipRect);
-			}
 		}
 		break;
 	}
@@ -1339,41 +1338,41 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
 			insertKlayman<KmScene1002>(90, 226, _class599, _ssLadderArch);
-			_class478 = insertSprite<Class478>(_klayman);
+			_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
-			_class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
+			_asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
 			insertKlayman<KmScene1002>(379, 435, _class599, _ssLadderArch);
-			_class478 = insertSprite<Class478>(_klayman);
+			_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-			_class478->setClipRect(_klayman->getClipRect());
+			_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		}
 	} else if (which == 1) {
 		insertKlayman<KmScene1002>(650, 435, _class599, _ssLadderArch);
-		_class478 = insertSprite<Class478>(_klayman);
+		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4478);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-		_class478->setClipRect(_klayman->getClipRect());
+		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
 		insertKlayman<KmScene1002>(68, 645, _class599, _ssLadderArch);
-		_class478 = insertSprite<Class478>(_klayman);
+		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4298);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-		_class478->setClipRect(_klayman->getClipRect());
+		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
 		insertKlayman<KmScene1002>(90, 226, _class599, _ssLadderArch);
-		_class478 = insertSprite<Class478>(_klayman);
+		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4470);
 		_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
-		_class478->setClipRect(_klayman->getClipRect());
-		_class479 = insertSprite<Class479>(this, _klayman);
-		_class479->setClipRect(_klayman->getClipRect());
+		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
+		_asKlaymanPeekHand = insertSprite<AsScene1002KlaymanPeekHand>(this, _klayman);
+		_asKlaymanPeekHand->setClipRect(_klayman->getClipRect());
 		_klayman->setRepl(64, 0);
 		_vm->_gameState.field2 = 0;
 	}
@@ -1391,7 +1390,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _class599->getDrawRect().y, false);
 
 	_asDoor = insertSprite<AsScene1002Door>(tempClipRect);
-	tempSprite = insertSprite<Class505>();
+	tempSprite = insertSprite<AsScene1002BoxingGloveHitEffect>();
 	_asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
 	_class426 = insertSprite<Class426>(this, 0x00412692, 0x140B60BE, 800, 0);
 	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, false);
@@ -1399,7 +1398,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 
-	_class506 = insertSprite<Class506>();
+	_asOutsideDoorBackground = insertSprite<AsScene1002OutsideDoorBackground>();
 								  
 	setRectList(0x004B43A0);
 
@@ -1415,7 +1414,7 @@ void Scene1002::update() {
 	Scene::update();
 	if (!_flag1B4 && _klayman->getY() > 230) {
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-		_class478->setClipRect(_klayman->getClipRect());
+		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		deleteSprite(&_ssLadderArchPart3);
 		_klayman->clearRepl();
 		_flag1B4 = true;
@@ -1430,7 +1429,6 @@ void Scene1002::update() {
 }
 
 uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Scene1002::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -1525,7 +1523,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource2.play();
 			sendMessage(_asDoor, 0x4808, 0);
-			sendMessage(_class506, 0x4808, 0);
+			sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		} else if (sender == _asRing4) {
 			setGlobalVar(0x4DE80AC0, 0);
 			_soundResource1.play(0xE0558848);
@@ -1538,7 +1536,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _asRing3) {
 			_soundResource3.play();
 			sendMessage(_asDoor, 0x4809, 0);
-			sendMessage(_class506, 0x4809, 0);
+			sendMessage(_asOutsideDoorBackground, 0x4809, 0);
 		} else if (sender == _asVenusFlyTrap) {
 			if (getGlobalVar(0x8306F218)) {
 				sendMessage(_asRing3, 0x4807, 0);
@@ -1552,7 +1550,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		setGlobalVar(0x4DE80AC0, 0);
 		_soundResource2.play();
 		sendMessage(_asDoor, 0x4808, 0);
-		sendMessage(_class506, 0x4808, 0);
+		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		break;				
 	}	
 	return messageResult;
@@ -1561,7 +1559,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 // Class152
 
 Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
-	: Scene(vm, parentModule, true), _fieldD0(-1), _fieldD2(-1) {
+	: Scene(vm, parentModule, true) {
 
 	_surfaceFlag = false;
 
@@ -1576,9 +1574,8 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
 			leaveScene(0);
-		}
 		break;
 	}
 	return 0;
@@ -1656,7 +1653,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	updatePaletteArea();
 	
-	_class478 = insertSprite<Class478>(_klayman);
+	_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 
 	insertStaticSprite(0x800034A0, 1100);
 	insertStaticSprite(0x64402020, 1100);
@@ -1664,7 +1661,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x0E002004, 1300);
 	
 	_klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480);
-	_class478->setClipRect(_klayman->getClipRect());
+	_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 
 	_asTrashCan = insertSprite<AsScene1004TrashCan>();
 
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 47b1a91..702f538 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -50,10 +50,10 @@ protected:
 	SoundResource _soundResource1;	
 	SoundResource _soundResource2;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void handleMessage2000h();
-	void callback1();
-	void callback2();
-	void callback3();
+	void hammerHitsDoor();
+	void stShowIdleDoor();
+	void stBustedDoorMove();
+	void stBustedDoorGone();
 };
 
 class AsScene1001Hammer : public AnimatedSprite {
@@ -104,8 +104,6 @@ protected:
 	Sprite *_asWindow;
 	Sprite *_asLever;
 	Sprite *_ssButton;
-	int16 _fieldE4;
-	int16 _fieldE6;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -115,9 +113,6 @@ class Class152 : public Scene {
 public:
 	Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash);
 protected:
-	// TODO: Are these used?
-	int16 _fieldD0;	
-	int16 _fieldD2;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -147,11 +142,11 @@ protected:
 	bool _flag1;
 	SoundResource _soundResource;
 	void update();
-	uint32 handleMessage4475E0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage447760(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage447890(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage447930(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage447A00(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRingIdle(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRingPulled2(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRingHangingLow(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRingReleased(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene1002Door : public StaticSprite {
@@ -164,27 +159,27 @@ protected:
 	void suCloseDoor();
 };
 
-class Class505 : public AnimatedSprite {
+class AsScene1002BoxingGloveHitEffect : public AnimatedSprite {
 public:
-	Class505(NeverhoodEngine *vm);
+	AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene1002DoorSpy : public AnimatedSprite {
 public:
-	AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505);
+	AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect);
 protected:
 	Scene *_parentScene;
 	Sprite *_asDoor;
-	Sprite *_class505;
+	Sprite *_asBoxingGloveHitEffect;
 	SoundResource _soundResource;
-	NRect _rect;
-	uint32 handleMessage4489D0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage448A60(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate448AA0();
-	void sub448AC0();
-	void sub448B10();
+	NRect _clipRect;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmDoorSpyAnimation(int messageNum, const MessageParam &param, Entity *sender);
+	void suDoorSpy();
+	void stDoorSpyIdle();
+	void stDoorSpyBoxingGlove();
 };
 
 class Class426 : public StaticSprite {
@@ -212,51 +207,51 @@ protected:
 	SoundResource _soundResource;
 	bool _flag;
 	void update();
-	void update447FB0();
-	uint32 handleMessage448000(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage4482E0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage448320(int messageNum, const MessageParam &param, Entity *sender);
-	void sub4484F0();
-	void sub448530();
-	void sub448560();
-	void sub4485B0();
-	void sub4485F0();
-	void sub448620();
-	void sub448660();
-	void sub448720();
-	void sub448750();
-	void sub448780();
+	void upIdle();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmAnimationSimple(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmAnimationExt(int messageNum, const MessageParam &param, Entity *sender);
+	void stWalkBack();
+	void stWalk();
+	void stRelease();
+	void stGrabRing();
+	void stRingGrabbed();
+	void stKlaymanInside();
+	void stIdle();
+	void stKlaymanInsideMoving();
+	void stSpitOutKlayman();
+	void swallowKlayman();
 };
 
-class Class506 : public AnimatedSprite {
+class AsScene1002OutsideDoorBackground : public AnimatedSprite {
 public:
-	Class506(NeverhoodEngine *vm);
+	AsScene1002OutsideDoorBackground(NeverhoodEngine *vm);
 protected:
 	int _countdown;
-	bool _flag;
+	bool _isDoorClosed;
 	void update();
-	uint32 handleMessage4491B0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage449210(int messageNum, const MessageParam &param, Entity *sender);
-	void sub449250();
-	void sub449280();
-	void sub4492C0();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmAnimation(int messageNum, const MessageParam &param, Entity *sender);
+	void stOpenDoor();
+	void stCloseDoor();
+	void stDoorClosed();
 };
 
-class Class478 : public AnimatedSprite {
+class AsScene1002KlaymanLadderHands : public AnimatedSprite {
 public:
-	Class478(NeverhoodEngine *vm, Klayman *klayman);
+	AsScene1002KlaymanLadderHands(NeverhoodEngine *vm, Klayman *klayman);
 protected:
 	Klayman *_klayman;
 	void update();
 };
 
-class Class479 : public AnimatedSprite {
+class AsScene1002KlaymanPeekHand : public AnimatedSprite {
 public:
-	Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman);
+	AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman);
 protected:
 	Scene *_parentScene;
 	Klayman *_klayman;
-	bool _flag1;
+	bool _isClipRectSaved;
 	NRect _savedClipRect;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -280,9 +275,9 @@ protected:
 	Sprite *_ssLadderArchPart2;
 	Sprite *_ssLadderArchPart3;
 	Sprite *_class599;
-	Sprite *_class478;
-	Sprite *_class479;
-	Sprite *_class506;
+	Sprite *_asKlaymanLadderHands;
+	Sprite *_asKlaymanPeekHand;
+	Sprite *_asOutsideDoorBackground;
 	Sprite *_class426;
 	SoundResource _soundResource1;
 	SoundResource _soundResource2;
@@ -308,7 +303,7 @@ class Scene1004 : public Scene {
 public:
 	Scene1004(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_class478;
+	Sprite *_asKlaymanLadderHands;
 	Sprite *_asTrashCan;
 	int _paletteAreaStatus;
 	void update();
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index f1f4bab..7fa6fb0 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -200,7 +200,8 @@ void NeverhoodEngine::dumpAllResources() {
 
 	PaletteResource paletteResource(this);
 	byte *vgaPalette = new byte[768];
-	paletteResource.load(0x4086520E);
+	//paletteResource.load(0x4086520E);
+	paletteResource.load(0x12C23307);
 	byte *srcpalette = paletteResource.palette();
 	for (int i = 0; i < 256; i++) {
 		vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0];
@@ -236,8 +237,6 @@ void NeverhoodEngine::dumpAllResources() {
 				writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height);
 				delete[] pixels;
 			}
-			static int n = 0;
-			//if (n++ == 25) break;
 		}
 	}
 	


Commit: 5465e6fe6429e10e0f6848f6edb48f07a233a22d
    https://github.com/scummvm/scummvm/commit/5465e6fe6429e10e0f6848f6edb48f07a233a22d
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-05-08T11:40:03-07:00

Commit Message:
NEVERHOOD: Pack the KlaymanIdleTableItem struct

Changed paths:
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index c19e884..7b8b42e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -36,11 +36,15 @@ class Klayman;
 
 const uint32 kKlaymanSpeedUpHash = 0x004A2148;
 
+#include "common/pack-start.h"	// START STRUCT PACKING
+
 struct KlaymanIdleTableItem {
 	int value;
 	void (Klayman::*callback)();
 };
 
+#include "common/pack-end.h"	// END STRUCT PACKING
+
 class Klayman : public AnimatedSprite {
 public:
 	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);


Commit: 4f35989ac452f0b742e86357fb13f33668df1358
    https://github.com/scummvm/scummvm/commit/4f35989ac452f0b742e86357fb13f33668df1358
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-05-08T11:40:03-07:00

Commit Message:
NEVERHOOD: Minor renaming, avoid mixing variables with their types

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module1900.cpp
    engines/neverhood/module1900.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 2ee98ac..2eb8a67 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -741,8 +741,8 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess
 	return messageResult;
 }
 
-AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect)
-	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(AsScene1002BoxingGloveHitEffect),
+AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect)
+	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect),
 	_soundResource(vm) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 702f538..b8fa636 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -168,7 +168,7 @@ protected:
 
 class AsScene1002DoorSpy : public AnimatedSprite {
 public:
-	AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect);
+	AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect);
 protected:
 	Scene *_parentScene;
 	Sprite *_asDoor;
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index e9be86a..f91513f 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -448,8 +448,8 @@ void AsScene1907Symbol::moveDown() {
 	_isMoving = true;
 }
 
-SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol)
-	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _AsScene1907Symbol(AsScene1907Symbol),
+SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol)
+	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol),
 	_countdown1(0) {
 	
 	_spriteResource.load2(0x64516424);
@@ -484,7 +484,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (_countdown1 == 0 && !_AsScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) {
+		if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) {
 			setVisible(true);
 			_countdown1 = 4;
 			StaticSprite::update();
diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h
index 7b41c57..2eadd06 100644
--- a/engines/neverhood/module1900.h
+++ b/engines/neverhood/module1900.h
@@ -107,13 +107,13 @@ protected:
 
 class SsScene1907UpDownButton : public StaticSprite {
 public:
-	SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol);
+	SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol);
 	void setToUpPosition();
 	void setToDownPosition();
 protected:
 	SoundResource _soundResource;
 	Scene1907 *_parentScene;
-	AsScene1907Symbol *_AsScene1907Symbol;
+	AsScene1907Symbol *_asScene1907Symbol;
 	int _countdown1;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);


Commit: 13efdceb9eb96c98ce279e78d92ca43772219479
    https://github.com/scummvm/scummvm/commit/13efdceb9eb96c98ce279e78d92ca43772219479
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:04-07:00

Commit Message:
NEVERHOOD: Add TODO

Changed paths:
  A engines/neverhood/todo.txt



diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt
new file mode 100644
index 0000000..abf8f27
--- /dev/null
+++ b/engines/neverhood/todo.txt
@@ -0,0 +1,42 @@
+NOTE:
+-------
+Some of the TODOs should be done AFTER the whole game logic is implemented
+else the game disasm and reimplemtation code become even more different
+(unless I decide it's ok to do it :) 
+
+TODOs which can be done any time:
+-----------------------------------
+- Give placeholder stuff (e.g. sub?????, _flag??? etc.) better fitting names
+- Use CursorMan for the mouse cursor (instead of using it like a normal sprite)
+	- This whould make it neccessary to call _system->updateScreen more often else 
+		the mouse movement would be choppy
+- Cleanup
+- Clean up staticdata structs to look more like the ones in create_neverhood
+	(e.g. by using template classes etc.)
+	- Or use a common base class and manage all stuff in one single table and cast stuff accordingly 
+
+TODOs which should be done only after the game logic is finished:
+-------------------------------------------------------------------
+- Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary
+- Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors)
+	- Should be just a handle object which initializes itself
+	- Play routine should fill the handle so it can be stopped/queried later
+	- Basically like ScummVM own sound handles
+- Rework the resource system
+	- The current system can be simplified a lot
+	- Also resource purging needs to be implemented
+- RE and implement yet unknown music/sound stuff
+- Implement game menus
+- Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes)
+	- This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included
+	- The move special scenes (SmackerScene) into the scenes file
+- Maybe merge CollisionMan with Scene (since it's so far never used independently)
+
+TODOs which are experimental:
+-------------------------------
+NOTE: Since they affect the whole game, they really should be only implemented once the full game logic is implemented.
+These are nothing more than wild ideas for now, any might never be implemented. 
+- Use states instead of separate callback methods
+- Try to move more stuff to neverhood.dat
+- Try to use more template functions instead of manually creating functions
+	(Can be coupled with the above to move parameters to the dat and only use IDs)


Commit: 2e94464a8a1e76507c72903dfafb970a244b6326
    https://github.com/scummvm/scummvm/commit/2e94464a8a1e76507c72903dfafb970a244b6326
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:04-07:00

Commit Message:
NEVERHOOD: Start with Module2800 and add Scene2801

Changed paths:
  A engines/neverhood/module2800.cpp
  A engines/neverhood/module2800.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk



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


Commit: 88bfe5d0766e4592cd414c1980eda9287c51035e
    https://github.com/scummvm/scummvm/commit/88bfe5d0766e4592cd414c1980eda9287c51035e
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-05-08T11:40:04-07:00

Commit Message:
NEVERHOOD: Added a FIXME

Changed paths:
    engines/neverhood/module1000.cpp



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 2eb8a67..176708b 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1042,6 +1042,8 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara
 				if (_x > 330) {
 					sendMessage(_klayman, 0x4811, 2);
 				} else if (_x > 265) {
+					// FIXME: This check is the same as the one below.
+					// Perhaps the third parameter should be 1 here?
 					sendMessage(_klayman, 0x4811, 0);
 				} else {
 					sendMessage(_klayman, 0x4811, 0);


Commit: 8613ff3a9dd0ad36c9d695c48ceb16a23e92e346
    https://github.com/scummvm/scummvm/commit/8613ff3a9dd0ad36c9d695c48ceb16a23e92e346
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:04-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2801

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 2534bce..514912c 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -112,6 +112,10 @@ static const uint32 rectListOffsets[] = {
 	// Scene2247
 	1, 0x004B5588,
 	1, 0x004B55C8,
+	// Scene2801
+	1, 0x004B6CE0,
+	1, 0x004B6CD0,
+	1, 0x004B6CF0,
 	0, 0
 };
 
@@ -377,6 +381,12 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B54C0,
 	5, 0x004B54E0,
 	5, 0x004B5508,
+	// Scene2801
+	1, 0x004B6BB8,
+	1, 0x004B6BC0,
+	1, 0x004B6C10,
+	1, 0x004B6BB0,
+	2, 0x004B6C40,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 946b19a..72f35a6 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 8172d679df5148a4a32f46074b20cb6caf91844f
    https://github.com/scummvm/scummvm/commit/8172d679df5148a4a32f46074b20cb6caf91844f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:40:44-07:00

Commit Message:
NEVERHOOD: Add scene create/update handling in Module2800

Changed paths:
    engines/neverhood/module2800.cpp



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 3a86e29..eded442 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -62,6 +62,20 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_stop(0xD2FA4D14, 0, 0);
 		_childObject = new Scene2801(_vm, this, which);
 		break;
+	case 1:
+		// TODO Music18hList_stop(0xD2FA4D14, 0, 0);
+#if 0		
+		_flag = true; // DEBUG!
+		if (_flag) {
+			_childObject = new Scene2802(_vm, this, which);
+		} else {
+			_childObject = new Class152(_vm, this, 0x000C6444, 0xC6440008);
+		}
+#endif		
+		break;
+	//		
+	case 1001:
+		break;
 	// TODO ...		
 	}
 	SetUpdateHandler(&Module2800::updateScene);
@@ -83,12 +97,25 @@ void Module2800::updateScene() {
 				leaveModule(0);
 			}
 			break;
+		case 1:
+			if (_moduleResult == 0) {
+				createScene(0, 2);
+			} else {
+				createScene(1001, -1);
+			}
+			break;
+		//		
+		case 1001:
+			break;
 		}
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			// TODO Module2800_sub4731E0(true);
 			break;
+		case 1:
+			// TODO Module2800_sub4731E0(false);
+			break;
 		}
 	}
 }


Commit: 9c2341678ef4984bf92b3878295250faf980b066
    https://github.com/scummvm/scummvm/commit/9c2341678ef4984bf92b3878295250faf980b066
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-05-08T11:40:58-07:00

Commit Message:
Merge branch 'master'

Changed paths:
  A COPYING.FREEFONT
  A audio/softsynth/mt32/AReverbModel.cpp
  A audio/softsynth/mt32/AReverbModel.h
  A audio/softsynth/mt32/DelayReverb.cpp
  A audio/softsynth/mt32/DelayReverb.h
  A audio/softsynth/mt32/FreeverbModel.cpp
  A audio/softsynth/mt32/FreeverbModel.h
  A audio/softsynth/mt32/LA32Ramp.cpp
  A audio/softsynth/mt32/LA32Ramp.h
  A audio/softsynth/mt32/Part.cpp
  A audio/softsynth/mt32/Part.h
  A audio/softsynth/mt32/Partial.cpp
  A audio/softsynth/mt32/Partial.h
  A audio/softsynth/mt32/PartialManager.cpp
  A audio/softsynth/mt32/PartialManager.h
  A audio/softsynth/mt32/Poly.cpp
  A audio/softsynth/mt32/Poly.h
  A audio/softsynth/mt32/Structures.h
  A audio/softsynth/mt32/Synth.cpp
  A audio/softsynth/mt32/Synth.h
  A audio/softsynth/mt32/TVA.cpp
  A audio/softsynth/mt32/TVA.h
  A audio/softsynth/mt32/TVF.cpp
  A audio/softsynth/mt32/TVF.h
  A audio/softsynth/mt32/TVP.cpp
  A audio/softsynth/mt32/TVP.h
  A audio/softsynth/mt32/Tables.cpp
  A audio/softsynth/mt32/Tables.h
  A audio/softsynth/mt32/mmath.h
  A backends/graphics/maemosdl/maemosdl-graphics.cpp
  A backends/graphics/maemosdl/maemosdl-graphics.h
  A backends/keymapper/hardware-input.cpp
  A backends/keymapper/hardware-input.h
  A backends/keymapper/keymapper-defaults.h
  A backends/platform/android/org/scummvm/scummvm/EditableSurfaceView.java
  A backends/platform/android/org/scummvm/scummvm/PluginProvider.java
  A backends/platform/android/org/scummvm/scummvm/ScummVM.java
  A backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
  A backends/platform/android/org/scummvm/scummvm/ScummVMApplication.java
  A backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java
  A backends/platform/android/org/scummvm/scummvm/Unpacker.java
  A backends/platform/iphone/iphone_keyboard.mm
  A backends/platform/iphone/iphone_main.mm
  A backends/platform/iphone/iphone_video.mm
  A backends/platform/iphone/osys_video.mm
  A backends/saves/windows/windows-saves.cpp
  A backends/saves/windows/windows-saves.h
  A common/EventMapper.cpp
  A common/gui_options.cpp
  A common/gui_options.h
  A common/language.cpp
  A common/language.h
  A common/memory.h
  A common/platform.cpp
  A common/platform.h
  A common/rendermode.cpp
  A common/rendermode.h
  A devtools/convbdf.cpp
  A devtools/create_translations/cp_parser.cpp
  A devtools/create_translations/cp_parser.h
  A dists/debian/changelog
  A dists/debian/compat
  A dists/debian/control
  A dists/debian/copyright
  A dists/debian/rules
  A dists/debian/scummvm-data.install
  A dists/debian/scummvm.dirs
  A dists/debian/scummvm.docs
  A dists/debian/scummvm.install
  A dists/debian/scummvm.manpages
  A dists/debian/scummvm.menu
  A dists/gph/README-GPH
  A dists/gph/README-GPH.in
  A dists/gph/caanoo/scummvm-gdb.gpe
  A dists/gph/caanoo/scummvm.gpe
  A dists/gph/gp2x/mmuhack/Makefile
  A dists/gph/gp2x/mmuhack/README
  A dists/gph/gp2x/mmuhack/flush_uppermem_cache.h
  A dists/gph/gp2x/mmuhack/flush_uppermem_cache.s
  A dists/gph/gp2x/mmuhack/mmuhack.c
  A dists/gph/gp2x/mmuhack/mmuhack.o
  A dists/gph/gp2x/scummvm.gpe
  A dists/gph/gp2xwiz/scummvm-gdb.gpe
  A dists/gph/gp2xwiz/scummvm.gpe
  A dists/gph/scummvm.ini
  A dists/gph/scummvm.ini.in
  A dists/gph/scummvm.png
  A dists/gph/scummvmb.png
  A dists/openpandora/PXML.xml
  A dists/openpandora/PXML.xml.in
  A dists/openpandora/PXML_schema.xsd
  A dists/openpandora/README-OPENPANDORA
  A dists/openpandora/README-OPENPANDORA.in
  A dists/openpandora/README-PND.txt
  A dists/openpandora/README-PND.txt.in
  A dists/openpandora/icon/preview-pic.png
  A dists/openpandora/icon/scummvm.png
  A dists/openpandora/index.html
  A dists/openpandora/index.html.in
  A dists/openpandora/pnd_make.sh
  A dists/openpandora/runscummvm.sh
  A dists/win32/migration.bat
  A dists/win32/migration.txt
  A doc/es/InicioRapido
  A doc/se/LasMig
  A doc/se/Snabbstart
  A engines/dreamweb/keypad.cpp
  A engines/dreamweb/monitor.cpp
  A engines/dreamweb/newplace.cpp
  A engines/dreamweb/people.cpp
  A engines/dreamweb/rain.cpp
  A engines/dreamweb/sound.cpp
  A engines/dreamweb/talk.cpp
  A engines/dreamweb/titles.cpp
  A engines/dreamweb/vgafades.cpp
  A engines/gob/cheater.cpp
  A engines/gob/cheater.h
  A engines/gob/cheater_geisha.cpp
  A engines/gob/minigames/geisha/meter.cpp
  A engines/gob/minigames/geisha/meter.h
  A engines/gob/minigames/geisha/oko.cpp
  A engines/gob/minigames/geisha/oko.h
  A engines/kyra/chargen.cpp
  A engines/kyra/darkmoon.cpp
  A engines/kyra/darkmoon.h
  A engines/kyra/eob.cpp
  A engines/kyra/eob.h
  A engines/kyra/eobcommon.cpp
  A engines/kyra/eobcommon.h
  A engines/kyra/gui_eob.cpp
  A engines/kyra/gui_eob.h
  A engines/kyra/gui_rpg.cpp
  A engines/kyra/gui_v1.cpp
  A engines/kyra/gui_v1.h
  A engines/kyra/items_eob.cpp
  A engines/kyra/kyra_rpg.cpp
  A engines/kyra/kyra_rpg.h
  A engines/kyra/magic_eob.cpp
  A engines/kyra/saveload_eob.cpp
  A engines/kyra/saveload_rpg.cpp
  A engines/kyra/scene_eob.cpp
  A engines/kyra/scene_rpg.cpp
  A engines/kyra/screen_eob.cpp
  A engines/kyra/screen_eob.h
  A engines/kyra/script_eob.cpp
  A engines/kyra/script_eob.h
  A engines/kyra/sequences_darkmoon.cpp
  A engines/kyra/sequences_eob.cpp
  A engines/kyra/sprites_eob.cpp
  A engines/kyra/sprites_rpg.cpp
  A engines/kyra/staticres_eob.cpp
  A engines/kyra/staticres_rpg.cpp
  A engines/kyra/text_rpg.cpp
  A engines/kyra/text_rpg.h
  A engines/kyra/timer_eob.cpp
  A engines/kyra/timer_rpg.cpp
  A engines/mohawk/cstime_graphics.cpp
  A engines/mohawk/cstime_graphics.h
  A engines/mohawk/livingbooks_graphics.cpp
  A engines/mohawk/livingbooks_graphics.h
  A engines/mohawk/livingbooks_lbx.cpp
  A engines/mohawk/livingbooks_lbx.h
  A engines/mohawk/myst_graphics.cpp
  A engines/mohawk/myst_graphics.h
  A engines/mohawk/riven_graphics.cpp
  A engines/mohawk/riven_graphics.h
  A engines/sci/graphics/controls16.cpp
  A engines/sci/graphics/controls16.h
  A engines/sci/graphics/controls32.cpp
  A engines/sci/graphics/controls32.h
  A engines/sci/sound/drivers/fmtowns.cpp
  A engines/scumm/player_apple2.cpp
  A engines/scumm/player_apple2.h
  A engines/toltecs/animation.cpp
  A engines/toltecs/animation.h
  A engines/toltecs/detection.cpp
  A engines/toltecs/menu.cpp
  A engines/toltecs/menu.h
  A engines/toltecs/microtiles.cpp
  A engines/toltecs/microtiles.h
  A engines/toltecs/module.mk
  A engines/toltecs/movie.cpp
  A engines/toltecs/movie.h
  A engines/toltecs/music.cpp
  A engines/toltecs/music.h
  A engines/toltecs/palette.cpp
  A engines/toltecs/palette.h
  A engines/toltecs/render.cpp
  A engines/toltecs/render.h
  A engines/toltecs/resource.cpp
  A engines/toltecs/resource.h
  A engines/toltecs/saveload.cpp
  A engines/toltecs/screen.cpp
  A engines/toltecs/screen.h
  A engines/toltecs/script.cpp
  A engines/toltecs/script.h
  A engines/toltecs/segmap.cpp
  A engines/toltecs/segmap.h
  A engines/toltecs/sound.cpp
  A engines/toltecs/sound.h
  A engines/toltecs/sprite.cpp
  A engines/toltecs/toltecs.cpp
  A engines/toltecs/toltecs.h
  A engines/tsage/ringworld2/ringworld2_scenes1.cpp
  A engines/tsage/ringworld2/ringworld2_scenes1.h
  A engines/tsage/ringworld2/ringworld2_scenes2.cpp
  A engines/tsage/ringworld2/ringworld2_scenes2.h
  A engines/tsage/ringworld2/ringworld2_scenes3.cpp
  A engines/tsage/ringworld2/ringworld2_scenes3.h
  A engines/tsage/ringworld2/ringworld2_speakers.cpp
  A engines/tsage/ringworld2/ringworld2_speakers.h
  A graphics/fonts/ttf.cpp
  A graphics/fonts/ttf.h
  A gui/themes/fonts/FreeMonoBold.ttf
  A gui/themes/fonts/FreeSans.ttf
  A gui/themes/fonts/FreeSansBold.ttf
  A gui/themes/scummmodern/FreeMonoBold.ttf
  A gui/themes/scummmodern/FreeSans.ttf
  A gui/themes/scummmodern/FreeSansBold.ttf
  A gui/themes/scummmodern/eraser.bmp
  A po/iso-8859-2.cp
  A po/iso-8859-5.cp
  A video/psx_decoder.cpp
  A video/psx_decoder.h
  R audio/softsynth/mt32/i386.cpp
  R audio/softsynth/mt32/i386.h
  R audio/softsynth/mt32/mt32_file.cpp
  R audio/softsynth/mt32/mt32_file.h
  R audio/softsynth/mt32/part.cpp
  R audio/softsynth/mt32/part.h
  R audio/softsynth/mt32/partial.cpp
  R audio/softsynth/mt32/partial.h
  R audio/softsynth/mt32/partialManager.cpp
  R audio/softsynth/mt32/structures.h
  R audio/softsynth/mt32/synth.cpp
  R audio/softsynth/mt32/synth.h
  R audio/softsynth/mt32/tables.cpp
  R audio/softsynth/mt32/tables.h
  R backends/keymapper/hardware-key.h
  R backends/keymapper/types.h
  R backends/platform/android/org/inodes/gus/scummvm/EditableSurfaceView.java
  R backends/platform/android/org/inodes/gus/scummvm/PluginProvider.java
  R backends/platform/android/org/inodes/gus/scummvm/ScummVM.java
  R backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java
  R backends/platform/android/org/inodes/gus/scummvm/ScummVMApplication.java
  R backends/platform/android/org/inodes/gus/scummvm/ScummVMEvents.java
  R backends/platform/android/org/inodes/gus/scummvm/Unpacker.java
  R backends/platform/iphone/blit_arm.h
  R backends/platform/iphone/blit_arm.s
  R backends/platform/iphone/iphone_keyboard.m
  R backends/platform/iphone/iphone_main.m
  R backends/platform/iphone/iphone_video.m
  R backends/platform/iphone/osys_video.cpp
  R backends/platform/sdl/hardwarekeys.cpp
  R backends/platform/iphone/blit.cpp
  R devtools/convbdf.c
  R devtools/create_mads/main.cpp
  R devtools/create_mads/module.mk
  R devtools/create_mads/parser.cpp
  R devtools/create_mads/scripts/rex_nebular.txt
  R audio/softsynth/mt32/partialManager.h
  R dists/engine-data/m4.dat
  R dists/engine-data/mads.dat
  R backends/platform/gph/devices/common/README-GPH
  R backends/platform/gph/devices/caanoo/scummvm-gdb.gpe
  R backends/platform/gph/devices/caanoo/scummvm.gpe
  R backends/platform/gph/devices/gp2x/mmuhack/Makefile
  R backends/platform/gph/devices/gp2x/mmuhack/README
  R backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h
  R backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s
  R backends/platform/gph/devices/gp2x/mmuhack/mmuhack.c
  R backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o
  R backends/platform/gph/devices/gp2x/scummvm.gpe
  R backends/platform/gph/devices/gp2xwiz/scummvm-gdb.gpe
  R backends/platform/gph/devices/gp2xwiz/scummvm.gpe
  R backends/platform/gph/devices/common/scummvm.ini
  R backends/platform/gph/devices/common/scummvm.png
  R backends/platform/gph/devices/common/scummvmb.png
  R backends/platform/openpandora/build/PXML.xml
  R backends/platform/openpandora/build/PXML_schema.xsd
  R backends/platform/openpandora/build/README-OPENPANDORA
  R backends/platform/openpandora/build/README-PND.txt
  R backends/platform/openpandora/build/icon/preview-pic.png
  R backends/platform/openpandora/build/icon/scummvm.png
  R backends/platform/openpandora/build/index.html
  R backends/platform/openpandora/build/pnd_make.sh
  R backends/platform/openpandora/build/runscummvm.sh
  R doc/es/Inicio rápido
  R engines/dreamweb/README
  R engines/dreamweb/dreamgen.cpp
  R engines/dreamweb/dreamgen.h
  R engines/dreamweb/runtime.h
  R engines/dreamweb/stubs.h
  R devtools/create_mads/parser.h
  R engines/m4/actor.cpp
  R engines/m4/actor.h
  R engines/m4/animation.cpp
  R engines/m4/animation.h
  R engines/m4/assets.cpp
  R engines/m4/assets.h
  R engines/m4/burger_data.h
  R engines/m4/compression.cpp
  R engines/m4/compression.h
  R engines/m4/console.cpp
  R engines/m4/console.h
  R engines/m4/converse.cpp
  R engines/m4/converse.h
  R engines/m4/detection.cpp
  R engines/m4/dialogs.cpp
  R engines/m4/dialogs.h
  R engines/m4/events.cpp
  R engines/m4/events.h
  R engines/m4/font.cpp
  R engines/m4/font.h
  R engines/m4/globals.cpp
  R engines/m4/globals.h
  R engines/m4/graphics.cpp
  R engines/m4/graphics.h
  R engines/m4/gui.cpp
  R engines/m4/gui.h
  R engines/m4/hotspot.cpp
  R engines/m4/hotspot.h
  R engines/m4/m4.cpp
  R engines/m4/m4.h
  R engines/m4/m4_menus.cpp
  R engines/m4/m4_menus.h
  R engines/m4/m4_scene.cpp
  R engines/m4/m4_scene.h
  R engines/m4/m4_views.cpp
  R engines/m4/m4_views.h
  R engines/m4/mads_anim.cpp
  R engines/m4/mads_anim.h
  R engines/m4/mads_logic.cpp
  R engines/m4/mads_logic.h
  R engines/m4/mads_menus.cpp
  R engines/m4/mads_menus.h
  R engines/m4/mads_player.cpp
  R engines/m4/mads_player.h
  R engines/m4/mads_scene.cpp
  R engines/m4/mads_scene.h
  R engines/m4/mads_views.cpp
  R engines/m4/mads_views.h
  R engines/m4/midi.cpp
  R engines/m4/module.mk
  R engines/m4/rails.cpp
  R engines/m4/rails.h
  R engines/m4/resource.cpp
  R engines/m4/resource.h
  R engines/m4/saveload.cpp
  R engines/m4/scene.cpp
  R engines/m4/scene.h
  R engines/m4/script.cpp
  R engines/m4/script.h
  R engines/m4/scripttab.h
  R engines/m4/sound.cpp
  R engines/m4/sound.h
  R engines/m4/sprite.cpp
  R engines/m4/sprite.h
  R engines/m4/viewmgr.cpp
  R engines/m4/viewmgr.h
  R engines/m4/woodscript.cpp
  R engines/m4/woodscript.h
  R engines/m4/ws_machine.cpp
  R engines/m4/ws_sequence.cpp
  R engines/m4/saveload.h
  R engines/sci/graphics/controls.cpp
  R engines/sci/graphics/controls.h
  R engines/m4/staticres.cpp
  R engines/m4/midi.h
  R engines/m4/staticres.h
    AUTHORS
    COPYRIGHT
    Makefile.common
    NEWS
    README
    audio/audiostream.h
    audio/decoders/aac.h
    audio/decoders/adpcm.h
    audio/decoders/adpcm_intern.h
    audio/decoders/aiff.h
    audio/decoders/flac.cpp
    audio/decoders/flac.h
    audio/decoders/iff_sound.cpp
    audio/decoders/iff_sound.h
    audio/decoders/mac_snd.h
    audio/decoders/mp3.h
    audio/decoders/qdm2.cpp
    audio/decoders/quicktime.cpp
    audio/decoders/raw.cpp
    audio/decoders/raw.h
    audio/decoders/voc.cpp
    audio/decoders/voc.h
    audio/decoders/vorbis.h
    audio/decoders/wave.cpp
    audio/decoders/wave.h
    audio/fmopl.h
    audio/mididrv.cpp
    audio/mididrv.h
    audio/midiparser.h
    audio/midiplayer.h
    audio/mixer.h
    audio/mixer_intern.h
    audio/mods/infogrames.h
    audio/mods/maxtrax.cpp
    audio/mods/maxtrax.h
    audio/mods/module.h
    audio/mods/paula.h
    audio/mods/protracker.h
    audio/mods/rjp1.h
    audio/mods/soundfx.h
    audio/mods/tfmx.cpp
    audio/mods/tfmx.h
    audio/mpu401.h
    audio/musicplugin.h
    audio/null.h
    audio/rate.h
    audio/rate_arm_asm.s
    audio/softsynth/adlib.cpp
    audio/softsynth/cms.cpp
    audio/softsynth/cms.h
    audio/softsynth/emumidi.h
    audio/softsynth/fmtowns_pc98/towns_audio.cpp
    audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
    audio/softsynth/mt32.cpp
    audio/softsynth/mt32/freeverb.cpp
    audio/softsynth/mt32/freeverb.h
    audio/softsynth/mt32/module.mk
    audio/softsynth/mt32/mt32emu.h
    audio/softsynth/opl/dbopl.cpp
    audio/softsynth/opl/dbopl.h
    audio/softsynth/opl/dosbox.h
    audio/softsynth/opl/mame.h
    audio/softsynth/pcspk.h
    audio/softsynth/sid.cpp
    audio/softsynth/sid.h
    audio/softsynth/wave6581.cpp
    audio/timestamp.h
    backends/events/default/default-events.cpp
    backends/events/default/default-events.h
    backends/events/maemosdl/maemosdl-events.cpp
    backends/events/maemosdl/maemosdl-events.h
    backends/events/webossdl/webossdl-events.cpp
    backends/events/webossdl/webossdl-events.h
    backends/fs/amigaos4/amigaos4-fs.h
    backends/fs/ps2/ps2-fs.h
    backends/fs/psp/psp-fs-factory.h
    backends/fs/symbian/symbian-fs.cpp
    backends/fs/symbian/symbianstream.cpp
    backends/fs/windows/windows-fs.cpp
    backends/graphics/null/null-graphics.h
    backends/graphics/opengl/glerrorcheck.cpp
    backends/graphics/opengl/gltexture.cpp
    backends/graphics/opengl/gltexture.h
    backends/graphics/opengl/opengl-graphics.cpp
    backends/graphics/opengl/opengl-graphics.h
    backends/graphics/openglsdl/openglsdl-graphics.cpp
    backends/keymapper/action.cpp
    backends/keymapper/action.h
    backends/keymapper/keymap.cpp
    backends/keymapper/keymap.h
    backends/keymapper/keymapper.cpp
    backends/keymapper/keymapper.h
    backends/keymapper/remap-dialog.cpp
    backends/keymapper/remap-dialog.h
    backends/midi/coreaudio.cpp
    backends/midi/timidity.cpp
    backends/midi/windows.cpp
    backends/modular-backend.h
    backends/module.mk
    backends/mutex/null/null-mutex.h
    backends/platform/android/android.cpp
    backends/platform/android/android.h
    backends/platform/android/android.mk
    backends/platform/android/asset-archive.cpp
    backends/platform/android/asset-archive.h
    backends/platform/android/events.cpp
    backends/platform/android/jni.cpp
    backends/platform/android/texture.cpp
    backends/platform/bada/application.cpp
    backends/platform/bada/audio.cpp
    backends/platform/bada/fs.cpp
    backends/platform/bada/missing.cpp
    backends/platform/bada/portdefs.h
    backends/platform/dc/audio.cpp
    backends/platform/dc/dc-fs.cpp
    backends/platform/dc/dc.h
    backends/platform/dc/dcloader.cpp
    backends/platform/dc/display.cpp
    backends/platform/dc/portdefs.h
    backends/platform/ds/arm7/source/main.cpp
    backends/platform/ds/arm9/source/blitters.cpp
    backends/platform/ds/arm9/source/dsmain.cpp
    backends/platform/ds/arm9/source/osystem_ds.cpp
    backends/platform/ds/arm9/source/osystem_ds.h
    backends/platform/ds/arm9/source/portdefs.h
    backends/platform/ds/arm9/source/scummhelp.h
    backends/platform/gph/caanoo-bundle.mk
    backends/platform/gph/gp2x-bundle.mk
    backends/platform/gph/gp2xwiz-bundle.mk
    backends/platform/iphone/iphone_common.h
    backends/platform/iphone/iphone_keyboard.h
    backends/platform/iphone/iphone_video.h
    backends/platform/iphone/module.mk
    backends/platform/iphone/osys_events.cpp
    backends/platform/iphone/osys_main.cpp
    backends/platform/iphone/osys_main.h
    backends/platform/linuxmoto/hardwarekeys.cpp
    backends/platform/linuxmoto/linuxmoto-sdl.h
    backends/platform/maemo/debian/changelog
    backends/platform/maemo/debian/control
    backends/platform/maemo/debian/rules
    backends/platform/maemo/maemo-common.h
    backends/platform/maemo/maemo.cpp
    backends/platform/maemo/maemo.h
    backends/platform/n64/osys_n64_utilities.cpp
    backends/platform/n64/portdefs.h
    backends/platform/openpandora/op-bundle.mk
    backends/platform/ps2/DmaPipe.cpp
    backends/platform/ps2/Gs2dScreen.cpp
    backends/platform/ps2/Gs2dScreen.h
    backends/platform/ps2/fileio.cpp
    backends/platform/ps2/icon.cpp
    backends/platform/ps2/ps2mutex.cpp
    backends/platform/ps2/ps2pad.cpp
    backends/platform/ps2/systemps2.cpp
    backends/platform/ps2/systemps2.h
    backends/platform/psp/display_manager.cpp
    backends/platform/psp/portdefs.h
    backends/platform/sdl/macosx/appmenu_osx.mm
    backends/platform/sdl/module.mk
    backends/platform/sdl/posix/posix.cpp
    backends/platform/sdl/sdl.h
    backends/platform/sdl/win32/win32.cpp
    backends/platform/symbian/README
    backends/platform/symbian/S60/ScummVM_S60.mmp.in
    backends/platform/symbian/S60/ScummVM_S60_App.mmp
    backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
    backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
    backends/platform/symbian/S80/ScummVM_S80.mmp.in
    backends/platform/symbian/S80/ScummVM_S80_App.mmp
    backends/platform/symbian/S90/Scummvm_S90.mmp.in
    backends/platform/symbian/S90/Scummvm_S90_App.mmp
    backends/platform/symbian/UIQ2/ScummVM.rss
    backends/platform/symbian/UIQ3/ScummVM.rss
    backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
    backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
    backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
    backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
    backends/platform/symbian/mmp/scummvm_agi.mmp.in
    backends/platform/symbian/mmp/scummvm_agos.mmp.in
    backends/platform/symbian/mmp/scummvm_base.mmp.in
    backends/platform/symbian/mmp/scummvm_cine.mmp.in
    backends/platform/symbian/mmp/scummvm_cruise.mmp.in
    backends/platform/symbian/mmp/scummvm_draci.mmp.in
    backends/platform/symbian/mmp/scummvm_drascula.mmp.in
    backends/platform/symbian/mmp/scummvm_gob.mmp.in
    backends/platform/symbian/mmp/scummvm_groovie.mmp.in
    backends/platform/symbian/mmp/scummvm_hugo.mmp.in
    backends/platform/symbian/mmp/scummvm_kyra.mmp.in
    backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
    backends/platform/symbian/mmp/scummvm_lure.mmp.in
    backends/platform/symbian/mmp/scummvm_m4.mmp.in
    backends/platform/symbian/mmp/scummvm_made.mmp.in
    backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
    backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
    backends/platform/symbian/mmp/scummvm_queen.mmp.in
    backends/platform/symbian/mmp/scummvm_saga.mmp.in
    backends/platform/symbian/mmp/scummvm_sci.mmp.in
    backends/platform/symbian/mmp/scummvm_scumm.mmp.in
    backends/platform/symbian/mmp/scummvm_sky.mmp.in
    backends/platform/symbian/mmp/scummvm_sword1.mmp.in
    backends/platform/symbian/mmp/scummvm_sword2.mmp.in
    backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
    backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
    backends/platform/symbian/mmp/scummvm_toon.mmp.in
    backends/platform/symbian/mmp/scummvm_touche.mmp.in
    backends/platform/symbian/mmp/scummvm_tsage.mmp.in
    backends/platform/symbian/mmp/scummvm_tucker.mmp.in
    backends/platform/symbian/res/ScummVmAif.rss
    backends/platform/symbian/res/scummvm.rss
    backends/platform/symbian/res/scummvm_A0000658.rss
    backends/platform/symbian/src/ScummVm.hrh
    backends/platform/webos/webos.cpp
    backends/platform/webos/webos.h
    backends/platform/wince/README-WinCE.txt
    backends/platform/wince/portdefs.h
    backends/platform/wince/wince-sdl.cpp
    backends/plugins/elf/elf-loader.cpp
    backends/taskbar/win32/win32-taskbar.cpp
    backends/timer/bada/timer.cpp
    backends/timer/default/default-timer.cpp
    backends/vkeybd/image-map.cpp
    backends/vkeybd/image-map.h
    backends/vkeybd/polygon.cpp
    backends/vkeybd/polygon.h
    backends/vkeybd/virtual-keyboard-gui.cpp
    backends/vkeybd/virtual-keyboard-gui.h
    backends/vkeybd/virtual-keyboard-parser.cpp
    backends/vkeybd/virtual-keyboard-parser.h
    backends/vkeybd/virtual-keyboard.cpp
    backends/vkeybd/virtual-keyboard.h
    base/commandLine.cpp
    base/main.cpp
    base/plugins.cpp
    base/version.cpp
    common/EventDispatcher.cpp
    common/algorithm.h
    common/archive.cpp
    common/archive.h
    common/array.h
    common/config-file.cpp
    common/config-manager.cpp
    common/events.h
    common/fft.cpp
    common/forbidden.h
    common/fs.cpp
    common/fs.h
    common/hash-str.h
    common/hashmap.h
    common/huffman.h
    common/keyboard.h
    common/list.h
    common/list_intern.h
    common/localization.h
    common/macresman.cpp
    common/macresman.h
    common/memorypool.cpp
    common/memorypool.h
    common/module.mk
    common/quicktime.cpp
    common/quicktime.h
    common/scummsys.h
    common/serializer.h
    common/singleton.h
    common/stack.h
    common/str.cpp
    common/stream.cpp
    common/substream.h
    common/system.h
    common/translation.cpp
    common/translation.h
    common/unarj.cpp
    common/unzip.cpp
    common/util.cpp
    common/util.h
    common/xmlparser.cpp
    common/xmlparser.h
    common/zlib.cpp
    common/zlib.h
    config.guess
    config.sub
    configure
    devtools/create_hugo/enums.h
    devtools/create_hugo/staticdata.h
    devtools/create_kyradat/create_kyradat.cpp
    devtools/create_kyradat/create_kyradat.h
    devtools/create_kyradat/extract.cpp
    devtools/create_kyradat/extract.h
    devtools/create_kyradat/games.cpp
    devtools/create_kyradat/module.mk
    devtools/create_kyradat/tables.cpp
    devtools/create_kyradat/util.cpp
    devtools/create_kyradat/util.h
    devtools/create_lure/process_actions.cpp
    devtools/create_project/create_project.cpp
    devtools/create_project/create_project.h
    devtools/create_project/xcode.cpp
    devtools/create_translations/create_translations.cpp
    devtools/create_translations/create_translations.h
    devtools/create_translations/module.mk
    devtools/credits.pl
    devtools/md5table.c
    devtools/module.mk
    devtools/sci/musicplayer.cpp
    devtools/scumm-md5.txt
    devtools/skycpt/AsciiCptCompile.cpp
    devtools/skycpt/TextFile.cpp
    devtools/skycpt/cptcompiler.cpp
    devtools/tasmrecover/dreamweb/backdrop.asm
    devtools/tasmrecover/dreamweb/debug.asm
    devtools/tasmrecover/dreamweb/dreamweb.asm
    devtools/tasmrecover/dreamweb/keypad.asm
    devtools/tasmrecover/dreamweb/look.asm
    devtools/tasmrecover/dreamweb/monitor.asm
    devtools/tasmrecover/dreamweb/newplace.asm
    devtools/tasmrecover/dreamweb/object.asm
    devtools/tasmrecover/dreamweb/print.asm
    devtools/tasmrecover/dreamweb/saveload.asm
    devtools/tasmrecover/dreamweb/sblaster.asm
    devtools/tasmrecover/dreamweb/sprite.asm
    devtools/tasmrecover/dreamweb/talk.asm
    devtools/tasmrecover/dreamweb/titles.asm
    devtools/tasmrecover/dreamweb/use.asm
    devtools/tasmrecover/dreamweb/vars.asm
    devtools/tasmrecover/dreamweb/vgafades.asm
    devtools/tasmrecover/dreamweb/vgagrafx.asm
    devtools/tasmrecover/tasm-recover
    devtools/tasmrecover/tasm/cpp.py
    devtools/tasmrecover/tasm/parser.py
    devtools/update-version.pl
    dists/android/AndroidManifest.xml
    dists/android/AndroidManifest.xml.in
    dists/android/mkplugin.sh
    dists/android/plugin-manifest.xml
    dists/android/plugin-manifest.xml.in
    dists/android/res/layout/main.xml
    dists/engine-data/kyra.dat
    dists/irix/scummvm.idb
    dists/macosx/DS_Store
    dists/macosx/Info.plist
    dists/macosx/Info.plist.in
    dists/redhat/scummvm.spec
    dists/redhat/scummvm.spec.in
    dists/scummvm.rc
    dists/scummvm.rc.in
    dists/win32/ScummVM.iss
    dists/win32/scummvm.nsi
    dists/win32/scummvm.nsi.in
    doc/cz/PrectiMe
    doc/de/Liesmich
    doc/de/Neues
    engines/advancedDetector.h
    engines/agi/agi.cpp
    engines/agi/agi.h
    engines/agi/checks.cpp
    engines/agi/cycle.cpp
    engines/agi/detection_tables.h
    engines/agi/graphics.cpp
    engines/agi/menu.cpp
    engines/agi/menu.h
    engines/agi/objects.cpp
    engines/agi/op_cmd.cpp
    engines/agi/opcodes.cpp
    engines/agi/picture.h
    engines/agi/preagi_mickey.h
    engines/agi/preagi_troll.cpp
    engines/agi/preagi_winnie.cpp
    engines/agi/predictive.cpp
    engines/agi/saveload.cpp
    engines/agi/sound_2gs.cpp
    engines/agi/sound_2gs.h
    engines/agi/sound_sarien.cpp
    engines/agi/sprite.cpp
    engines/agi/sprite.h
    engines/agi/text.cpp
    engines/agi/wagparser.cpp
    engines/agi/words.cpp
    engines/agos/agos.h
    engines/agos/animation.cpp
    engines/agos/charset-fontdata.cpp
    engines/agos/charset.cpp
    engines/agos/detection_tables.h
    engines/agos/draw.cpp
    engines/agos/installshield_cab.cpp
    engines/agos/midi.cpp
    engines/agos/res.cpp
    engines/agos/res_snd.cpp
    engines/agos/saveload.cpp
    engines/agos/script_pn.cpp
    engines/agos/sound.cpp
    engines/agos/sound.h
    engines/agos/string.cpp
    engines/agos/string_pn.cpp
    engines/agos/subroutine.cpp
    engines/cge/bitmap.cpp
    engines/cge/bitmap.h
    engines/cge/cge.cpp
    engines/cge/cge.h
    engines/cge/cge_main.cpp
    engines/cge/cge_main.h
    engines/cge/console.cpp
    engines/cge/console.h
    engines/cge/detection.cpp
    engines/cge/events.cpp
    engines/cge/events.h
    engines/cge/fileio.cpp
    engines/cge/snail.cpp
    engines/cge/snail.h
    engines/cge/talk.cpp
    engines/cge/talk.h
    engines/cge/text.cpp
    engines/cge/vga13h.cpp
    engines/cge/vga13h.h
    engines/cge/walk.h
    engines/cine/cine.cpp
    engines/cine/detection.cpp
    engines/cine/detection_tables.h
    engines/cine/gfx.cpp
    engines/cine/main_loop.cpp
    engines/cine/saveload.cpp
    engines/cine/sound.cpp
    engines/composer/composer.cpp
    engines/composer/composer.h
    engines/composer/detection.cpp
    engines/composer/graphics.cpp
    engines/composer/resource.cpp
    engines/composer/resource.h
    engines/composer/scripting.cpp
    engines/cruise/background.cpp
    engines/cruise/backgroundIncrust.cpp
    engines/cruise/cruise.h
    engines/cruise/cruise_main.cpp
    engines/cruise/dataLoader.cpp
    engines/cruise/detection.cpp
    engines/cruise/font.cpp
    engines/cruise/function.cpp
    engines/cruise/gfxModule.cpp
    engines/cruise/mainDraw.cpp
    engines/cruise/overlay.cpp
    engines/cruise/saveload.cpp
    engines/cruise/script.cpp
    engines/cruise/volume.cpp
    engines/dialogs.cpp
    engines/draci/barchive.cpp
    engines/draci/detection.cpp
    engines/draci/draci.cpp
    engines/draci/saveload.cpp
    engines/draci/sprite.cpp
    engines/draci/walking.cpp
    engines/drascula/animation.cpp
    engines/drascula/converse.cpp
    engines/drascula/detection.cpp
    engines/drascula/drascula.cpp
    engines/drascula/drascula.h
    engines/drascula/graphics.cpp
    engines/drascula/interface.cpp
    engines/drascula/saveload.cpp
    engines/drascula/sound.cpp
    engines/drascula/talk.cpp
    engines/dreamweb/backdrop.cpp
    engines/dreamweb/detection.cpp
    engines/dreamweb/detection_tables.h
    engines/dreamweb/dreamweb.cpp
    engines/dreamweb/dreamweb.h
    engines/dreamweb/module.mk
    engines/dreamweb/object.cpp
    engines/dreamweb/pathfind.cpp
    engines/dreamweb/print.cpp
    engines/dreamweb/saveload.cpp
    engines/dreamweb/sprite.cpp
    engines/dreamweb/structs.h
    engines/dreamweb/stubs.cpp
    engines/dreamweb/use.cpp
    engines/dreamweb/vgagrafx.cpp
    engines/engine.cpp
    engines/engine.h
    engines/engines.mk
    engines/game.cpp
    engines/game.h
    engines/gob/aniobject.cpp
    engines/gob/aniobject.h
    engines/gob/console.cpp
    engines/gob/console.h
    engines/gob/databases.h
    engines/gob/dataio.cpp
    engines/gob/detection_tables.h
    engines/gob/draw_v1.cpp
    engines/gob/draw_v2.cpp
    engines/gob/gob.cpp
    engines/gob/gob.h
    engines/gob/hotspots.cpp
    engines/gob/iniconfig.cpp
    engines/gob/inter.h
    engines/gob/inter_geisha.cpp
    engines/gob/inter_playtoons.cpp
    engines/gob/inter_v1.cpp
    engines/gob/inter_v2.cpp
    engines/gob/inter_v7.cpp
    engines/gob/map.cpp
    engines/gob/minigames/geisha/diving.cpp
    engines/gob/minigames/geisha/diving.h
    engines/gob/minigames/geisha/evilfish.cpp
    engines/gob/minigames/geisha/evilfish.h
    engines/gob/module.mk
    engines/gob/sound/bgatmosphere.h
    engines/groovie/detection.cpp
    engines/groovie/roq.cpp
    engines/groovie/script.cpp
    engines/hugo/detection.cpp
    engines/hugo/game.h
    engines/hugo/object.h
    engines/hugo/object_v1d.cpp
    engines/hugo/object_v1w.cpp
    engines/hugo/object_v2d.cpp
    engines/hugo/object_v3d.cpp
    engines/hugo/parser.cpp
    engines/hugo/route.cpp
    engines/hugo/schedule.cpp
    engines/hugo/sound.cpp
    engines/hugo/sound.h
    engines/hugo/util.cpp
    engines/kyra/animator_hof.cpp
    engines/kyra/animator_lok.cpp
    engines/kyra/animator_mr.cpp
    engines/kyra/animator_v2.cpp
    engines/kyra/debugger.cpp
    engines/kyra/debugger.h
    engines/kyra/detection.cpp
    engines/kyra/detection_tables.h
    engines/kyra/gui.cpp
    engines/kyra/gui.h
    engines/kyra/gui_hof.cpp
    engines/kyra/gui_lok.cpp
    engines/kyra/gui_lok.h
    engines/kyra/gui_lol.cpp
    engines/kyra/gui_lol.h
    engines/kyra/gui_mr.cpp
    engines/kyra/gui_v2.cpp
    engines/kyra/gui_v2.h
    engines/kyra/items_lok.cpp
    engines/kyra/items_lol.cpp
    engines/kyra/kyra_hof.cpp
    engines/kyra/kyra_hof.h
    engines/kyra/kyra_lok.cpp
    engines/kyra/kyra_lok.h
    engines/kyra/kyra_mr.cpp
    engines/kyra/kyra_mr.h
    engines/kyra/kyra_v1.cpp
    engines/kyra/kyra_v1.h
    engines/kyra/kyra_v2.cpp
    engines/kyra/kyra_v2.h
    engines/kyra/lol.cpp
    engines/kyra/lol.h
    engines/kyra/module.mk
    engines/kyra/resource.cpp
    engines/kyra/resource.h
    engines/kyra/resource_intern.cpp
    engines/kyra/resource_intern.h
    engines/kyra/saveload.cpp
    engines/kyra/saveload_lok.cpp
    engines/kyra/saveload_lol.cpp
    engines/kyra/scene_lok.cpp
    engines/kyra/scene_lol.cpp
    engines/kyra/scene_mr.cpp
    engines/kyra/scene_v1.cpp
    engines/kyra/scene_v2.cpp
    engines/kyra/screen.cpp
    engines/kyra/screen.h
    engines/kyra/screen_hof.cpp
    engines/kyra/screen_hof.h
    engines/kyra/screen_lok.cpp
    engines/kyra/screen_lok.h
    engines/kyra/screen_lol.cpp
    engines/kyra/screen_lol.h
    engines/kyra/screen_mr.cpp
    engines/kyra/screen_mr.h
    engines/kyra/screen_v2.cpp
    engines/kyra/screen_v2.h
    engines/kyra/script.h
    engines/kyra/script_hof.cpp
    engines/kyra/script_lok.cpp
    engines/kyra/script_lol.cpp
    engines/kyra/script_mr.cpp
    engines/kyra/script_tim.cpp
    engines/kyra/script_tim.h
    engines/kyra/script_v1.cpp
    engines/kyra/script_v2.cpp
    engines/kyra/seqplayer.cpp
    engines/kyra/sequences_hof.cpp
    engines/kyra/sequences_lok.cpp
    engines/kyra/sequences_lol.cpp
    engines/kyra/sound.cpp
    engines/kyra/sound.h
    engines/kyra/sound_adlib.cpp
    engines/kyra/sound_adlib.h
    engines/kyra/sound_amiga.cpp
    engines/kyra/sound_intern.h
    engines/kyra/sound_lol.cpp
    engines/kyra/sound_midi.cpp
    engines/kyra/sound_towns.cpp
    engines/kyra/sprites_lol.cpp
    engines/kyra/staticres.cpp
    engines/kyra/staticres_lol.cpp
    engines/kyra/text_lok.cpp
    engines/kyra/text_lol.cpp
    engines/kyra/text_lol.h
    engines/kyra/timer.cpp
    engines/kyra/timer_lok.cpp
    engines/kyra/timer_lol.cpp
    engines/kyra/wsamovie.cpp
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/data/archive.h
    engines/lastexpress/data/scene.h
    engines/lastexpress/detection.cpp
    engines/lastexpress/entities/abbot.cpp
    engines/lastexpress/entities/alexei.cpp
    engines/lastexpress/entities/august.cpp
    engines/lastexpress/entities/entity_intern.h
    engines/lastexpress/entities/francois.cpp
    engines/lastexpress/entities/mertens.cpp
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/entities.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/resource.cpp
    engines/lastexpress/resource.h
    engines/lure/decode.cpp
    engines/lure/detection.cpp
    engines/lure/hotspots.cpp
    engines/lure/menu.cpp
    engines/lure/res.cpp
    engines/lure/room.cpp
    engines/lure/scripts.cpp
    engines/lure/sound.cpp
    engines/made/database.cpp
    engines/made/database.h
    engines/made/detection.cpp
    engines/made/graphics.cpp
    engines/made/resource.h
    engines/made/screen.cpp
    engines/made/screenfx.cpp
    engines/made/scriptfuncs.h
    engines/metaengine.h
    engines/mohawk/bitmap.cpp
    engines/mohawk/console.cpp
    engines/mohawk/cstime.h
    engines/mohawk/detection_tables.h
    engines/mohawk/graphics.cpp
    engines/mohawk/graphics.h
    engines/mohawk/installer_archive.cpp
    engines/mohawk/installer_archive.h
    engines/mohawk/livingbooks.cpp
    engines/mohawk/livingbooks.h
    engines/mohawk/livingbooks_code.cpp
    engines/mohawk/livingbooks_code.h
    engines/mohawk/module.mk
    engines/mohawk/myst.cpp
    engines/mohawk/myst.h
    engines/mohawk/myst_areas.cpp
    engines/mohawk/myst_areas.h
    engines/mohawk/myst_scripts.cpp
    engines/mohawk/myst_scripts.h
    engines/mohawk/myst_stacks/channelwood.cpp
    engines/mohawk/myst_stacks/credits.cpp
    engines/mohawk/myst_stacks/demo.cpp
    engines/mohawk/myst_stacks/intro.cpp
    engines/mohawk/myst_stacks/mechanical.cpp
    engines/mohawk/myst_stacks/myst.cpp
    engines/mohawk/myst_stacks/preview.cpp
    engines/mohawk/myst_stacks/slides.cpp
    engines/mohawk/myst_stacks/stoneship.cpp
    engines/mohawk/riven.cpp
    engines/mohawk/riven_external.cpp
    engines/mohawk/riven_external.h
    engines/mohawk/riven_scripts.cpp
    engines/mohawk/riven_scripts.h
    engines/mohawk/video.cpp
    engines/mohawk/video.h
    engines/neverhood/blbarchive.cpp
    engines/parallaction/balloons.cpp
    engines/parallaction/callables_br.cpp
    engines/parallaction/callables_ns.cpp
    engines/parallaction/debug.cpp
    engines/parallaction/dialogue.cpp
    engines/parallaction/disk.cpp
    engines/parallaction/disk_br.cpp
    engines/parallaction/disk_ns.cpp
    engines/parallaction/exec.h
    engines/parallaction/font.cpp
    engines/parallaction/gfxbase.cpp
    engines/parallaction/graphics.cpp
    engines/parallaction/graphics.h
    engines/parallaction/gui.h
    engines/parallaction/gui_br.cpp
    engines/parallaction/inventory.cpp
    engines/parallaction/inventory.h
    engines/parallaction/objects.cpp
    engines/parallaction/parallaction.cpp
    engines/parallaction/parallaction.h
    engines/parallaction/parallaction_br.cpp
    engines/parallaction/parser.h
    engines/parallaction/parser_br.cpp
    engines/parallaction/parser_ns.cpp
    engines/parallaction/saveload.cpp
    engines/parallaction/sound_br.cpp
    engines/parallaction/sound_ns.cpp
    engines/queen/input.h
    engines/queen/logic.cpp
    engines/queen/music.cpp
    engines/queen/queen.cpp
    engines/queen/resource.h
    engines/queen/talk.cpp
    engines/saga/animation.cpp
    engines/saga/detection.cpp
    engines/saga/detection_tables.h
    engines/saga/gfx.cpp
    engines/saga/interface.cpp
    engines/saga/isomap.cpp
    engines/saga/resource.h
    engines/saga/saga.h
    engines/saga/saveload.cpp
    engines/saga/scene.cpp
    engines/saga/script.h
    engines/saga/sndres.cpp
    engines/saga/sndres.h
    engines/saga/sound.cpp
    engines/saga/sound.h
    engines/sci/console.cpp
    engines/sci/detection.cpp
    engines/sci/detection_tables.h
    engines/sci/engine/features.cpp
    engines/sci/engine/kernel.cpp
    engines/sci/engine/kernel.h
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kfile.cpp
    engines/sci/engine/kgraphics.cpp
    engines/sci/engine/klists.cpp
    engines/sci/engine/kpathing.cpp
    engines/sci/engine/kscripts.cpp
    engines/sci/engine/ksound.cpp
    engines/sci/engine/kstring.cpp
    engines/sci/engine/message.cpp
    engines/sci/engine/savegame.cpp
    engines/sci/engine/script.cpp
    engines/sci/engine/script.h
    engines/sci/engine/script_patches.cpp
    engines/sci/engine/scriptdebug.cpp
    engines/sci/engine/seg_manager.cpp
    engines/sci/engine/seg_manager.h
    engines/sci/engine/segment.cpp
    engines/sci/engine/segment.h
    engines/sci/engine/selector.cpp
    engines/sci/engine/selector.h
    engines/sci/engine/state.cpp
    engines/sci/engine/vm.cpp
    engines/sci/engine/vm.h
    engines/sci/engine/vm_types.h
    engines/sci/engine/workarounds.cpp
    engines/sci/event.cpp
    engines/sci/graphics/coordadjuster.cpp
    engines/sci/graphics/coordadjuster.h
    engines/sci/graphics/cursor.cpp
    engines/sci/graphics/cursor.h
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/palette.cpp
    engines/sci/graphics/screen.cpp
    engines/sci/graphics/text16.cpp
    engines/sci/graphics/text32.cpp
    engines/sci/graphics/text32.h
    engines/sci/graphics/transitions.cpp
    engines/sci/graphics/view.cpp
    engines/sci/module.mk
    engines/sci/parser/said.cpp
    engines/sci/parser/vocabulary.cpp
    engines/sci/resource.cpp
    engines/sci/resource.h
    engines/sci/resource_audio.cpp
    engines/sci/sci.cpp
    engines/sci/sci.h
    engines/sci/sound/drivers/adlib.cpp
    engines/sci/sound/drivers/amigamac.cpp
    engines/sci/sound/drivers/mididriver.h
    engines/sci/sound/midiparser_sci.cpp
    engines/sci/sound/music.cpp
    engines/sci/sound/music.h
    engines/sci/sound/soundcmd.cpp
    engines/sci/sound/soundcmd.h
    engines/scumm/actor.cpp
    engines/scumm/actor.h
    engines/scumm/boxes.cpp
    engines/scumm/boxes.h
    engines/scumm/charset-fontdata.cpp
    engines/scumm/costume.cpp
    engines/scumm/costume.h
    engines/scumm/cursor.cpp
    engines/scumm/debugger.cpp
    engines/scumm/detection.cpp
    engines/scumm/detection.h
    engines/scumm/detection_tables.h
    engines/scumm/dialogs.cpp
    engines/scumm/dialogs.h
    engines/scumm/gfx.cpp
    engines/scumm/gfx.h
    engines/scumm/gfxARM.s
    engines/scumm/gfx_towns.cpp
    engines/scumm/he/script_v80he.cpp
    engines/scumm/he/script_v90he.cpp
    engines/scumm/he/sound_he.cpp
    engines/scumm/he/sprite_he.cpp
    engines/scumm/he/wiz_he.cpp
    engines/scumm/help.h
    engines/scumm/imuse/imuse_player.cpp
    engines/scumm/input.cpp
    engines/scumm/module.mk
    engines/scumm/object.cpp
    engines/scumm/object.h
    engines/scumm/palette.cpp
    engines/scumm/player_nes.cpp
    engines/scumm/player_pce.cpp
    engines/scumm/player_pce.h
    engines/scumm/player_sid.cpp
    engines/scumm/player_sid.h
    engines/scumm/player_towns.cpp
    engines/scumm/player_v1.cpp
    engines/scumm/player_v2a.cpp
    engines/scumm/player_v2a.h
    engines/scumm/resource.cpp
    engines/scumm/room.cpp
    engines/scumm/saveload.cpp
    engines/scumm/saveload.h
    engines/scumm/script.cpp
    engines/scumm/script_v0.cpp
    engines/scumm/script_v2.cpp
    engines/scumm/script_v4.cpp
    engines/scumm/script_v5.cpp
    engines/scumm/script_v8.cpp
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h
    engines/scumm/scumm_v0.h
    engines/scumm/scumm_v2.h
    engines/scumm/scumm_v5.h
    engines/scumm/smush/smush_player.cpp
    engines/scumm/sound.cpp
    engines/scumm/sound.h
    engines/scumm/string.cpp
    engines/scumm/vars.cpp
    engines/scumm/verbs.cpp
    engines/scumm/verbs.h
    engines/sky/autoroute.cpp
    engines/sky/compact.cpp
    engines/sky/control.cpp
    engines/sky/control.h
    engines/sky/detection.cpp
    engines/sky/disk.cpp
    engines/sky/intro.cpp
    engines/sky/logic.cpp
    engines/sky/mouse.cpp
    engines/sky/music/adlibchannel.cpp
    engines/sky/music/adlibmusic.cpp
    engines/sky/music/adlibmusic.h
    engines/sky/music/gmmusic.cpp
    engines/sky/music/gmmusic.h
    engines/sky/music/mt32music.cpp
    engines/sky/music/mt32music.h
    engines/sky/music/musicbase.cpp
    engines/sky/music/musicbase.h
    engines/sky/sky.cpp
    engines/sky/text.cpp
    engines/sword1/animation.cpp
    engines/sword1/animation.h
    engines/sword1/detection.cpp
    engines/sword1/logic.cpp
    engines/sword1/sound.cpp
    engines/sword1/sound.h
    engines/sword1/staticres.cpp
    engines/sword1/sword1.cpp
    engines/sword1/sword1.h
    engines/sword1/swordres.h
    engines/sword2/animation.cpp
    engines/sword2/animation.h
    engines/sword2/console.cpp
    engines/sword2/function.cpp
    engines/sword2/music.cpp
    engines/sword2/sprite.cpp
    engines/sword2/sword2.cpp
    engines/sword25/detection_tables.h
    engines/sword25/gfx/image/art.cpp
    engines/sword25/gfx/image/renderedimage.cpp
    engines/sword25/gfx/renderobject.h
    engines/sword25/gfx/screenshot.cpp
    engines/sword25/util/lua/lbaselib.cpp
    engines/sword25/util/lua/llex.cpp
    engines/sword25/util/lua/lobject.cpp
    engines/sword25/util/lua/lstrlib.cpp
    engines/sword25/util/lua/luaconf.h
    engines/sword25/util/lua/scummvm_file.cpp
    engines/sword25/util/pluto/pluto.cpp
    engines/teenagent/callbacks.cpp
    engines/teenagent/console.cpp
    engines/teenagent/console.h
    engines/teenagent/detection.cpp
    engines/teenagent/music.cpp
    engines/teenagent/music.h
    engines/teenagent/surface.h
    engines/testbed/detection.cpp
    engines/tinsel/background.cpp
    engines/tinsel/bg.cpp
    engines/tinsel/cursor.cpp
    engines/tinsel/detection.cpp
    engines/tinsel/detection_tables.h
    engines/tinsel/dialogs.cpp
    engines/tinsel/drives.cpp
    engines/tinsel/events.cpp
    engines/tinsel/font.cpp
    engines/tinsel/graphics.cpp
    engines/tinsel/handle.cpp
    engines/tinsel/heapmem.cpp
    engines/tinsel/mareels.cpp
    engines/tinsel/move.cpp
    engines/tinsel/music.cpp
    engines/tinsel/palette.cpp
    engines/tinsel/pcode.cpp
    engines/tinsel/pdisplay.cpp
    engines/tinsel/play.cpp
    engines/tinsel/rince.cpp
    engines/tinsel/saveload.cpp
    engines/tinsel/savescn.cpp
    engines/tinsel/scene.cpp
    engines/tinsel/sched.cpp
    engines/tinsel/scroll.cpp
    engines/tinsel/scroll.h
    engines/tinsel/sound.cpp
    engines/tinsel/strres.cpp
    engines/tinsel/strres.h
    engines/tinsel/sysvar.cpp
    engines/tinsel/text.cpp
    engines/tinsel/timers.cpp
    engines/tinsel/tinlib.cpp
    engines/tinsel/tinsel.cpp
    engines/tinsel/token.cpp
    engines/toon/anim.cpp
    engines/toon/anim.h
    engines/toon/audio.cpp
    engines/toon/audio.h
    engines/toon/character.cpp
    engines/toon/character.h
    engines/toon/detection.cpp
    engines/toon/font.cpp
    engines/toon/font.h
    engines/toon/hotspot.cpp
    engines/toon/hotspot.h
    engines/toon/movie.cpp
    engines/toon/movie.h
    engines/toon/path.cpp
    engines/toon/picture.cpp
    engines/toon/picture.h
    engines/toon/resource.cpp
    engines/toon/resource.h
    engines/toon/script_func.h
    engines/toon/text.cpp
    engines/toon/text.h
    engines/toon/toon.cpp
    engines/toon/toon.h
    engines/touche/detection.cpp
    engines/touche/graphics.h
    engines/touche/resource.cpp
    engines/touche/saveload.cpp
    engines/touche/staticres.cpp
    engines/touche/touche.cpp
    engines/touche/touche.h
    engines/tsage/blue_force/blueforce_dialogs.cpp
    engines/tsage/blue_force/blueforce_dialogs.h
    engines/tsage/blue_force/blueforce_logic.cpp
    engines/tsage/blue_force/blueforce_logic.h
    engines/tsage/blue_force/blueforce_scenes0.cpp
    engines/tsage/blue_force/blueforce_scenes0.h
    engines/tsage/blue_force/blueforce_scenes1.cpp
    engines/tsage/blue_force/blueforce_scenes1.h
    engines/tsage/blue_force/blueforce_scenes2.cpp
    engines/tsage/blue_force/blueforce_scenes3.cpp
    engines/tsage/blue_force/blueforce_scenes3.h
    engines/tsage/blue_force/blueforce_scenes4.cpp
    engines/tsage/blue_force/blueforce_scenes4.h
    engines/tsage/blue_force/blueforce_scenes5.cpp
    engines/tsage/blue_force/blueforce_scenes5.h
    engines/tsage/blue_force/blueforce_scenes6.cpp
    engines/tsage/blue_force/blueforce_scenes6.h
    engines/tsage/blue_force/blueforce_scenes7.cpp
    engines/tsage/blue_force/blueforce_scenes7.h
    engines/tsage/blue_force/blueforce_scenes8.cpp
    engines/tsage/blue_force/blueforce_scenes9.cpp
    engines/tsage/blue_force/blueforce_scenes9.h
    engines/tsage/converse.cpp
    engines/tsage/converse.h
    engines/tsage/core.cpp
    engines/tsage/core.h
    engines/tsage/debugger.cpp
    engines/tsage/debugger.h
    engines/tsage/detection.cpp
    engines/tsage/detection_tables.h
    engines/tsage/dialogs.cpp
    engines/tsage/dialogs.h
    engines/tsage/events.cpp
    engines/tsage/events.h
    engines/tsage/globals.cpp
    engines/tsage/globals.h
    engines/tsage/graphics.cpp
    engines/tsage/graphics.h
    engines/tsage/module.mk
    engines/tsage/resources.cpp
    engines/tsage/resources.h
    engines/tsage/ringworld/ringworld_dialogs.cpp
    engines/tsage/ringworld/ringworld_dialogs.h
    engines/tsage/ringworld/ringworld_logic.cpp
    engines/tsage/ringworld/ringworld_logic.h
    engines/tsage/ringworld/ringworld_scenes10.cpp
    engines/tsage/ringworld/ringworld_scenes10.h
    engines/tsage/ringworld/ringworld_scenes3.cpp
    engines/tsage/ringworld/ringworld_scenes5.cpp
    engines/tsage/ringworld/ringworld_scenes5.h
    engines/tsage/ringworld/ringworld_scenes6.cpp
    engines/tsage/ringworld/ringworld_scenes8.cpp
    engines/tsage/ringworld/ringworld_scenes8.h
    engines/tsage/ringworld2/ringworld2_dialogs.cpp
    engines/tsage/ringworld2/ringworld2_dialogs.h
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/ringworld2/ringworld2_logic.h
    engines/tsage/ringworld2/ringworld2_scenes0.cpp
    engines/tsage/ringworld2/ringworld2_scenes0.h
    engines/tsage/saveload.cpp
    engines/tsage/saveload.h
    engines/tsage/scenes.cpp
    engines/tsage/sound.cpp
    engines/tsage/sound.h
    engines/tsage/staticres.cpp
    engines/tsage/staticres.h
    engines/tsage/tsage.cpp
    engines/tsage/tsage.h
    engines/tsage/user_interface.cpp
    engines/tsage/user_interface.h
    engines/tucker/detection.cpp
    engines/tucker/locations.cpp
    engines/tucker/saveload.cpp
    engines/tucker/tucker.h
    graphics/VectorRenderer.cpp
    graphics/VectorRenderer.h
    graphics/VectorRendererSpec.cpp
    graphics/VectorRendererSpec.h
    graphics/cursorman.cpp
    graphics/font.cpp
    graphics/font.h
    graphics/fontman.cpp
    graphics/fontman.h
    graphics/fonts/bdf.cpp
    graphics/fonts/bdf.h
    graphics/fonts/consolefont.cpp
    graphics/fonts/newfont.cpp
    graphics/fonts/newfont_big.cpp
    graphics/iff.cpp
    graphics/imagedec.cpp
    graphics/jpeg.cpp
    graphics/jpeg.h
    graphics/module.mk
    graphics/pict.cpp
    graphics/png.cpp
    graphics/png.h
    graphics/scaler/scale2x.h
    graphics/scaler/scale3x.h
    graphics/scaler/scalebit.h
    graphics/scaler/thumbnail_intern.cpp
    graphics/sjis.h
    graphics/surface.cpp
    graphics/yuv_to_rgb.h
    gui/ThemeEngine.cpp
    gui/ThemeEngine.h
    gui/ThemeParser.cpp
    gui/ThemeParser.h
    gui/about.cpp
    gui/browser_osx.mm
    gui/console.cpp
    gui/credits.h
    gui/debugger.cpp
    gui/dialog.cpp
    gui/gui-manager.cpp
    gui/gui-manager.h
    gui/launcher.cpp
    gui/launcher.h
    gui/object.cpp
    gui/object.h
    gui/options.cpp
    gui/options.h
    gui/saveload.cpp
    gui/themes/default.inc
    gui/themes/fonts/README
    gui/themes/scummclassic.zip
    gui/themes/scummclassic/THEMERC
    gui/themes/scummclassic/clR6x12-iso-8859-2.fcc
    gui/themes/scummclassic/clR6x12-iso-8859-5.fcc
    gui/themes/scummclassic/classic_gfx.stx
    gui/themes/scummclassic/classic_layout.stx
    gui/themes/scummclassic/classic_layout_lowres.stx
    gui/themes/scummclassic/fixed5x8-iso-8859-2.fcc
    gui/themes/scummclassic/fixed5x8-iso-8859-5.fcc
    gui/themes/scummclassic/helvb12-iso-8859-2.fcc
    gui/themes/scummclassic/helvb12-iso-8859-5.fcc
    gui/themes/scummmodern.zip
    gui/themes/scummmodern/THEMERC
    gui/themes/scummmodern/clR6x12-iso-8859-2.fcc
    gui/themes/scummmodern/clR6x12-iso-8859-5.fcc
    gui/themes/scummmodern/fixed5x8-iso-8859-2.fcc
    gui/themes/scummmodern/fixed5x8-iso-8859-5.fcc
    gui/themes/scummmodern/helvb12-iso-8859-1.fcc
    gui/themes/scummmodern/helvb12-iso-8859-2.fcc
    gui/themes/scummmodern/helvb12-iso-8859-5.fcc
    gui/themes/scummmodern/scummmodern_gfx.stx
    gui/themes/scummmodern/scummmodern_layout.stx
    gui/themes/scummmodern/scummmodern_layout_lowres.stx
    gui/themes/scummmodern/search.bmp
    gui/themes/scummtheme.py
    gui/themes/translations.dat
    gui/widget.cpp
    gui/widget.h
    gui/widgets/editable.cpp
    gui/widgets/edittext.cpp
    gui/widgets/list.cpp
    gui/widgets/scrollbar.cpp
    gui/widgets/scrollbar.h
    po/POTFILES
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DA.po
    po/de_DE.po
    po/es_ES.po
    po/fr_FR.po
    po/hu_HU.po
    po/it_IT.po
    po/module.mk
    po/nb_NO.po
    po/nn_NO.po
    po/pl_PL.po
    po/pt_BR.po
    po/ru_RU.po
    po/scummvm.pot
    po/se_SE.po
    po/uk_UA.po
    ports.mk
    test/audio/helper.h
    test/audio/raw.h
    test/common/fixedstack.h
    test/common/memoryreadstream.h
    test/common/pack.h
    test/common/stack.h
    test/common/subreadstream.h
    test/cxxtest/cxxtest/ValueTraits.h
    video/avi_decoder.h
    video/bink_decoder.cpp
    video/bink_decoder.h
    video/codecs/cinepak.h
    video/codecs/mjpeg.h
    video/coktel_decoder.cpp
    video/coktel_decoder.h
    video/dxa_decoder.cpp
    video/dxa_decoder.h
    video/module.mk
    video/qt_decoder.cpp
    video/qt_decoder.h



diff --cc engines/neverhood/blbarchive.cpp
index 6a047ca,0000000..4e138b0
mode 100644,000000..100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@@ -1,116 -1,0 +1,116 @@@
 +/* 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 "common/dcl.h"
 +#include "neverhood/blbarchive.h"
 +
 +namespace Neverhood {
 +
 +BlbArchive::BlbArchive() : _extData(NULL) {
 +}
 +
 +BlbArchive::~BlbArchive() {
 +	delete[] _extData;
 +}
 +
 +void BlbArchive::open(const Common::String &filename) {
 +	BlbHeader header; 
 +	
 +	_entries.clear();		
 +
 +	if (!_fd.open(filename))
 +		error("BlbArchive::open() Could not open %s", filename.c_str());
 +
 +	header.id1 = _fd.readUint32LE();
 +	header.id2 = _fd.readUint16LE();
 +	header.extDataSize = _fd.readUint16LE();
 +	header.fileSize = _fd.readUint32LE();
 +	header.fileCount = _fd.readUint32LE();
 +
 +	if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size())
 +		error("BlbArchive::open() %s seems to be corrupt", filename.c_str());
 +
 +	debug(2, "fileCount = %d", header.fileCount);
 +
 +	_entries.reserve(header.fileCount);
 +
 +	// Load file hashes
 +	for (uint i = 0; i < header.fileCount; i++) {
 +		BlbArchiveEntry entry;
 +		entry.fileHash = _fd.readUint32LE();
 +		_entries.push_back(entry);
 +	}
 +	
 +	// Load file records
 +	for (uint i = 0; i < header.fileCount; i++) {
 +		BlbArchiveEntry &entry = _entries[i];
 +		entry.type = _fd.readByte();
 +		entry.comprType = _fd.readByte();
 +		entry.extDataOfs = _fd.readUint16LE();
 +		entry.timeStamp = _fd.readUint32LE();
 +		entry.offset = _fd.readUint32LE();
 +		entry.diskSize = _fd.readUint32LE();
 +		entry.size = _fd.readUint32LE();
 +		debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
 +			entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp,
 +			entry.offset, entry.diskSize, entry.size);
 +	}
 +
 +	// Load ext data
 +	if (header.extDataSize > 0) {
 +		_extData = new byte[header.extDataSize];
 +		_fd.read(_extData, header.extDataSize);
 +	}
 +
 +}
 +
 +void BlbArchive::load(uint index, byte *buffer, uint32 size) {
 +	BlbArchiveEntry &entry = _entries[index];
 +	
 +	_fd.seek(entry.offset);
 +	
 +	switch (entry.comprType) {
 +	case 1: // Uncompressed
 +		if (size == 0)
 +			size = entry.diskSize;
 +		_fd.read(buffer, size);
 +		break;
 +	case 3: // DCL-compressed
 +		Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size);
 +		break;
 +	default:
 +		;
 +	}
 +
 +}
 +
 +byte *BlbArchive::getEntryExtData(uint index) {
 +	BlbArchiveEntry &entry = _entries[index];
 +	return (_extData && entry.extDataOfs != 0) ? &_extData[entry.extDataOfs - 1] : NULL;
 +}
 +
 +Common::SeekableReadStream *BlbArchive::createStream(uint index) {
 +	const BlbArchiveEntry &entry = _entries[index];
- 	return new Common::SafeSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
++	return new Common::SafeSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
 +}
 +
 +} // End of namespace Neverhood


Commit: 0683ed9eee35a465b7b3fd5b36f55011123aee65
    https://github.com/scummvm/scummvm/commit/0683ed9eee35a465b7b3fd5b36f55011123aee65
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:38-07:00

Commit Message:
NEVERHOOD: Rename SetSpriteCallback to SetSpriteUpdate

- Started replace message numbers with constants
- Add NRect::contains
- Some cleanup

Changed paths:
  A engines/neverhood/messages.h
    engines/neverhood/blbarchive.cpp
    engines/neverhood/collisionman.cpp
    engines/neverhood/graphics.h
    engines/neverhood/klayman.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/scene.cpp
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h
    engines/neverhood/smackerscene.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 4e138b0..f003728 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -98,7 +98,7 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) {
 		Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size);
 		break;
 	default:
-		;
+		error("BlbArchive::load() Unknown compression type %d", entry.comprType);
 	}
 
 }
diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index a1314bf..bacf18b 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -56,13 +56,10 @@ void CollisionMan::clearHitRects() {
 }
 
 HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) {
-	if (_hitRects) {
-		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) {
-			HitRect *hitRect = &(*it);
-			if (x >= hitRect->rect.x1 && x <= hitRect->rect.x2 && y >= hitRect->rect.y1 && y <= hitRect->rect.y2)
-				return hitRect;
-		}
-	}
+	if (_hitRects)
+		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++)
+			if ((*it).rect.contains(x, y))
+				return &(*it);
 	return &defaultHitRect; 
 }
 
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index c2adb11..7725e73 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -42,14 +42,22 @@ struct NDimensions {
 
 struct NRect {
 	int16 x1, y1, x2, y2;
+
 	NRect() : x1(0), y1(0), x2(0), y2(0) {}
+
 	NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {}
+
 	void set(int16 x01, int16 y01, int16 x02, int16 y02) {
 		x1 = x01;
 		y1 = y01;
 		x2 = x02;
 		y2 = y02;
 	}
+
+	bool contains(int16 x, int16 y) const {
+		return x >= x1 && x <= x2 && y >= y1 && y <= y2;
+	}
+
 };
 
 typedef Common::Array<NRect> NRectArray;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 6873e50..303e3fe 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -132,7 +132,7 @@ void Klayman::stIdlePickEar() {
 	startAnimation(0x5B20C814, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmIdlePickEar);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 	FinalizeState(&Klayman::evIdlePickEarDone);
 }
@@ -163,7 +163,7 @@ void Klayman::sub41FDB0() {
 	startAnimation(0xD122C137, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41E980);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
@@ -189,7 +189,7 @@ void Klayman::sub41FE00() {
 	startAnimation(0x543CD054, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41E9E0);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 	FinalizeState(&Klayman::sub41FE50);
 }
@@ -224,7 +224,7 @@ void Klayman::stIdleChest() {
 	startAnimation(0x40A0C034, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmIdleChest);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
@@ -250,7 +250,7 @@ void Klayman::sub41FEC0() {
 	startAnimation(0x5120E137, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EFE0);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
@@ -277,7 +277,7 @@ void Klayman::sub421350() {
 	_acceptInput = true;
 	startAnimation(0x582EC138, 0, -1);
 	_counter = 0;
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetUpdateHandler(&Klayman::update41D1C0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_counter3 = 0;
@@ -317,7 +317,7 @@ void Klayman::stIdleSitBlink() {
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stIdleSitBlinkSecond);
 }
 
@@ -327,7 +327,7 @@ void Klayman::stIdleSitBlinkSecond() {
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update41D1C0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stPickUpNeedle() {
@@ -338,7 +338,7 @@ void Klayman::stPickUpNeedle() {
 		startAnimation(0x1449C169, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPickUpGeneric);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -350,7 +350,7 @@ void Klayman::sub41FFF0() {
 		startAnimation(0x0018C032, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D640);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -383,7 +383,7 @@ void Klayman::stTurnToUseInTeleporter() {
 	startAnimation(0xD229823D, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stReturnFromUseInTeleporter() {
@@ -392,7 +392,7 @@ void Klayman::stReturnFromUseInTeleporter() {
 	startAnimation(0x9A2801E0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stStepOver() {
@@ -402,7 +402,7 @@ void Klayman::stStepOver() {
 		startAnimation(0x004AA310, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	}
 }
 
@@ -413,7 +413,7 @@ void Klayman::stSitInTeleporter() {
 		startAnimation(0x392A0330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmSitInTeleporter);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	}
 }
 
@@ -435,7 +435,7 @@ void Klayman::stGetUpFromTeleporter() {
 	startAnimation(0x913AB120, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 }
 
 /////////////////////////////////////////////////////////////////
@@ -477,7 +477,7 @@ bool Klayman::stStartActionFromIdle(AnimationCb callback) {
 		startAnimation(0x9A7020B8, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartAction);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		NextState(callback);
 		return true;
 	}
@@ -523,7 +523,7 @@ void Klayman::stTryStandIdle() {
 		_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
 		SetUpdateHandler(&Klayman::update41D0F0);
 		SetMessageHandler(&Klayman::handleMessage41D360);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -591,7 +591,7 @@ void Klayman::stStand() {
 	startAnimation(0x5900C41E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
@@ -611,7 +611,7 @@ void Klayman::stStandAround() {
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update41D0F0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmStartAction(int messageNum, const MessageParam &param, Entity *sender) {
@@ -666,7 +666,7 @@ void Klayman::stWakeUp() {
 	startAnimation(0x527AC970, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stSleeping() {
@@ -675,7 +675,7 @@ void Klayman::stSleeping() {
 	startAnimation(0x5A38C110, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmSleeping);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmSleeping(int messageNum, const MessageParam &param, Entity *sender) {
@@ -697,7 +697,7 @@ bool Klayman::stStartAction(AnimationCb callback3) {
 		startAnimation(0x5C7080D4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartAction);
-		SetSpriteCallback(&Klayman::spriteUpdate41F250);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 		NextState(callback3);
 		return true;
 	} else {
@@ -793,7 +793,7 @@ void Klayman::stSneak() {
 	startAnimation(0x5C48C506, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteCallback(&Klayman::suWalking);
+	SetSpriteUpdate(&Klayman::suWalking);
 	FinalizeState(&Klayman::stWalkingDone);	
 }
 
@@ -832,7 +832,7 @@ void Klayman::stStartWalking() {
 		startAnimation(0x242C0198, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteCallback(&Klayman::suWalkingTestExit);
+		SetSpriteUpdate(&Klayman::suWalkingTestExit);
 		FinalizeState(&Klayman::stStartWalkingDone);	
 		NextState(&Klayman::stWalking);
 	}
@@ -863,13 +863,13 @@ void Klayman::stWalking() {
 	startAnimation(0x1A249001, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
-	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	FinalizeState(&Klayman::stStartWalkingDone);	
 	NextState(&Klayman::stUpdateWalking);
 }
 
 void Klayman::spriteUpdate41F300() {
-	SetSpriteCallback(&Klayman::suWalkingTestExit);
+	SetSpriteUpdate(&Klayman::suWalkingTestExit);
 	_deltaX = 0;
 }
 
@@ -914,7 +914,7 @@ void Klayman::stUpdateWalking() {
 		}
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalking);
-		SetSpriteCallback(&Klayman::suWalking);
+		SetSpriteUpdate(&Klayman::suWalking);
 		FinalizeState(&Klayman::stWalkingDone);	
 	}
 }
@@ -987,7 +987,7 @@ void Klayman::stPickUpGeneric() {
 		startAnimation(0x1C28C178, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPickUpGeneric);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -1024,7 +1024,7 @@ void Klayman::stTurnPressButton() {
 		startAnimation(0x1C02B03D, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -1053,7 +1053,7 @@ void Klayman::stStampFloorButton() {
 		startAnimation(0x1C16B033, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -1064,7 +1064,7 @@ void Klayman::stPressButtonSide() {
 		startAnimation(0x1CD89029, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteCallback(&Klayman::spriteUpdate41F250);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 	}
 }
 
@@ -1155,7 +1155,7 @@ void Klayman::stLargeStep() {
 	startAnimation(0x08B28116, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLargeStep);
-	SetSpriteCallback(&Klayman::suLargeStep);
+	SetSpriteUpdate(&Klayman::suLargeStep);
 	FinalizeState(&Klayman::stLargeStepDone);	
 }
 
@@ -1225,7 +1225,7 @@ void Klayman::stWonderAboutHalf() {
 	startAnimation(0xD820A114, 0, 10);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stWonderAboutAfter() {
@@ -1234,7 +1234,7 @@ void Klayman::stWonderAboutAfter() {
 	startAnimation(0xD820A114, 30, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stTurnToUseHalf() {
@@ -1243,7 +1243,7 @@ void Klayman::stTurnToUseHalf() {
 	startAnimation(0x9B250AD2, 0, 7);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmTurnToUse);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1266,7 +1266,7 @@ void Klayman::stTurnAwayFromUse() {
 	startAnimation(0x98F88391, 4, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmTurnToUse);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stWonderAbout() {
@@ -1275,7 +1275,7 @@ void Klayman::stWonderAbout() {
 	startAnimation(0xD820A114, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stPeekWall() {
@@ -1284,7 +1284,7 @@ void Klayman::stPeekWall() {
 	startAnimation(0xAC20C012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmPeekWall);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1318,7 +1318,7 @@ void Klayman::setupJumpToRing() {
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmJumpToRing);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	NextState(&Klayman::sub420340);
 	sendMessage(_attachedSprite, 0x482B, 0);
 }
@@ -1355,7 +1355,7 @@ void Klayman::sub420340() {
 	startAnimation(0x4829E0B8, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stJumpToRing2() {
@@ -1372,7 +1372,7 @@ void Klayman::stJumpToRing3() {
 		_acceptInput = false;
 		startAnimation(0xBA1910B2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::hmJumpToRing3);
 		NextState(&Klayman::stHoldRing);
 		sendMessage(_attachedSprite, 0x482B, 0);
@@ -1405,7 +1405,7 @@ void Klayman::stHoldRing() {
 	startAnimation(0x4A293FB0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmHoldRing);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmHoldRing(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1426,7 +1426,7 @@ void Klayman::stReleaseRing() {
 	startAnimation(0xB869A4B9, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stJumpToRing4() {
@@ -1449,7 +1449,7 @@ void Klayman::stContinueClimbLadderUp() {
 	_newStickFrameHash = 0x01084280;
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	gotoNextStateExt();
 }
 
@@ -1469,14 +1469,14 @@ void Klayman::stStartClimbLadderDown() {
 			startAnimation(0x122D1505, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		} else if (_ladderStatus == 3) {
 			_ladderStatus = 2;
 			_acceptInput = true;
 			startAnimationByHash(0x122D1505, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		} else if (_ladderStatus == 1) {
 			_ladderStatus = 2;
 			_acceptInput = true;
@@ -1493,14 +1493,14 @@ void Klayman::stClimbLadderHalf() {
 		startAnimationByHash(0x3A292504, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	} else if (_ladderStatus == 2) {
 		_ladderStatus = 0;
 		_acceptInput = false;
 		startAnimationByHash(0x122D1505, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	} else {
 		gotoNextStateExt();
 	}
@@ -1561,14 +1561,14 @@ void Klayman::stStartClimbLadderUp() {
 			startAnimation(0x3A292504, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		} else if (_ladderStatus == 3) {
 			_ladderStatus = 1;
 			_acceptInput = true;
 			startAnimationByHash(0x3A292504, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		} else if (_ladderStatus == 2) {
 			_ladderStatus = 1;
 			_acceptInput = true;
@@ -1583,7 +1583,7 @@ void Klayman::stWalkToFrontNoStep() {
 	startAnimationByHash(0xF229C003, 0x14884392, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalkToFront);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 }
 
 uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1611,7 +1611,7 @@ void Klayman::stWalkToFront() {
 		startAnimation(0xF229C003, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	}
 }
 
@@ -1622,7 +1622,7 @@ void Klayman::stTurnToFront() {
 		startAnimationByHash(0xCA221107, 0x8520108C, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	}
 }
 
@@ -1633,7 +1633,7 @@ void Klayman::stTurnToBack() {
 		startAnimation(0xCA221107, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	}
 }
 
@@ -1643,7 +1643,7 @@ void Klayman::stLandOnFeet() {
 	startAnimation(0x18118554, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLandOnFeet);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1665,7 +1665,7 @@ void Klayman::stTurnToBackToUse() {
 		startAnimation(0x91540140, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmTurnToBackToUse);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	}
 }
 
@@ -1691,7 +1691,7 @@ void Klayman::stClayDoorOpen() {
 		_acceptInput = false;
 		startAnimation(0x5CCCB330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::hmClayDoorOpen);
 	}
 }
@@ -1716,7 +1716,7 @@ void Klayman::stTurnToUse() {
 		_acceptInput = false;
 		startAnimation(0x9B250AD2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::hmTurnToUse);
 	}
 }
@@ -1726,7 +1726,7 @@ void Klayman::stReturnFromUse() {
 	_acceptInput = false;
 	startAnimation(0x98F88391, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::hmTurnToUse);
 }
 
@@ -1735,7 +1735,7 @@ void Klayman::stWalkingOpenDoor() {
 	_acceptInput = false;
 	startAnimation(0x11A8E012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::suWalkingOpenDoor);
+	SetSpriteUpdate(&Klayman::suWalkingOpenDoor);
 	SetMessageHandler(&Klayman::hmStartWalking);
 }
 
@@ -1753,7 +1753,7 @@ void Klayman::stMoveObjectSkipTurnFaceObject() {
 	_acceptInput = true;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::hmMoveObjectTurn);
 }
 
@@ -1792,7 +1792,7 @@ void Klayman::stMoveObjectSkipTurn() {
 	_acceptInput = true;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::hmMoveObjectTurn);
 }
 
@@ -1804,7 +1804,7 @@ void Klayman::stMoveObjectFaceObject() {
 		_acceptInput = true;
 		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::hmMoveObjectTurn);
 	}
 }
@@ -1818,7 +1818,7 @@ void Klayman::stUseLever() {
 			sendMessage(_attachedSprite, 0x482B, 0);
 			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteCallback(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 			SetMessageHandler(&Klayman::handleMessage41E210);
 			NextState(&Klayman::stPullLeverDown);
 			_acceptInput = false;
@@ -1836,7 +1836,7 @@ void Klayman::stPullLeverDown() {
 void Klayman::stHoldLeverDown() {
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_isLeverDown = true;
 	_acceptInput = true;
@@ -1845,7 +1845,7 @@ void Klayman::stHoldLeverDown() {
 void Klayman::stUseLeverRelease() {
 	startAnimation(0x09018068, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41E210);
 	sendMessage(_attachedSprite, 0x4807, 0);
 	NextState(&Klayman::stPullLeverDown);
@@ -1857,7 +1857,7 @@ void Klayman::stReleaseLever() {
 		_status2 = 2;
 		startAnimation(0x09018068, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::handleMessage41E210);
 		sendMessage(_attachedSprite, 0x4807, 0);
 		NextState(&Klayman::stLetGoOfLever);
@@ -1894,7 +1894,7 @@ void Klayman::stInsertDisk() {
 		} else {
 			startAnimation(0xD8C8D100, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteCallback(&Klayman::spriteUpdate41F250);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 			SetMessageHandler(&Klayman::hmInsertDisk);
 			_acceptInput = false;
 			_counter2--;
@@ -1952,10 +1952,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&KmScene1001::sub44FA50);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -2016,7 +2016,7 @@ void KmScene1001::sub44FA50() {
 		startAnimation(0x00648953, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1001::handleMessage44FA00);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	}
 }
 
@@ -2101,7 +2101,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:			   
 		GotoState(&KmScene1002::sub449E20);
 		break;
-	case 0x4816:  
+	case NM_KLAYMAN_PRESS_BUTTON:  
 		if (param.asInteger() == 0) {
 			GotoState(&KmScene1002::stPressDoorButton);
 		}
@@ -2329,7 +2329,7 @@ void KmScene1002::sub449E20() {
 		_acceptInput = false;
 		startAnimation(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1002::handleMessage449800);
 		NextState(&Klayman::stLandOnFeet);
 		sendMessage(_attachedSprite, 0x482B, 0);
@@ -2343,7 +2343,7 @@ void KmScene1002::sub449E90() {
 	_surface->setVisible(false);
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage4498E0);
 }
 
@@ -2356,7 +2356,7 @@ void KmScene1002::sub449EF0() {
 	// Weird stuff happening
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	//SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteCallback(&KmScene1002::suFallDown);
+	SetSpriteUpdate(&KmScene1002::suFallDown);
 	NextState(&KmScene1002::sub449F70);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
@@ -2370,7 +2370,7 @@ void KmScene1002::sub449F70() {
 	_isWalking = false;
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
 	NextState(&KmScene1002::sub44A230);
 	sendMessage(_parentScene, 0x2002, 0);
@@ -2386,7 +2386,7 @@ void KmScene1002::stSpitOutFall() {
 	_acceptInput = false;
 	startAnimation(0x9308C132, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
-	SetSpriteCallback(&KmScene1002::suFallDown);
+	SetSpriteUpdate(&KmScene1002::suFallDown);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	NextState(&KmScene1002::sub449F70);
 	sendMessage(_class599, 0x482A, 0);
@@ -2400,7 +2400,7 @@ void KmScene1002::sub44A0D0() {
 	startAnimation(0x0013A206, 0, -1);
 	SetUpdateHandler(&KmScene1002::update4497D0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteCallback(&KmScene1002::suFallDown);
+	SetSpriteUpdate(&KmScene1002::suFallDown);
 	NextState(&KmScene1002::sub44A150);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
@@ -2415,7 +2415,7 @@ void KmScene1002::sub44A150() {
 	startAnimationByHash(0x0013A206, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&KmScene1002::sub44A230);
 	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
@@ -2437,7 +2437,7 @@ void KmScene1002::stJumpAndFall() {
 		startAnimation(0xB93AB151, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1002::handleMessage449D60);
-		SetSpriteCallback(&KmScene1002::suFallDown);
+		SetSpriteUpdate(&KmScene1002::suFallDown);
 		NextState(&Klayman::stLandOnFeet);
 	}
 }
@@ -2453,7 +2453,7 @@ void KmScene1002::stDropFromRing() {
 	startAnimation(0x586984B1, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage41D360);
-	SetSpriteCallback(&KmScene1002::suFallDown);
+	SetSpriteUpdate(&KmScene1002::suFallDown);
 	NextState(&Klayman::stLandOnFeet);
 }
 
@@ -2464,7 +2464,7 @@ void KmScene1002::stPressDoorButton() {
 	startAnimation(0x1CD89029, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::hmPressDoorButton);
-	SetSpriteCallback(&Klayman::spriteUpdate41F250);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 }
 
 void KmScene1002::stHitByBoxingGlove() {
@@ -2473,7 +2473,7 @@ void KmScene1002::stHitByBoxingGlove() {
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::handleMessage449C90);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	FinalizeState(&KmScene1002::stHitByBoxingGloveDone);
 }
 
@@ -2490,7 +2490,7 @@ void KmScene1002::stMoveVenusFlyTrap() {
 		startAnimation(0x5C01A870, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone);
 	}
 }
@@ -2501,7 +2501,7 @@ void KmScene1002::stContinueMovingVenusFlyTrap() {
 	startAnimationByHash(0x5C01A870, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone);
 }
 
@@ -2596,7 +2596,7 @@ void KmScene1004::stReadNote() {
 	startAnimation(0x123E9C9F, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene1004::hmReadNote);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
 KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -2681,7 +2681,7 @@ void KmScene1109::sub461F30() {
 	_status2 = 0;
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1109::handleMessage461EA0);
 	startAnimation(0x2C2A4A1C, 0, -1);
 }
@@ -2690,7 +2690,7 @@ void KmScene1109::sub461F70() {
 	_status2 = 0;
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1109::handleMessage461EA0);
 	startAnimation(0x3C2E4245, 0, -1);
 }
@@ -2717,7 +2717,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480A:
 		GotoState(&KmScene1201::stMoveObject);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4813:
@@ -2729,7 +2729,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4815:
 		GotoState(&KmScene1201::sub40E040);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 0) {
 			GotoState(&Klayman::stPressButtonSide);
 		}
@@ -2801,7 +2801,7 @@ void KmScene1201::stFetchMatch() {
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		startAnimation(0x9CAA0218, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		SetMessageHandler(&KmScene1201::hmMatch);
 		NextState(&KmScene1201::stLightMatch);
 	}
@@ -2813,7 +2813,7 @@ void KmScene1201::stLightMatch() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	startAnimation(0x1222A513, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1201::hmMatch);
 }
 
@@ -2858,7 +2858,7 @@ void KmScene1201::stMoveObject() {
 		setDoDeltaX(0);
 		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&KmScene1201::update40DBE0);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1201::hmMoveObject);
 	}
 }
@@ -2867,7 +2867,7 @@ void KmScene1201::stMoveObjectSkipTurn() {
 	_acceptInput = false;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&KmScene1201::update40DBE0);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene1201::hmMoveObject);
 }
 
@@ -2878,7 +2878,7 @@ void KmScene1201::stTumbleHeadless() {
 		setDoDeltaX(0);
 		startAnimation(0x2821C590, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1201::hmTumbleHeadless);
 		NextState(&Klayman::stTryStandIdle);
 		sendMessage(_class464, 0x2006, 0);
@@ -2892,7 +2892,7 @@ void KmScene1201::sub40E040() {
 		_acceptInput = false;		
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 	}
 }
@@ -2948,7 +2948,7 @@ void KmScene1303::stPeekWall1() {
 	_acceptInput = true;
 	startAnimation(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	NextState(&KmScene1303::stPeekWall3);
 }
@@ -2958,7 +2958,7 @@ void KmScene1303::stPeekWall2() {
 	_acceptInput = false;
 	startAnimation(0xAC20C012, 43, 49);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 }
 
@@ -2969,7 +2969,7 @@ void KmScene1303::stPeekWall3() {
 	_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
 	startAnimation(0xAC20C012, 38, 42);
 	SetUpdateHandler(&KmScene1303::update4161A0);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_newStickFrameIndex = 42;
 }
@@ -2979,7 +2979,7 @@ void KmScene1303::stPeekWallReturn() {
 	_acceptInput = false;
 	startAnimation(0x2426932E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1303::hmPeekWallReturn);
 }
 
@@ -2998,7 +2998,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;		
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3069,7 +3069,7 @@ void KmScene1305::stCrashDown() {
 	_acceptInput = false;
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	NextState(&KmScene1305::cbCrashDownEvent);
 }
@@ -3101,7 +3101,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3110,7 +3110,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -3123,7 +3123,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
-	case 0x481A:
+	case NM_KLAYMAN_INSERT_DISK:
 		GotoState(&Klayman::stInsertDisk);		
 		break;
 	case 0x481B:
@@ -3210,7 +3210,7 @@ void KmScene1306::sub417D40() {
 	_acceptInput = false;
 	startAnimation(0xEE084A04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1306::handleMessage417CB0);
 }
 
@@ -3219,7 +3219,7 @@ void KmScene1306::sub417D80() {
 	_acceptInput = false;
 	startAnimation(0xB86A4274, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1306::handleMessage417CB0);
 }
 
@@ -3261,7 +3261,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&KmScene1001::stUseLever);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3274,7 +3274,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
-	case 0x481A:
+	case NM_KLAYMAN_INSERT_DISK:
 		if (param.asInteger() == 1) {
 			GotoState(&KmScene1308::sub456150);		
 		} else {
@@ -3294,7 +3294,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x481E:
 		GotoState(&Klayman::stReturnFromUse);
 		break;
-	case 0x4827:
+	case NM_KLAYMAN_RELEASE_LEVER:
 		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x4834:
@@ -3364,7 +3364,7 @@ void KmScene1308::sub456150() {
 			_acceptInput = false;
 			startAnimation(0xDC409440, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteCallback(&Klayman::spriteUpdate41F250);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 			SetMessageHandler(&KmScene1308::handleMessage);
 			_flag1 = false;
 		}
@@ -3395,7 +3395,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stMoveObjectFaceObject);
 		}	
 		break;		
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -3518,7 +3518,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&KmScene1001::stUseLever);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3538,7 +3538,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 			sub41CCE0(param.asPoint().x);
 		}
 		break;
-	case 0x4827:
+	case NM_KLAYMAN_RELEASE_LEVER:
 		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x483F:
@@ -3575,7 +3575,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stMoveObjectFaceObject);
 		}
 		break;		
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3588,7 +3588,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
-	case 0x481A:
+	case NM_KLAYMAN_INSERT_DISK:
 		GotoState(&Klayman::stInsertDisk);		
 		break;
 	case 0x481B:
@@ -3650,7 +3650,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3747,7 +3747,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4803:
 		GotoState(&KmScene1705::stFallSkipJump);
 		break;				
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3842,7 +3842,7 @@ void KmScene1705::stFallSkipJump() {
 	_acceptInput = false;
 	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&KmScene1705::spriteUpdate468A30);
+	SetSpriteUpdate(&KmScene1705::spriteUpdate468A30);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	NextState(&Klayman::stLandOnFeet);
 }
@@ -3852,7 +3852,7 @@ void KmScene1705::sub468AD0() {
 	_acceptInput = false;
 	startAnimation(0x5E0A4905, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1705::handleMessage4689A0);
 }
 
@@ -3861,7 +3861,7 @@ void KmScene1705::sub468B10() {
 	_acceptInput = false;
 	startAnimation(0xD86E4477, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1705::handleMessage4689A0);
 }
 
@@ -3922,26 +3922,23 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		if (_isSittingInTeleporter) {
 			GotoState(&Klayman::sub421350);
-		} else {
+		} else
 			GotoState(&Klayman::stTryStandIdle);
-		}
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klayman::stWalking);
-		} else {
+		} else
 			GotoState(&Klayman::stPeekWall);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
 	case 0x481D:
-		if (_isSittingInTeleporter) {
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::stTurnToUseInTeleporter);
-		}
 		break;
 	case 0x481E:
 		if (_isSittingInTeleporter) {
@@ -3990,7 +3987,7 @@ void KmScene2001::sub440230() {
 	_acceptInput = false;
 	startAnimation(0xBE68CC54, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
@@ -3999,7 +3996,7 @@ void KmScene2001::stDoTeleport() {
 	_acceptInput = false;
 	startAnimation(0x18AB4ED4, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene2001::handleMessage4401A0);
 }
 
@@ -4029,7 +4026,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4811:
 		GotoState(&KmScene2101::sub4862C0);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4038,7 +4035,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4131,7 +4128,7 @@ void KmScene2101::sub4862C0() {
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene2101::handleMessage486160);
 	_soundResource1.play(0x402E82D4);
 }
@@ -4141,7 +4138,7 @@ void KmScene2101::sub486320() {
 	_acceptInput = false;
 	startAnimation(0xFF290E30, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene2101::handleMessage486230);
 }
 
@@ -4150,7 +4147,7 @@ void KmScene2101::sub486360() {
 	_acceptInput = false;
 	startAnimation(0x9A28CA1C, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene2101::handleMessage486230);
 }
 
@@ -4171,10 +4168,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 0) {
 			GotoState(&Klayman::stPressButtonSide);
 		}
@@ -4241,7 +4238,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4250,7 +4247,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4269,7 +4266,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4819:
 		GotoState(&Klayman::stClayDoorOpen);
 		break;
-	case 0x481A:
+	case NM_KLAYMAN_INSERT_DISK:
 		GotoState(&Klayman::stInsertDisk);		
 		break;
 	case 0x481B:
@@ -4325,7 +4322,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPeekWall);
 		}
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 0) {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -4357,7 +4354,7 @@ void KmScene2205::sub423980() {
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
-	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
@@ -4396,14 +4393,14 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPeekWall);
 		}
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::sub41FFF0);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4483,7 +4480,7 @@ void KmScene2206::sub482490() {
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D360);
-		SetSpriteCallback(&KmScene2206::spriteUpdate482450);
+		SetSpriteUpdate(&KmScene2206::spriteUpdate482450);
 		// TODO Sound1ChList_playLooping(0xD3B02847);
 	}
 }
@@ -4498,7 +4495,7 @@ void KmScene2206::sub482530() {
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
-	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
@@ -4527,10 +4524,10 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&KmScene2207::sub4424B0);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4550,7 +4547,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 			sub41CCE0(param.asPoint().x);
 		}
 		break;
-	case 0x4827:
+	case NM_KLAYMAN_RELEASE_LEVER:
 		GotoState(&Klayman::stReleaseLever);
 		break;
 	case 0x482D:
@@ -4579,7 +4576,7 @@ void KmScene2207::sub442460() {
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteCallback(&KmScene2207::spriteUpdate442430);
+		SetSpriteUpdate(&KmScene2207::spriteUpdate442430);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 	}
 }
@@ -4593,7 +4590,7 @@ void KmScene2207::sub4424B0() {
 			_acceptInput = false;
 			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteCallback(&KmScene2207::spriteUpdate41F230);
+			SetSpriteUpdate(&KmScene2207::spriteUpdate41F230);
 			SetMessageHandler(&Klayman::handleMessage41E210);
 			NextState(&KmScene2207::sub442520);
 		}
@@ -4609,7 +4606,7 @@ void KmScene2207::sub442520() {
 void KmScene2207::sub442560() {
 	startAnimation(0x1564A2C0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	NextState(&KmScene2207::sub4425A0);
 	_acceptInput = true;
 	_isLeverDown = true;
@@ -4618,7 +4615,7 @@ void KmScene2207::sub442560() {
 void KmScene2207::sub4425A0() {
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteCallback(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_acceptInput = true;
 	_isLeverDown = true;
@@ -4650,7 +4647,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPeekWall);
 		}
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4704,7 +4701,7 @@ void KmScene2242::sub444D20() {
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
-	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
@@ -4773,7 +4770,7 @@ void KmHallOfRecords::sub43B130() {
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
-	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
@@ -4842,7 +4839,7 @@ void KmScene2247::sub453520() {
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41EB70);
-	SetSpriteCallback(&Klayman::spriteUpdate41F300);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
@@ -4861,7 +4858,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4817:
diff --git a/engines/neverhood/messages.h b/engines/neverhood/messages.h
new file mode 100644
index 0000000..5a2139d
--- /dev/null
+++ b/engines/neverhood/messages.h
@@ -0,0 +1,37 @@
+/* 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_MESSAGES_H
+#define NEVERHOOD_MESSAGES_H
+
+namespace Neverhood {
+
+enum NeverhoodMessage {
+	NM_KLAYMAN_PICKUP			= 0x4812,
+	NM_KLAYMAN_PRESS_BUTTON		= 0x4816,
+	NM_KLAYMAN_INSERT_DISK		= 0x481A,
+	NM_KLAYMAN_RELEASE_LEVER	= 0x4827
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MESSAGES_H */
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 176708b..edd9860 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -668,7 +668,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 	
 	SetUpdateHandler(&AsScene1002Door::update);
 	SetMessageHandler(&AsScene1002Door::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	StaticSprite::update();
 	
 }
@@ -683,11 +683,11 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x4808:
 		setGlobalVar(0x8306F218, 1);
-		SetSpriteCallback(&AsScene1002Door::suOpenDoor);
+		SetSpriteUpdate(&AsScene1002Door::suOpenDoor);
 		break;
 	case 0x4809:
 		setGlobalVar(0x8306F218, 0);
-		SetSpriteCallback(&AsScene1002Door::suCloseDoor);
+		SetSpriteUpdate(&AsScene1002Door::suCloseDoor);
 		break;
 	}
 	return messageResult;
@@ -697,7 +697,7 @@ void AsScene1002Door::suOpenDoor() {
 	if (_y > 49) {
 		_y -= 8;
 		if (_y < 49) {
-			SetSpriteCallback(NULL);
+			SetSpriteUpdate(NULL);
 			_y = 49;
 		}
 		_needRefresh = true;
@@ -708,7 +708,7 @@ void AsScene1002Door::suCloseDoor() {
 	if (_y < 239) {
 		_y += 8;
 		if (_y > 239) {
-			SetSpriteCallback(NULL);
+			SetSpriteUpdate(NULL);
 			_y = 239;
 		}
 		_needRefresh = true;
@@ -747,7 +747,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
-	SetSpriteCallback(&AsScene1002DoorSpy::suDoorSpy);
+	SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy);
 	createSurface(800, 136, 147);
 	setClipRect(clipRect);
 	suDoorSpy();
@@ -909,7 +909,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 
 	if (!_flag) {
 		if (getGlobalVar(0x8306F218)) {
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index fc28917..96ed46f 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -329,7 +329,7 @@ Class464::Class464(NeverhoodEngine *vm)
 	createSurface(1200, 69, 98);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class464::handleMessage);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	setVisible(false);
 }
 
@@ -415,13 +415,13 @@ void AsScene1201TntMan::spriteUpdate40CD10() {
 void AsScene1201TntMan::sub40CD30() {
 	startAnimation(0x654913D0, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void AsScene1201TntMan::sub40CD60() {
 	startAnimation(0x356803D0, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	NextState(&AsScene1201TntMan::sub40CD30);
 }
 
@@ -431,7 +431,7 @@ void AsScene1201TntMan::sub40CD90() {
 	_flag = true;
 	startAnimation(0x85084190, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
-	SetSpriteCallback(&AsScene1201TntMan::spriteUpdate40CD10);
+	SetSpriteUpdate(&AsScene1201TntMan::spriteUpdate40CD10);
 	_newStickFrameIndex = -2;
 }
 
@@ -441,7 +441,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
 	createSurface1(0x828C0411, 995);
 	SetUpdateHandler(&Class465::update);
 	SetMessageHandler(&Sprite::handleMessage);
-	SetSpriteCallback(&Class465::spriteUpdate40D150);
+	SetSpriteUpdate(&Class465::spriteUpdate40D150);
 	startAnimation(0x828C0411, 0, -1);
 	setVisible(false);
 }
@@ -471,7 +471,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
 	createSurface(1100, 57, 60);
 	SetUpdateHandler(&AsScene1201Match::update);
 	SetMessageHandler(&AsScene1201Match::handleMessage40C2D0);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	
 	switch (getGlobalVar(0x0112090A)) {
 	case 0:
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 38dd356..2c7a5c8 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -346,7 +346,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
 	
 	SetUpdateHandler(&SsScene1302Fence::update);
 	SetMessageHandler(&SsScene1302Fence::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	_firstY = _y;
 	if (getGlobalVar(0x80101B1E))
 		_y += 152;
@@ -364,12 +364,12 @@ uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param
 	switch (messageNum) {
 	case 0x4808:
 		_soundResource1.play();
-		SetSpriteCallback(&SsScene1302Fence::suMoveDown);
+		SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
 		SetMessageHandler(NULL);
 		break;
 	case 0x4809:
 		_soundResource2.play();
-		SetSpriteCallback(&SsScene1302Fence::suMoveUp);
+		SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
 		SetMessageHandler(NULL);
 		break;
 	}
@@ -381,7 +381,7 @@ void SsScene1302Fence::suMoveDown() {
 		_y += 8;
 	else {
 		SetMessageHandler(&SsScene1302Fence::handleMessage);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -390,7 +390,7 @@ void SsScene1302Fence::suMoveUp() {
 		_y -= 8;
 	else {
 		SetMessageHandler(&SsScene1302Fence::handleMessage);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -590,7 +590,7 @@ AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
 	_y = 390;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1303Balloon::handleMessage);
-	SetSpriteCallback(&AnimatedSprite::updateDeltaXY);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	startAnimation(0x800278D2, 0, -1);
 }
 
@@ -1179,7 +1179,7 @@ void AsScene1307Key::suRemoveKey() {
 		processDelta();
 		_pointIndex++;
 	} else {
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -1192,7 +1192,7 @@ void AsScene1307Key::suInsertKey() {
 		if (_pointIndex == 7)
 			_soundResource1.play();
 	} else {
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		sendMessage(_parentScene, 0x2002, 0);
 	}
 }
@@ -1215,7 +1215,7 @@ void AsScene1307Key::suMoveKey() {
 void AsScene1307Key::stRemoveKey() {
 	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
 	_pointIndex = 0;
-	SetSpriteCallback(&AsScene1307Key::suRemoveKey);
+	SetSpriteUpdate(&AsScene1307Key::suRemoveKey);
 	startAnimation(fileHashes[0], 0, -1);
 	_soundResource2.play();
 }
@@ -1224,7 +1224,7 @@ void AsScene1307Key::stInsertKey() {
 	_pointIndex = 0;
 	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]);
 	setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]);
-	SetSpriteCallback(&AsScene1307Key::suInsertKey);
+	SetSpriteUpdate(&AsScene1307Key::suInsertKey);
 	_newStickFrameIndex = -2;
 }
 
@@ -1244,7 +1244,7 @@ void AsScene1307Key::stMoveKey() {
 		_currFrameIndex = 0;
 		_deltaX = newX - _x;
 		_deltaY = newY - _y;
-		SetSpriteCallback(&AsScene1307Key::suMoveKey);
+		SetSpriteUpdate(&AsScene1307Key::suMoveKey);
 		startAnimation(fileHashes[0], 0, -1);
 	}
 }
@@ -1778,12 +1778,12 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x08284011);
 	showMouse(false);
 	_smackerFileHash = 0;
-	_smackerFlag1 = false;
+	_keepLastSmackerFrame = false;
 }
 
 void Scene1317::update() {
 	if (_smackerFileHash) {
-		_smackerPlayer->open(_smackerFileHash, _smackerFlag1);
+		_smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame);
 		_smackerFileHash = 0;
 	}
 	Scene::update();
@@ -1805,7 +1805,7 @@ void Scene1317::upChooseKing() {
 		stNoDecisionYet();
 			
 	if (_smackerFileHash) {
-		_smackerPlayer->open(_smackerFileHash, _smackerFlag1);
+		_smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame);
 		_smackerFileHash = 0;
 	}
 
@@ -1887,7 +1887,7 @@ void Scene1317::stChooseKing() {
 	SetMessageHandler(&Scene1317::hmChooseKing);
 	SetUpdateHandler(&Scene1317::upChooseKing);
 	_smackerFileHash = 0x10982841;
-	_smackerFlag1 = true;
+	_keepLastSmackerFrame = true;
 	_decisionCountdown = 450;
 	_klaymanBlinks = false;
 	_klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
@@ -1898,7 +1898,7 @@ void Scene1317::stNoDecisionYet() {
 	SetMessageHandler(&Scene1317::hmNoDecisionYet);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x20982841;
-	_smackerFlag1 = false;
+	_keepLastSmackerFrame = false;
 }
 
 void Scene1317::stHoborgAsKing() {
@@ -1906,7 +1906,7 @@ void Scene1317::stHoborgAsKing() {
 	SetMessageHandler(&Scene1317::hmHoborgAsKing);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x40982841;
-	_smackerFlag1 = false;
+	_keepLastSmackerFrame = false;
 }
 
 void Scene1317::stKlaymanAsKing() {
@@ -1914,7 +1914,7 @@ void Scene1317::stKlaymanAsKing() {
 	SetMessageHandler(&Scene1317::hmKlaymanAsKing);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x80982841;
-	_smackerFlag1 = false;
+	_keepLastSmackerFrame = false;
 }
 
 void Scene1317::stEndMovie() {
@@ -1922,7 +1922,7 @@ void Scene1317::stEndMovie() {
 	SetMessageHandler(&Scene1317::hmEndMovie);
 	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x40800711;
-	_smackerFlag1 = false;
+	_keepLastSmackerFrame = false;
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 27e2540..e404127 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -300,7 +300,7 @@ protected:
 	int _klaymanBlinkCountdown;
 	int _decisionCountdown;
 	uint32 _smackerFileHash;
-	bool _smackerFlag1;
+	bool _keepLastSmackerFrame;
 	void update();
 	void upChooseKing();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index ecf6326..76bf41b 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -258,7 +258,7 @@ void Class526::spriteUpdate466720() {
 	if (_rect.y1 <= 150) {
 		_soundResource.play(0x0E32247F);
 		stopAnimation();
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		SetMessageHandler(NULL);
 		setVisible(false);
 	}
@@ -266,7 +266,7 @@ void Class526::spriteUpdate466720() {
 
 void Class526::sub466770() {
 	startAnimation(0x34880040, 0, -1);
-	SetSpriteCallback(&Class526::spriteUpdate466720);
+	SetSpriteUpdate(&Class526::spriteUpdate466720);
 }
 
 Class527::Class527(NeverhoodEngine *vm, Sprite *class526)
@@ -296,7 +296,7 @@ void Class527::spriteUpdate466920() {
 	if (_rect.y1 <= 150) {
 		_soundResource.play(0x18020439);
 		stopAnimation();
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		SetMessageHandler(NULL);
 		setVisible(false);
 	}
@@ -304,7 +304,7 @@ void Class527::spriteUpdate466920() {
 
 void Class527::sub466970() {
 	startAnimation(0x103B8020, 0, -1);
-	SetSpriteCallback(&Class527::spriteUpdate466920);
+	SetSpriteUpdate(&Class527::spriteUpdate466920);
 }
 
 Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
@@ -577,13 +577,13 @@ void Class489::sub434D80() {
 		sendMessage(_class525, 0x483A, 0);
 		stopAnimation();
 		SetMessageHandler(&Sprite::handleMessage);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		setVisible(false);
 	}
 }
 
 void Class489::sub434DD0() {
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Class489::handleMessage);
 	startAnimation(0x10E3042B, 0, -1);
 }
@@ -591,20 +591,20 @@ void Class489::sub434DD0() {
 void Class489::sub434DF0() {
 	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
 	startAnimation(0x14A10137, 0, -1);
-	SetSpriteCallback(&Class489::spriteUpdate434B60);
+	SetSpriteUpdate(&Class489::spriteUpdate434B60);
 	SetMessageHandler(&Class489::handleMessage);
 	_soundResource2.play(0xEC008474);
 }
 
 void Class489::sub434E60() {
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	startAnimation(0x80C32213, 0, -1);
 	NextState(&Class489::sub434E90);
 }
 
 void Class489::sub434E90() {
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Class489::handleMessage4348E0);
 	startAnimation(0xD23B207F, 0, -1);
 }
@@ -612,7 +612,7 @@ void Class489::sub434E90() {
 void Class489::sub434EC0() {
 	startAnimation(0x50A80517, 0, -1);
 	SetMessageHandler(&Class489::handleMessage434B20);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	NextState(&Class489::sub434F40);
 	setGlobalVar(0x12A10DB3, 1);
 	_soundResource1.play(0xCC4A8456);
@@ -623,13 +623,13 @@ void Class489::sub434EC0() {
 void Class489::sub434F40() {
 	sendMessage(_parentScene, 0x480F, 0);
 	startAnimation(0xD833207F, 0, -1);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Class489::handleMessage4348E0);
 }
 
 void Class489::sub434F80() {
 	startAnimation(0x50A94417, 0, -1);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	NextState(&Class489::sub434E90);
 	setGlobalVar(0x12A10DB3, 0);
@@ -640,7 +640,7 @@ void Class489::sub434F80() {
 void Class489::sub434FF0() {
 	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
 	startAnimation(0x22CB4A33, 0, -1);
-	SetSpriteCallback(&Class489::spriteUpdate434B60);
+	SetSpriteUpdate(&Class489::spriteUpdate434B60);
 	SetMessageHandler(&Class489::handleMessage434B20);
 	NextState(&Class489::sub434DF0);
 }
@@ -648,7 +648,7 @@ void Class489::sub434FF0() {
 void Class489::sub435040() {
 	setGlobalVar(0x04A105B3, 4);
 	setGlobalVar(0x04A10F33, 0);
-	SetSpriteCallback(&Class489::sub434D80);
+	SetSpriteUpdate(&Class489::sub434D80);
 	SetMessageHandler(&Sprite::handleMessage);
 	startAnimation(0x708D4712, 0, -1);
 	_soundResource3.play();
@@ -1208,7 +1208,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
 void AsScene1407Mouse::stIdleLookAtGoodHole() {
 	setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0);
 	startAnimation(0x72215194, 0, -1);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
 }
 
@@ -1216,7 +1216,7 @@ void AsScene1407Mouse::stWalkToDest() {
 	if (_walkDestX != _x) {
 		setDoDeltaX(_walkDestX < _x ? 1 : 0);
 		startAnimation(0x22291510, 0, -1);
-		SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
+		SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
 		SetMessageHandler(&AsScene1407Mouse::handleMessage);
 		NextState(&AsScene1407Mouse::stIdleLookAtGoodHole);
 	}
@@ -1225,14 +1225,14 @@ void AsScene1407Mouse::stWalkToDest() {
 void AsScene1407Mouse::stWalkToHole() {
 	setDoDeltaX(_walkDestX < _x ? 1 : 0);
 	startAnimation(0x22291510, 0, -1);
-	SetSpriteCallback(&AsScene1407Mouse::suWalkTo);
+	SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
 	NextState(&AsScene1407Mouse::stGoThroughHole);
 }
 
 void AsScene1407Mouse::stGoThroughHole() {
 	startAnimation(0x72215194, 0, -1);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	SetMessageHandler(NULL);
 	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
 	NextState(&AsScene1407Mouse::stArriveAtHole);
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 44c8721..6519efa 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -175,7 +175,7 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	
 	SetUpdateHandler(&Class521::update);
 	SetMessageHandler(&Class521::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 
 	// TODO createSurface2(200, dword_4AF4C0);
 	createSurface(200, 640, 480); //TODO: Remove once the line above is done
@@ -244,7 +244,7 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1019:
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		break;
 	/* NOTE: Implemented in setPathPoints
 	case 0x2000:
@@ -317,7 +317,7 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity
 					if (_currPointIndex == 0) {
 						moveToPrevPoint();
 					} else {
-						SetSpriteCallback(NULL);
+						SetSpriteUpdate(NULL);
 					}
 				} else {
 					if (minMatchIndex > _currPointIndex) {
@@ -336,14 +336,14 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity
 		_moreY = param.asInteger();
 		_steps = 0;
 		_flag10E = 0;
-		SetSpriteCallback(&Class521::suMoveToPrevPoint);
+		SetSpriteUpdate(&Class521::suMoveToPrevPoint);
 		_lastDistance = 640;
 		break;
 	case 0x2008:
 		_moreY = param.asInteger();
 		_steps = 0;
 		_flag10E = 0;
-		SetSpriteCallback(&Class521::suMoveToNextPoint);
+		SetSpriteUpdate(&Class521::suMoveToNextPoint);
 		_lastDistance = 640;
 		break;
 	case 0x2009:
@@ -397,7 +397,7 @@ uint32 Class521::handleMessage45CCA0(int messageNum, const MessageParam &param,
 
 void Class521::sub45CD00() {
 	bool doDeltaX = _doDeltaX;
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	_againDestPtFlag = 0;
 	_againDestPointFlag = 0;
 	_flag10E = 0;
@@ -425,12 +425,12 @@ void Class521::sub45CDC0() {
 		_lastDistance = 640;
 		_flag113 = 0;
 		_flag10E = 0;
-		SetSpriteCallback(&Class521::suMoveToNextPoint);
+		SetSpriteUpdate(&Class521::suMoveToNextPoint);
 	} else if (_value112 == 2) {
 		_lastDistance = 640;
 		_flag113 = 0;
 		_flag10E = 0;
-		SetSpriteCallback(&Class521::suMoveToPrevPoint);
+		SetSpriteUpdate(&Class521::suMoveToPrevPoint);
 	}
 }
 
@@ -581,7 +581,7 @@ void Class521::moveToNextPoint() {
 				NextState(&Class521::sub45D100);
 			}
 			_flag10E = 0;
-			SetSpriteCallback(&Class521::suMoveToNextPoint);
+			SetSpriteUpdate(&Class521::suMoveToNextPoint);
 			_lastDistance = 640;
 		}
 	}
@@ -643,7 +643,7 @@ void Class521::moveToPrevPoint() {
 				NextState(&Class521::sub45D100);
 			}
 			_flag10E = 0;
-			SetSpriteCallback(&Class521::suMoveToPrevPoint);
+			SetSpriteUpdate(&Class521::suMoveToPrevPoint);
 			_lastDistance = 640;
 		}
 	}
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index f91513f..45d3b83 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -262,7 +262,7 @@ void AsScene1907Symbol::suTryToPlugIn() {
 	if (_currStep == 16) {
 		_x -= _smallDeltaX;
 		_y -= _smallDeltaY;
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -313,7 +313,7 @@ void AsScene1907Symbol::suMoveDown() {
 	if (_y >= kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y) {
 		_y = kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y;
 		_isMoving = false;
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}	
 }
 
@@ -335,7 +335,7 @@ void AsScene1907Symbol::suMoveUp() {
 	if (_y < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) {
 		_y = kAsScene1907SymbolPluggedInPositions[_elementIndex].y;
 		_isMoving = false;
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -348,7 +348,7 @@ void AsScene1907Symbol::tryToPlugIn() {
 	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
 	SetUpdateHandler(&AsScene1907Symbol::update);
 	SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn);
-	SetSpriteCallback(&AsScene1907Symbol::suTryToPlugIn);
+	SetSpriteUpdate(&AsScene1907Symbol::suTryToPlugIn);
 	_currStep = 0;
 	_deltaX = (_x - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x) / 16;
 	_smallDeltaX = _x - _deltaX * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x;
@@ -378,7 +378,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
 	_yAccel = 1;
 	SetUpdateHandler(&AsScene1907Symbol::update);
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
-	SetSpriteCallback(&AsScene1907Symbol::suFallOff);
+	SetSpriteUpdate(&AsScene1907Symbol::suFallOff);
 }
 
 void AsScene1907Symbol::stFallOffHitGround() {
@@ -388,7 +388,7 @@ void AsScene1907Symbol::stFallOffHitGround() {
 	Entity::_priority = 1000 - _newPositionIndex;
 	_vm->_collisionMan->removeSprite(this);
 	_vm->_collisionMan->addSprite(this);
-	SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround);
+	SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround);
 	NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent);
 	_newStickFrameIndex = 0;
 	_currStep = 0;
@@ -409,7 +409,7 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() {
 	_newStickFrameIndex = 0;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	processDelta();
 	_soundResource3.play();
 }
@@ -419,7 +419,7 @@ void AsScene1907Symbol::stPlugIn() {
 	_currPositionIndex = _newPositionIndex;
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	if (_elementIndex == 8)
 		sendMessage(_parentScene, 0x2001, 0);
 }
@@ -434,7 +434,7 @@ void AsScene1907Symbol::moveUp() {
 	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
-	SetSpriteCallback(&AsScene1907Symbol::suMoveUp);
+	SetSpriteUpdate(&AsScene1907Symbol::suMoveUp);
 	_yIncr = 1;
 	_isMoving = true;
 }
@@ -443,7 +443,7 @@ void AsScene1907Symbol::moveDown() {
 	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
-	SetSpriteCallback(&AsScene1907Symbol::suMoveDown);
+	SetSpriteUpdate(&AsScene1907Symbol::suMoveDown);
 	_yIncr = 4;
 	_isMoving = true;
 }
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index e886acc..9846bc5 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -841,7 +841,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 	}
 
 	if (_xDelta > _yDelta) {
-		SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileX);
+		SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileX);
 		if (_xIncr > 0) {
 			if (_newX - _x >= 180)
 				_xFlagPos = _newX - 90;
@@ -855,7 +855,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 		}
 		_soundResource1.play();
 	} else {
-		SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileY);
+		SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileY);
 		if (_yIncr > 0) {
 			if (_newY - _y >= 180)
 				_xFlagPos = _newY - 90;
@@ -879,7 +879,7 @@ void SsScene2202PuzzleTile::stopMoving() {
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
 	_needRefresh = true;
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 	_isMoving = false;
 	sendMessage(_parentScene, 0x2002, _tileIndex);
 }
@@ -1413,7 +1413,7 @@ Class603::Class603(NeverhoodEngine *vm, uint32 fileHash)
 		_x -= 63;
 	SetUpdateHandler(&Class603::update);
 	SetMessageHandler(&Class603::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Class603::update() {
@@ -1427,13 +1427,13 @@ uint32 Class603::handleMessage(int messageNum, const MessageParam &param, Entity
 	case 0x4808:
 		_index = 0;
 		SetMessageHandler(NULL);
-		SetSpriteCallback(&Class603::spriteUpdate481E60);
+		SetSpriteUpdate(&Class603::spriteUpdate481E60);
 		_soundResource.play(0x032746E0);
 		break;
 	case 0x4809:
 		_index = 0;
 		SetMessageHandler(NULL);
-		SetSpriteCallback(&Class603::spriteUpdate481E90);
+		SetSpriteUpdate(&Class603::spriteUpdate481E90);
 		_soundResource.play(0x002642C0);
 		break;
 	}
@@ -1446,7 +1446,7 @@ void Class603::spriteUpdate481E60() {
 		_index++;
 	} else {
 		SetMessageHandler(&Class603::handleMessage);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -1456,7 +1456,7 @@ void Class603::spriteUpdate481E90() {
 		_index++;
 	} else {
 		SetMessageHandler(&Class603::handleMessage);
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -1465,7 +1465,7 @@ Class604::Class604(NeverhoodEngine *vm, uint32 fileHash)
 
 	SetUpdateHandler(&Class604::update);
 	SetMessageHandler(&Class604::handleMessage);
-	SetSpriteCallback(NULL);
+	SetSpriteUpdate(NULL);
 }
 
 void Class604::update() {
@@ -1478,7 +1478,7 @@ uint32 Class604::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x4803:
 		SetMessageHandler(NULL);
-		SetSpriteCallback(&Class604::spriteUpdate482020);
+		SetSpriteUpdate(&Class604::spriteUpdate482020);
 		_yDelta = 0;
 		break;
 	}
@@ -1708,7 +1708,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene
 	createSurface(1100, 129, 103);
 	startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0);
 	SetUpdateHandler(&AsScene2207Elevator::update);
-	SetSpriteCallback(&AsScene2207Elevator::suSetPosition);
+	SetSpriteUpdate(&AsScene2207Elevator::suSetPosition);
 	SetMessageHandler(&AsScene2207Elevator::handleMessage);
 	_newStickFrameIndex = 0;
 }
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 8c5fd6c..8c797f3 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -670,7 +670,7 @@ AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage);
 	if (varValue == 8 || varValue == 9 || varValue == 10) {
-		SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight);
+		SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight);
 		_x = 280;
 	}
 }
@@ -691,7 +691,7 @@ uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const Messa
 void AsScene3009HorizontalIndicator::suMoveLeft() {
 	_x -= 6;
 	if (_x < 92) {
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		_x = 92;
 	}
 }
@@ -699,7 +699,7 @@ void AsScene3009HorizontalIndicator::suMoveLeft() {
 void AsScene3009HorizontalIndicator::suMoveRight() {
 	_x += 6;
 	if (_x > 533) {
-		SetSpriteCallback(NULL);
+		SetSpriteUpdate(NULL);
 		_x = 533;
 	}
 }
@@ -713,12 +713,12 @@ void AsScene3009HorizontalIndicator::show() {
 
 void AsScene3009HorizontalIndicator::stMoveLeft() {
 	_x = 533;
-	SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveLeft);
+	SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveLeft);
 }
 
 void AsScene3009HorizontalIndicator::stMoveRight() {
 	_x = 330;
-	SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight);
+	SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight);
 }
 
 AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index adc4619..b7c276e 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -31,6 +31,7 @@
 #include "common/system.h"
 #include "audio/mixer.h"
 #include "engines/engine.h"
+#include "neverhood/messages.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 9a588f2..457d586 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -387,13 +387,11 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 	if (_rectType == 1) {
 		RectList &rectList = *_rectList;
 		for (uint i = 0; i < rectList.size(); i++) {
-			debug("(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2);
-			if (klaymanX >= rectList[i].rect.x1 && klaymanX <= rectList[i].rect.x2 && 
-				klaymanY >= rectList[i].rect.y1 && klaymanY <= rectList[i].rect.y2) {
+			debug(2, "(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2);
+			if (rectList[i].rect.contains(klaymanX, klaymanY)) {
 				for (uint j = 0; j < rectList[i].subRects.size(); j++) {
-					debug("  (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2);
-					if (mouseX >= rectList[i].subRects[j].rect.x1 && mouseX <= rectList[i].subRects[j].rect.x2 && 
-						mouseY >= rectList[i].subRects[j].rect.y1 && mouseY <= rectList[i].subRects[j].rect.y2) {
+					debug(2, "  (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2);
+					if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) {
 						debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId);
 						return setMessageList2(rectList[i].subRects[j].messageListId);
 					}
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 9ae7e14..1b40c8f 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -35,9 +35,8 @@ SmackerSurface::SmackerSurface(NeverhoodEngine *vm)
 }
 
 void SmackerSurface::draw() {
-	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
+	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0)
 		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false);
-	}
 }
 
 void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) {
@@ -60,15 +59,14 @@ SmackerDoubleSurface::SmackerDoubleSurface(NeverhoodEngine *vm)
 }
 
 void SmackerDoubleSurface::draw() {
-	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
+	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0)
 		_vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect);
-	}
 }
 
 // SmackerPlayer
 
 SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag)
-	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false),
+	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false),
 	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true),
 	_drawX(-1), _drawY(-1) {
 
@@ -146,6 +144,8 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) {
 
 void SmackerPlayer::rewind() {
 
+	// TODO Quite dirty, try to implement this in the decoder
+
 	delete _smackerDecoder;
 	_smackerDecoder = NULL;
 	_stream = NULL;
@@ -170,37 +170,17 @@ void SmackerPlayer::update() {
 		_dirtyFlag = false;
 	}
 
-#if 0
-	if (!_smackerDecoder->endOfVideo()) {
-		updateFrame();
-		if (_smackerDecoder->endOfVideo() && !_keepLastFrame) {
-			// Inform the scene about the end of the video playback
-			if (_scene) {
-				sendMessage(_scene, 0x3002, 0);
-			}
-			_flag2 = true;
-		} else {
-			if (_smackerDecoder->endOfVideo()) {
-				rewind();
-				updateFrame();
-			}
-			_flag2 = false;
-		}
-	}
-#endif
-
 	if (!_smackerDecoder->endOfVideo()) {
 		updateFrame();
 	} else if (!_keepLastFrame) {
 		// Inform the scene about the end of the video playback
-		if (_scene) {
+		if (_scene)
 			sendMessage(_scene, 0x3002, 0);
-		}
-		_flag2 = true;
+		_videoDone = true;
 	} else {
 		rewind();
 		updateFrame();
-		_flag2 = false;
+		_videoDone = false;
 	}
 	
 }
@@ -231,9 +211,9 @@ void SmackerPlayer::updateFrame() {
 	// TODO _vm->_screen->_skipUpdate = true;
 	_dirtyFlag = true;
 
-	if (_smackerDecoder->hasDirtyPalette()) {
+	if (_smackerDecoder->hasDirtyPalette())
 		updatePalette();
-	}
+		
 }
 
 void SmackerPlayer::updatePalette() {
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 883cb52..65c0c84 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -70,7 +70,7 @@ protected:
 	bool _doubleSurface;
 	Common::SeekableReadStream *_stream;
 	bool _keepLastFrame;
-	bool _flag2;
+	bool _videoDone;
 	bool _dirtyFlag;
 	int _drawX, _drawY;
 	void update();
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index fe78e50..9982043 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -82,7 +82,6 @@ void SmackerScene::nextVideo() {
 		}
 		if (_fileHashListIndex == 0) {
 			_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false));
-			// TODO? Screen.hSmack = _smackerPlayer;
 		} else {
 			_smackerPlayer->open(smackerFileHash, false);
 		}
@@ -108,9 +107,8 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam &param, En
 			_playNextVideoFlag = true;
 		break;
 	case 0x000C:
-		if (_canAbort) {
+		if (_canAbort)
 			sendMessage(_parentModule, 0x1009, 0);
-		}
 		break;
 	case 0x3002:
 		_playNextVideoFlag = true;
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index b9decef..bc7c0a5 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -30,7 +30,7 @@
 
 namespace Neverhood {
 
-#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback); debug(2, "SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback
+#define SetSpriteUpdate(callback) _spriteUpdateCb = static_cast <void (Sprite::*)(void)> (callback); debug(2, "SetSpriteUpdate(" #callback ")"); _spriteUpdateCbName = #callback
 #define SetFilterX(callback) _filterXCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug(2, "SetFilterX(" #callback ")")
 #define SetFilterY(callback) _filterYCb = static_cast <int16 (Sprite::*)(int16)> (callback); debug(2, "SetFilterY(" #callback ")")
 


Commit: 9de3cf56756579e63aa6381cb2a9b30495d7d046
    https://github.com/scummvm/scummvm/commit/9de3cf56756579e63aa6381cb2a9b30495d7d046
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:38-07:00

Commit Message:
NEVERHOOD: Some minor cleanup, add a TODO about some palette issues (I couldn't find any apparent causes yet)

Changed paths:
    engines/neverhood/module2800.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/resource.cpp



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index eded442..6643d5a 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -123,6 +123,8 @@ void Module2800::updateScene() {
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
+	// TODO Weird palette glitches in the mouse cursor and sprite, check this later
+
 	// TODO _vm->gameModule()->initScene2801Vars();
 
 	_surfaceFlag = true;
@@ -143,11 +145,10 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(0xC0418A02)) {
 			insertKlayman<KmScene2801>(312, 432);
 			_klayman->setDoDeltaX(1);
-			setMessageList(0x004B6C10);
 		} else {
 			insertKlayman<KmScene2801>(194, 432);
-			setMessageList(0x004B6C10);
 		}
+		setMessageList(0x004B6C10);
 	} else {
 		insertKlayman<KmScene2801>(0, 432);
 		setMessageList(0x004B6BB0);
@@ -188,6 +189,8 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape); 
 	}
+	
+	addEntity(_palette);
 
 	if (which == 1) {
 		_palette->addPalette(0xB103B604, 0, 65, 0);
@@ -196,7 +199,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->addPalette(_paletteHash, 0, 65, 0);
 		_palette->addBasePalette(_paletteHash, 0, 65, 0);
 	}
-
+	
 }
 
 Scene2801::~Scene2801() {
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index 481e0e5..936ca39 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -143,9 +143,8 @@ void Palette::update() {
 	debug(2, "Palette::update() _status = %d", _status);
 	if (_status == 1) {
 		if (_palCounter > 1) {
-			for (int i = 0; i < 256; i++) {
+			for (int i = 0; i < 256; i++)
 				fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB);
-			}
 			_vm->_screen->testPalette(_palette);
 			_palCounter--;
 		} else {
@@ -154,9 +153,8 @@ void Palette::update() {
 		}
 	} else if (_status == 2) {
 		if (_palCounter > 1) {
-			for (int i = 0; i < 256; i++) {
+			for (int i = 0; i < 256; i++)
 				fadeColor(_palette + i * 4, _basePalette[i * 4 + 0], _basePalette[i * 4 + 1], _basePalette[i * 4 + 2]);
-			}
 			_vm->_screen->testPalette(_palette);
 			_palCounter--;
 		} else {
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 9678031..65f98a8 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -119,7 +119,7 @@ bool PaletteResource::load(uint32 fileHash) {
 		case 3:
 			// _palette already points to the correct data
 			break;
-		default:						
+		default:
 			_vm->_res->unuseResource(_resourceHandle);
 			_resourceHandle = -1;
 			break;


Commit: 0abba004fe4a6b172269f09cfe55d7d683736867
    https://github.com/scummvm/scummvm/commit/0abba004fe4a6b172269f09cfe55d7d683736867
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:38-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2805

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 514912c..70402d4 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -116,6 +116,9 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B6CE0,
 	1, 0x004B6CD0,
 	1, 0x004B6CF0,
+	// Scene2805
+	1, 0x004AE318,
+	1, 0x004AE308,
 	0, 0
 };
 
@@ -387,6 +390,12 @@ static const uint32 messageListOffsets[] = {
 	1, 0x004B6C10,
 	1, 0x004B6BB0,
 	2, 0x004B6C40,
+	// Scene2805
+	1, 0x004AE1C8,
+	2, 0x004AE1D0,
+	4, 0x004AE288,
+	2, 0x004AE1E0,
+	1, 0x004AE1C0,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 72f35a6..14f72dd 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 646790489886aa8adb9a5bfc6e6ec6c57e5aa62b
    https://github.com/scummvm/scummvm/commit/646790489886aa8adb9a5bfc6e6ec6c57e5aa62b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:38-07:00

Commit Message:
NEVERHOOD: Implement Scene2805

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 781a9c3..37e8743 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -303,7 +303,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 0;
+	_vm->gameState().sceneNum = 4;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 303e3fe..247c946 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -4916,4 +4916,90 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	// Empty
+}
+
+uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x2000:
+		_isSittingInTeleporter = param.asInteger() != 0;
+		break;
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::sub421350);
+		else
+			GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x481D:
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stTurnToUseInTeleporter);
+		break;
+	case 0x481E:
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
+		break;
+	case 0x4834:
+		GotoState(&Klayman::stStepOver);
+		break;
+	case 0x4835:
+		sendMessage(_parentScene, 0x2000, 1);
+		_isSittingInTeleporter = true;
+		GotoState(&Klayman::stSitInTeleporter);
+		break;																		
+	case 0x4836:
+		sendMessage(_parentScene, 0x2000, 0);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
+		break;
+	case 0x483D:
+		sub404890();
+		break;
+	case 0x483E:
+		sub4048D0();
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene2805::handleMessage404800(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24)
+			_soundResource1.play(0x85B10BB8);
+		else if (param.asInteger() == 0x4E6A0CA0)
+			_soundResource1.play(0xC5B709B0);
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2805::sub404890() {
+	_status2 = 0;
+	_acceptInput = false;
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&KmScene2805::handleMessage404800);
+	startAnimation(0xDE284B74, 0, -1);
+}
+
+void KmScene2805::sub4048D0() {
+	_status2 = 0;
+	_acceptInput = false;
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&KmScene2805::handleMessage404800);
+	startAnimation(0xD82A4094, 0, -1);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 355c6d6..5f4076e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -549,6 +549,17 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2805 : public Klayman {
+public:
+	KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _isSittingInTeleporter;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage404800(int messageNum, const MessageParam &param, Entity *sender);
+	void sub404890();
+	void sub4048D0();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 6643d5a..c1e7048 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -73,6 +73,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		}
 #endif		
 		break;
+	case 4:
+		// TODO Music18hList_stop(0xD2FA4D14, 0, 2);
+		_childObject = new Scene2805(_vm, this, which);
+		break;
 	//		
 	case 1001:
 		break;
@@ -104,6 +108,13 @@ void Module2800::updateScene() {
 				createScene(1001, -1);
 			}
 			break;
+		case 4:
+			if (_moduleResult == 1) {
+				leaveModule(1);
+			} else {
+				createScene(11, 1);
+			}
+			break;
 		//		
 		case 1001:
 			break;
@@ -228,4 +239,63 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2805::handleMessage);
+
+	setBackground(0x08021E04);
+	setPalette(0x08021E04);
+	_palette->addPalette(0x8A6B1F91, 0, 65, 0);
+	insertMouse433(0x21E00088);
+
+	_sprite1 = insertStaticSprite(0x008261E7, 1100);
+	_sprite2 = insertStaticSprite(0x020CE421, 1100);
+
+	if (which < 0) {
+		insertKlayman<KmScene2805>(380, 338);
+		setMessageList(0x004AE1C8);
+		sendMessage(this, 0x2000, 0);
+	} else if (which == 1) {
+		insertKlayman<KmScene2805>(493, 338);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004AE1D0);
+		sendMessage(this, 0x2000, 1);
+	} else if (which == 2) {
+		insertKlayman<KmScene2805>(493, 338);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004AE288);
+		sendMessage(this, 0x2000, 1);
+	} else if (which == 3) {
+		insertKlayman<KmScene2805>(493, 338);
+		sendMessage(_klayman, 0x2000, 1);
+		setMessageList(0x004AE1E0);
+		sendMessage(this, 0x2000, 1);
+	} else {
+		insertKlayman<KmScene2805>(340, 338);
+		setMessageList(0x004AE1C0);
+		sendMessage(this, 0x2000, 0);
+	}
+
+	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480);
+
+}
+
+uint32 Scene2805::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (param.asInteger()) {
+			setRectList(0x004AE318);
+			_klayman->setKlaymanIdleTable3();
+		} else {
+			setRectList(0x004AE308);
+			_klayman->setKlaymanIdleTable1();
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index cdfcdbe..06d818c 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -54,6 +54,15 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2805 : public Scene {
+public:
+	Scene2805(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2800_H */


Commit: ee7bd2fc6c228d3088cb236c54614b656af17636
    https://github.com/scummvm/scummvm/commit/ee7bd2fc6c228d3088cb236c54614b656af17636
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:38-07:00

Commit Message:
NEVERHOOD: Implement Scene2803b

- Also some more Klayman stuff used by that scene

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 37e8743..a424d53 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -303,7 +303,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 4;
+	_vm->gameState().sceneNum = 2;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 247c946..010c2e4 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -62,7 +62,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0),
 	_counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
 	_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
-	_flagFA(false), _ladderStatus(0), _field114(0), _resourceHandle(-1), _soundFlag(false) {
+	_flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
@@ -574,11 +574,9 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 		break;
 	case 0x482C:
 		if (param.asInteger() != 0) {
-		debug("#################################################");
-			// TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,);
+			_pathPoints = _dataResource.getPointArray(param.asInteger());
 		} else {
-		debug("#################################################");
-			// TODO _field114 = 0;
+			_pathPoints = NULL;
 		}
 		break;
 	}
@@ -757,9 +755,8 @@ void Klayman::suWalking() {
 	if (_destX != _x) {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdiff;
-		if (_field114) {
-			error("// TODO Klayman_sub_41CF70");
-			// TODO Klayman_sub_41CF70
+		if (_pathPoints) {
+			walkAlongPathPoints();
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
@@ -939,9 +936,8 @@ void Klayman::suWalkingTestExit() {
 	} else {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdelta;
-		if (_field114) {
-			error("_field114");
-			// TODO Klayman_sub_41CF70
+		if (_pathPoints) {
+			walkAlongPathPoints();
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
@@ -1096,6 +1092,153 @@ void Klayman::startSpecialWalkLeft(int16 x) {
 	}
 }
 
+void Klayman::sub41CDE0(int16 x) {
+	_status3 = 2;
+	if (_x == x) {
+		_destX = x;
+		if (_isWalking) {
+			GotoState(NULL);
+			gotoNextStateExt();
+		}
+	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_destX = x;
+	} else {
+		_destX = x;
+		GotoState(&Klayman::sub421680);
+	}
+}
+
+void Klayman::sub421680() {
+	_isWalking = true;
+	_acceptInput = true;
+	_status3 = 2;
+	setDoDeltaX(_destX < _x ? 1 : 0);
+	startAnimation(0x3A4CD934, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41ED70);
+	SetSpriteUpdate(&Klayman::suWalkingTestExit);
+	FinalizeState(&Klayman::stStartWalkingDone);
+}
+
+uint32 Klayman::handleMessage41ED70(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101)
+			_soundResource1.play(0x4924AAC4);
+		else if (param.asInteger() == 0x0A2A9098)
+			_soundResource1.play(0x0A2AA8E0);
+	}
+	return messageResult;
+}
+
+void Klayman::sub421640() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x90D0D1D0, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::sub421740() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x11C8D156, 30, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::sub421780() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x11C8D156, 0, 10);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::sub421700() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x11C8D156, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::sub421840() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimationByHash(0x3F9CC394, 0x14884392, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EE00);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+}
+
+uint32 Klayman::handleMessage41EE00(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5)
+			sendMessage(_parentScene, 0x482A, 0);
+		else if (param.asInteger() == 0x110010D1)
+			sendMessage(_parentScene, 0x482B, 0);
+		else if (param.asInteger() == 0x32180101)
+			_soundResource1.play(0x4924AAC4);
+		else if (param.asInteger() == 0x0A2A9098)
+			_soundResource1.play(0x0A2AA8E0);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub421800() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2F1C4694, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EE00);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+}
+
+void Klayman::sub4217C0() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x3F9CC394, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EE00);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+}
+
+void Klayman::sub421900() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimationByHash(0x37ECD436, 0, 0x8520108C);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EE00);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+}
+
+void Klayman::sub4218C0() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x16EDDE36, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EE00);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+}
+
+void Klayman::sub421880() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x37ECD436, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EE00);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+}
+
 void Klayman::sub41CC40(int16 x1, int16 x2) {
 	if (_x > x1) {
 		if (_x == x1 + x2) {
@@ -1182,9 +1325,8 @@ void Klayman::suLargeStep() {
 	if (_x != _destX) {
 		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 		_x += xdiff;
-		if (_field114) {
-			error("// TODO Klayman_sub_41CF70();");
-			// TODO Klayman_sub_41CF70();
+		if (_pathPoints) {
+			walkAlongPathPoints();
 		} else {
 			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
@@ -1928,6 +2070,39 @@ uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *
 	return handleMessage41D480(messageNum, param, sender);
 }
 
+void Klayman::walkAlongPathPoints() {
+	if (_x <= (*_pathPoints)[0].x)
+		_y = (*_pathPoints)[0].y;
+	else if (_x >= (*_pathPoints)[_pathPoints->size() - 1].x)
+		_y = (*_pathPoints)[_pathPoints->size() - 1].y;
+	else {
+		int16 deltaX = _x - (*_pathPoints)[0].x, deltaXIncr = 0;
+		uint index = 0;
+		while (deltaX > 0) {
+			NPoint pt2 = (*_pathPoints)[index];
+			NPoint pt1 = index + 1 >= _pathPoints->size() ? (*_pathPoints)[0] : (*_pathPoints)[index + 1];
+			int16 xd = ABS(pt1.x - pt2.x);
+			int16 yd = ABS(pt1.y - pt2.y);
+			if (deltaX + deltaXIncr >= xd) {
+				deltaX -= xd;
+				deltaX += deltaXIncr;
+				++index;
+				if (index >= _pathPoints->size())
+					index = 0;
+				_y = (*_pathPoints)[index].y;
+			} else {
+				deltaXIncr += deltaX;
+				if (pt1.y >= pt2.y) {
+					_y = pt2.y + (yd * deltaXIncr) / xd;
+				} else {
+					_y = pt2.y - (yd * deltaXIncr) / xd;
+				}
+				deltaX = 0;
+			}
+		}
+	}
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -4916,6 +5091,83 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _soundResource(vm) {
+	
+	_dataResource.load(0x81120132);
+	_soundResource.load(0x10688664);
+}
+
+uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41CDE0(param.asPoint().x);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::sub421640);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;
+	case 0x4818:
+		sub41CDE0(_dataResource.getPoint(param.asInteger()).x);
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1)
+			GotoState(&Klayman::sub421740);
+		else if (param.asInteger() == 0)
+			GotoState(&Klayman::sub421780);
+		else
+			GotoState(&Klayman::sub421700);
+		break;
+	case 0x482E:
+		if (param.asInteger() == 1)
+			GotoState(&Klayman::sub421840);
+		else if (param.asInteger() == 2)
+			GotoState(&Klayman::sub421800);
+		else
+			GotoState(&Klayman::sub4217C0);
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1)
+			GotoState(&Klayman::sub421900);
+		else if (param.asInteger() == 2)
+			GotoState(&Klayman::sub4218C0);
+		else
+			GotoState(&Klayman::sub421880);
+		break;
+	case 0x4830:
+		GotoState(&KmScene2803b::sub460670);
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene2803b::handleMessage460600(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5)
+			sendMessage(_parentScene, 0x482A, 0);
+		else if (param.asInteger() == 0x33288344)
+			_soundResource.play();
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2803b::sub460670() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x1AE88904, 0, -1);
+	_soundResource1.play(0x4C69EA53);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&KmScene2803b::handleMessage460600);
+}
+
 KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 5f4076e..ab7ccb6 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -140,6 +140,17 @@ public:
 	
 	void setSoundFlag(bool value) { _soundFlag = value; }
 
+	void sub421640();
+	void sub421740();
+	void sub421780();
+	void sub421700();
+	void sub421840();
+	void sub421800();
+	void sub4217C0();
+	void sub421900();
+	void sub4218C0();
+	void sub421880();
+
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
@@ -165,10 +176,7 @@ protected:
 	const KlaymanIdleTableItem *_idleTable;
 	int _idleTableCount;
 	int _idleTableMaxValue;
-	uint32 _field114;
-	/*
-	00000118 field118		dw ?
-	*/
+	NPointArray *_pathPoints;
 	bool _soundFlag;
 	int _resourceHandle;
 	virtual void xUpdate();
@@ -249,6 +257,13 @@ protected:
 	
 	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
 	
+	void sub41CDE0(int16 x);
+	void sub421680();
+	uint32 handleMessage41ED70(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage41EE00(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void walkAlongPathPoints();
+	
 };
 
 class KmScene1001 : public Klayman {
@@ -549,6 +564,16 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2803b : public Klayman {
+public:
+	KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	SoundResource _soundResource;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage460600(int messageNum, const MessageParam &param, Entity *sender);
+	void sub460670();
+};
+
 class KmScene2805 : public Klayman {
 public:
 	KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index c1e7048..c6ce179 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -73,6 +73,15 @@ void Module2800::createScene(int sceneNum, int which) {
 		}
 #endif		
 		break;
+	case 2:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		setGlobalVar(0x1860C990,1);//DEBUG
+		if (getGlobalVar(0x1860C990))
+			_childObject = new Scene2803b(_vm, this, which);
+		else {
+			// TODO _childObject = new Scene2803(_vm, this, which);
+		}
+		break;
 	case 4:
 		// TODO Music18hList_stop(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
@@ -108,6 +117,20 @@ void Module2800::updateScene() {
 				createScene(1001, -1);
 			}
 			break;
+		case 2:
+			if (_moduleResult == 1)
+				createScene(3, 0);
+			else if (_moduleResult == 2)
+				createScene(5, 0);
+			else if (_moduleResult == 3)
+				createScene(6, 0);
+			else if (_moduleResult == 4)
+				createScene(9, 0);
+			else if (_moduleResult == 5)
+				createScene(25, 0);
+			else 
+				createScene(0, 1);
+			break;
 		case 4:
 			if (_moduleResult == 1) {
 				leaveModule(1);
@@ -239,6 +262,270 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _palStatus(0) {
+
+	static const uint32 kScene2803bFileHashes1[] = {
+		0, 0x081000F1, 0x08100171, 0x08100271
+	};
+
+	static const uint32 kScene2803bFileHashes2[] = {
+		0, 0x286800D4, 0x286806D4, 0x28680AD4
+	};
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2803b::handleMessage);
+
+	loadDataResource(0x81120132);
+	insertMouse433(0x00A05290);
+
+	// TODO insertSprite<Class488>(this, 0xAFAD591A, 0x276E321D, 578, 200);
+
+	if (getGlobalVar(0x190A1D18)) {
+		setBackground(0x412A423E);
+		setPalette(0x412A423E);
+		_palette->addBasePalette(0x412A423E, 0, 256, 0);
+		addEntity(_palette);
+		_sprite1 = insertStaticSprite(0x0C03AA23, 1100);
+		_sprite2 = insertStaticSprite(0x24320220, 1100);
+		_sprite3 = insertStaticSprite(0x1A032204, 1100);
+		_sprite4 = insertStaticSprite(0x18032204, 1100);
+		_sprite5 = insertStaticSprite(0x34422912, 1100);
+		_sprite6 = insertStaticSprite(0x3C42022F, 1100);
+		_sprite7 = insertStaticSprite(0x341A0237, 1100);
+
+		if (getSubVar(0x0C601058, 0) == 0)
+			insertStaticSprite(0x66121222, 100);
+		else
+			insertSprite<AnimatedSprite>(kScene2803bFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326);
+
+		if (getSubVar(0x0C601058, 1) == 3)
+			insertStaticSprite(0x64330236, 100);
+
+		if (getSubVar(0x0C601058, 2) == 3)
+			insertStaticSprite(0x2E4A22A2, 100);
+
+	} else {
+		setBackground(0x29800A01);
+		setPalette(0x29800A01);
+		_palette->addBasePalette(0x29800A01, 0, 256, 0);
+		addEntity(_palette);
+		_sprite1 = insertStaticSprite(0x16202200, 1100);
+		_sprite2 = insertStaticSprite(0xD0802EA0, 1100);
+		_sprite3 = insertStaticSprite(0x780C2E30, 1100);
+		_sprite4 = insertStaticSprite(0x700C2E30, 1100);
+		_sprite5 = insertStaticSprite(0x102CE6E1, 900);
+		_sprite6 = insertStaticSprite(0x108012C1, 1100);
+		_sprite7 = insertStaticSprite(0x708072E0, 1100);
+		insertStaticSprite(0x90582EA4, 100);
+
+		setSubVar(0x0C601058, 0, 1);//DEBUG, FIXME crashes when not done?!
+		if (getSubVar(0x0C601058, 0) == 0)
+			insertStaticSprite(0x50C027A8, 100);
+		else
+			insertSprite<AnimatedSprite>(kScene2803bFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326);
+
+		if (getSubVar(0x0C601058, 1) == 3)
+			insertStaticSprite(0xD48077A0, 100);
+
+		if (getSubVar(0x0C601058, 2) == 3)
+			insertStaticSprite(0x30022689, 100);
+
+	}
+	
+	_sprite6->setVisible(false);
+	_sprite7->setVisible(false);
+
+	if (which < 0) {
+		insertKlayman<KmScene2803b>(479, 435);
+		sub460110();
+		setMessageList(0x004B60D8);
+	} else if (which == 3) {
+		NPoint pt = _dataResource.getPoint(0x096520ED);
+		insertKlayman<KmScene2803b>(pt.x, pt.y);
+		sub460090();
+		setMessageList(0x004B6100);
+		_klayman->setRepl(64, 0);
+	} else if (which == 4) {
+		NPoint pt = _dataResource.getPoint(0x20C6238D);
+		insertKlayman<KmScene2803b>(pt.x, pt.y);
+		sub460090();
+		setMessageList(0x004B60F8);
+		_klayman->setRepl(64, 0);
+	} else if (which == 5) {
+		NPoint pt = _dataResource.getPoint(0x2146690D);
+		insertKlayman<KmScene2803b>(pt.x, pt.y);
+		sub460090();
+		setMessageList(0x004B6100);
+		_klayman->setRepl(64, 0);
+	} else if (which == 2) {
+		NPoint pt = _dataResource.getPoint(0x104C03ED);
+		insertKlayman<KmScene2803b>(pt.x, pt.y);
+		sub460110();
+		setMessageList(0x004B6138);
+	} else {
+		insertKlayman<KmScene2803b>(135, 444);
+		sub460110();
+		setMessageList(0x004B60E0);
+		_sprite6->setVisible(true);
+		_sprite7->setVisible(true);
+	}
+
+}
+
+uint32 Scene2803b::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xB4E4884C) {
+			setMessageList(0x004B6180);
+		} else if (param.asInteger() == 0xB1FDAB2E) {
+			NPoint pt = _dataResource.getPoint(0x0D84A1AD);
+			_klayman->setX(pt.x);
+			_klayman->setY(pt.y);
+			_klayman->processDelta();
+			sub460110();
+			_klayman->setClipRect(517, 401, 536, 480);
+			setMessageList(0x004B6198);
+		} else if (param.asInteger() == 0xB00C7C48) {
+			setMessageList(0x004B6108);
+		} else if (param.asInteger() == 0x61F64346) {
+			setMessageList(0x004B6150);
+		} else if (param.asInteger() == 0xAC69A28D) {
+			setMessageList(0x004B6168);
+		} else if (param.asInteger() == 0x00086212) {
+			_klayman->setClipRect(0, 0, 560, 315);
+			_klayman->setX(560);
+			_klayman->setY(315);
+			_klayman->processDelta();
+			sub460090();
+			setMessageList(0x004B61A0);
+		} else if (param.asInteger() == 0x002CAA68) {
+			setMessageList(0x004B61A8);
+		}
+		break;
+	case 0x482A:
+		if (_klayman->getX() < 200) {
+			sub4601D0();
+		} else if (_klayman->getX() < 500) {
+			setSurfacePriority(_sprite5->getSurface(), 1100);
+			sendMessage(_klayman, 0x482C, 0);
+			sub4601B0();
+		} else {
+			_klayman->setClipRect(517, 401, 536, 480);
+			sub4601B0();
+		}
+		break;
+	case 0x482B:
+		_sprite6->setVisible(false);
+		_sprite7->setVisible(false);
+		_klayman->setClipRect(0, 0, 640, 480);
+		setSurfacePriority(_sprite5->getSurface(), 900);
+		sendMessage(_klayman, 0x482C, 0x2086222D);
+		break;
+	}
+	return 0;
+}
+
+void Scene2803b::update45FCB0() {
+	if (_klayman->getX() < 388) {
+		_klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
+		sub460170();
+	} else if (_klayman->getX() < 500) {
+		_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2());
+		sub460190();
+	}
+	Scene::update();
+}
+
+void Scene2803b::update45FD50() {
+	if (_klayman->getX() > 194 && _klayman->getX() < 273)
+		sub4601B0();
+	else if (_klayman->getX() > 155 && _klayman->getX() < 300)
+		sub460170();
+	Scene::update();
+}
+
+void Scene2803b::sub460090() {
+	SetUpdateHandler(&Scene2803b::update45FCB0);
+	sendMessage(_klayman, 0x482C, 0x23C630D9);
+	_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2());
+	_klayman->setRepl(64, 0);
+	_sprite1->setVisible(true);
+}
+
+void Scene2803b::sub460110() {
+	SetUpdateHandler(&Scene2803b::update45FD50);
+	sendMessage(_klayman, 0x482C, 0x2086222D);
+	_klayman->setClipRect(0, 0, 640, 480);
+	_klayman->clearRepl();
+	_sprite1->setVisible(false);
+}
+
+void Scene2803b::sub460170() {
+	if (_palStatus != 0) {
+		_palStatus = 0;
+		sub4601F0(false);
+	}
+}
+
+void Scene2803b::sub460190() {
+	if (_palStatus != 1) {
+		_palStatus = 1;
+		sub4601F0(false);
+	}
+}
+
+void Scene2803b::sub4601B0() {
+	if (_palStatus != 2) {
+		_palStatus = 2;
+		sub4601F0(false);
+	}
+}
+
+void Scene2803b::sub4601D0() {
+	if (_palStatus != 3) {
+		_palStatus = 3;
+		sub4601F0(true);
+	}
+}
+
+void Scene2803b::sub4601F0(bool flag) {
+	if (getGlobalVar(0x190A1D18)) {
+		switch (_palStatus) {
+		case 1:
+			_palette->addBasePalette(0x0A938204, 0, 64, 0);
+			break;
+		case 2:
+			_palette->addBasePalette(0xB103B604, 0, 64, 0);
+			break;
+		case 3:
+			// TODO _palette->sub_47BFB0(0, 64);
+			break;
+		default:
+			_palette->addBasePalette(0x412A423E, 0, 64, 0);
+			break;
+		}
+	} else {
+		switch (_palStatus) {
+		case 2:
+			_palette->addBasePalette(0x0263D144, 0, 64, 0);
+			break;
+		case 3:
+			// TODO _palette->sub_47BFB0(0, 64);
+			break;
+		default:
+			_palette->addBasePalette(0x29800A01, 0, 64, 0);
+			break;
+		}
+	}
+	if (flag) {
+		_palette->startFadeToPalette(0);
+	} else {
+		_palette->startFadeToPalette(12);
+	}
+}
+
 Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 06d818c..54b893b 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -54,6 +54,30 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2803b : public Scene {
+public:
+	Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	int _palStatus;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_sprite4;
+	Sprite *_sprite5;
+	Sprite *_sprite6;
+	Sprite *_sprite7;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void update45FCB0();
+	void update45FD50();
+	void sub460090();
+	void sub460110();
+	void sub460170();
+	void sub460190();
+	void sub4601B0();
+	void sub4601D0();
+	void sub4601F0(bool flag);
+};
+
 class Scene2805 : public Scene {
 public:
 	Scene2805(NeverhoodEngine *vm, Module *parentModule, int which);


Commit: f3d98e62757fb7b3de2c2ebae87ef6f885967556
    https://github.com/scummvm/scummvm/commit/f3d98e62757fb7b3de2c2ebae87ef6f885967556
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:38-07:00

Commit Message:
NEVERHOOD: Add scene 28/05

Changed paths:
    engines/neverhood/module2800.cpp



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index c6ce179..417e3f5 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -86,6 +86,13 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_stop(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
 		break;
+	case 25:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		if (getGlobalVar(0x190A1D18))
+			_childObject = new Class152(_vm, this, 0x01600204, 0x0020001E);
+		else
+			_childObject = new Class152(_vm, this, 0x08611204, 0x1120008E);
+		break;
 	//		
 	case 1001:
 		break;
@@ -138,6 +145,9 @@ void Module2800::updateScene() {
 				createScene(11, 1);
 			}
 			break;
+		case 25:
+			createScene(2, 5);
+			break;
 		//		
 		case 1001:
 			break;


Commit: 3cee21ac9391f98f1ed372ad0a99f9e81974ef2b
    https://github.com/scummvm/scummvm/commit/3cee21ac9391f98f1ed372ad0a99f9e81974ef2b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2803b (forgot them before) and Scene2806

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 70402d4..fe6644e 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -390,12 +390,33 @@ static const uint32 messageListOffsets[] = {
 	1, 0x004B6C10,
 	1, 0x004B6BB0,
 	2, 0x004B6C40,
+	// Scene2803b
+	1, 0x004B60D8,
+	1, 0x004B6100,
+	1, 0x004B60F8,
+	1, 0x004B6100,
+	3, 0x004B6138,
+	3, 0x004B60E0,
+	3, 0x004B6180,
+	1, 0x004B6198,
+	6, 0x004B6108,
+	3, 0x004B6150,
+	3, 0x004B6168,
+	1, 0x004B61A0,
+	5, 0x004B61A8,
 	// Scene2805
 	1, 0x004AE1C8,
 	2, 0x004AE1D0,
 	4, 0x004AE288,
 	2, 0x004AE1E0,
 	1, 0x004AE1C0,
+	// Scene2806
+	1, 0x004AF098,
+	1, 0x004AF098,
+	3, 0x004AF0C8,
+	5, 0x004AF0A0,
+	1, 0x004AF090,
+	2, 0x004AF0E0,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 14f72dd..58190d0 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: c2f91e39ba8e7654d5f0da3f789a9eaf9136afe5
    https://github.com/scummvm/scummvm/commit/c2f91e39ba8e7654d5f0da3f789a9eaf9136afe5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Scene2806 (Class469 TODO)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index a424d53..62fe2ad 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -303,7 +303,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 2;
+	_vm->gameState().sceneNum = 5;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 010c2e4..4178bec 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -650,8 +650,7 @@ void Klayman::startWalkToX(int16 x, bool flag) {
 		_destX = x;
 	} else if (flag) {
 		_destX = x;
-		error("// TODO AnimatedSprite_GotoState(&Klayman::sub421550));");
-		// TODO AnimatedSprite_GotoState(&Klayman::sub421550);
+		GotoState(&Klayman::sub421550);
 	} else {
 		_destX = x;
 		GotoState(&Klayman::stStartWalking);
@@ -1239,6 +1238,104 @@ void Klayman::sub421880() {
 	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 }
 
+void Klayman::sub420F60() {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420F60))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x3F28E094, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E6C0);
+		SetSpriteUpdate(NULL);
+		NextState(&Klayman::sub420FB0);
+	}
+}
+
+void Klayman::sub420FB0() {
+	_acceptInput = false;
+	startAnimation(0x3A28C094, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41E6C0);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klayman::handleMessage41E6C0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+			sendMessage(_attachedSprite, 0x480F, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub421110() {
+	if (!stStartAction(AnimationCallback(&Klayman::sub421110))) {
+		_status2 = 1;
+		_acceptInput = false;
+		startAnimation(0x1A38A814, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E750);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+uint32 Klayman::handleMessage41E750(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02B20220)
+			_soundResource1.play(0xC5408620);
+		else if (param.asInteger() == 0x0A720138)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0x03020231)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0xB613A180)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x67221A03)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x038A010B)
+			_soundResource1.play(0x00018040);
+		else if (param.asInteger() == 0x422B0280)
+			_soundResource1.play(0x166FC6E0);
+		else if (param.asInteger() == 0x925A0C1E)
+			_soundResource1.play(0x40E5884D);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub4215E0() {
+	_status2 = 0;
+	_isWalking = true;
+	_acceptInput = true;
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
+	NextState(&Klayman::stUpdateWalking);
+	FinalizeState(&Klayman::stStartWalkingDone);
+	startAnimation(0x5A2CBC00, 0, -1);
+}
+
+void Klayman::sub421550() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub421550))) {
+		_status2 = 0;
+		_isWalking = true;
+		_acceptInput = true;
+		setDoDeltaX(_destX < _x ? 1 : 0);
+		startAnimation(0x272C1199, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::hmStartWalking);
+		SetSpriteUpdate(&Klayman::suWalkingTestExit);
+		FinalizeState(&Klayman::stStartWalkingDone);	
+		NextState(&Klayman::sub4215E0);
+	}
+}
+
 void Klayman::sub41CC40(int16 x1, int16 x2) {
 	if (_x > x1) {
 		if (_x == x1 + x2) {
@@ -5254,4 +5351,167 @@ void KmScene2805::sub4048D0() {
 	startAnimation(0xD82A4094, 0, -1);
 }
 
+KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+	bool flag, NRect *clipRects, uint clipRectsCount)
+	: Klayman(vm, parentScene, x, y, 1000, 1000),
+	_soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) {
+	// Empty
+
+	if (flag) {
+		// TODO Maybe? Don't know. Set Klayman clip rects
+		_soundRes1.load(0x58E0C341);
+		_soundRes2.load(0x40A00342);
+		_soundRes3.load(0xD0A1C348);
+		_soundRes4.load(0x166FC6E0);
+		_soundRes5.load(0x00018040);
+	}
+	
+	_dataResource.load(0x98182003);
+
+}
+
+uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4804:
+		startWalkToX(440, true);
+		break;
+	case 0x480D:
+		GotoState(&Klayman::sub420F60);
+		break;
+	case 0x4816:
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stPressButtonSide); 
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x4818:
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x4831:
+		GotoState(&KmScene2806::sub40F780);
+		break;
+	case 0x4832:
+		if (param.asInteger() == 1) {
+			GotoState(&KmScene2806::sub40F7C0);
+		} else {
+			GotoState(&Klayman::sub421110);
+		}
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene2806::handleMessage40F1F0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1008:
+		if (_flag1) {
+			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+			messageResult = 0;
+		} else
+			_flag2 = true;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x0002418E)
+			sendMessage(_parentScene, 0x2000, 0);
+		else if (param.asInteger() == 0x924090C2) {
+			_flag1 = true;
+			if (_flag2) {
+				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+				messageResult = 0;
+			}
+		} else if (param.asInteger() == 0x004A2148)
+			_flag1 = false;
+		else if (param.asInteger() == 0x02B20220)
+			_soundResource1.play(0xC5408620);
+		else if (param.asInteger() == 0x0A720138)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0x03020231)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0xB613A180)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x67221A03)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x038A010B)
+			_soundResource1.play(0x00018040);
+		else if (param.asInteger() == 0x422B0280)
+			_soundResource1.play(0x166FC6E0);
+		else if (param.asInteger() == 0x925A0C1E)
+			_soundResource1.play(0x40E5884D);
+		else if (param.asInteger() == 0x00020814)
+			_soundResource1.play(0x786CC6D0);
+		else if (param.asInteger() == 0x06020500)
+			_soundResource1.play(0x1069C0E1);
+		else if (param.asInteger() == 0x02128C00)
+			_soundResource1.play(0x5068C4C3);
+		else if (param.asInteger() == 0x82022030)
+			_soundResource1.play(0x5C48C0E8);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene2806::handleMessage40F570(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101)
+			_soundResource1.play(0x405002D8);
+		else if (param.asInteger() == 0x0A2A9098)
+			_soundResource1.play(0x0460E2FA);
+		else if (param.asInteger() == 0xD00A0C0C)
+			_soundRes1.play();
+		else if (param.asInteger() == 0x04121920)
+			_soundRes2.play();
+		else if (param.asInteger() == 0x030B4480)
+			_soundRes3.play();
+		else if (param.asInteger() == 0x422B0280)
+			_soundRes4.play();
+		else if (param.asInteger() == 0x038A010B)
+			_soundRes5.play();
+		else if (param.asInteger() == 0x67221A03)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x02B20220)
+			_soundResource1.play(0xC5408620);
+		else if (param.asInteger() == 0x925A0C1E)
+			_soundResource1.play(0x40E5884D);
+		else if (param.asInteger() == 0x03020231)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0x08040840)
+			setDoDeltaX(2);
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2806::sub40F780() {
+	_status2 = 0;
+	_acceptInput = false;
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&KmScene2806::handleMessage40F570);
+	startAnimation(0x2838C010, 0, -1);
+}
+
+void KmScene2806::sub40F7C0() {
+	_status2 = 1;
+	_acceptInput = false;
+	_flag1 = false;
+	_flag2 = false;
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&KmScene2806::handleMessage40F1F0);
+	startAnimation(0x1C388C04, 0, -1);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index ab7ccb6..27d9298 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -30,7 +30,8 @@
 
 namespace Neverhood {
 
-// TODO: This code is horrible and weird and a lot of stuff needs renaming once a better name is found
+// TODO This code is horrible and weird and a lot of stuff needs renaming once a better name is found
+// TODO Also the methods should probably rearranged and be grouped together more consistently
 
 class Klayman;
 
@@ -150,6 +151,13 @@ public:
 	void sub421900();
 	void sub4218C0();
 	void sub421880();
+	void sub420F60();
+	void sub420FB0();
+	uint32 handleMessage41E6C0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub421110();
+	uint32 handleMessage41E750(int messageNum, const MessageParam &param, Entity *sender);
+	void sub4215E0();
+	void sub421550();
 
 protected:
 	Entity *_parentScene;
@@ -585,6 +593,25 @@ protected:
 	void sub4048D0();
 };
 
+class KmScene2806 : public Klayman {
+public:
+	KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+		bool flag, NRect *clipRects, uint clipRectsCount);
+protected:
+	SoundResource _soundRes1;
+	SoundResource _soundRes2;
+	SoundResource _soundRes3;
+	SoundResource _soundRes4;
+	SoundResource _soundRes5;
+	bool _flag1;
+	bool _flag2;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage40F1F0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage40F570(int messageNum, const MessageParam &param, Entity *sender);
+	void sub40F780();
+	void sub40F7C0();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 417e3f5..793fc74 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -86,6 +86,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_stop(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
 		break;
+	case 5:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2806(_vm, this, which);
+		break;
 	case 25:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		if (getGlobalVar(0x190A1D18))
@@ -145,6 +149,13 @@ void Module2800::updateScene() {
 				createScene(11, 1);
 			}
 			break;
+		case 5:
+			if (_moduleResult == 1) {
+				createScene(27, 0);
+			} else {
+				createScene(2, 2);
+			}
+			break;
 		case 25:
 			createScene(2, 5);
 			break;
@@ -595,4 +606,126 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	Sprite *tempSprite;
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2806::handleMessage);
+	SetUpdateHandler(&Scene2806::update);
+	
+	loadDataResource(0x98182003);
+	loadHitRectList();
+	
+	_pointList = _dataResource.getPointArray(0x3606A422);
+
+	insertMouse433(0x22114C13);	
+	setBackground(0xC1B22110);
+	setPalette(0xC1B22110);
+	
+	_sprite1 = insertStaticSprite(0xA21F82CB, 1100);
+	_clipRects[0].x1 = _sprite1->getDrawRect().x;
+	_clipRects[0].y1 = _sprite1->getDrawRect().y;
+	_clipRects[0].x2 = _sprite1->getDrawRect().x2();
+	_clipRects[0].y2 = _sprite1->getDrawRect().y2();
+
+	_sprite2 = insertStaticSprite(0x92035301, 1100);
+	_clipRects[1].y2 = _sprite2->getDrawRect().y2();
+
+	_sprite3 = insertStaticSprite(0x3182220E, 1100);
+
+	_sprite4 = insertStaticSprite(0x72090342, 1100);
+	_clipRects[1].x1 = _sprite4->getDrawRect().x;
+	_clipRects[1].y1 = _sprite4->getDrawRect().y;
+	
+	_fieldEC = true;
+
+	tempSprite = insertStaticSprite(0xD2012C02, 1100);
+	_clipRects[2].x1 = tempSprite->getDrawRect().x;
+	_clipRects[2].y2 = tempSprite->getDrawRect().y2();
+	_clipRects[3].y1 = tempSprite->getDrawRect().y2();
+	_clipRects[1].x2 = tempSprite->getDrawRect().x2();
+
+	tempSprite = insertStaticSprite(0x72875F42, 1100);
+	_clipRects[3].x1 = tempSprite->getDrawRect().x;
+
+	insertStaticSprite(0x0201410A, 1100);
+	insertStaticSprite(0x72875F42, 1100);
+
+	// TODO _class469 = insertSprite<Class469>();
+
+	_clipRects[2].y1 = 0;
+	_clipRects[3].y2 = 480;
+	_clipRects[2].x2 = 640;
+	_clipRects[3].x2 = 640;
+
+	if (which < 0) {
+		insertKlayman<KmScene2806>(441, 423, false, _clipRects, 4);
+		setMessageList(0x004AF098);
+	} else if (which == 1) {
+		insertKlayman<KmScene2806>(378, 423, false, _clipRects, 4);
+		setMessageList(0x004AF098);
+	} else if (which == 2) {
+		insertKlayman<KmScene2806>(378, 423, false, _clipRects, 4);
+		setMessageList(0x004AF0C8);
+	} else if (which == 3) {
+		insertKlayman<KmScene2806>(378, 423, true, _clipRects, 4);
+		setMessageList(0x004AF0A0);
+		setGlobalVar(0x1860C990, 0);
+	} else {
+		insertKlayman<KmScene2806>(670, 423, false, _clipRects, 4);
+		setMessageList(0x004AF090);
+	}
+
+	_pointIndex = -1;
+	findClosestPoint();
+
+}
+
+uint32 Scene2806::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x44262B12) {
+			setMessageList(0x004AF0E0);
+		}
+		break;
+	case 0x2000:
+		// TODO sendMessage(_class469, 0x2000, 0);
+		break;
+	}
+	return 0;
+}
+
+void Scene2806::update() {
+	Scene::update();
+	findClosestPoint();
+}
+
+void Scene2806::findClosestPoint() {
+
+	static const uint32 kScene2806PaletteFileHashes[] = {
+		0x48052508,
+		0x01139404,
+		0x01138C04,
+		0x01138004,
+		0x01138604,
+		0x086B8890
+	};
+
+	int16 x = MIN<int16>(_klayman->getX(), 639);
+	int index = 1;
+	
+	while (index < (int)_pointList->size() && (*_pointList)[index].x < x)
+		++index;
+	--index;
+
+	if (_pointIndex != index) {
+		_pointIndex = index;
+		_palette->addPalette(kScene2806PaletteFileHashes[index], 0, 64, 0);
+	}
+	
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 54b893b..b672866 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -87,6 +87,24 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2806 : public Scene {
+public:
+	Scene2806(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	NPointArray *_pointList;
+	int _pointIndex;
+	NRect _clipRects[4];
+	bool _fieldEC;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_sprite4;
+	// TODO class469
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void update();
+	void findClosestPoint();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2800_H */


Commit: 404aaaad941efe6496223e4c0263b181be406a71
    https://github.com/scummvm/scummvm/commit/404aaaad941efe6496223e4c0263b181be406a71
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Class469

Changed paths:
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 793fc74..27234eb 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -151,7 +151,7 @@ void Module2800::updateScene() {
 			break;
 		case 5:
 			if (_moduleResult == 1) {
-				createScene(27, 0);
+				createScene(7, 0);
 			} else {
 				createScene(2, 2);
 			}
@@ -606,6 +606,34 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
+Class469::Class469(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	
+	createSurface1(0x04211490, 1200);
+	_x = 378;
+	_y = 423;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Class469::handleMessage);
+	setDoDeltaX(1);
+	setVisible(false);
+}
+
+uint32 Class469::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		_soundResource.play(0x48640244);
+		startAnimation(0x04211490, 0, -1);
+		setVisible(true);
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+	
 Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
@@ -653,7 +681,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x0201410A, 1100);
 	insertStaticSprite(0x72875F42, 1100);
 
-	// TODO _class469 = insertSprite<Class469>();
+	_class469 = insertSprite<Class469>();
 
 	_clipRects[2].y1 = 0;
 	_clipRects[3].y2 = 480;
@@ -692,7 +720,7 @@ uint32 Scene2806::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		// TODO sendMessage(_class469, 0x2000, 0);
+		sendMessage(_class469, 0x2000, 0);
 		break;
 	}
 	return 0;
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index b672866..765873d 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -87,6 +87,14 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Class469 : public AnimatedSprite {
+public:
+	Class469(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene2806 : public Scene {
 public:
 	Scene2806(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -99,7 +107,7 @@ protected:
 	Sprite *_sprite2;
 	Sprite *_sprite3;
 	Sprite *_sprite4;
-	// TODO class469
+	Sprite *_class469;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void update();
 	void findClosestPoint();


Commit: 12bb3f23f35491cdef20cb11cb013426618cf97f
    https://github.com/scummvm/scummvm/commit/12bb3f23f35491cdef20cb11cb013426618cf97f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Scene2808

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 62fe2ad..248c873 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -220,6 +220,31 @@ void GameModule::initScene1405Vars() {
 	
 }
 
+void GameModule::initScene2808Vars1() {
+
+	// Exit if it's already initialized
+	if (getSubVar(0x40050052, 0x20479010))
+		return;
+
+	for (uint i = 0; i < 3; i++)
+		setSubVar(0x0C601058, i, _vm->_rnd->getRandomNumber(3 - 1) + 1);
+
+	setSubVar(0x40050052, 0x20479010, 1);
+
+}
+
+void GameModule::initScene2808Vars2() {
+
+	// Exit if it's already initialized
+	if (getSubVar(0x40050052, 0x66059818))
+		return;
+
+	for (uint i = 0; i < 3; i++)
+		setSubVar(0x40005834, i, _vm->_rnd->getRandomNumber(6 - 1) + 1);
+
+	setSubVar(0x40050052, 0x66059818, 1);
+}
+
 void GameModule::initScene3009Vars() {
 	if (!getSubVar(0x40050052, 0x8C9819C2)) {
 		for (int i = 0; i < 3; i++) {
@@ -303,7 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 5;
+	_vm->gameState().sceneNum = 7;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 6da7123..f453feb 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -39,6 +39,8 @@ public:
 	void handleMouseDown(int16 x, int16 y);
 	void initScene1307Vars();
 	void initScene1405Vars();
+	void initScene2808Vars1();
+	void initScene2808Vars2();
 	void initScene3009Vars();
 protected:
 	Entity *_prevChildObject;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 27234eb..353bb76 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -90,6 +90,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2806(_vm, this, which);
 		break;
+	case 7:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2808(_vm, this, 0);
+		break;
 	case 25:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		if (getGlobalVar(0x190A1D18))
@@ -156,6 +160,9 @@ void Module2800::updateScene() {
 				createScene(2, 2);
 			}
 			break;
+		case 7:
+			createScene(5, _moduleResult);
+			break;
 		case 25:
 			createScene(2, 5);
 			break;
@@ -756,4 +763,449 @@ void Scene2806::findClosestPoint() {
 	
 }
 
+static const uint32 kScene2808FileHashes1[] = {
+	0x90B0392,
+	0x90B0192
+};
+
+static const uint32 kScene2808FileHashes2[] = {
+	0xB0396098,
+	0xB0196098
+};
+
+static const uint32 kClass428FileHashes[] = {
+	0x140022CA,
+	0x4C30A602,
+	0xB1633402,
+	0x12982135,
+	0x0540B728,
+	0x002A81E3,
+	0x08982841,
+	0x10982841,
+	0x20982841,
+	0x40982841,
+	0x80982841,
+	0x40800711
+};
+
+static const int kClass428Countdowns1[] = {
+	18, 16, 10, 0
+};
+
+static const int kClass428Countdowns2[] = {
+	9, 9, 8, 8, 5, 5, 0, 0
+};
+
+static const uint32 kClass490FileHashes[] = {
+	0x08100071,
+	0x24084215,
+	0x18980A10
+};
+
+static const int16 kClass490FrameIndices1[] = {
+	0, 8, 15, 19
+};
+
+static const int16 kClass490FrameIndices2[] = {
+	0, 4, 8, 11, 15, 17, 19, 0
+};
+
+AsScene2808Dispenser::AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum),
+	_testTubeIndex(testTubeIndex) {
+	
+	_spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]);
+	createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	
+	_surface->getDrawRect().x = 0;
+	_surface->getDrawRect().y = 0;
+	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
+	_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_deltaRect = _drawRect;
+	processDelta();
+
+	SetUpdateHandler(&AsScene2808Dispenser::update);
+	SetMessageHandler(&AsScene2808Dispenser::handleMessage);
+
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+	
+}
+
+void AsScene2808Dispenser::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown) == 0) {
+		setVisible(false);
+	}
+}
+	
+uint32 AsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		sendMessage(_parentScene, 0x2000, _testTubeIndex);
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2808Dispenser::startCountdown(int index) {
+	setVisible(true);
+	StaticSprite::update();
+	if (_testTubeSetNum == 0) {
+		_countdown = kClass428Countdowns1[index];
+	} else {
+		_countdown = kClass428Countdowns2[index];
+	}
+}
+
+AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser)
+	: AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _dispenser(dispenser),
+	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
+	_soundResource4(vm), _soundResource5(vm), _soundResource6(vm),
+	_soundResource7(vm), _soundResource8(vm), _soundResource9(vm), _fillLevel(0) {
+
+	if (testTubeSetNum == 0) {
+		_x = 504;
+		_y = 278;
+	} else {
+		setDoDeltaX(1);
+		_x = 136;
+		_y = 278;
+	}
+
+	createSurface1(kClass490FileHashes[testTubeIndex], 1100);
+
+	if (testTubeSetNum == 0) {
+		_soundResource1.load(0x30809E2D);
+		_soundResource2.load(0x72811E2D);
+		_soundResource3.load(0x78B01625);
+	} else {
+		_soundResource4.load(0x70A41E0C);
+		_soundResource5.load(0x50205E2D);
+		_soundResource6.load(0xF8621E2D);
+		_soundResource7.load(0xF1A03C2D);
+		_soundResource8.load(0x70A43D2D);
+		_soundResource9.load(0xF0601E2D);
+	}
+	
+	startAnimation(kClass490FileHashes[testTubeIndex], 0, -1);
+	_newStickFrameIndex = 0;
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2808TestTube::handleMessage);
+	
+	if (_fillLevel == 0)
+		setVisible(false);
+	
+}
+
+uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		fill();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2808TestTube::fill() {
+
+
+	if ((int)_fillLevel >= _testTubeSetNum * 3 + 3)
+		return;
+		
+	if (_testTubeSetNum == 0) {
+		switch (_fillLevel) {
+		case 0:
+			_soundResource1.play();
+			break;
+		case 1:
+			_soundResource2.play();
+			break;
+		case 2:
+			_soundResource3.play();
+			break;
+		}
+		setVisible(true);
+		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]);
+		_newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1];
+	} else {
+		switch (_fillLevel) {
+		case 0:
+			_soundResource4.play();
+			break;
+		case 1:
+			_soundResource5.play();
+			break;
+		case 2:
+			_soundResource6.play();
+			break;
+		case 3:
+			_soundResource7.play();
+			break;
+		case 4:
+			_soundResource8.play();
+			break;
+		case 5:
+			_soundResource9.play();
+			break;
+		}
+		setVisible(true);
+		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]);
+		_newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1];
+	}
+	_dispenser->startCountdown(_fillLevel);
+	_fillLevel++;
+}
+
+void AsScene2808TestTube::flush() {
+	if (_fillLevel != 0) {
+		if (_testTubeSetNum == 0) {
+			startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], -1);
+		} else {
+			startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], -1);
+		}
+		_newStickFrameIndex = 0;
+		_playBackwards = true;
+		setVisible(true);
+	}
+}
+
+AsScene2808Handle::AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum)
+	: AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false),
+	_soundResource(vm) {
+	
+	_soundResource.load(0xE18D1F30);
+	_x = 320;
+	_y = 240;
+	if (_testTubeSetNum == 1)
+		setDoDeltaX(1);
+	createSurface1(0x040900D0, 1300);
+	startAnimation(0x040900D0, 0, -1);
+	_needRefresh = true;
+	_newStickFrameIndex = 0;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2808Handle::handleMessage);
+	AnimatedSprite::updatePosition();
+}
+
+uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (!_isActivated) {
+			sendMessage(_parentScene, 0x2001, 0);
+			_soundResource.play();
+			activate();
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene2808Handle::hmActivating(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2808Handle::activate() {
+	startAnimation(0x040900D0, 0, -1);
+	SetMessageHandler(&AsScene2808Handle::hmActivating);
+	NextState(&AsScene2808Handle::stActivated);
+	_isActivated = true;
+	_newStickFrameIndex = -1;
+}
+
+void AsScene2808Handle::stActivated() {
+	stopAnimation();
+	sendMessage(_parentScene, 0x2002, 0);
+}
+
+AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum),
+	_soundResource(vm) {
+
+	if (testTubeSetNum == 0) {
+		_x = 312;
+		_y = 444;
+	} else {
+		_x = 328;
+		_y = 444;
+	}
+	createSurface1(0xB8414818, 1200);
+	startAnimation(0xB8414818, 0, -1);
+	setVisible(false);
+	_newStickFrameIndex = 0;
+	_needRefresh = true;
+	_soundResource.load(0x6389B652);
+	SetUpdateHandler(&AnimatedSprite::update);
+	AnimatedSprite::updatePosition();
+}
+	
+uint32 AsScene2808Flow::hmFlowing(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2808Flow::start() {
+	startAnimation(0xB8414818, 0, -1);
+	setVisible(true);
+	SetMessageHandler(&AsScene2808Flow::hmFlowing);
+	NextState(&AsScene2808Flow::stKeepFlowing);
+	_soundResource.play();
+}
+
+void AsScene2808Flow::stKeepFlowing() {
+	startAnimation(0xB8414818, 1, -1);
+	NextState(&AsScene2808Flow::stKeepFlowing);
+}
+
+AsScene2808LightEffect::AsScene2808LightEffect(NeverhoodEngine *vm, int testTubeSetNum)
+	: AnimatedSprite(vm, 800), _countdown(1) {
+	
+	_x = 320;
+	_y = 240;
+	if (testTubeSetNum == 1)
+		setDoDeltaX(1);
+	createSurface1(0x804C2404, 800);
+	SetUpdateHandler(&AsScene2808LightEffect::update);
+	_needRefresh = true;
+	AnimatedSprite::updatePosition();
+}
+
+void AsScene2808LightEffect::update() {
+	if (_countdown != 0 && (--_countdown) == 0) {
+		int16 frameIndex = _vm->_rnd->getRandomNumber(3 - 1);
+		startAnimation(0x804C2404, frameIndex, frameIndex);
+		updateAnim();
+		updatePosition();
+		_countdown = _vm->_rnd->getRandomNumber(3 - 1) + 1;
+	}
+}
+
+Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) {
+
+	Sprite *tempSprite;
+
+	if (which == 0) {
+		_vm->gameModule()->initScene2808Vars1();
+	} else {
+		_vm->gameModule()->initScene2808Vars2();
+	}
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2808::handleMessage);
+	SetUpdateHandler(&Scene2808::update);
+
+	setBackground(kScene2808FileHashes1[which]);
+	setPalette(kScene2808FileHashes1[which]);
+
+	tempSprite = insertSprite<AsScene2808Handle>(this, which);
+	_vm->_collisionMan->addSprite(tempSprite);
+
+	_asFlow = insertSprite<AsScene2808Flow>(this, which);
+	insertSprite<AsScene2808LightEffect>(which);
+
+	for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) {
+		AsScene2808Dispenser *dispenser = insertSprite<AsScene2808Dispenser>(this, which, testTubeIndex);
+		_vm->_collisionMan->addSprite(dispenser);
+		_asTestTubes[testTubeIndex] = insertSprite<AsScene2808TestTube>(which, testTubeIndex, dispenser);
+		_vm->_collisionMan->addSprite(_asTestTubes[testTubeIndex]);
+	}
+	
+	insertMouse433(kScene2808FileHashes2[which]);
+
+}
+
+uint32 Scene2808::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO DEBUG Stuff
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) {
+			leaveScene(1);
+		}
+		break;
+	case 0x000D:
+		// TODO DEBUG Stuff
+		break;
+	case 0x2000:
+		if (!_isFlowing)
+			_asTestTubes[param.asInteger()]->fill();
+		break;
+	case 0x2001:
+		_isFlowing = true;
+		break;
+	case 0x2002:
+		if (isAnyTestTubeFilled()) {
+			_leaveResult = 3;
+			if (!isMixtureGood())
+				_leaveResult = 2;
+			_asFlow->start();
+			for (int i = 0; i < 3; i++)
+				_asTestTubes[i]->flush();
+			_mouseCursor->setVisible(false);
+			_countdown = 16;
+		} else {
+			leaveScene(1);
+		}
+		break;
+	}
+	return 0;
+}
+
+void Scene2808::update() {
+
+	// DEBUG: Show correct values
+	debug("---------------");
+	debug("%03d %03d %03d", getSubVar(0x0C601058, 0), getSubVar(0x0C601058, 1), getSubVar(0x0C601058, 2));
+	debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel());
+	
+	Scene::update();
+	if (_countdown != 0 && (--_countdown) == 0) {
+		leaveScene(_leaveResult);
+	}
+}
+
+bool Scene2808::isMixtureGood() {
+	if (_testTubeSetNum == 0) {
+		return
+			_asTestTubes[0]->getFillLevel() == getSubVar(0x0C601058, 0) &&
+			_asTestTubes[1]->getFillLevel() == getSubVar(0x0C601058, 1) &&
+			_asTestTubes[2]->getFillLevel() == getSubVar(0x0C601058, 2);
+	} else {
+		return
+			_asTestTubes[0]->getFillLevel() == getSubVar(0x40005834, 0) &&
+			_asTestTubes[1]->getFillLevel() == getSubVar(0x40005834, 1) &&
+			_asTestTubes[2]->getFillLevel() == getSubVar(0x40005834, 2);
+	}
+}
+
+bool Scene2808::isAnyTestTubeFilled() {
+	return
+		_asTestTubes[0]->getFillLevel() > 0 ||
+		_asTestTubes[1]->getFillLevel() > 0 ||
+		_asTestTubes[2]->getFillLevel() > 0;
+}
+
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 765873d..ed93c9f 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -113,6 +113,91 @@ protected:
 	void findClosestPoint();
 };
 
+class AsScene2808Dispenser : public StaticSprite {
+public:
+	AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex);
+	void startCountdown(int index);
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	int _testTubeSetNum, _testTubeIndex;
+	void update();	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2808TestTube : public AnimatedSprite {
+public:
+	AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser);
+	void fill();
+	void flush();
+	uint32 getFillLevel() const { return _fillLevel; }
+protected:
+	AsScene2808Dispenser *_dispenser;
+	int _testTubeSetNum;
+	uint32 _fillLevel;
+	int _testTubeIndex;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	SoundResource _soundResource5;
+	SoundResource _soundResource6;
+	SoundResource _soundResource7;
+	SoundResource _soundResource8;
+	SoundResource _soundResource9;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2808Handle : public AnimatedSprite {
+public:
+	AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum);
+	void activate();
+	void stActivated();
+protected:
+	Scene *_parentScene;
+	int _testTubeSetNum;
+	bool _isActivated;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmActivating(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2808Flow : public AnimatedSprite {
+public:
+	AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum);
+	void start();
+	void stKeepFlowing();
+protected:
+	Scene *_parentScene;
+	int _testTubeSetNum;
+	SoundResource _soundResource;
+	uint32 hmFlowing(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2808LightEffect : public AnimatedSprite {
+public:
+	AsScene2808LightEffect(NeverhoodEngine *vm, int which);
+protected:
+	int _countdown;
+	void update();
+};
+
+class Scene2808 : public Scene {
+public:
+	Scene2808(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	int _countdown;
+	int _testTubeSetNum;
+	AsScene2808Flow *_asFlow;
+	int _leaveResult;
+	bool _isFlowing;
+	AsScene2808TestTube *_asTestTubes[3];
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void update();
+	bool isMixtureGood();
+	bool isAnyTestTubeFilled();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2800_H */


Commit: 1cb1e66c101612d9400cca090c3fdc2d18dcaf96
    https://github.com/scummvm/scummvm/commit/1cb1e66c101612d9400cca090c3fdc2d18dcaf96
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Class488 (renaming TODO)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 248c873..7ea115c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,7 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 7;
+	_vm->gameState().sceneNum = 2;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 353bb76..3a787ee 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -290,6 +290,75 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+Class488::Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2),
+	_flag1(false), _flag2(false), _soundResource(vm) {
+
+	createSurface(1010, 640, 480); // TODO Use correct size	from the two hashes
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	_x = x;
+	_y = y;
+	sub4343C0();
+}
+
+uint32 Class488::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (!_flag2 && param.asInteger() == calcHash("ClickSwitch")) {
+			sendMessage(_parentScene, 0x480F, 0);
+			_soundResource.play(0x4E1CA4A0);
+		}
+		break;
+	case 0x480F:
+		sub434380();
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Class488::handleMessage434340(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void Class488::sub434380() {
+	_flag2 = false;
+	_flag1 = true;
+	startAnimation(_fileHash2, 0, -1);
+	SetMessageHandler(&Class488::handleMessage434340);
+	NextState(&Class488::sub4343C0);
+}
+
+void Class488::sub4343C0() {
+	_flag1 = false;
+	startAnimation(_fileHash1, 0, -1);
+	SetMessageHandler(&Class488::handleMessage);
+}
+
+void Class488::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
+	_fileHash1 = fileHash1;
+	_fileHash2 = fileHash2;
+	if (_flag1) {
+		startAnimation(_fileHash2, _currFrameIndex, -1);
+		_flag2 = true;
+	} else {
+		startAnimation(_fileHash1, 0, -1);
+	}
+}
+
 Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _palStatus(0) {
 
@@ -307,7 +376,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 	loadDataResource(0x81120132);
 	insertMouse433(0x00A05290);
 
-	// TODO insertSprite<Class488>(this, 0xAFAD591A, 0x276E321D, 578, 200);
+	insertSprite<Class488>(this, 0xAFAD591A, 0x276E321D, 578, 200);
 
 	if (getGlobalVar(0x190A1D18)) {
 		setBackground(0x412A423E);
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index ed93c9f..4026093 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -54,6 +54,21 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Class488 : public AnimatedSprite {
+public:
+	Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y);
+	void sub434380();
+	void sub4343C0();
+	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
+protected:
+	Scene *_parentScene;
+	SoundResource _soundResource;
+	uint32 _fileHash1, _fileHash2;
+	bool _flag1, _flag2;	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage434340(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene2803b : public Scene {
 public:
 	Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which);


Commit: 5688047fe353276806bc491e324dbb3a9c9df22f
    https://github.com/scummvm/scummvm/commit/5688047fe353276806bc491e324dbb3a9c9df22f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2809

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index fe6644e..1c9c76a 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -417,6 +417,12 @@ static const uint32 messageListOffsets[] = {
 	5, 0x004AF0A0,
 	1, 0x004AF090,
 	2, 0x004AF0E0,
+	// Scene2809
+	1, 0x004B5B90,
+	3, 0x004B5BD0,
+	5, 0x004B5BA8,
+	1, 0x004B5B88,
+	2, 0x004B5B98,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 58190d0..7bc4609 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 2aa6e6b89cc968854e84b1e752e36287251b898e
    https://github.com/scummvm/scummvm/commit/2aa6e6b89cc968854e84b1e752e36287251b898e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Scene2809

- Fix some setMessageList parameters
- Add scene 10 in Module2800

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7ea115c..384f419 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,7 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 2;
+	_vm->gameState().sceneNum = 5;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 4178bec..de3844e 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5514,4 +5514,168 @@ void KmScene2806::sub40F7C0() {
 	startAnimation(0x1C388C04, 0, -1);
 }
 
+KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+	bool flag, NRect *clipRects, uint clipRectsCount)
+	: Klayman(vm, parentScene, x, y, 1000, 1000),
+	_soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) {
+
+	if (flag) {
+    	// TODO Maybe? Don't know. Set Klayman clip rects
+		_soundRes1.load(0x58E0C341);
+		_soundRes2.load(0x40A00342);
+		_soundRes3.load(0xD0A1C348);
+		_soundRes4.load(0x166FC6E0);
+		_soundRes5.load(0x00018040);
+	}
+
+	_dataResource.load(0x1830009A);
+	
+}
+
+uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4804:
+		startWalkToX(226, true);
+		break;
+	case 0x480D:
+		GotoState(&Klayman::sub420F60);
+		break;
+	case 0x4816:
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stPressButtonSide); 
+		}
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x4818:
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x4831:
+		GotoState(&KmScene2809::sub458550);
+		break;
+	case 0x4832:
+		if (param.asInteger() == 1) {
+			GotoState(&KmScene2809::sub458590);
+		} else {
+			GotoState(&Klayman::sub421110);
+		}
+		break;
+	}
+	return 0;
+}
+
+uint32 KmScene2809::handleMessage457FC0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1008:
+		if (_flag1) {
+			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+			messageResult = 0;
+		} else
+			_flag2 = true;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x0002418E)
+			sendMessage(_parentScene, 0x2000, 0);
+		else if (param.asInteger() == 0x924090C2) {
+			_flag1 = true;
+			if (_flag2) {
+				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+				messageResult = 0;
+			}
+		} else if (param.asInteger() == 0x004A2148)
+			_flag1 = false;
+		else if (param.asInteger() == 0x02B20220)
+			_soundResource1.play(0xC5408620);
+		else if (param.asInteger() == 0x0A720138)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0x03020231)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0xB613A180)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x67221A03)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x038A010B)
+			_soundResource1.play(0x00018040);
+		else if (param.asInteger() == 0x422B0280)
+			_soundResource1.play(0x166FC6E0);
+		else if (param.asInteger() == 0x925A0C1E)
+			_soundResource1.play(0x40E5884D);
+		else if (param.asInteger() == 0x000F0082)
+			_soundResource1.play(0x546CDCC1);
+		else if (param.asInteger() == 0x00020814)
+			_soundResource1.play(0x786CC6D0);
+		else if (param.asInteger() == 0x06020500)
+			_soundResource1.play(0x1069C0E1);
+		else if (param.asInteger() == 0x02128C00)
+			_soundResource1.play(0x5068C4C3);
+		else if (param.asInteger() == 0x82022030)
+			_soundResource1.play(0x5C48C0E8);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene2809::handleMessage458340(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101)
+			_soundResource1.play(0x405002D8);
+		else if (param.asInteger() == 0x0A2A9098)
+			_soundResource1.play(0x0460E2FA);
+		else if (param.asInteger() == 0xD00A0C0C)
+			_soundRes1.play();
+		else if (param.asInteger() == 0x04121920)
+			_soundRes2.play();
+		else if (param.asInteger() == 0x030B4480)
+			_soundRes3.play();
+		else if (param.asInteger() == 0x422B0280)
+			_soundRes4.play();
+		else if (param.asInteger() == 0x038A010B)
+			_soundRes5.play();
+		else if (param.asInteger() == 0x67221A03)
+			_soundResource1.play(0x44051000);
+		else if (param.asInteger() == 0x02B20220)
+			_soundResource1.play(0xC5408620);
+		else if (param.asInteger() == 0x925A0C1E)
+			_soundResource1.play(0x40E5884D);
+		else if (param.asInteger() == 0x03020231)
+			_soundResource1.play(0xD4C08010);
+		else if (param.asInteger() == 0x08040840)
+			setDoDeltaX(2);
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2809::sub458550() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2838C010, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene2809::handleMessage458340);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+void KmScene2809::sub458590() {
+	_status2 = 1;
+	_acceptInput = false;
+	_flag1 = false;
+	_flag2 = false;
+	startAnimation(0x1C388C04, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene2809::handleMessage457FC0);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 27d9298..d508f6c 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -612,6 +612,25 @@ protected:
 	void sub40F7C0();
 };
 
+class KmScene2809 : public Klayman {
+public:
+	KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+		bool flag, NRect *clipRects, uint clipRectsCount);
+protected:
+	SoundResource _soundRes1;
+	SoundResource _soundRes2;
+	SoundResource _soundRes3;
+	SoundResource _soundRes4;
+	SoundResource _soundRes5;
+	bool _flag1;
+	bool _flag2;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage457FC0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage458340(int messageNum, const MessageParam &param, Entity *sender);
+	void sub458550();
+	void sub458590();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 3a787ee..0862205 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -94,6 +94,14 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 0);
 		break;
+	case 8:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2809(_vm, this, which);
+		break;
+	case 10:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2808(_vm, this, 1);
+		break;
 	case 25:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		if (getGlobalVar(0x190A1D18))
@@ -163,6 +171,16 @@ void Module2800::updateScene() {
 		case 7:
 			createScene(5, _moduleResult);
 			break;
+		case 8:
+			if (_moduleResult == 1) {
+				createScene(10, 0);
+			} else {
+				createScene(9, 4);
+			}
+			break;
+		case 10:
+			createScene(8, _moduleResult);
+			break;
 		case 25:
 			createScene(2, 5);
 			break;
@@ -463,7 +481,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else {
 		insertKlayman<KmScene2803b>(135, 444);
 		sub460110();
-		setMessageList(0x004B60E0);
+		setMessageList(0x004B60E0, false);
 		_sprite6->setVisible(true);
 		_sprite7->setVisible(true);
 	}
@@ -644,17 +662,17 @@ Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 1) {
 		insertKlayman<KmScene2805>(493, 338);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004AE1D0);
+		setMessageList(0x004AE1D0, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
 		insertKlayman<KmScene2805>(493, 338);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004AE288);
+		setMessageList(0x004AE288, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
 		insertKlayman<KmScene2805>(493, 338);
 		sendMessage(_klayman, 0x2000, 1);
-		setMessageList(0x004AE1E0);
+		setMessageList(0x004AE1E0, false);
 		sendMessage(this, 0x2000, 1);
 	} else {
 		insertKlayman<KmScene2805>(340, 338);
@@ -682,19 +700,19 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-Class469::Class469(NeverhoodEngine *vm)
+AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1200), _soundResource(vm) {
 	
 	createSurface1(0x04211490, 1200);
 	_x = 378;
 	_y = 423;
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class469::handleMessage);
+	SetMessageHandler(&AsScene2806Spew::handleMessage);
 	setDoDeltaX(1);
 	setVisible(false);
 }
 
-uint32 Class469::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
@@ -757,7 +775,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x0201410A, 1100);
 	insertStaticSprite(0x72875F42, 1100);
 
-	_class469 = insertSprite<Class469>();
+	_asSpew = insertSprite<AsScene2806Spew>();
 
 	_clipRects[2].y1 = 0;
 	_clipRects[3].y2 = 480;
@@ -772,10 +790,10 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AF098);
 	} else if (which == 2) {
 		insertKlayman<KmScene2806>(378, 423, false, _clipRects, 4);
-		setMessageList(0x004AF0C8);
+		setMessageList(0x004AF0C8, false);
 	} else if (which == 3) {
 		insertKlayman<KmScene2806>(378, 423, true, _clipRects, 4);
-		setMessageList(0x004AF0A0);
+		setMessageList(0x004AF0A0, false);
 		setGlobalVar(0x1860C990, 0);
 	} else {
 		insertKlayman<KmScene2806>(670, 423, false, _clipRects, 4);
@@ -796,7 +814,7 @@ uint32 Scene2806::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		sendMessage(_class469, 0x2000, 0);
+		sendMessage(_asSpew, 0x2000, 0);
 		break;
 	}
 	return 0;
@@ -1276,5 +1294,152 @@ bool Scene2808::isAnyTestTubeFilled() {
 		_asTestTubes[2]->getFillLevel() > 0;
 }
 
+AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2809Spew::handleMessage);
+	createSurface1(0x04211490, 1200);
+	_x = 262;
+	_y = 423;
+	setDoDeltaX(0);
+	setVisible(false);
+}
+
+uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		_soundResource.play(0x48640244);
+		startAnimation(0x04211490, 0, -1);
+		setVisible(true);
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	Sprite *tempSprite;
+		
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2809::handleMessage);
+	SetUpdateHandler(&Scene2809::update);
+	
+	loadDataResource(0x1830009A);
+	loadHitRectList();
+	
+	_pointList = _dataResource.getPointArray(0x064A310E);
+
+	setBackground(0xB22116C5);
+	setPalette(0xB22116C5);
+	insertMouse433(0x116C1B2A);
+
+	_sprite1 = insertStaticSprite(0x1FA2EB82, 1100);
+
+	_clipRects[0].x1 = _sprite1->getDrawRect().x;
+	_clipRects[0].y1 = _sprite1->getDrawRect().y;
+	_clipRects[0].x2 = _sprite1->getDrawRect().x2();
+	_clipRects[0].y2 = _sprite1->getDrawRect().y2();
+
+	_sprite2 = insertStaticSprite(0x037321B2, 1100);
+	_clipRects[1].y2 = _sprite2->getDrawRect().y2();
+
+	_sprite3 = insertStaticSprite(0x82022E11, 1100);
+
+	_sprite4 = insertStaticSprite(0x09236252, 1100);
+	_clipRects[1].x2 = _sprite4->getDrawRect().x2();
+	_clipRects[1].y1 = _sprite4->getDrawRect().y;
+
+	tempSprite = insertStaticSprite(0x010C22F2, 1100);
+	_clipRects[2].x2 = tempSprite->getDrawRect().x2();
+	_clipRects[2].y2 = tempSprite->getDrawRect().y2();
+	_clipRects[3].y1 = tempSprite->getDrawRect().y2();
+	_clipRects[1].x1 = tempSprite->getDrawRect().x2();
+
+	tempSprite = insertStaticSprite(0x877F6252, 1100);
+	_clipRects[3].x2 = tempSprite->getDrawRect().x2();
+	
+	insertStaticSprite(0x01612A22, 1100);
+	insertStaticSprite(0x877F6252, 1100);
+
+	_asSpew = insertSprite<AsScene2809Spew>();
+	_clipRects[2].y1 = 0;
+	_clipRects[3].y2 = 480;
+	_clipRects[2].x1 = 0;
+	_clipRects[3].x1 = 0;
+
+	if (which < 0) {
+		insertKlayman<KmScene2809>(226, 423, false, _clipRects, 4);
+		setMessageList(0x004B5B90);
+	} else if (which == 1) {
+		insertKlayman<KmScene2809>(262, 423, false, _clipRects, 4);
+		setMessageList(0x004B5B90);
+	} else if (which == 2) {
+		insertKlayman<KmScene2809>(262, 423, false, _clipRects, 4);
+		setMessageList(0x004B5BD0);
+	} else if (which == 3) {
+		insertKlayman<KmScene2809>(262, 423, true, _clipRects, 4);
+		setMessageList(0x004B5BA8, false);
+		setGlobalVar(0x1860C990, 0);
+	} else {
+		insertKlayman<KmScene2809>(-30, 423, false, _clipRects, 4);
+		setMessageList(0x004B5B88);
+	}
+
+	_pointIndex = -1;
+	findClosestPoint();
+
+}
+
+void Scene2809::update() {
+	Scene::update();
+	findClosestPoint();
+}
+
+uint32 Scene2809::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x160DA937) {
+			setMessageList(0x004B5B98);
+		}
+		break;
+	case 0x2000:
+		sendMessage(_asSpew, 0x2000, 0);
+		break;
+	}
+	return 0;
+}
+
+void Scene2809::findClosestPoint() {
+
+	static const uint32 kScene2809PaletteFileHashes[] = {
+		0x04260848,
+		0x12970401,
+		0x128F0401,
+		0x12830401,
+		0x12850401,
+		0x6A8B9008
+	};
+
+	int16 x = MAX<int16>(_klayman->getX(), 2);
+	int index = 1;
+
+	while (index < (int)_pointList->size() && (*_pointList)[index].x >= x)
+		++index;
+	--index;
+
+	if (_pointIndex != index) {
+		_pointIndex = index;
+		_palette->addPalette(kScene2809PaletteFileHashes[index], 0, 64, 0);
+	}
+	
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 4026093..404f9ac 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -102,9 +102,9 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class469 : public AnimatedSprite {
+class AsScene2806Spew : public AnimatedSprite {
 public:
-	Class469(NeverhoodEngine *vm);
+	AsScene2806Spew(NeverhoodEngine *vm);
 protected:
 	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -122,7 +122,7 @@ protected:
 	Sprite *_sprite2;
 	Sprite *_sprite3;
 	Sprite *_sprite4;
-	Sprite *_class469;
+	Sprite *_asSpew;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void update();
 	void findClosestPoint();
@@ -213,6 +213,31 @@ protected:
 	bool isAnyTestTubeFilled();
 };
 
+class AsScene2809Spew : public AnimatedSprite {
+public:
+	AsScene2809Spew(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2809 : public Scene {
+public:
+	Scene2809(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	NPointArray *_pointList;
+	int _pointIndex;
+	NRect _clipRects[4];
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_sprite4;
+	Sprite *_asSpew;
+	void update();	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void findClosestPoint();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2800_H */


Commit: 4f1e8b2070a64ff1f03b01fcdfea2229244f1bb1
    https://github.com/scummvm/scummvm/commit/4f1e8b2070a64ff1f03b01fcdfea2229244f1bb1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Scene2804

- Fix dispenser in Scene2808 (wasn't clickable)
- Add Palette::fillBaseWhite
- Minor renaming in Module2800

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 384f419..813222c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,7 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 5;
+	_vm->gameState().sceneNum = 3;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 0862205..4757b4f 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -82,6 +82,9 @@ void Module2800::createScene(int sceneNum, int which) {
 			// TODO _childObject = new Scene2803(_vm, this, which);
 		}
 		break;
+	case 3:
+		_childObject = new Scene2804(_vm, this, which);
+		break;
 	case 4:
 		// TODO Music18hList_stop(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
@@ -154,6 +157,9 @@ void Module2800::updateScene() {
 			else 
 				createScene(0, 1);
 			break;
+		case 3:
+			createScene(2, 1);
+			break;
 		case 4:
 			if (_moduleResult == 1) {
 				leaveModule(1);
@@ -641,6 +647,601 @@ void Scene2803b::sub4601F0(bool flag) {
 	}
 }
 
+SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene)
+	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene),
+	_soundResource(vm) {
+	
+	if (getGlobalVar(0x190A1D18))
+		_spriteResource.load2(0x51A10202);
+	else
+		_spriteResource.load2(0x11814A21);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_deltaRect = _drawRect;
+	processDelta();
+	setVisible(false);
+	_needRefresh = true;
+	SetUpdateHandler(&SsScene2804RedButton::update);
+	SetMessageHandler(&SsScene2804RedButton::handleMessage);
+	_soundResource.load(0x44241240);
+}
+
+void SsScene2804RedButton::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown) == 0) {
+		setVisible(false);
+	}
+}
+
+uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0 && !_parentScene->isWorking()) {
+			_soundResource.play();
+			setVisible(true);
+			_countdown = 4;
+			sendMessage(_parentScene, 0x2000, 0);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+SsScene2808LightCoil::SsScene2808LightCoil(NeverhoodEngine *vm)
+	: StaticSprite(vm, 900) {
+	
+	_spriteResource.load2(0x8889B008);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+	SetMessageHandler(&SsScene2808LightCoil::handleMessage);
+}
+
+uint32 SsScene2808LightCoil::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		setVisible(true);
+		StaticSprite::update();
+		messageResult = 1;
+		break;
+	case 0x2003:
+		setVisible(false);
+		StaticSprite::update();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+SsScene2808LightTarget::SsScene2808LightTarget(NeverhoodEngine *vm)
+	: StaticSprite(vm, 900) {
+	
+	_spriteResource.load2(0x06092132);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+	SetMessageHandler(&SsScene2808LightTarget::handleMessage);
+}
+
+uint32 SsScene2808LightTarget::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2004:
+		setVisible(true);
+		StaticSprite::update();
+		messageResult = 1;
+		break;
+	case 0x2005:
+		setVisible(false);
+		StaticSprite::update();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+SsScene2808Flash::SsScene2808Flash(NeverhoodEngine *vm)
+	: StaticSprite(vm, 900), _soundResource(vm) {
+	
+	_spriteResource.load2(0x211003A0);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+	_soundResource.load(0xCB36BA54);
+}
+
+void SsScene2808Flash::show() {
+	setVisible(true);
+	StaticSprite::update();
+	_soundResource.play();
+}
+
+SsScene2808BeamCoilBody::SsScene2808BeamCoilBody(NeverhoodEngine *vm)
+	: StaticSprite(vm, 900) {
+	
+	_spriteResource.load2(0x9A816000);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	setVisible(false);
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
+AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex)
+	: AnimatedSprite(vm, 1100), _crystalIndex(crystalIndex) {
+
+	static const NPoint kAsScene2804CrystalWavesPoints[] = {
+		{323, 245},
+		{387, 76},
+		{454, 260},
+		{527, 70}
+	};
+
+	_x = kAsScene2804CrystalWavesPoints[crystalIndex].x;
+	_y = kAsScene2804CrystalWavesPoints[crystalIndex].y;
+	createSurface1(0x840C41F0, 1200);
+	if (crystalIndex & 1)
+		setDoDeltaX(1);
+	setVisible(false);
+	_needRefresh = true;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&Sprite::handleMessage);
+}
+
+void AsScene2804CrystalWaves::show() {
+	setVisible(true);
+	startAnimation(0x840C41F0, 0, -1);
+}
+
+void AsScene2804CrystalWaves::hide() {
+	setVisible(false);
+	stopAnimation();
+}
+
+static const int16 kAsScene2804CrystalFrameNums[] = {
+	0, 6, 2, 8, 1, 10, 0, 0
+};
+
+static const uint32 kAsScene2804CrystalFileHashes[] = {
+	0x000540B0,
+	0x001280D0,
+	0x003D0010,
+	0x00620190,
+	0x00DC0290
+};
+
+AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex)
+	: AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex),
+	_isShowing(false), _soundResource(vm) {
+
+	static const NPoint kAsScene2804CrystalPoints[] = {
+		{204, 196},
+		{272, 316},
+		{334, 206},
+		{410, 334},
+		{470, 180}
+	};
+
+	_colorNum = (int16)getSubVar(0xE11A1929, crystalIndex);
+	_isLightOn = getGlobalVar(0x190A1D18) != 0;
+	if (_isLightOn) {
+		_x = kAsScene2804CrystalPoints[crystalIndex].x;
+		_y = kAsScene2804CrystalPoints[crystalIndex].y;
+		createSurface1(0x108DFB12, 1200);
+		startAnimation(0x108DFB12, kAsScene2804CrystalFrameNums[_colorNum], -1);
+		_needRefresh = true;
+		_newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum];
+	} else {
+		_x = 320;
+		_y = 240;
+		createSurface1(kAsScene2804CrystalFileHashes[crystalIndex], 1200);
+		startAnimation(kAsScene2804CrystalFileHashes[crystalIndex], _colorNum, -1);
+		setVisible(false);
+		_needRefresh = true;
+		_newStickFrameIndex = _colorNum;
+	}
+	_soundResource.load(0x725294D4);
+	SetUpdateHandler(&AnimatedSprite::update);
+}
+
+void AsScene2804Crystal::show() {
+	if (!_isLightOn) {
+		setVisible(true);
+		_isShowing = true;
+		if (_asCrystalWaves)
+			_asCrystalWaves->show();
+		_soundResource.play();
+	}
+}
+
+void AsScene2804Crystal::hide() {
+	if (!_isLightOn) {
+		setVisible(false);
+		_isShowing = false;
+		if (_asCrystalWaves)
+			_asCrystalWaves->hide();
+	}
+}
+
+void AsScene2804Crystal::activate() {
+	if (!_isShowing) {
+		int16 frameNum = kAsScene2804CrystalFrameNums[_colorNum];
+		_colorNum++;
+		if (_colorNum >= 6)
+			_colorNum = 0;
+		if (_isLightOn) {
+			startAnimation(0x108DFB12, frameNum, kAsScene2804CrystalFrameNums[_colorNum]);
+			_playBackwards = kAsScene2804CrystalFrameNums[_colorNum] < _colorNum;
+			_newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum];
+		} else {
+			startAnimation(kAsScene2804CrystalFileHashes[_crystalIndex], _colorNum, -1);
+			_newStickFrameIndex = _colorNum;
+		}
+		setSubVar(0xE11A1929, _crystalIndex, _colorNum);
+	}
+}
+
+SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex)
+	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal),
+	_crystalIndex(crystalIndex), _soundResource(vm) {
+
+	static const uint32 kSsScene2804CrystalButtonFileHashes1[] = {
+		0x911101B0,
+		0x22226001,
+		0x4444A362,
+		0x888925A4,
+		0x11122829
+	};
+
+	static const uint32 kSsScene2804CrystalButtonFileHashes2[] = {
+		0xB500A1A0,
+		0x6A012021,
+		0xD4022322,
+		0xA8042525,
+		0x5008292B
+	};
+	
+	if (getGlobalVar(0x190A1D18))
+		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]);
+	else
+		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]);
+
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_deltaRect = _drawRect;
+	processDelta();
+	setVisible(false);
+	_soundResource.load(0x44045140);
+	_needRefresh = true;
+	SetUpdateHandler(&SsScene2804CrystalButton::update);
+	SetMessageHandler(&SsScene2804CrystalButton::handleMessage);
+}
+
+void SsScene2804CrystalButton::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown) == 0) {
+		setVisible(false);
+	}
+}
+
+uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0 && !_parentScene->isWorking()) {
+			_soundResource.play();
+			setVisible(true);
+			_countdown = 4;
+			_asCrystal->activate();
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody)
+	: AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody),
+	_countdown(0), _soundResource(vm) {
+	
+	createSurface1(0x00494891, 1000);
+	_x = 125;
+	_y = 184;
+	setVisible(false);
+	_needRefresh = true;
+	AnimatedSprite::updatePosition();
+	_soundResource.load(0x6352F051);
+	// TODO Sound1ChList_addSoundResource(0xC5EA0B28, 0xEF56B094, true);
+	SetUpdateHandler(&AsScene2804BeamCoil::update);
+	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
+}
+
+void AsScene2804BeamCoil::update() {
+	updateAnim();
+	updatePosition();
+	if (_countdown != 0 && (--_countdown) == 0) {
+		sendMessage(_parentScene, 0x2001, 0);
+	}
+}
+
+uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2002:
+		show();
+		_countdown = 92;
+		messageResult = 1;
+		break;
+	case 0x2003:
+		hide();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+	
+void AsScene2804BeamCoil::show() {
+	_ssBeamCoilBody->setVisible(true);
+	// TODO _ssBeamCoilBody->update(); -> show()
+	setVisible(true);
+	startAnimation(0x00494891, 0, -1);
+	_soundResource.play();
+	SetMessageHandler(&AsScene2804BeamCoil::hmBeaming);
+	NextState(&AsScene2804BeamCoil::stBeaming);
+}
+
+void AsScene2804BeamCoil::hide() {
+	stopAnimation();
+	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
+	setVisible(false);
+	_ssBeamCoilBody->setVisible(false);
+	// TODO _ssBeamCoilBody->update(); -> hide()
+	// TODO Sound1ChList_stop(0xEF56B094);
+}
+
+void AsScene2804BeamCoil::stBeaming() {
+	startAnimation(0x00494891, 93, -1);
+	NextState(&AsScene2804BeamCoil::stBeaming);
+	// TODO Sound1ChList_playLooping(0xEF56B094);
+}
+
+uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2804BeamTarget::AsScene2804BeamTarget(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1400) {
+	
+	createSurface1(0x03842000, 1000);
+	_x = 475;
+	_y = 278;
+	setVisible(false);
+	_needRefresh = true;
+	updatePosition();
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2804BeamTarget::handleMessage);
+}
+
+uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2004:
+		setVisible(true);
+		startAnimation(0x03842000, 0, -1);
+		messageResult = 1;
+		break;
+	case 0x2005:
+		setVisible(false);
+		stopAnimation();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _countdown3(0),
+	_beamStatus(0), _isSolved(false), _isWorking(false) {
+
+	initCrystalColors();
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2804::handleMessage);
+	SetUpdateHandler(&Scene2804::update);
+
+	//setGlobalVar(0x190A1D18, 1); // DEBUG Set lights on
+
+	if (getGlobalVar(0x190A1D18)) {
+		setBackground(0xA1D03005);
+		setPalette(0xA1D03005);
+		addEntity(_palette);
+		insertMouse435(0x03001A15, 20, 620);
+		_asCoil = insertSprite<SsScene2808LightCoil>();
+		_asTarget = insertSprite<SsScene2808LightTarget>();
+	} else {
+		SsScene2808BeamCoilBody *ssBeamCoilBody;
+		setBackground(0x01C01414);
+		setPalette(0x01C01414);
+		addEntity(_palette);
+		insertMouse435(0x01410014, 20, 620);
+		ssBeamCoilBody = insertSprite<SsScene2808BeamCoilBody>();
+		_asCoil = insertSprite<AsScene2804BeamCoil>(this, ssBeamCoilBody);
+		_asTarget = insertSprite<AsScene2804BeamTarget>();
+		_ssFlash = insertSprite<SsScene2808Flash>();
+	}
+	
+	_ssRedButton = insertSprite<SsScene2804RedButton>(this);
+	_vm->_collisionMan->addSprite(_ssRedButton);
+
+	for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) {
+		AsScene2804CrystalWaves *asCrystalWaves = NULL;
+		if (crystalIndex < 4 && getGlobalVar(0x190A1D18) == 0)
+			asCrystalWaves = insertSprite<AsScene2804CrystalWaves>(crystalIndex);
+		_asCrystals[crystalIndex] = insertSprite<AsScene2804Crystal>(asCrystalWaves, crystalIndex);
+		_ssCrystalButtons[crystalIndex] = insertSprite<SsScene2804CrystalButton>(this, _asCrystals[crystalIndex], crystalIndex);
+		_vm->_collisionMan->addSprite(_ssCrystalButtons[crystalIndex]);
+	}
+
+}
+
+uint32 Scene2804::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		// TODO DEBUG
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			leaveScene(0);
+		}
+		break;
+	case 0x000D:
+		// TODO DEBUG
+		break;
+	case 0x2000:
+		_isWorking = true;
+		sendMessage(_asCoil, 0x2002, 0);
+		if (getGlobalVar(0x190A1D18)) {
+			sendMessage(_asTarget, 0x2004, 0);
+			_countdown2 = 48;
+		}
+		break;
+	case 0x2001:
+		_countdown3 = 2;
+		_isSolved = true;
+		_beamStatus = 0;
+		for (uint index = 0; index < 5; index++)
+			if (_asCrystals[index]->getColorNum() != (int16)getSubVar(0xD4B2089C, index))
+				_isSolved = false;
+		_countdown2 = 48;
+		break;
+	}
+	return 0;
+}
+
+void Scene2804::update() {
+
+	Scene::update();
+	
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		leaveScene(0);
+	}
+
+	if (_countdown2 != 0 && (--_countdown2) == 0) {
+		_isWorking = false;
+		sendMessage(_asCoil, 0x2003, 0);
+		sendMessage(_asTarget, 0x2005, 0);
+		for (uint index = 0; index < 5; index++)
+			_asCrystals[index]->hide();
+	}
+
+	if (_countdown3 != 0 && (--_countdown3) == 0) {
+		if (_beamStatus == 5) {
+			sendMessage(_asTarget, 0x2004, 0);
+			if (_isSolved) {
+				_palette->fillBaseWhite(0, 256);
+				_palette->startFadeToPalette(18);
+				setGlobalVar(0x1860C990, 1);
+				_countdown1 = 48;
+			}
+		} else if (_beamStatus == 6) {
+			if (_isSolved)
+				_ssFlash->show();
+		} else {
+			_asCrystals[_beamStatus]->show();
+		}
+		_beamStatus++;
+		if (_beamStatus < 6)
+			_countdown3 = 2;
+		else if (_beamStatus < 7)
+			_countdown3 = 4;
+	}
+
+}
+
+void Scene2804::initCrystalColors() {
+	// TODO Maybe move this into the GameModule so all puzzle init code is together
+	if (getGlobalVar(0xDE2EC914) == 0) {
+		TextResource textResource(_vm);
+		const char *textStart, *textEnd;
+		textResource.load(0x46691611);
+		textStart = textResource.getString(0, textEnd);
+		for (uint index = 0; index < 5; index++) {
+			char colorLetter = (byte)textStart[index];
+			byte correctColorNum = 0, misalignedColorNum;
+			switch (colorLetter) {
+			case 'B':
+				correctColorNum = 4;
+				break;
+			case 'G':
+				correctColorNum = 3;
+				break;
+			case 'O':
+				correctColorNum = 1;
+				break;
+			case 'R':
+				correctColorNum = 0;
+				break;
+			case 'V':
+				correctColorNum = 5;
+				break;
+			case 'Y':
+				correctColorNum = 2;
+				break;
+			}
+			do {
+				misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1);
+			} while (misalignedColorNum == correctColorNum);
+			setSubVar(0xD4B2089C, index, correctColorNum);
+			setSubVar(0xE11A1929, index, misalignedColorNum);
+		}
+		setGlobalVar(0xDE2EC914, 1);
+	}
+}
+
 Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
@@ -897,39 +1498,35 @@ static const int16 kClass490FrameIndices2[] = {
 	0, 4, 8, 11, 15, 17, 19, 0
 };
 
-AsScene2808Dispenser::AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex)
+SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum),
 	_testTubeIndex(testTubeIndex) {
 	
 	_spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]);
 	createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	
-	_surface->getDrawRect().x = 0;
-	_surface->getDrawRect().y = 0;
-	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-	_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_deltaRect = _drawRect;
 	processDelta();
-
-	SetUpdateHandler(&AsScene2808Dispenser::update);
-	SetMessageHandler(&AsScene2808Dispenser::handleMessage);
-
+	SetUpdateHandler(&SsScene2808Dispenser::update);
+	SetMessageHandler(&SsScene2808Dispenser::handleMessage);
 	setVisible(false);
 	_needRefresh = true;
 	StaticSprite::update();
-	
 }
 
-void AsScene2808Dispenser::update() {
+void SsScene2808Dispenser::update() {
 	StaticSprite::update();
 	if (_countdown != 0 && (--_countdown) == 0) {
 		setVisible(false);
 	}
 }
 	
-uint32 AsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -940,7 +1537,7 @@ uint32 AsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &p
 	return messageResult;
 }
 
-void AsScene2808Dispenser::startCountdown(int index) {
+void SsScene2808Dispenser::startCountdown(int index) {
 	setVisible(true);
 	StaticSprite::update();
 	if (_testTubeSetNum == 0) {
@@ -950,8 +1547,8 @@ void AsScene2808Dispenser::startCountdown(int index) {
 	}
 }
 
-AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser)
-	: AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _dispenser(dispenser),
+AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser)
+	: AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser),
 	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
 	_soundResource4(vm), _soundResource5(vm), _soundResource6(vm),
 	_soundResource7(vm), _soundResource8(vm), _soundResource9(vm), _fillLevel(0) {
@@ -1048,7 +1645,7 @@ void AsScene2808TestTube::fill() {
 		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]);
 		_newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1];
 	}
-	_dispenser->startCountdown(_fillLevel);
+	_ssDispenser->startCountdown(_fillLevel);
 	_fillLevel++;
 }
 
@@ -1213,9 +1810,9 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertSprite<AsScene2808LightEffect>(which);
 
 	for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) {
-		AsScene2808Dispenser *dispenser = insertSprite<AsScene2808Dispenser>(this, which, testTubeIndex);
-		_vm->_collisionMan->addSprite(dispenser);
-		_asTestTubes[testTubeIndex] = insertSprite<AsScene2808TestTube>(which, testTubeIndex, dispenser);
+		SsScene2808Dispenser *ssDispenser = insertSprite<SsScene2808Dispenser>(this, which, testTubeIndex);
+		_vm->_collisionMan->addSprite(ssDispenser);
+		_asTestTubes[testTubeIndex] = insertSprite<AsScene2808TestTube>(which, testTubeIndex, ssDispenser);
 		_vm->_collisionMan->addSprite(_asTestTubes[testTubeIndex]);
 	}
 	
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 404f9ac..03e272f 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -93,6 +93,129 @@ protected:
 	void sub4601F0(bool flag);
 };
 
+class Scene2804;
+
+class SsScene2804RedButton : public StaticSprite {
+public:
+	SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene);
+protected:
+	SoundResource _soundResource;
+	Scene2804 *_parentScene;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class SsScene2808LightCoil : public StaticSprite {
+public:
+	SsScene2808LightCoil(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class SsScene2808BeamCoilBody : public StaticSprite {
+public:
+	SsScene2808BeamCoilBody(NeverhoodEngine *vm);
+};
+
+class SsScene2808LightTarget : public StaticSprite {
+public:
+	SsScene2808LightTarget(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class SsScene2808Flash : public StaticSprite {
+public:
+	SsScene2808Flash(NeverhoodEngine *vm);
+	void show();
+protected:
+	SoundResource _soundResource;
+};
+
+class AsScene2804CrystalWaves : public AnimatedSprite {
+public:
+	AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex);
+	void show();
+	void hide();
+protected:
+	uint _crystalIndex;
+};
+
+class AsScene2804Crystal : public AnimatedSprite {
+public:
+	AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex);
+	void show();
+	void hide();
+	void activate();
+	int16 getColorNum() const { return _colorNum; }
+protected:
+	AsScene2804CrystalWaves *_asCrystalWaves;
+	uint _crystalIndex;
+	int16 _colorNum;
+	bool _isLightOn;
+	bool _isShowing;
+	SoundResource _soundResource;
+};
+
+class SsScene2804CrystalButton : public StaticSprite {
+public:
+	SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex);
+protected:
+	SoundResource _soundResource;
+	Scene2804 *_parentScene;
+	AsScene2804Crystal *_asCrystal;
+	uint _crystalIndex;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2804BeamCoil : public AnimatedSprite {
+public:
+	AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody);
+protected:
+	SoundResource _soundResource;
+	Scene *_parentScene;
+	SsScene2808BeamCoilBody *_ssBeamCoilBody;
+	int _countdown;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void show();
+	void hide();
+	void stBeaming();
+	uint32 hmBeaming(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2804BeamTarget : public AnimatedSprite {
+public:
+	AsScene2804BeamTarget(NeverhoodEngine *vm);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2804 : public Scene {
+public:
+	Scene2804(NeverhoodEngine *vm, Module *parentModule, int which);
+	bool isWorking() const { return _isWorking; }
+protected:
+	int _countdown1;
+	int _countdown2;
+	int _countdown3;
+	int _beamStatus;
+	bool _isSolved;
+	bool _isWorking;
+	Sprite *_ssRedButton;
+	Sprite *_asCoil;
+	Sprite *_asTarget;
+	SsScene2808Flash *_ssFlash;
+	AsScene2804Crystal *_asCrystals[5];
+	Sprite *_ssCrystalButtons[5];
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void initCrystalColors();
+};
+
 class Scene2805 : public Scene {
 public:
 	Scene2805(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -128,9 +251,9 @@ protected:
 	void findClosestPoint();
 };
 
-class AsScene2808Dispenser : public StaticSprite {
+class SsScene2808Dispenser : public StaticSprite {
 public:
-	AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex);
+	SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex);
 	void startCountdown(int index);
 protected:
 	Scene *_parentScene;
@@ -142,12 +265,12 @@ protected:
 
 class AsScene2808TestTube : public AnimatedSprite {
 public:
-	AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser);
+	AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser);
 	void fill();
 	void flush();
 	uint32 getFillLevel() const { return _fillLevel; }
 protected:
-	AsScene2808Dispenser *_dispenser;
+	SsScene2808Dispenser *_ssDispenser;
 	int _testTubeSetNum;
 	uint32 _fillLevel;
 	int _testTubeIndex;
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index 936ca39..c27bd86 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -139,6 +139,17 @@ void Palette::startFadeToPalette(int counter) {
 	_status = 2;			
 }
 
+void Palette::fillBaseWhite(int index, int count) {
+	if (index + count > 256)
+		count = 256 - index;
+	for (int i = 0; i < count; i++) {
+		_basePalette[(i + index) * 4 + 0] = 0xFF;
+		_basePalette[(i + index) * 4 + 1] = 0xFF;
+		_basePalette[(i + index) * 4 + 2] = 0xFF;
+		_basePalette[(i + index) * 4 + 3] = 0;
+	}
+}
+
 void Palette::update() {
 	debug(2, "Palette::update() _status = %d", _status);
 	if (_status == 1) {
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 7966013..27f4816 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -49,6 +49,7 @@ public:
 	void startFadeToBlack(int counter);
 	void startFadeToWhite(int counter);
 	void startFadeToPalette(int counter);
+	void fillBaseWhite(int index, int count);
 protected:
 	int _status;
 	byte *_palette;


Commit: 0962c594bd7edb2d232cdd9ff1f10c23f5c6944a
    https://github.com/scummvm/scummvm/commit/0962c594bd7edb2d232cdd9ff1f10c23f5c6944a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Rename wrongly named stuff

Changed paths:
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 4757b4f..9cdc942 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -694,7 +694,7 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p
 	return messageResult;
 }
 
-SsScene2808LightCoil::SsScene2808LightCoil(NeverhoodEngine *vm)
+SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
 	_spriteResource.load2(0x8889B008);
@@ -708,10 +708,10 @@ SsScene2808LightCoil::SsScene2808LightCoil(NeverhoodEngine *vm)
 	setVisible(false);
 	_needRefresh = true;
 	StaticSprite::update();
-	SetMessageHandler(&SsScene2808LightCoil::handleMessage);
+	SetMessageHandler(&SsScene2804LightCoil::handleMessage);
 }
 
-uint32 SsScene2808LightCoil::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2002:
@@ -728,7 +728,7 @@ uint32 SsScene2808LightCoil::handleMessage(int messageNum, const MessageParam &p
 	return messageResult;
 }
 
-SsScene2808LightTarget::SsScene2808LightTarget(NeverhoodEngine *vm)
+SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
 	_spriteResource.load2(0x06092132);
@@ -742,10 +742,10 @@ SsScene2808LightTarget::SsScene2808LightTarget(NeverhoodEngine *vm)
 	setVisible(false);
 	_needRefresh = true;
 	StaticSprite::update();
-	SetMessageHandler(&SsScene2808LightTarget::handleMessage);
+	SetMessageHandler(&SsScene2804LightTarget::handleMessage);
 }
 
-uint32 SsScene2808LightTarget::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2004:
@@ -762,7 +762,7 @@ uint32 SsScene2808LightTarget::handleMessage(int messageNum, const MessageParam
 	return messageResult;
 }
 
-SsScene2808Flash::SsScene2808Flash(NeverhoodEngine *vm)
+SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900), _soundResource(vm) {
 	
 	_spriteResource.load2(0x211003A0);
@@ -779,13 +779,13 @@ SsScene2808Flash::SsScene2808Flash(NeverhoodEngine *vm)
 	_soundResource.load(0xCB36BA54);
 }
 
-void SsScene2808Flash::show() {
+void SsScene2804Flash::show() {
 	setVisible(true);
 	StaticSprite::update();
 	_soundResource.play();
 }
 
-SsScene2808BeamCoilBody::SsScene2808BeamCoilBody(NeverhoodEngine *vm)
+SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
 	_spriteResource.load2(0x9A816000);
@@ -979,7 +979,7 @@ uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessagePara
 	return messageResult;
 }
 
-AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody)
+AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody)
 	: AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody),
 	_countdown(0), _soundResource(vm) {
 	
@@ -1101,18 +1101,18 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 		setPalette(0xA1D03005);
 		addEntity(_palette);
 		insertMouse435(0x03001A15, 20, 620);
-		_asCoil = insertSprite<SsScene2808LightCoil>();
-		_asTarget = insertSprite<SsScene2808LightTarget>();
+		_asCoil = insertSprite<SsScene2804LightCoil>();
+		_asTarget = insertSprite<SsScene2804LightTarget>();
 	} else {
-		SsScene2808BeamCoilBody *ssBeamCoilBody;
+		SsScene2804BeamCoilBody *ssBeamCoilBody;
 		setBackground(0x01C01414);
 		setPalette(0x01C01414);
 		addEntity(_palette);
 		insertMouse435(0x01410014, 20, 620);
-		ssBeamCoilBody = insertSprite<SsScene2808BeamCoilBody>();
+		ssBeamCoilBody = insertSprite<SsScene2804BeamCoilBody>();
 		_asCoil = insertSprite<AsScene2804BeamCoil>(this, ssBeamCoilBody);
 		_asTarget = insertSprite<AsScene2804BeamTarget>();
-		_ssFlash = insertSprite<SsScene2808Flash>();
+		_ssFlash = insertSprite<SsScene2804Flash>();
 	}
 	
 	_ssRedButton = insertSprite<SsScene2804RedButton>(this);
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 03e272f..20bc4b4 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -106,28 +106,28 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class SsScene2808LightCoil : public StaticSprite {
+class SsScene2804LightCoil : public StaticSprite {
 public:
-	SsScene2808LightCoil(NeverhoodEngine *vm);
+	SsScene2804LightCoil(NeverhoodEngine *vm);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class SsScene2808BeamCoilBody : public StaticSprite {
+class SsScene2804BeamCoilBody : public StaticSprite {
 public:
-	SsScene2808BeamCoilBody(NeverhoodEngine *vm);
+	SsScene2804BeamCoilBody(NeverhoodEngine *vm);
 };
 
-class SsScene2808LightTarget : public StaticSprite {
+class SsScene2804LightTarget : public StaticSprite {
 public:
-	SsScene2808LightTarget(NeverhoodEngine *vm);
+	SsScene2804LightTarget(NeverhoodEngine *vm);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class SsScene2808Flash : public StaticSprite {
+class SsScene2804Flash : public StaticSprite {
 public:
-	SsScene2808Flash(NeverhoodEngine *vm);
+	SsScene2804Flash(NeverhoodEngine *vm);
 	void show();
 protected:
 	SoundResource _soundResource;
@@ -173,11 +173,11 @@ protected:
 
 class AsScene2804BeamCoil : public AnimatedSprite {
 public:
-	AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody);
+	AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody);
 protected:
 	SoundResource _soundResource;
 	Scene *_parentScene;
-	SsScene2808BeamCoilBody *_ssBeamCoilBody;
+	SsScene2804BeamCoilBody *_ssBeamCoilBody;
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -208,7 +208,7 @@ protected:
 	Sprite *_ssRedButton;
 	Sprite *_asCoil;
 	Sprite *_asTarget;
-	SsScene2808Flash *_ssFlash;
+	SsScene2804Flash *_ssFlash;
 	AsScene2804Crystal *_asCrystals[5];
 	Sprite *_ssCrystalButtons[5];
 	void update();


Commit: 6f003399c85a38245b1e9f376f94625fad1ca581
    https://github.com/scummvm/scummvm/commit/6f003399c85a38245b1e9f376f94625fad1ca581
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Implement Scene2807

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 813222c..18d7881 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,7 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 3;
+	_vm->gameState().sceneNum = 6;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 9cdc942..7367530 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -93,6 +93,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2806(_vm, this, which);
 		break;
+	case 6:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2807(_vm, this, which);
+		break;
 	case 7:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 0);
@@ -174,6 +178,9 @@ void Module2800::updateScene() {
 				createScene(2, 2);
 			}
 			break;
+		case 6:
+			createScene(2, 3);
+			break;
 		case 7:
 			createScene(5, _moduleResult);
 			break;
@@ -1451,6 +1458,55 @@ void Scene2806::findClosestPoint() {
 	
 }
 
+Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2807::handleMessage);
+
+	if (getSubVar(0x0C601058, 0) == 1) {
+		insertStaticSprite(0x103021E2, 300);
+	} else if (getSubVar(0x0C601058, 0) == 2) {
+		insertStaticSprite(0x103022E2, 300);
+	} else if (getSubVar(0x0C601058, 0) == 3) {
+		insertStaticSprite(0x103024E2, 300);
+	}
+
+	if (getSubVar(0x0C601058, 1) == 1) {
+		insertStaticSprite(0x4800A52A, 200);
+	} else if (getSubVar(0x0C601058, 1) == 2) {
+		insertStaticSprite(0x4800A62A, 200);
+	} else if (getSubVar(0x0C601058, 1) == 3) {
+		insertStaticSprite(0x4800A02A, 200);
+	}
+
+	if (getSubVar(0x0C601058, 2) == 1) {
+		insertStaticSprite(0x31203430, 100);
+	} else if (getSubVar(0x0C601058, 2) == 2) {
+		insertStaticSprite(0x31203400, 100);
+	} else if (getSubVar(0x0C601058, 2) == 3) {
+		insertStaticSprite(0x31203460, 100);
+	}
+
+	_surfaceFlag = true;
+	setBackground(0x3E049A95);
+	setPalette(0x3E049A95);
+	insertMouse435(0x49A913E8, 20, 620);
+
+}
+
+uint32 Scene2807::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			leaveScene(0);
+		}
+		break;
+	}
+	return 0;
+}
+
 static const uint32 kScene2808FileHashes1[] = {
 	0x90B0392,
 	0x90B0192
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 20bc4b4..720f011 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -251,6 +251,13 @@ protected:
 	void findClosestPoint();
 };
 
+class Scene2807 : public Scene {
+public:
+	Scene2807(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class SsScene2808Dispenser : public StaticSprite {
 public:
 	SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex);


Commit: 745e46279ec4b3ccacd996d73a9df9dc19271e75
    https://github.com/scummvm/scummvm/commit/745e46279ec4b3ccacd996d73a9df9dc19271e75
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:39-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2810

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 1c9c76a..a458ded 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -119,6 +119,9 @@ static const uint32 rectListOffsets[] = {
 	// Scene2805
 	1, 0x004AE318,
 	1, 0x004AE308,
+	// Scene2810
+	1, 0x004AE810,
+	1, 0x004AE800,
 	0, 0
 };
 
@@ -423,6 +426,30 @@ static const uint32 messageListOffsets[] = {
 	5, 0x004B5BA8,
 	1, 0x004B5B88,
 	2, 0x004B5B98,
+	1, 0x004AE438,
+	3, 0x004AE440,
+	3, 0x004AE738,
+	1, 0x004AE6D8,
+	2, 0x004AE6E8,
+	1, 0x004AE6E0,
+	2, 0x004AE428,
+	2, 0x004AE418,
+	1, 0x004AE410,
+	4, 0x004AE458,
+	5, 0x004AE4A8,
+	5, 0x004AE4D0,
+	5, 0x004AE4F8,
+	5, 0x004AE520,
+	5, 0x004AE548,
+	5, 0x004AE570,
+	5, 0x004AE598,
+	5, 0x004AE5C0,
+	5, 0x004AE5E8,
+	5, 0x004AE610,
+	5, 0x004AE638,
+	5, 0x004AE660,
+	5, 0x004AE688,
+	2, 0x004AE750,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 7bc4609..f47b01d 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 99ebd0eca3b7b5ac808a43c356a47f37ebe0cadc
    https://github.com/scummvm/scummvm/commit/99ebd0eca3b7b5ac808a43c356a47f37ebe0cadc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Implement Scene2810

- Also add globalvars.txt, a (currently almost empty) list of global game variables with descriptions

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 18d7881..2944428 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,7 +328,8 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 6;
+	_vm->gameState().which = 11;
+	_vm->gameState().sceneNum = 9;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index de3844e..5ca5354 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2200,6 +2200,72 @@ void Klayman::walkAlongPathPoints() {
 	}
 }
 
+void Klayman::sub4204C0() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimationByHash(0x00AB8C10, 0x01084280, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F920);
+	SetMessageHandler(&Klayman::handleMessage41E5F0);
+}
+
+void Klayman::spriteUpdate41F920() {
+	updateDeltaXY();
+	if (_y >= _destY) {
+		_y = _destY;
+		processDelta();
+		gotoNextStateExt();
+	}
+}
+
+uint32 Klayman::handleMessage41E5F0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0)
+			sendMessage(_attachedSprite, 0x4806, 0);
+		else if (param.asInteger() == 0x320AC306)
+			startAnimationByHash(0x00AB8C10, 0x01084280, 0);
+		else if (param.asInteger() == 0x4AB28209)
+			sendMessage(_attachedSprite, 0x482A, 0);
+		else if (param.asInteger() == 0x88001184)
+			sendMessage(_attachedSprite, 0x482B, 0);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub421230() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimationByHash(0x38445000, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::handleMessage41F1D0);
+}
+
+uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x040C4C01)
+			_soundResource1.play(0x01E11140);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::sub421270() {
+	if (!stStartAction(AnimationCallback(&Klayman::sub421270))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x1B3D8216, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::hmTurnToUse);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	}
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -5678,4 +5744,151 @@ void KmScene2809::sub458590() {
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
+
+KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) 
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		sub41CDE0(param.asPoint().x);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::sub421640);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x4818:
+		sub41CDE0(_dataResource.getPoint(param.asInteger()).x);
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1)
+			GotoState(&Klayman::sub421740);
+		else if (param.asInteger() == 0)
+			GotoState(&Klayman::sub421780);
+		else
+			GotoState(&Klayman::sub421700);
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::sub421840);
+		} else {
+			GotoState(&Klayman::sub4217C0);
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::sub421900);
+		} else {
+			GotoState(&Klayman::sub421880);
+		}
+		break;
+	case 0x4837:
+		sub41CE70();
+		break;
+	}
+	return 0;
+}
+
+KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+		NRect *clipRects, uint clipRectsCount)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+
+	// TODO ClipRects stuff
+	
+}
+		
+uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4803:
+		_destY = param.asInteger();
+		GotoState(&Klayman::sub4204C0);
+		break;
+	case 0x4804:
+		if (param.asInteger() == 3)
+			GotoState(&Klayman::sub421230);
+		break;
+	case 0x4812:
+		GotoState(&Klayman::stPickUpGeneric);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x4818:
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stWonderAboutHalf);
+		} else if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWonderAboutAfter);
+		} else if (param.asInteger() == 3) {
+			GotoState(&Klayman::stTurnToUseHalf);
+		} else if (param.asInteger() == 4) {
+			GotoState(&Klayman::stTurnAwayFromUse);
+		} else if (param.asInteger() == 5) {
+			GotoState(&Klayman::sub421270);
+		} else {
+			GotoState(&Klayman::stWonderAbout);
+		}
+		break;
+	case 0x4820:  
+		sendMessage(_parentScene, 0x2000, 0);
+		GotoState(&Klayman::stContinueClimbLadderUp);	 
+		break;
+	case 0x4821:	
+		sendMessage(_parentScene, 0x2000, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderDown);	 
+		break;
+	case 0x4822:  
+		sendMessage(_parentScene, 0x2000, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderUp);	 
+		break;
+	case 0x4823:
+		sendMessage(_parentScene, 0x2001, 0);
+		GotoState(&Klayman::stClimbLadderHalf);	 
+		break;
+	case 0x4824:
+		sendMessage(_parentScene, 0x2000, 0);
+		_destY = _dataResource.getPoint(param.asInteger()).y;
+		GotoState(&Klayman::stStartClimbLadderDown);
+		break;
+	case 0x4825:
+		sendMessage(_parentScene, 0x2000, 0);
+		_destY = _dataResource.getPoint(param.asInteger()).y;
+		GotoState(&Klayman::stStartClimbLadderUp);
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		gotoNextStateExt();
+		break;
+	case 0x4837:
+		sub41CE70();
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index d508f6c..f36e27a 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -158,6 +158,15 @@ public:
 	uint32 handleMessage41E750(int messageNum, const MessageParam &param, Entity *sender);
 	void sub4215E0();
 	void sub421550();
+	
+	void sub4204C0();
+	void spriteUpdate41F920();
+	uint32 handleMessage41E5F0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub421230();
+	uint32 handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub421270();
 
 protected:
 	Entity *_parentScene;
@@ -631,6 +640,21 @@ protected:
 	void sub458590();
 };
 
+class KmScene2810Small : public Klayman {
+public:
+	KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
+class KmScene2810 : public Klayman {
+public:
+	KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+		NRect *clipRects, uint clipRectsCount);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 7367530..9b514e7 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -36,6 +36,9 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Music18hList_add(0x64210814, 0xD2FA4D14);
 	setGlobalVar(0x28D8C940, 1);
 	
+	createScene(9, 5);
+	return;
+	
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, which);
 	} else if (which == 2) {
@@ -105,6 +108,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2809(_vm, this, which);
 		break;
+	case 9:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2810(_vm, this, which);
+		break;
 	case 10:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 1);
@@ -185,11 +192,49 @@ void Module2800::updateScene() {
 			createScene(5, _moduleResult);
 			break;
 		case 8:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(10, 0);
-			} else {
+			else
 				createScene(9, 4);
-			}
+			break;
+		case 9:
+			debug("scene 9 _moduleResult = %d", _moduleResult);
+			if (_moduleResult == 1)
+				createScene(11, 0);
+			else if (_moduleResult == 2)
+				createScene(2, 0);
+			else if (_moduleResult == 3)
+				createScene(24, 0);
+			else if (_moduleResult == 4)
+				createScene(8, 0);
+			else if (_moduleResult == 6)
+				createScene(2, 6);
+			else if (_moduleResult == 11)
+				createScene(12, 0);
+			else if (_moduleResult == 12)
+				createScene(13, 0);
+			else if (_moduleResult == 13)
+				createScene(14, 0);
+			else if (_moduleResult == 14)
+				createScene(15, 0);
+			else if (_moduleResult == 15)
+				createScene(16, 0);
+			else if (_moduleResult == 16)
+				createScene(17, 0);
+			else if (_moduleResult == 17)
+				createScene(18, 0);
+			else if (_moduleResult == 18)
+				createScene(19, 0);
+			else if (_moduleResult == 19)
+				createScene(20, 0);
+			else if (_moduleResult == 20)
+				createScene(21, 0);
+			else if (_moduleResult == 21)
+				createScene(22, 0);
+			else if (_moduleResult == 22)
+				createScene(23, 0);
+			else 
+				createScene(2, 4);
 			break;
 		case 10:
 			createScene(8, _moduleResult);
@@ -2095,4 +2140,248 @@ void Scene2809::findClosestPoint() {
 	
 }
 
+AsScene2810Rope::AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x)
+	: AnimatedSprite(vm, 1100) {
+
+	createSurface(990, 68, 476);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2810Rope::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	_x = x;
+	_y = -276;
+	startAnimation(0x9D098C23, 35, 53);
+}
+
+uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		startAnimation(0x9D098C23, 35, 53);
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	}
+	return messageResult;
+}
+
+Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	Sprite *tempSprite;
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2810::handleMessage);
+	
+	setBackground(0x26508804);
+	setPalette(0x26508804);
+	insertMouse433(0x0880026D);
+
+	_sprite6 = insertStaticSprite(0x03615227, 1100);
+	_sprite5 = insertStaticSprite(0xE059A224, 1100);
+
+	_clipRects[0].x1 = 0;
+	_clipRects[0].y1 = 0;
+	_clipRects[0].x2 = 640;
+	_clipRects[0].y2 = 400;
+	_clipRects[1].x1 = _sprite5->getDrawRect().x;
+	_clipRects[1].y1 = 400;
+	_clipRects[1].x2 = _sprite6->getDrawRect().x2();
+	_clipRects[1].y2 = 480;
+
+	if (getGlobalVar(0x1860C990)) {
+		_asTape = insertSprite<AsScene1201Tape>(this, 0, 900, 245, 429, 0x9148A011);
+		_vm->_collisionMan->addSprite(_asTape);
+	} else {
+		_asTape = insertSprite<AsScene1201Tape>(this, 0, 1100, 245, 429, 0x9148A011);
+		_vm->_collisionMan->addSprite(_asTape);
+	}
+
+	_sprite1 = insertStaticSprite(0x430001C4, 1200);
+
+	if (getGlobalVar(0x0018CA22)) {
+		setGlobalVar(0xCB45DE03, 1);
+		if (getGlobalVar(0x1860C990)) {
+			_sprite4 = insertStaticSprite(0x82653808, 100);
+		} else {
+			_sprite4 = insertStaticSprite(0x82653808, 1100);
+		}
+		_sprite4->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
+	}
+	
+	if (which < 0) {
+		if (getGlobalVar(0x1860C990)) {
+			insertKlayman<KmScene2810Small>(240, 448);
+			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
+			setMessageList(0x004AE438);
+			setRectList(0x004AE810);
+			_flag1 = false;
+			_vm->_collisionMan->removeSprite(_asTape);
+		} else {
+			insertKlayman<KmScene2810>(300, 424, _clipRects, 2);
+			setMessageList(0x004AE438);
+			if (getGlobalVar(0x0018CA22))
+				loadDataResource(0x84130112);
+			else
+				loadDataResource(0x84500132);
+			tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+			tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
+			_clipRects[0].y1 = _sprite1->getDrawRect().y;
+			_flag1 = false;
+		}
+	} else if (which == 1) {
+		insertKlayman<KmScene2810>(186, 64, _clipRects, 2);
+		setMessageList(0x004AE440);
+		loadDataResource(0x84130112);
+		tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+		tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
+		_flag1 = true;
+		_clipRects[0].y1 = _sprite1->getDrawRect().y;
+	} else if (which == 5) {
+		insertStaticSprite(0xC3007EA0, 100);
+		_sprite2 = insertStaticSprite(0x02780936, 1100);
+		_sprite3 = insertStaticSprite(0x1CA02160, 1100);
+		_asRope = insertSprite<AsScene2810Rope>(this, 384);
+		insertKlayman<KmScene2810>(384, 0, _clipRects, 0);
+		sendEntityMessage(_klayman, 0x1014, _asRope);
+		setMessageList(0x004AE738);
+		_klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
+		_asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
+		// TODO Sound1ChList_addSoundResource(0x84400112, 0xC874EE6C, true);
+		// TODO Sound1ChList_playLooping(0xC874EE6C);
+		// TODO Sound1ChList_setVolume(0xC874EE6C, 50);
+		_flag1 = false;
+	} else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) {
+		if (getGlobalVar(0x1860C990)) {
+			insertKlayman<KmScene2810Small>((int16)getGlobalVar(0x00D30138), 448);
+			if (getGlobalVar(0xC0418A02))
+				_klayman->setDoDeltaX(1);
+			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
+			setMessageList(0x004AE6D8);
+			setRectList(0x004AE810);
+			_flag1 = false;
+			_vm->_collisionMan->removeSprite(_asTape);
+		} else {
+			sub406650();
+			if (getGlobalVar(0x00188211)) {
+				setMessageList(0x004AE6E8);
+				setGlobalVar(0x00188211, 0);
+				_flag1 = false;
+			} else {
+				setMessageList(0x004AE6D8);
+				_flag1 = false;
+			}
+		}
+	} else if (which >= 15 && which <= 18) {
+		sub406650();
+		setMessageList(0x004AE6E0);
+		_flag1 = false;
+	} else if (which == 4) {
+		if (getGlobalVar(0x1860C990)) {
+			insertKlayman<KmScene2810Small>(473, 448);
+			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
+			setMessageList(0x004AE428);
+			setRectList(0x004AE810);
+			_flag1 = false;
+			_vm->_collisionMan->removeSprite(_asTape);
+		} else {
+			insertKlayman<KmScene2810>(450, 424, _clipRects, 2);
+			setMessageList(0x004AE418);
+			if (getGlobalVar(0x0018CA22))
+				loadDataResource(0x84130112);
+			else
+				loadDataResource(0x84500132);
+			tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+			tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
+			_clipRects[0].y1 = _sprite1->getDrawRect().y;
+			_flag1 = false;
+		}
+	} else {
+		insertKlayman<KmScene2810Small>(120, 448);
+		_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
+		setMessageList(0x004AE410);
+		setRectList(0x004AE810);
+		_flag1 = false;
+		_vm->_collisionMan->removeSprite(_asTape);
+	}
+
+}
+
+void Scene2810::sub406650() {
+	Sprite *tempSprite;
+
+	if (getGlobalVar(0x00188211)) {
+		insertKlayman<KmScene2810>(430, 424, _clipRects, 2);
+		_klayman->setDoDeltaX(1);
+	} else {
+		insertKlayman<KmScene2810>((int16)getGlobalVar(0x00D30138), 424, _clipRects, 2);
+		if (getGlobalVar(0xC0418A02))
+			_klayman->setDoDeltaX(1);
+	}
+	if (getGlobalVar(0x0018CA22))
+		loadDataResource(0x84130112);
+	else
+		loadDataResource(0x84500132);
+	tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+	tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
+	_clipRects[0].y1 = _sprite1->getDrawRect().y;
+}
+
+uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xE574F14C)
+			setMessageList(0x004AE458);
+		else if (param.asInteger() == 0x7214A05C || param.asInteger() == 0x2905E574)
+			setMessageList(0x004AE4A8);
+		else if (param.asInteger() == 0x7274E24C || param.asInteger() == 0x2D24E572)
+			setMessageList(0x004AE4D0);
+		else if (param.asInteger() == 0x4A07A040 || param.asInteger() == 0x190426F5)
+			setMessageList(0x004AE4F8);
+		else if (param.asInteger() == 0x6604200C || param.asInteger() == 0x2100E435)
+			setMessageList(0x004AE520);
+		else if (param.asInteger() == 0xE216A05C || param.asInteger() == 0x0905EC74)
+			setMessageList(0x004AE548);
+		else if (param.asInteger() == 0x721DA05C || param.asInteger() == 0xB905E574)
+			setMessageList(0x004AE570);
+		else if (param.asInteger() == 0x6214E09C || param.asInteger() == 0x2D09E474)
+			setMessageList(0x004AE598);
+		else if (param.asInteger() == 0x6276A04C || param.asInteger() == 0x0904E472)
+			setMessageList(0x004AE5C0);
+		else if (param.asInteger() == 0x6E14A00C || param.asInteger() == 0x2900E4B4)
+			setMessageList(0x004AE5E8);
+		else if (param.asInteger() == 0x6014A04D || param.asInteger() == 0x2904F454)
+			setMessageList(0x004AE610);
+		else if (param.asInteger() == 0x6215A3C4 || param.asInteger() == 0x393C6474)
+			setMessageList(0x004AE638);
+		else if (param.asInteger() == 0x6A54E24D || param.asInteger() == 0x2D24F4F0)
+			setMessageList(0x004AE660);
+		else if (param.asInteger() == 0x2064294C || param.asInteger() == 0x2194E053)
+			setMessageList(0x004AE688);
+		break;
+	case 0x2000:
+		setRectList(0x004AE800);
+		_flag1 = true;
+		break;
+	case 0x2001:
+		if (getGlobalVar(0x0018CA22))
+			loadDataResource(0x84130112);
+		else
+			loadDataResource(0x84500132);
+		_flag1 = false;
+		break;
+	case 0x4826:
+		if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _asTape);
+			setMessageList(0x004AE750);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 720f011..f4acda3 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -368,6 +368,32 @@ protected:
 	void findClosestPoint();
 };
 
+class AsScene2810Rope : public AnimatedSprite {
+public:
+	AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2810 : public Scene {
+public:
+	Scene2810(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
+	Sprite *_asRope;
+	Sprite *_sprite4;
+	Sprite *_asTape;
+	Sprite *_sprite5;
+	Sprite *_sprite6;
+	bool _flag1;
+	NRect _clipRects[2];
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void sub406650();
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2800_H */


Commit: 0388fb496d507afc2262c32c9e6f9be1f384443b
    https://github.com/scummvm/scummvm/commit/0388fb496d507afc2262c32c9e6f9be1f384443b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Implement Scene2822

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 2944428..e9a5838 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,8 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().which = 11;
-	_vm->gameState().sceneNum = 9;
+	_vm->gameState().sceneNum = 21;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 9b514e7..b28babe 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -25,6 +25,7 @@
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
 #include "neverhood/module1700.h"
+#include "neverhood/diskplayerscene.h"
 
 namespace Neverhood {
 
@@ -36,9 +37,6 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Music18hList_add(0x64210814, 0xD2FA4D14);
 	setGlobalVar(0x28D8C940, 1);
 	
-	createScene(9, 5);
-	return;
-	
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, which);
 	} else if (which == 2) {
@@ -116,6 +114,58 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 1);
 		break;
+	case 12:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008);
+		break;
+	case 13:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x81C60635, 0x60631814);
+		break;
+	case 14:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0);
+		break;
+	case 15:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC);
+		break;
+	case 16:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0);
+		break;
+	case 17:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018);
+		break;
+	case 18:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018);
+		break;
+	case 19:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x10866205, 0x66201100);
+		break;
+	case 20:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x01C58000, 0x58004014);
+		break;
+	case 21:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2822(_vm, this, which);
+		break;
+	case 22:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948);
+		break;
+	case 23:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040);
+		break;
+	case 24:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A);
+		break;
 	case 25:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		if (getGlobalVar(0x190A1D18))
@@ -123,6 +173,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		else
 			_childObject = new Class152(_vm, this, 0x08611204, 0x1120008E);
 		break;
+	case 26:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new DiskplayerScene(_vm, this, 4);
+		break;
 	//		
 	case 1001:
 		break;
@@ -239,9 +293,51 @@ void Module2800::updateScene() {
 		case 10:
 			createScene(8, _moduleResult);
 			break;
+		case 12:
+			createScene(9, 11);
+			break;
+		case 13:
+			createScene(9, 12);
+			break;
+		case 14:
+			createScene(9, 13);
+			break;
+		case 15:
+			createScene(9, 14);
+			break;
+		case 16:
+			createScene(9, 15);
+			break;
+		case 17:
+			createScene(9, 16);
+			break;
+		case 18:
+			createScene(9, 17);
+			break;
+		case 19:
+			createScene(9, 18);
+			break;
+		case 20:
+			createScene(9, 19);
+			break;
+		case 21:
+			createScene(9, 20);
+			break;
+		case 22:
+			createScene(9, 21);
+			break;
+		case 23:
+			createScene(9, 22);
+			break;
+		case 24:
+			createScene(9, 3);
+			break;
 		case 25:
 			createScene(2, 5);
 			break;
+		case 26:
+			createScene(11, 2);
+			break;
 		//		
 		case 1001:
 			break;
@@ -2310,6 +2406,12 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 
 }
 
+Scene2810::~Scene2810() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(0x00D30138, _klayman->getX());
+	// TODO Sound1ChList_sub_407AF0(0x84400112);
+}
+
 void Scene2810::sub406650() {
 	Sprite *tempSprite;
 
@@ -2384,4 +2486,78 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0),
+	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm) {
+
+	SetMessageHandler(&Scene2822::handleMessage);
+	SetUpdateHandler(&Scene2822::update);
+	_background = new Background(_vm, 0xD542022E, 0, 0);
+	addBackground(_background);
+	_background->getSurface()->getDrawRect().y = -10;
+	setPalette(0xD542022E);
+	insertMouse435(0x0028D089, 20, 620);
+	_ssButton = insertStaticSprite(0x1A4D4120, 1100);
+	_ssButton->setVisible(false);
+	_soundResource3.load(0x19044E72);
+}
+
+void Scene2822::update() {
+
+	static const int16 kScene2822BackgroundYPositions[] = {
+		0, -20, -5, -15, -8, -12, -9, -11, -10, 0
+	};
+
+	Scene::update();
+
+	if (_countdown != 0) {
+		if ((--_countdown) == 0) {
+			if (_countdownStatus == 0) {
+				_ssButton->setVisible(false);
+				_countdownStatus = 1;
+				_countdown = 48;
+			} else if (_countdownStatus == 1) {
+				_soundResource1.play(0x1384CB60);
+				_countdownStatus = 2;
+				_countdown = 12;
+			} else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) {
+				leaveScene(0);
+			}
+		} else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) {
+			if (_scrollIndex < 9) {
+				_background->getSurface()->getDrawRect().y = kScene2822BackgroundYPositions[_scrollIndex];
+				_scrollIndex++;
+			} else {
+				_background->getSurface()->getDrawRect().y = -10;
+			}
+		}
+	}
+
+}
+
+uint32 Scene2822::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			leaveScene(0);
+		} else if (param.asPoint().x >= 257 && param.asPoint().y >= 235 &&
+			param.asPoint().x <= 293 && param.asPoint().y <= 273) {
+			_ssButton->setVisible(true);
+			_countdownStatus = 0;
+			_countdown = 12;
+			_soundResource2.play(0x44061000);
+			if (getGlobalVar(0x0018CA22) == 0) {
+				setGlobalVar(0x0018CA22, 1);
+				setGlobalVar(0x00188211, 1);
+				SetMessageHandler(NULL);
+				_soundResource3.play();
+				_mouseCursor->setVisible(false);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index f4acda3..4a7224d 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -379,6 +379,7 @@ protected:
 class Scene2810 : public Scene {
 public:
 	Scene2810(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene2810();
 protected:
 	Sprite *_sprite1;
 	Sprite *_sprite2;
@@ -394,6 +395,21 @@ protected:
 	void sub406650();
 };
 
+class Scene2822 : public Scene {
+public:
+	Scene2822(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_ssButton;
+	int _scrollIndex;
+	int _countdown;
+	int _countdownStatus;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2800_H */


Commit: 93a074e9ad4da61265ce7692d2785958fceaae68
    https://github.com/scummvm/scummvm/commit/93a074e9ad4da61265ce7692d2785958fceaae68
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Implement Scene2812

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e9a5838..3208283 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -328,7 +328,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 21;
+	_vm->gameState().sceneNum = 11;
 	createModule(2800, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 5ca5354..3e8c007 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2266,6 +2266,18 @@ void Klayman::sub421270() {
 	}
 }
 
+void Klayman::sub420460() {
+	if (!stStartAction(AnimationCallback(&Klayman::sub420460))) {
+		_status2 = 0;
+		_acceptInput = false;
+		startAnimation(0x00AB8C10, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41E5F0);
+		SetSpriteUpdate(&Klayman::spriteUpdate41F920);
+		sendMessage(_attachedSprite, 0x482B, 0);
+	}
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -5891,4 +5903,96 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene2812::KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4805:
+		_destY = param.asInteger();
+		debug("_destY = %d", _destY);
+		GotoState(&Klayman::sub420460);
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2)
+			GotoState(&Klayman::stPickUpNeedle);
+		else if (param.asInteger() == 1)
+			GotoState(&Klayman::sub41FFF0);
+		else
+			GotoState(&Klayman::stPickUpGeneric);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;
+	case 0x481A:
+		GotoState(&Klayman::stInsertDisk);		
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0)
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		else
+			sub41CCE0(param.asPoint().x);
+		break;
+	case 0x481D:
+		GotoState(&Klayman::stTurnToUse);
+		break;
+	case 0x481E:
+		GotoState(&Klayman::stReturnFromUse);
+		break;
+	case 0x4820:  
+		sendMessage(_parentScene, 0x2001, 0);
+		GotoState(&Klayman::stContinueClimbLadderUp);	 
+		break;
+	case 0x4821:	
+		sendMessage(_parentScene, 0x2001, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderDown);	 
+		break;
+	case 0x4822:  
+		sendMessage(_parentScene, 0x2001, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderUp);	 
+		break;
+	case 0x4823:
+		sendMessage(_parentScene, 0x2002, 0);
+		GotoState(&Klayman::stClimbLadderHalf);	 
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		gotoNextStateExt();
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWalkToFrontNoStep);
+		} else {
+			GotoState(&Klayman::stWalkToFront);
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnToFront);
+		} else {
+			GotoState(&Klayman::stTurnToBack);
+		}
+		break;
+	case 0x483F:
+		startSpecialWalkRight(param.asInteger());
+		break;
+	case 0x4840: 
+		startSpecialWalkLeft(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index f36e27a..18791ff 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -167,6 +167,7 @@ public:
 	uint32 handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void sub421270();
+	void sub420460();
 
 protected:
 	Entity *_parentScene;
@@ -655,6 +656,13 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2812 : public Klayman {
+public:
+	KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index b28babe..2bf023c 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -25,6 +25,7 @@
 #include "neverhood/module1000.h"
 #include "neverhood/module1200.h"
 #include "neverhood/module1700.h"
+#include "neverhood/module2200.h"
 #include "neverhood/diskplayerscene.h"
 
 namespace Neverhood {
@@ -114,6 +115,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 1);
 		break;
+	case 11:
+		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		_childObject = new Scene2812(_vm, this, which);
+		break;
 	case 12:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008);
@@ -293,6 +298,16 @@ void Module2800::updateScene() {
 		case 10:
 			createScene(8, _moduleResult);
 			break;
+		case 11:
+			if (_moduleResult == 1)
+				createScene(4, 0);
+			else if (_moduleResult == 2)
+				createScene(26, 0);
+			else if (_moduleResult == 3)
+				createScene(9, 5);
+			else 
+				createScene(9, 1);
+			break;
 		case 12:
 			createScene(9, 11);
 			break;
@@ -2486,6 +2501,260 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
+	
+	createSurface1(0x20DA08A0, 1200);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2812Winch::handleMessage);
+	setVisible(false);
+	_x = 280;
+	_y = 184;
+}
+
+AsScene2812Winch::~AsScene2812Winch() {
+	// TODO Sound1ChList_sub_407AF0(0x00B000E2);
+}
+
+uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		startAnimation(0x20DA08A0, 0, -1);
+		setVisible(true);
+		// TODO Sound1ChList_addSoundResource(0x00B000E2, 0xC874EE6C, true);
+		// TODO Sound1ChList_playLooping(0xC874EE6C);
+		break;
+	case 0x3002:
+		startAnimation(0x20DA08A0, 7, -1);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2812Rope::AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
+	
+	createSurface(990, 68, 476);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2812Rope::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	startAnimation(0xAE080551, 0, -1);
+	_x = 334;
+	_y = 201;
+}
+
+uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x4806:
+		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
+		sub413E00();
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene2812Rope::handleMessage413DC0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2812Rope::sub413E00() {
+	sendMessage(_parentScene, 0x4806, 0);
+	startAnimation(0x9D098C23, 0, -1);
+	SetMessageHandler(&AsScene2812Rope::handleMessage413DC0);
+}
+
+AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 0x805D0029, 100, 320, 240), _soundResource(vm) {
+	
+	SetMessageHandler(&AsScene2812TrapDoor::handleMessage);
+	_newStickFrameIndex = 0;
+}
+
+uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		startAnimation(0x805D0029, 0, -1);
+		_soundResource.play(0xEA005F40);
+		_newStickFrameIndex = -2;
+		break;
+	}
+	return messageResult;
+}
+
+Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _palStatus(0) {
+	
+	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
+		setGlobalVar(0x13382860, 3);
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2812::handleMessage);
+	SetUpdateHandler(&Scene2812::update);
+	
+	setRectList(0x004AF700);
+	
+	setBackground(0x03600606);
+	setPalette(0x03600606);
+	addEntity(_palette);
+	_palette->addBasePalette(0x03600606, 0, 256, 0);
+
+	_sprite1 = insertStaticSprite(0x0C06C860, 1100);
+	insertMouse433(0x0060203E);
+
+	if (getGlobalVar(0x13382860) == 3) {
+		_class545 = insertSprite<Class545>(this, 2, 1100, 474, 437);
+		_vm->_collisionMan->addSprite(_class545);
+	}
+
+	_class606 = insertSprite<Class606>(this, 6, 1100, 513, 437, 0xA1361863);
+	_vm->_collisionMan->addSprite(_class606);
+	
+	_asWinch = insertSprite<AsScene2812Winch>();
+	_asTrapDoor = insertSprite<AsScene2812TrapDoor>();
+	_asRope = insertSprite<AsScene2812Rope>(this);
+
+	_sprite2 = insertStaticSprite(0x08478078, 1100);
+	_sprite3 = insertStaticSprite(0x2203B821, 1100);
+	_sprite4 = insertStaticSprite(0x08592134, 1100);
+
+	if (which < 0) {
+		_flag1 = false;
+		insertKlayman<KmScene2812>(272, 432);
+		setMessageList(0x004AF560);
+		_sprite1->setVisible(false);
+		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
+	} else if (which == 1) {
+		_flag1 = false;
+		insertKlayman<KmScene2812>(338, 398);
+		setMessageList(0x004AF588);
+		setPalStatus1(1);
+		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2());
+	} else if (which == 2) {
+		_flag1 = false;
+		if (getGlobalVar(0xC0418A02)) {
+			insertKlayman<KmScene2812>(554, 432);
+			_klayman->setDoDeltaX(1);
+		} else {
+			insertKlayman<KmScene2812>(394, 432);
+		}
+		setMessageList(0x004AF5F0);
+		_sprite1->setVisible(false);
+		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
+	} else {
+		_flag1 = true;
+		insertKlayman<KmScene2812>(150, 582);
+		setMessageList(0x004AF568);
+		setPalStatus2(1);
+		_sprite1->setVisible(false);
+		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
+	}
+	
+	_asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
+	
+}
+
+void Scene2812::update() {
+	if (_klayman->getX() < 220)
+		setPalStatus2(0);
+	else if (_klayman->getX() < 240)
+		setPalStatus0(0);
+	Scene::update();
+}
+
+uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0004269B)
+			sendEntityMessage(_klayman, 0x1014, _asRope);
+		break;
+	case 0x2001:
+		_flag1 = true;
+		setRectList(0x004AF710);
+		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2());
+		break;
+	case 0x2002:
+		_flag1 = false;
+		setRectList(0x004AF700);
+		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
+		break;
+	case 0x4806:
+		sendMessage(_asWinch, 0x2000, 0);
+		sendMessage(_asTrapDoor, 0x2000, 0);
+		break;
+	case 0x4826:
+		if (sender == _class606 && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _class606);
+			setMessageList(0x004AF658);
+		} else if (sender == _class545 && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _class545);
+			setMessageList(0x004AF668);
+		}
+		break;
+	case 0x482A:
+		setPalStatus1(0);
+		_sprite1->setVisible(true);
+		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2());
+		break;
+	case 0x482B:
+		setPalStatus0(false);
+		_sprite1->setVisible(false);
+		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2812::setPalStatus0(int fadeTime) {
+	if (_palStatus != 0) {
+		_palStatus = 0;
+		setPalStatus(fadeTime);
+	}
+}
+
+void Scene2812::setPalStatus1(int fadeTime) {
+	if (_palStatus != 1) {
+		_palStatus = 1;
+		setPalStatus(fadeTime);
+	}
+}
+
+void Scene2812::setPalStatus2(int fadeTime) {
+	if (_palStatus != 2) {
+		_palStatus = 2;
+		setPalStatus(fadeTime);
+	}
+}
+
+void Scene2812::setPalStatus(int fadeTime) {
+	if (_palStatus == 0)
+		_palette->addBasePalette(0x05D30F11, 0, 64, 0);
+	else if (_palStatus == 1)
+		_palette->addBasePalette(0x92CA2C9B, 0, 64, 0);
+	else if (_palStatus == 2)
+		_palette->addBasePalette(0x381F92C5, 0, 64, 0);
+	if (fadeTime > 0) {
+		_palette->startFadeToPalette(0);
+	} else {
+		_palette->startFadeToPalette(12);
+	}
+}
+
 Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0),
 	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm) {
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 4a7224d..9daf820 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -395,6 +395,55 @@ protected:
 	void sub406650();
 };
 
+class AsScene2812Winch : public AnimatedSprite {
+public:
+	AsScene2812Winch(NeverhoodEngine *vm);
+	virtual ~AsScene2812Winch();
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2812Rope : public AnimatedSprite {
+public:
+	AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage413DC0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub413E00();
+};
+
+class AsScene2812TrapDoor : public AnimatedSprite {
+public:
+	AsScene2812TrapDoor(NeverhoodEngine *vm);
+protected:
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2812 : public Scene {
+public:
+	Scene2812(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_asWinch;
+	Sprite *_asTrapDoor;
+	Sprite *_asRope;
+	Sprite *_sprite3;
+	Sprite *_sprite2;
+	Sprite *_sprite4;
+	Sprite *_class606;
+	Sprite *_class545;
+	Sprite *_sprite1;
+	bool _flag1;
+	int _palStatus;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void setPalStatus0(int fadeTime);
+	void setPalStatus1(int fadeTime);
+	void setPalStatus2(int fadeTime);
+	void setPalStatus(int fadeTime);
+};
+
 class Scene2822 : public Scene {
 public:
 	Scene2822(NeverhoodEngine *vm, Module *parentModule, int which);


Commit: c27e930861cea513f3d966e610c336dbdb34ea6d
    https://github.com/scummvm/scummvm/commit/c27e930861cea513f3d966e610c336dbdb34ea6d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2812

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index a458ded..f8a4497 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -122,6 +122,9 @@ static const uint32 rectListOffsets[] = {
 	// Scene2810
 	1, 0x004AE810,
 	1, 0x004AE800,
+	// Scene2812
+	1, 0x004AF700,
+	1, 0x004AF710,
 	0, 0
 };
 
@@ -450,6 +453,13 @@ static const uint32 messageListOffsets[] = {
 	5, 0x004AE660,
 	5, 0x004AE688,
 	2, 0x004AE750,
+	// Scene2812
+	1, 0x004AF560,
+	1, 0x004AF588,
+	1, 0x004AF5F0,
+	4, 0x004AF568,
+	2, 0x004AF658,
+	2, 0x004AF668,
 	0, 0
 };
 
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index f47b01d..9fbfcfa 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 43362dfbd1354220ffdf1fba8a04286a7037c45f
    https://github.com/scummvm/scummvm/commit/43362dfbd1354220ffdf1fba8a04286a7037c45f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Implement Scene2803

- Also add "empty" constructor to DirtyBackground (used by that scene)

Changed paths:
    engines/neverhood/background.cpp
    engines/neverhood/background.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
index e235eaa..03c531f 100644
--- a/engines/neverhood/background.cpp
+++ b/engines/neverhood/background.cpp
@@ -59,6 +59,11 @@ void Background::load(uint32 fileHash) {
 
 // DirtyBackground
 
+DirtyBackground::DirtyBackground(NeverhoodEngine *vm, int objectPriority)
+	: Background(vm, objectPriority) {
+	// Empty
+}
+
 DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority)
 	: Background(vm, objectPriority) {
 	
diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h
index 8ac3581..d8f624b 100644
--- a/engines/neverhood/background.h
+++ b/engines/neverhood/background.h
@@ -46,6 +46,7 @@ protected:
 
 class DirtyBackground : public Background {
 public:
+	DirtyBackground(NeverhoodEngine *vm, int objectPriority);
 	DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority);
 	DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority);
 	void createSurface(int surfacePriority, int16 width, int16 height);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 3e8c007..f69686a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2278,6 +2278,27 @@ void Klayman::sub420460() {
 	}
 }
 
+void Klayman::sub420500() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimationByHash(0x00AB8C10, 0x320AC306, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::handleMessage41F0E0);
+	NextState(&Klayman::stReleaseRing);
+}
+
+uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x320AC306)
+			_soundResource1.play(0x5860C640);
+		break;
+	}
+	return messageResult;
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -5266,6 +5287,69 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
+KmScene2803::KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	// TODO ClipRects stuff
+	_dataResource.load(0x00900849);
+}
+
+uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4803:
+		_destY = param.asInteger();
+		GotoState(&Klayman::sub4204C0);
+		break;
+	case 0x4804:
+		if (param.asInteger() == 3)
+			GotoState(&Klayman::sub421230);
+		break;
+	case 0x480D:
+		GotoState(&Klayman::sub420F60);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x4818:
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	case 0x481D:
+		GotoState(&Klayman::stTurnToUse);
+		break;
+	case 0x481E:
+		GotoState(&Klayman::stReturnFromUse);
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWonderAboutAfter);
+		} else {
+			GotoState(&Klayman::stWonderAboutHalf);
+		}
+		break;
+	case 0x482E:	 
+		GotoState(&Klayman::stWalkToFront);
+		break;
+	case 0x482F:
+		GotoState(&Klayman::stTurnToBack);
+		break;
+	case 0x4834:
+		GotoState(&Klayman::stStepOver);
+		break;
+	case 0x4838:
+		GotoState(&Klayman::sub420500);
+		break;
+	}
+	return 0;
+}
+
 KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _soundResource(vm) {
 	
@@ -5807,8 +5891,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
 	return 0;
 }
 
-KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
-		NRect *clipRects, uint clipRectsCount)
+KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// TODO ClipRects stuff
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 18791ff..6cfb0fc 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -168,6 +168,9 @@ public:
 	
 	void sub421270();
 	void sub420460();
+	
+	void sub420500();
+	uint32 handleMessage41F0E0(int messageNum, const MessageParam &param, Entity *sender);
 
 protected:
 	Entity *_parentScene;
@@ -582,6 +585,13 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2803 : public Klayman {
+public:
+	KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene2803b : public Klayman {
 public:
 	KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 2bf023c..97fb18f 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -77,12 +77,11 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 2:
 		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
-		setGlobalVar(0x1860C990,1);//DEBUG
+		//setGlobalVar(0x1860C990,1);//DEBUG
 		if (getGlobalVar(0x1860C990))
 			_childObject = new Scene2803b(_vm, this, which);
-		else {
-			// TODO _childObject = new Scene2803(_vm, this, which);
-		}
+		else
+			_childObject = new Scene2803(_vm, this, which);
 		break;
 	case 3:
 		_childObject = new Scene2804(_vm, this, which);
@@ -477,7 +476,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-Class488::Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y)
+AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2),
 	_flag1(false), _flag2(false), _soundResource(vm) {
 
@@ -489,7 +488,7 @@ Class488::Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui
 	sub4343C0();
 }
 
-uint32 Class488::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -511,7 +510,7 @@ uint32 Class488::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-uint32 Class488::handleMessage434340(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2803LightCord::handleMessage434340(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -521,21 +520,21 @@ uint32 Class488::handleMessage434340(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-void Class488::sub434380() {
+void AsScene2803LightCord::sub434380() {
 	_flag2 = false;
 	_flag1 = true;
 	startAnimation(_fileHash2, 0, -1);
-	SetMessageHandler(&Class488::handleMessage434340);
-	NextState(&Class488::sub4343C0);
+	SetMessageHandler(&AsScene2803LightCord::handleMessage434340);
+	NextState(&AsScene2803LightCord::sub4343C0);
 }
 
-void Class488::sub4343C0() {
+void AsScene2803LightCord::sub4343C0() {
 	_flag1 = false;
 	startAnimation(_fileHash1, 0, -1);
-	SetMessageHandler(&Class488::handleMessage);
+	SetMessageHandler(&AsScene2803LightCord::handleMessage);
 }
 
-void Class488::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
+void AsScene2803LightCord::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHash1 = fileHash1;
 	_fileHash2 = fileHash2;
 	if (_flag1) {
@@ -546,6 +545,381 @@ void Class488::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	}
 }
 
+AsScene2803TestTubeOne::AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2)
+	: AnimatedSprite(vm, 1200), _fileHash1(fileHash1), _fileHash2(fileHash2) {
+	
+	createSurface1(fileHash1, 100);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2803TestTubeOne::handleMessage);
+	_x = 529;
+	_y = 326;
+}
+
+uint32 AsScene2803TestTubeOne::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (param.asInteger())
+			startAnimation(_fileHash2, 0, -1);
+		else
+			startAnimation(_fileHash1, 0, -1);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
+	
+	createSurface(990, 68, 476);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&AsScene2803Rope::handleMessage);
+	startAnimation(0x9D098C23, 35, 53);
+	NextState(&AsScene2803Rope::sub476A70);
+	_x = x;
+	_y = -276;
+}
+
+uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		startAnimation(0x9D098C23, 50, -1);
+		SetMessageHandler(&AsScene2803Rope::handleMessage4769E0);
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 AsScene2803Rope::handleMessage4769E0(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x482A:
+		sendMessage(_parentScene, 0x1022, 990);
+		break;
+	case 0x482B:
+		sendMessage(_parentScene, 0x1022, 1010);
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2803Rope::sub476A70() {
+	startAnimation(0x8258A030, 0, 1);
+	NextState(&AsScene2803Rope::stHide);
+}
+
+void AsScene2803Rope::stHide() {
+	stopAnimation();
+	setVisible(false);
+}
+
+Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _field134(0) {
+	
+	static const uint32 kScene2803FileHashes1[] = {
+		0,
+		0x081000F1,
+		0x08100171,
+		0x08100271
+	};
+
+	static const uint32 kScene2803FileHashes2[] = {
+		0,
+		0x286800D4,
+		0x286806D4,
+		0x28680AD4
+	};
+
+	setGlobalVar(0x1C1B8A9A, 1);
+	_vm->gameModule()->initScene2808Vars1();
+	
+	SetMessageHandler(&Scene2803::handleMessage);
+	
+	loadDataResource(0x00900849);
+	
+	_surfaceFlag = true;
+	
+	_background = new DirtyBackground(_vm, 0);
+	_background->createSurface(0, 640, 480);
+	addBackground(_background);
+	
+	setPalette(0x412A423E);
+	addEntity(_palette);
+	
+	insertMouse433(0xA423A41A);
+	
+	if (getSubVar(0x0C601058, 0) == 0) {
+		_asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100);
+	} else {
+		_asTestTubeOne = (StaticSprite*)insertSprite<AsScene2803TestTubeOne>(
+			kScene2803FileHashes1[getSubVar(0x0C601058, 0)],
+			kScene2803FileHashes2[getSubVar(0x0C601058, 0)]);
+	}
+	
+	if (getSubVar(0x0C601058, 1) == 3)
+		_asTestTubeTwo = (StaticSprite*)insertStaticSprite(0x64330236, 100);
+
+	if (getSubVar(0x0C601058, 2) == 3)
+		_asTestTubeThree = (StaticSprite*)insertStaticSprite(0x2E4A22A2, 100);
+	
+	_asLightCord = insertSprite<AsScene2803LightCord>(this, 0x8FAD5932, 0x276E1A3D, 578, 200);
+	_sprite3 = (StaticSprite*)insertStaticSprite(0xA40EF2FB, 1100);
+	_sprite4 = (StaticSprite*)insertStaticSprite(0x0C03AA23, 1100);
+	_sprite5 = (StaticSprite*)insertStaticSprite(0x2A822E2E, 1100);
+	_sprite6 = (StaticSprite*)insertStaticSprite(0x2603A202, 1100);
+	_sprite7 = (StaticSprite*)insertStaticSprite(0x24320220, 1100);
+	_sprite8 = (StaticSprite*)insertStaticSprite(0x3C42022F, 1100);
+	_sprite9 = (StaticSprite*)insertStaticSprite(0x341A0237, 1100);
+	_sprite10 = insertStaticSprite(0x855820A3, 1200);
+
+	_clipRects1[0].x1 = 0;
+	_clipRects1[0].y1 = 0;
+	_clipRects1[0].x2 = 640;
+	_clipRects1[0].y2 = _sprite8->getDrawRect().y2();
+	
+	_clipRects1[1].x1 = _sprite8->getDrawRect().x2();
+	_clipRects1[1].y1 = _sprite8->getDrawRect().y2();
+	_clipRects1[1].x2 = 640;
+	_clipRects1[1].y2 = 480;
+
+	_clipRects2[0].x1 = _sprite5->getDrawRect().x;
+	_clipRects2[0].y1 = 0;
+	_clipRects2[0].x2 = _sprite5->getDrawRect().x2();
+	_clipRects2[0].y2 = _sprite5->getDrawRect().y2();
+	
+	_clipRects2[1].x1 = _sprite6->getDrawRect().x;
+	_clipRects2[1].y1 = 0;
+	_clipRects2[1].x2 = _sprite3->getDrawRect().x;
+	_clipRects2[1].y2 = _sprite6->getDrawRect().y2();
+	
+	_clipRects2[2].x1 = _sprite3->getDrawRect().x;
+	_clipRects2[2].y1 = 0;
+	_clipRects2[2].x2 = _sprite4->getDrawRect().x2();
+	_clipRects2[2].y2 = 480;
+
+	if (which < 0) {
+		insertKlayman<KmScene2803>(302, 445, _clipRects1, 2);
+		setMessageList(0x004B79F0);
+		sub476090();
+	} else if (which == 1) {
+		insertKlayman<KmScene2803>(200, 445, _clipRects1, 2);
+		setMessageList(0x004B79C8);
+		sub476090();
+	} else if (which == 3) {
+		NPoint pt = _dataResource.getPoint(0xC2A08694);
+		insertKlayman<KmScene2803>(pt.x, pt.y, _clipRects2, 3);
+		setMessageList(0x004B7A00);
+		sub475FF0();
+	} else if (which == 5) {
+		insertKlayman<KmScene2803>(253, 298, _clipRects2, 3);
+		setMessageList(0x004B7A00);
+		sub475FF0();
+	} else if (which == 6) {
+		_asRope = insertSprite<AsScene2803Rope>(this, 384);
+		_asRope->setClipRect(0, 25, 640, 480);
+		insertKlayman<KmScene2803>(384, 0, _clipRects1, 2);
+		sendEntityMessage(_klayman, 0x1014, _asRope);
+		_klayman->setClipRect(0, 25, 640, 480);
+		setMessageList(0x004B7A78);
+		sub476090();
+	} else if (which == 2) {
+		insertKlayman<KmScene2803>(400, 445, _clipRects1, 2);
+		setMessageList(0x004B79F8);
+		sub476090();
+	} else {
+		insertKlayman<KmScene2803>(50, 231, _clipRects2, 3);
+		setMessageList(0x004B79C0);
+		sub475FF0();
+	}
+
+	sub476180();
+
+}
+
+void Scene2803::update475E40() {
+	if (_klayman->getX() < 350) {
+		sub4765D0();
+	} else {
+		sub4765F0();
+	}
+	Scene::update();
+}
+
+uint32 Scene2803::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x480F:
+		sub476130();
+		// NOTE Intentional fall-through
+	case 0x100D:
+		if (param.asInteger() == 0x84251F82)
+			setMessageList(0x004B7A50);
+		else if (param.asInteger() == 0x4254A2D2)
+			setMessageList(0x004B7A58);
+		else if (param.asInteger() == 0xE90A40A0)
+			setMessageList(0x004B7A08);
+		else if (param.asInteger() == 0x482D1210)
+			setMessageList(0x004B7A30);
+		else if (param.asInteger() == 0x802402B2) {
+			sendEntityMessage(_klayman, 0x1014, _asLightCord);
+			setMessageList(0x004B7A68);
+		} else if (param.asInteger() == 0x9626F390)
+			setMessageList(0x004B7A88);
+		break;
+	case 0x482A:
+		sub475FF0();
+		sub4765F0();
+		break;
+	case 0x482B:
+		sub476090();
+		sub4765D0();
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2803::sub475FF0() {
+	SetUpdateHandler(&Scene2803::update475E40);
+	// TODO _klayman->setClipRects(_clipRects2, 3);
+	sendMessage(_klayman, 0x482C, 0xE5A48297);
+	_sprite3->setVisible(true);
+	_sprite4->setVisible(true);
+	_sprite5->setVisible(true);
+	_sprite6->setVisible(true);
+	_sprite7->setVisible(true);
+	_sprite8->setVisible(false);
+	_sprite9->setVisible(false);
+}
+
+void Scene2803::sub476090() {
+	SetUpdateHandler(&Scene::update);
+	// TODO _klayman->setClipRects(_clipRects1, 2);
+	sendMessage(_klayman, 0x482C, 0);
+	_sprite3->setVisible(false);
+	_sprite4->setVisible(false);
+	_sprite5->setVisible(false);
+	_sprite6->setVisible(false);
+	_sprite7->setVisible(false);
+	_sprite8->setVisible(true);
+	_sprite9->setVisible(true);
+}
+
+void Scene2803::sub476130() {
+	setGlobalVar(0x190A1D18, getGlobalVar(0x190A1D18) ? 0 : 1);
+	sub476180();
+}
+
+void Scene2803::sub476180() {
+	// TODO? g_screen->resetDirtyRects();
+	if (getGlobalVar(0x190A1D18)) {
+		_asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D);
+		_background->load(0x412A423E);
+		_palette->addPalette(0x412A423E, 0, 256, 0);
+		_palette->addBasePalette(0x412A423E, 0, 256, 0);
+		_sprite3->load(0xA40EF2FB, false, false);
+		_sprite3->update();
+		_sprite4->load(0x0C03AA23, false, false);
+		_sprite4->update();
+		_sprite5->load(0x2A822E2E, false, false);
+		_sprite5->update();
+		_sprite6->load(0x2603A202, false, false);
+		_sprite6->update();
+		_sprite7->load(0x24320220, false, false);
+		_sprite7->update();
+		_mouseCursor->load(0xA423A41A);
+		_mouseCursor->updateCursor();
+		_sprite8->load(0x3C42022F, false, false);
+		_sprite8->update();
+		_sprite9->load(0x341A0237, false, false);
+		_sprite9->update();
+		if (getSubVar(0x0C601058, 0) == 0) {
+			_asTestTubeOne->load(0x66121222, false, false);
+			_asTestTubeOne->update();
+		} else
+			sendMessage(_asTestTubeOne, 0x2000, 0);
+		if (getSubVar(0x0C601058, 1) == 3) {
+			_asTestTubeTwo->load(0x64330236, false, false);
+			_asTestTubeTwo->update();
+		}
+		if (getSubVar(0x0C601058, 2) == 3) {
+			_asTestTubeThree->load(0x2E4A22A2, false, false);
+			_asTestTubeThree->update();
+		}
+		_sprite10->setVisible(true);
+	} else {
+		_asLightCord->setFileHashes(0xAFAD591A, 0x276E321D);
+		_background->load(0x29800A01);
+		_palette->addPalette(0x29800A01, 0, 256, 0);
+		_palette->addBasePalette(0x29800A01, 0, 256, 0);
+		_sprite3->load(0x234340A0, false, false);
+		_sprite3->update();
+		_sprite4->load(0x16202200, false, false);
+		_sprite4->update();
+		_sprite5->load(0x1030169A, false, false);
+		_sprite5->update();
+		_sprite6->load(0x1600A6A8, false, false);
+		_sprite6->update();
+		_sprite7->load(0xD0802EA0, false, false);
+		_sprite7->update();
+		_mouseCursor->load(0x00A05290);
+		_mouseCursor->updateCursor();
+		_sprite8->load(0x108012C1, false, false);
+		_sprite8->update();
+		_sprite9->load(0x708072E0, false, false);
+		_sprite9->update();
+		if (getSubVar(0x0C601058, 0) == 0) {
+			_asTestTubeOne->load(0x50C027A8, false, false);
+			_asTestTubeOne->update();
+		} else
+			sendMessage(_asTestTubeOne, 0x2000, 1);
+		if (getSubVar(0x0C601058, 1) == 3) {
+			_asTestTubeTwo->load(0xD48077A0, false, false);
+			_asTestTubeTwo->update();
+		}
+		if (getSubVar(0x0C601058, 2) == 3) {
+			_asTestTubeThree->load(0x30022689, false, false);
+			_asTestTubeThree->update();
+		}
+		_sprite10->setVisible(false);
+	}
+	sub476610();
+}
+
+void Scene2803::sub4765D0() {
+	if (_field134) {
+		_field134 = 0;
+		sub476610();
+	}
+}
+
+void Scene2803::sub4765F0() {
+	if (!_field134) {
+		_field134 = 1;
+		sub476610();
+	}
+}
+
+void Scene2803::sub476610() {
+	uint32 fadePaletteHash;
+	if (getGlobalVar(0x190A1D18))
+		fadePaletteHash = _field134 ? 0xB103B604 : 0x412A423E;
+	else
+		fadePaletteHash = _field134 ? 0x0263D144 : 0x29800A01;
+	_palette->addBasePalette(fadePaletteHash, 0, 64, 0);
+	_palette->startFadeToPalette(12);
+}
+
 Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _palStatus(0) {
 
@@ -563,7 +937,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 	loadDataResource(0x81120132);
 	insertMouse433(0x00A05290);
 
-	insertSprite<Class488>(this, 0xAFAD591A, 0x276E321D, 578, 200);
+	insertSprite<AsScene2803LightCord>(this, 0xAFAD591A, 0x276E321D, 578, 200);
 
 	if (getGlobalVar(0x190A1D18)) {
 		setBackground(0x412A423E);
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 9daf820..50db161 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -54,9 +54,9 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class488 : public AnimatedSprite {
+class AsScene2803LightCord : public AnimatedSprite {
 public:
-	Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y);
+	AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y);
 	void sub434380();
 	void sub4343C0();
 	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
@@ -69,6 +69,56 @@ protected:
 	uint32 handleMessage434340(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class AsScene2803TestTubeOne : public AnimatedSprite {
+public:
+	AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2);
+protected:
+	uint32 _fileHash1, _fileHash2;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2803Rope : public AnimatedSprite {
+public:
+	AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x);
+protected:
+	Scene *_parentScene;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage4769E0(int messageNum, const MessageParam &param, Entity *sender);
+	void sub476A70();
+	void stHide();
+};
+
+class Scene2803 : public Scene {
+public:
+	Scene2803(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	StaticSprite *_asTestTubeOne;
+	StaticSprite *_asTestTubeTwo;
+	StaticSprite *_asTestTubeThree;
+	Sprite *_asRope;
+	AsScene2803LightCord *_asLightCord;
+	StaticSprite *_sprite3;
+	StaticSprite *_sprite4;
+	StaticSprite *_sprite5;
+	StaticSprite *_sprite6;
+	StaticSprite *_sprite7;
+	StaticSprite *_sprite8;
+	StaticSprite *_sprite9;
+	Sprite *_sprite10;
+	NRect _clipRects1[2];
+	NRect _clipRects2[3];
+	bool _field134;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void update475E40();
+	void sub475FF0();
+	void sub476090();
+	void sub476130();
+	void sub476180();
+	void sub4765D0();
+	void sub4765F0();
+	void sub476610();
+};
+
 class Scene2803b : public Scene {
 public:
 	Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which);


Commit: de622586f6926eb2376b59494fdbf504b5858b95
    https://github.com/scummvm/scummvm/commit/de622586f6926eb2376b59494fdbf504b5858b95
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2803

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index f8a4497..663845f 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -410,6 +410,19 @@ static const uint32 messageListOffsets[] = {
 	3, 0x004B6168,
 	1, 0x004B61A0,
 	5, 0x004B61A8,
+	// Scene2803
+	1, 0x004B79F0,
+	5, 0x004B79C8,
+	1, 0x004B7A00,
+	2, 0x004B7A78,
+	1, 0x004B79F8,
+	1, 0x004B79C0,
+	1, 0x004B7A50,
+	2, 0x004B7A58,
+	5, 0x004B7A08,
+	4, 0x004B7A30,
+	2, 0x004B7A68,
+	7, 0x004B7A88,
 	// Scene2805
 	1, 0x004AE1C8,
 	2, 0x004AE1D0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 9fbfcfa..fd8e9c4 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: b2175adf61a2524338ad8c78a747a326d1519266
    https://github.com/scummvm/scummvm/commit/b2175adf61a2524338ad8c78a747a326d1519266
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2501

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 663845f..044880b 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -112,6 +112,8 @@ static const uint32 rectListOffsets[] = {
 	// Scene2247
 	1, 0x004B5588,
 	1, 0x004B55C8,
+	// Scene2501
+	1, 0x004B2608,
 	// Scene2801
 	1, 0x004B6CE0,
 	1, 0x004B6CD0,
@@ -390,6 +392,9 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B54C0,
 	5, 0x004B54E0,
 	5, 0x004B5508,
+	// Scene 2501
+	7, 0x004B2538,
+	6, 0x004B2570,
 	// Scene2801
 	1, 0x004B6BB8,
 	1, 0x004B6BC0,
@@ -641,5 +646,9 @@ static const uint32 sceneInfo2700Offsets[] = {
 	0x004B5FD8,
 	0x004B5FFC,
 	0x004B6020,
+	// Scene2501
+	0x004B2628,
+	0x004B264C,
+	0x004B2670,
 	0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index fd8e9c4..9d0e214 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: bbb23cdf275d686f23f0553154d36a5c1fb74c88
    https://github.com/scummvm/scummvm/commit/bbb23cdf275d686f23f0553154d36a5c1fb74c88
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Start with Module2500

- Implement Scene2501
- Add Scene::removeSprite

Changed paths:
  A engines/neverhood/module2500.cpp
  A engines/neverhood/module2500.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk
    engines/neverhood/module2700.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 3208283..9953492 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -37,6 +37,7 @@
 #include "neverhood/module2100.h"
 #include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
+#include "neverhood/module2500.h"
 #include "neverhood/module2600.h"
 #include "neverhood/module2700.h"
 #include "neverhood/module2800.h"
@@ -327,10 +328,15 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 11;
 	createModule(2800, -1);
 #endif
+#if 1
+	_vm->gameState().which = 2;
+	_vm->gameState().sceneNum = 0;
+	createModule(2500, -1);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
@@ -394,6 +400,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x1A214010);
 		_childObject = new Module2300(_vm, this, which);
 		break;
+	case 2500:
+		setGlobalVar(0x91080831, 0x29220120);
+		_childObject = new Module2500(_vm, this, which);
+		break;
 	case 2600:
 		setGlobalVar(0x91080831, 0x40271018);
 		_childObject = new Module2600(_vm, this, which);
@@ -513,6 +523,9 @@ void GameModule::updateModule() {
 				createModule(1000, 1);
 			}
 			break;
+		case 2500:
+			createModule(2600, 1);
+			break;
 		case 2600:
 			if (_moduleResult == 1) {
 				createModule(2500, 0);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index f69686a..9d28b5f 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5215,6 +5215,57 @@ void KmScene2247::sub453520() {
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
+KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	// Empty
+}
+	
+uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x2000:
+		_isSittingInTeleporter = param.asInteger() != 0;
+		messageResult = 1;
+		break;
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::sub421350);
+		else
+			GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x481D:
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stTurnToUseInTeleporter);
+		break;
+	case 0x481E:
+		if (_isSittingInTeleporter)
+			GotoState(&Klayman::stReturnFromUseInTeleporter);
+		break;
+	case 0x4834:
+		GotoState(&Klayman::stStepOver);
+		break;
+	case 0x4835:
+		sendMessage(_parentScene, 0x2000, 1);
+		_isSittingInTeleporter = true;
+		GotoState(&Klayman::stSitInTeleporter);
+		break;																		
+	case 0x4836:
+		sendMessage(_parentScene, 0x2000, 0);
+		_isSittingInTeleporter = false;
+		GotoState(&Klayman::stGetUpFromTeleporter);
+		break;
+	}
+	return messageResult;
+}
+
 KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 6cfb0fc..fea543c 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -578,6 +578,14 @@ protected:
 	void sub453520();
 };
 
+class KmScene2501 : public Klayman {
+public:
+	KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _isSittingInTeleporter;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene2801 : public Klayman {
 public:
 	KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 780ee76..ac4064b 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -25,6 +25,7 @@ MODULE_OBJS = \
 	module2100.o \
 	module2200.o \
 	module2300.o \
+	module2500.o \
 	module2600.o \
 	module2700.o \
 	module2800.o \
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
new file mode 100644
index 0000000..0f746d1
--- /dev/null
+++ b/engines/neverhood/module2500.cpp
@@ -0,0 +1,387 @@
+/* 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/module2500.h"
+
+namespace Neverhood {
+
+Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
+	_soundResource3(vm), _soundResource4(vm), _soundIndex(0) {
+	
+	// TODO Music18hList_add(0x29220120, 0x05343184);
+	// TODO Music18hList_play(0x05343184, 0, 0, 1);
+	SetMessageHandler(&Module2500::handleMessage);
+
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, _vm->gameState().which);
+	} else {
+		createScene(0, 0);
+	}
+
+	_soundResource1.load(0x00880CCC);
+	_soundResource2.load(0x00880CC0);
+	_soundResource3.load(0x00880CCC);
+	_soundResource4.load(0x00880CC0);
+
+}
+
+Module2500::~Module2500() {
+}
+
+void Module2500::createScene(int sceneNum, int which) {
+	debug("Module2500::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		_childObject = new Scene2501(_vm, this, which);
+		break;
+	}
+	SetUpdateHandler(&Module2500::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2500::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1)
+				createScene(2, 0);
+			else if (_moduleResult == 2)
+				createScene(1, 0);
+			else
+				leaveModule(0);
+			break;
+		}
+	}
+}
+
+uint32 Module2500::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x200D:
+		switch (_soundIndex) {
+		case 0:
+			_soundResource1.play();
+			break;
+		case 1:
+			_soundResource2.play();
+			break;
+		case 2:
+			_soundResource3.play();
+			break;
+		case 3:
+			_soundResource4.play();
+			break;
+		}
+		_soundIndex++;
+		if (_soundIndex >= 4)
+			_soundIndex = 0;
+		break;
+	}
+	return messageResult;
+}
+			
+Class541::Class541(NeverhoodEngine *vm, int16 x, int16 y)
+	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
+	
+	startAnimation(0x1209E09F, 1, -1);
+	_newStickFrameIndex = 1;
+	setDoDeltaX(1);
+}
+
+Class542::Class542(NeverhoodEngine *vm, int16 x, int16 y)
+	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
+	
+	_newStickFrameIndex = 0;
+	setDoDeltaX(1);
+}
+
+Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	_sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628);
+	_sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C);
+	_sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670);
+
+	setGlobalVar(0x21E60190, 1);
+	SetUpdateHandler(&Scene2501::update);
+	_surfaceFlag = true;
+	setBackground(0x1B8E8115);
+	setPalette(0x1B8E8115);
+	_palette->addPalette(0x00128842, 65, 31, 65);
+	_palette->addPalette("paKlayRed", 0, 64, 0);
+	insertMouse433(0xE81111B0);
+
+	_class437 = createSprite<Class437>(0x99BE9015); // Don't add this to the sprite list
+	addEntity(_class437);
+
+	_class521 = createSprite<Class521>(this, 211, 400); // Create but don't add to the sprite list yet
+	_class541 = insertSprite<Class541>(211, 400);
+	_class542 = insertSprite<Class542>(211, 400);
+	insertStaticSprite(0xC42AC521, 1500);
+
+	if (which < 0) {
+		insertKlayman<KmScene2501>(162, 393);
+		_kmScene2501 = _klayman;
+		_klaymanInCar = false;
+		setMessageList(0x004B2538);
+		setRectList(0x004B2608);
+		SetMessageHandler(&Scene2501::handleMessage);
+		SetUpdateHandler(&Scene2501::update);
+		sendMessage(_class521, 0x2009, 0);
+		_class521->setVisible(false);
+		_currTrackIndex = 0;
+	} else if (which == 1 || which == 2) {
+		addSprite(_class521);
+		_kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393);
+		_klaymanInCar = true;
+		sendMessage(_kmScene2501, 0x2000, 1);
+		_kmScene2501->setDoDeltaX(1);
+		SetMessageHandler(&Scene2501::hmRidingCar);
+		SetUpdateHandler(&Scene2501::upRidingCar);
+		_class541->setVisible(false);
+		_class542->setVisible(false);
+		_currTrackIndex = which;
+	} else {
+		insertKlayman<KmScene2501>(162, 393);
+		_kmScene2501 = _klayman;
+		_klaymanInCar = false;
+		setMessageList(0x004B2538);
+		setRectList(0x004B2608);
+		SetMessageHandler(&Scene2501::handleMessage);
+		SetUpdateHandler(&Scene2501::update);
+		sendMessage(_class521, 0x2009, 0);
+		_class521->setVisible(false);
+		_currTrackIndex = 0;
+	}
+
+	// TODO _class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+	// TODO _class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+	// TODO _class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	insertSprite<Class518>(_class521);
+	
+	_pointListsCount = 3;
+	_newTrackIndex = -1;
+	_dataResource.load(calcHash("Ashooded"));
+
+	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
+	_class521->setPathPoints(_trackPoints);
+
+	if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) {
+		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
+			sendMessage(_class521, 0x2007, 150);
+	} else {
+		NPoint testPoint = (*_trackPoints)[0];
+		sendMessage(_class521, 0x2002, 0);
+		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
+			sendMessage(_class521, 0x2008, 150);
+	}
+	
+	_carStatus = 0;
+	
+}
+
+Scene2501::~Scene2501() {
+	// Free sprites not currently in the sprite list
+	if (_klaymanInCar)
+		delete _kmScene2501;
+	else
+		delete _class521;
+}
+
+void Scene2501::update() {
+	Scene::update();
+	if (_carStatus == 1) {
+		removeSprite(_klayman);
+		addSprite(_class521);
+		clearRectList();
+		_klaymanInCar = true;
+		SetMessageHandler(&Scene2501::hmCarAtHome);
+		SetUpdateHandler(&Scene2501::upCarAtHome);
+		_class541->setVisible(false);
+		_class542->setVisible(false);
+		_class521->setVisible(true);
+		sendMessage(_class521, 0x2009, 0);
+		_class521->handleUpdate();
+		_klayman = NULL;
+		_carStatus = 0;
+	}
+	updateKlaymanCliprect();
+}
+
+void Scene2501::upCarAtHome() {
+	Scene::update();
+	if (_mouseClicked) {
+		if (_mouseClickPos.x <= 210 && _class521->getX() == 211 && _class521->getY() == 400) {
+			sendMessage(_class521, 0x200A, 0);
+			SetUpdateHandler(&Scene2501::upGettingOutOfCar);
+		} else {
+			findClosestTrack(_mouseClickPos);
+			SetMessageHandler(&Scene2501::hmRidingCar);
+			SetUpdateHandler(&Scene2501::upRidingCar);
+		}
+		_mouseClicked = false;
+	}
+	updateKlaymanCliprect();
+}
+
+void Scene2501::upGettingOutOfCar() {
+	Scene::update();
+	if (_carStatus == 2) {
+		_klayman = _kmScene2501;
+		removeSprite(_class521);
+		addSprite(_klayman);
+		_klaymanInCar = false;
+		SetMessageHandler(&Scene2501::handleMessage);
+		SetUpdateHandler(&Scene2501::update);
+		setRectList(0x004B2608);
+		_class541->setVisible(true);
+		_class542->setVisible(true);
+		_class521->setVisible(false);
+		setMessageList(0x004B2570);
+		runMessageList();
+		_klayman->handleUpdate();
+		_carStatus = 0;
+	}
+	updateKlaymanCliprect();
+}
+
+void Scene2501::upRidingCar() {
+	Scene::update();
+	if (_mouseClicked) {
+		findClosestTrack(_mouseClickPos);
+		_mouseClicked = false;
+	}
+}
+
+uint32 Scene2501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x60842040)
+			_carStatus = 1;
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return messageResult;
+}
+		
+uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2005:
+		if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) {
+			changeTrack();
+		} else if (_sceneInfos[_currTrackIndex]->which1 == 0) {
+			SetMessageHandler(&Scene2501::hmCarAtHome);
+			SetUpdateHandler(&Scene2501::upCarAtHome);
+			sendMessage(_class521, 0x200F, 1);
+		} else if (_sceneInfos[_currTrackIndex]->which1 > 0) {
+			leaveScene(_sceneInfos[_currTrackIndex]->which1);
+		}
+		break;
+	case 0x2006:
+		if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) {
+			changeTrack();
+		} else if (_sceneInfos[_currTrackIndex]->which2 == 0) {
+			SetMessageHandler(&Scene2501::hmCarAtHome);
+			SetUpdateHandler(&Scene2501::upCarAtHome);
+			sendMessage(_class521, 0x200F, 1);
+		} else if (_sceneInfos[_currTrackIndex]->which2 > 0) {
+			leaveScene(_sceneInfos[_currTrackIndex]->which2);
+		}
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x200A:
+		_carStatus = 2;
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return messageResult;
+}
+	
+void Scene2501::changeTrack() {
+	_currTrackIndex = _newTrackIndex;
+	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
+	_class521->setPathPoints(_trackPoints);
+	if (_currTrackIndex == 0) {
+		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+	} else {
+		sendMessage(_class521, 0x2002, 0);
+	}
+	sendPointMessage(_class521, 0x2004, _clickPoint);
+	_newTrackIndex = -1;
+}
+
+void Scene2501::findClosestTrack(NPoint &pt) {
+	// TODO NOTE This is uses with minor variations in other scenes, maybe merge them? 
+	int minMatchDistance = 640;
+	int minMatchTrackIndex = -1;
+	// Find the track which contains a point closest to pt
+	for (int infoIndex = 0; infoIndex < _pointListsCount; infoIndex++) {
+		NPointArray *pointList = _dataResource.getPointArray(_sceneInfos[infoIndex]->pointListName);
+		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
+			NPoint testPt = (*pointList)[pointIndex];
+			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
+			if (distance < minMatchDistance) {
+				minMatchTrackIndex = infoIndex;
+				minMatchDistance = distance;
+			}
+		}
+	}
+	if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
+		_newTrackIndex = minMatchTrackIndex;
+		_clickPoint = pt;
+		if (_currTrackIndex == 0)
+			sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+		else
+			sendMessage(_class521, 0x2003, 0);
+	} else {
+		_newTrackIndex = -1;
+		sendMessage(_class521, 0x2004, pt);
+	}
+}
+
+void Scene2501::updateKlaymanCliprect() {
+	if (_kmScene2501->getX() <= 211)
+		_kmScene2501->setClipRect(0, 0, 640, 480);
+	else
+		_kmScene2501->setClipRect(0, 0, 640, 388);
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
new file mode 100644
index 0000000..d907d5f
--- /dev/null
+++ b/engines/neverhood/module2500.h
@@ -0,0 +1,96 @@
+/* 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_MODULE2500_H
+#define NEVERHOOD_MODULE2500_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/module1600.h"
+#include "neverhood/module2700.h"
+
+namespace Neverhood {
+
+// Module2500
+
+class Module2500 : public Module {
+public:
+	Module2500(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2500();
+protected:
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	int _soundIndex;
+	void createScene(int sceneNum, int which);
+	void updateScene();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Class541 : public AnimatedSprite {
+public:
+	Class541(NeverhoodEngine *vm, int16 x, int16 y);
+};
+
+class Class542 : public AnimatedSprite {
+public:
+	Class542(NeverhoodEngine *vm, int16 x, int16 y);
+};
+
+class Scene2501 : public Scene {
+public:
+	Scene2501(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene2501();
+protected:
+	Class521 *_class521;
+	Sprite *_class437;
+	// TODO Sprite *_class517;
+	// TODO Sprite *_class519;
+	// TODO Sprite *_class520;
+	Sprite *_class541;
+	Sprite *_class542;
+	Klayman *_kmScene2501;
+	NPointArray *_trackPoints;
+	SceneInfo2700 *_sceneInfos[3];
+	int _currTrackIndex;
+	NPoint _clickPoint;
+	int _pointListsCount;
+	int _newTrackIndex;
+	int _carStatus;
+	bool _klaymanInCar;
+	void update();
+	void upCarAtHome();
+	void upGettingOutOfCar();
+	void upRidingCar();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRidingCar(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender);
+	void findClosestTrack(NPoint &pt);
+	void changeTrack();
+	void updateKlaymanCliprect();
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2500_H */
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 096e335..862b832 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -90,7 +90,6 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO Music18hList_play(0x04020210, 24, 2, 1);
 	SetMessageHandler(&Module2700::handleMessage);
 
-
 	if (which < 0) {
 		which = _vm->gameState().which;
 		if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31)
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 457d586..d189fad 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -158,6 +158,11 @@ Sprite *Scene::addSprite(Sprite *sprite) {
 	return sprite;
 }
 
+void Scene::removeSprite(Sprite *sprite) {
+	removeSurface(sprite->getSurface());
+	removeEntity(sprite);
+}
+
 void Scene::setSurfacePriority(BaseSurface *surface, int priority) {
 	surface->setPriority(priority);
 	if (removeSurface(surface))
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index e962266..f9e221a 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -47,6 +47,7 @@ public:
 	void addSurface(BaseSurface *surface);
 	bool removeSurface(BaseSurface *surface);
 	Sprite *addSprite(Sprite *sprite);
+	void removeSprite(Sprite *sprite);
 	void setSurfacePriority(BaseSurface *surface, int priority);
 	void deleteSprite(Sprite **sprite);
 	Background *addBackground(Background *background);


Commit: 31270bc5e66de42312813e58f4641c0958f1f455
    https://github.com/scummvm/scummvm/commit/31270bc5e66de42312813e58f4641c0958f1f455
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Add car track tables for Module2500

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 044880b..b4f84c2 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -650,5 +650,18 @@ static const uint32 sceneInfo2700Offsets[] = {
 	0x004B2628,
 	0x004B264C,
 	0x004B2670,
+	// Scene2502
+	0x004B01B8,
+	// Scene2503
+	0x004B01E0,
+	0x004B0208,
+	// Scene2505
+	0x004B0230,
+	// Scene2506
+	0x004B0268,
+	// Scene2507
+	0x004B02A0,
+	// Scene2508
+	0x004B02C8,
 	0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 9d0e214..1ff9e73 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 86c75922fe5c7ee86ce31e39440fe2aca9a09474
    https://github.com/scummvm/scummvm/commit/86c75922fe5c7ee86ce31e39440fe2aca9a09474
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:40-07:00

Commit Message:
NEVERHOOD: Implement Scene2504 and add all car track scenes

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 9953492..844ca58 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -333,7 +333,7 @@ void GameModule::startup() {
 	createModule(2800, -1);
 #endif
 #if 1
-	_vm->gameState().which = 2;
+	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 0;
 	createModule(2500, -1);
 #endif
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 0f746d1..79a4011 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -24,6 +24,37 @@
 
 namespace Neverhood {
 
+// TODO Maybe move these to the DAT
+
+static const uint32 kScene2505StaticSprites[] = {
+	0x4000A226,
+	0
+};
+
+static const NRect kScene2505ClipRect = NRect(0, 0, 564, 480);
+
+static const uint32 kScene2506StaticSprites[] = {
+	0x4027AF02,
+	0
+};
+
+static const NRect kScene2506ClipRect = NRect(0, 0, 640, 441);
+
+static const uint32 kScene2508StaticSprites1[] = {
+	0x2F08E610,
+	0xD844E6A0,
+	0
+};
+
+static const NRect kScene2508ClipRect1 = NRect(0, 0, 594, 448);
+
+static const uint32 kScene2508StaticSprites2[] = {
+	0x2F08E610,
+	0
+};
+
+static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448);
+
 Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
 	_soundResource3(vm), _soundResource4(vm), _soundIndex(0) {
@@ -55,6 +86,50 @@ void Module2500::createScene(int sceneNum, int which) {
 	case 0:
 		_childObject = new Scene2501(_vm, this, which);
 		break;
+	case 1:
+		_vm->gameState().which = which;
+		createScene2704(which, 0x004B01B8, 220);
+		break;
+	case 2:
+		setGlobalVar(0x98109F12, 1);// TODO DEBUG! Join the tracks.
+		_vm->gameState().which = which;
+		if (getGlobalVar(0x98109F12))
+			createScene2704(which, 0x004B01E0, 150);
+		else
+			createScene2704(which, 0x004B0208, 150);
+		break;
+	case 3:
+		_childObject = new Scene2504(_vm, this, which);
+		break;
+	case 4:
+		_vm->gameState().which = which;
+		createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect);
+		break;
+	case 5:
+		setGlobalVar(0x21E60190, 1);
+		_vm->gameState().which = which;
+		createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect);
+		break;
+	case 6:
+		_vm->gameState().which = which;
+		createScene2704(which, 0x004B02A0, 150);
+		break;
+	case 7:
+		_vm->gameState().which = which;
+		if (getGlobalVar(0xD0A14D10))
+			createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1);
+		else
+			createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2);
+		break;
+	case 8:
+		_childObject = new Scene1608(_vm, this, which);
+		break;
+	case 9:
+		if (getGlobalVar(0xD0A14D10))
+			_childObject = new Class152(_vm, this, 0xC62A0645, 0xA0641C6A);
+		else
+			_childObject = new Class152(_vm, this, 0x7A343546, 0x435427AB);
+		break;
 	}
 	SetUpdateHandler(&Module2500::updateScene);
 	_childObject->handleUpdate();
@@ -71,6 +146,54 @@ void Module2500::updateScene() {
 			else
 				leaveModule(0);
 			break;
+		case 1:
+			if (_moduleResult == 1)
+				createScene(3, -1);
+			else
+				createScene(0, 2);
+			break;
+		case 2:
+			if (_moduleResult == 1)
+				createScene(4, 0);
+			else
+				createScene(0, 1);
+			break;
+		case 3:
+			createScene(1, 1);
+			break;
+		case 4:
+			if (_moduleResult == 1)
+				createScene(5, 0);
+			else
+				createScene(2, 1);
+			break;
+		case 5:
+			if (_moduleResult == 1)
+				createScene(6, 0);
+			else
+				createScene(4, 1);
+			break;
+		case 6:
+			if (_moduleResult == 1)
+				createScene(7, 0);
+			else
+				createScene(5, 1);
+			break;
+		case 7:
+			if (_moduleResult == 1)
+				createScene(8, 1);
+			else
+				createScene(6, 1);
+			break;
+		case 8:
+			if (_moduleResult == 2)
+				createScene(9, -1);
+			else
+				createScene(7, 1);
+			break;
+		case 9:
+			createScene(8, 2);
+			break;
 		}
 	}
 }
@@ -101,6 +224,10 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam &param, Enti
 	return messageResult;
 }
 			
+void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
+	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
+}
+
 Class541::Class541(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
 	
@@ -384,4 +511,91 @@ void Scene2501::updateKlaymanCliprect() {
 		_kmScene2501->setClipRect(0, 0, 640, 388);
 }
 
+Class450::Class450(NeverhoodEngine *vm)
+	: StaticSprite(vm, 1400), _countdown(0), _flag1(false), _soundResource1(vm),
+	_soundResource2(vm), _soundResource3(vm), _soundResource4(vm) {
+	
+	_spriteResource.load2(0x070220D9);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_deltaRect = _drawRect;
+	processDelta();
+	_needRefresh = true;
+	setVisible(false);
+	_soundResource3.load(0x44043000);
+	_soundResource4.load(0x44045000);
+	_soundResource1.load(0x4600204C);
+	_soundResource2.load(0x408C0034);
+	SetMessageHandler(&Class450::handleMessage);
+	SetUpdateHandler(&Class450::update);
+}
+
+void Class450::update() {
+	StaticSprite::update();
+	if (_flag1 && !_soundResource1.isPlaying() && !_soundResource2.isPlaying()) {
+		_soundResource4.play();
+		setVisible(false);
+		_flag1 = false;
+	}
+	if (_countdown != 0 && (--_countdown) == 0) {
+		if (getSubVar(0x14800353, 0x01180951)) {
+			_soundResource1.play();
+		} else {
+			_soundResource2.play();
+		}
+		_flag1 = true;
+	}
+}
+
+uint32 Class450::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0 && !_flag1) {
+			setVisible(true);
+			_countdown = 2;
+			if (getSubVar(0x14800353, 0x01180951)) {
+				setSubVar(0x14800353, 0x01180951, 0);
+			} else {
+				setSubVar(0x14800353, 0x01180951, 1);
+			}
+			_soundResource3.play();
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+	
+	Sprite *class450;
+	
+	_surfaceFlag = true;
+	setBackground(0x90791B80);
+	setPalette(0x90791B80);
+	class450 = insertSprite<Class450>();
+	_vm->_collisionMan->addSprite(class450);
+	insertMouse435(0x91B8490F, 20, 620);
+	SetMessageHandler(&Scene2504::handleMessage);
+	SetUpdateHandler(&Scene::update);
+}
+
+uint32 Scene2504::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
+			leaveScene(0);
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index d907d5f..c3c046e 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -26,6 +26,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
+#include "neverhood/module1000.h"
 #include "neverhood/module1600.h"
 #include "neverhood/module2700.h"
 
@@ -46,6 +47,7 @@ protected:
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
 class Class541 : public AnimatedSprite {
@@ -91,6 +93,27 @@ protected:
 	void updateKlaymanCliprect();
 };
 
+class Class450 : public StaticSprite {
+public:
+	Class450(NeverhoodEngine *vm);
+protected:
+	int _countdown;
+	bool _flag1;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	SoundResource _soundResource3;
+	SoundResource _soundResource4;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2504 : public Scene {
+public:
+	Scene2504(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2500_H */


Commit: bd3dac97819bd92ea7b34bc53248d5168569f15b
    https://github.com/scummvm/scummvm/commit/bd3dac97819bd92ea7b34bc53248d5168569f15b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add commented out code (which is TODO) to Module2500 so I don't forget it later

Changed paths:
    engines/neverhood/module2500.cpp



diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 79a4011..3cb2379 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -77,6 +77,7 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2500::~Module2500() {
+	// TODO Music18hList_deleteGroup(0x29220120);
 }
 
 void Module2500::createScene(int sceneNum, int which) {


Commit: d4e322bc78d30941f5f3ab31c2460412fe0d7fb5
    https://github.com/scummvm/scummvm/commit/d4e322bc78d30941f5f3ab31c2460412fe0d7fb5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2401

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index b4f84c2..c2f0d6a 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -112,6 +112,8 @@ static const uint32 rectListOffsets[] = {
 	// Scene2247
 	1, 0x004B5588,
 	1, 0x004B55C8,
+	// Scene2401
+	1, 0x004B3140,
 	// Scene2501
 	1, 0x004B2608,
 	// Scene2801
@@ -392,7 +394,17 @@ static const uint32 messageListOffsets[] = {
 	4, 0x004B54C0,
 	5, 0x004B54E0,
 	5, 0x004B5508,
-	// Scene 2501
+	// Scene2401
+	1, 0x004B2F70,
+	1, 0x004B2F80,
+	1, 0x004B2F78,
+	4, 0x004B3090,
+	2, 0x004B30B0,
+	6, 0x004B3020,
+	2, 0x004B3050,
+	4, 0x004B2FA8,
+	4, 0x004B2FC8,
+	// Scene2501
 	7, 0x004B2538,
 	6, 0x004B2570,
 	// Scene2801
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 1ff9e73..6f7f629 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 402f4bd275f064f0ad7752be7aebfa1634b81fa1
    https://github.com/scummvm/scummvm/commit/402f4bd275f064f0ad7752be7aebfa1634b81fa1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Start with Module2400

- Implement Scene2401

Changed paths:
  A engines/neverhood/module2400.cpp
  A engines/neverhood/module2400.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module.mk



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 844ca58..d657307 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -37,6 +37,7 @@
 #include "neverhood/module2100.h"
 #include "neverhood/module2200.h"
 #include "neverhood/module2300.h"
+#include "neverhood/module2400.h"
 #include "neverhood/module2500.h"
 #include "neverhood/module2600.h"
 #include "neverhood/module2700.h"
@@ -221,6 +222,21 @@ void GameModule::initScene1405Vars() {
 	
 }
 
+void GameModule::initScene2401Vars() {
+
+	if (getSubVar(0x40050052, 0x40520234))
+		return;
+
+	setSubVar(0x90405038, 0, 3);
+	setSubVar(0x90405038, 1, 1);
+	setSubVar(0x90405038, 2, 2);
+	setSubVar(0x90405038, 3, 0);
+	setSubVar(0x90405038, 4, 4);
+		
+	setSubVar(0x40050052, 0x40520234, 1);
+
+}
+
 void GameModule::initScene2808Vars1() {
 
 	// Exit if it's already initialized
@@ -332,11 +348,15 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 11;
 	createModule(2800, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 0;
 	createModule(2500, -1);
 #endif
+#if 1
+	_vm->gameState().sceneNum = 0;
+	createModule(2400, -1);
+#endif
 }
 
 void GameModule::createModule(int moduleNum, int which) {
@@ -400,6 +420,10 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(0x91080831, 0x1A214010);
 		_childObject = new Module2300(_vm, this, which);
 		break;
+	case 2400:
+		setGlobalVar(0x91080831, 0x202D1010);
+		_childObject = new Module2400(_vm, this, which);
+		break;
 	case 2500:
 		setGlobalVar(0x91080831, 0x29220120);
 		_childObject = new Module2500(_vm, this, which);
@@ -523,6 +547,9 @@ void GameModule::updateModule() {
 				createModule(1000, 1);
 			}
 			break;
+		case 2400:
+			createModule(2300, 3);
+			break;
 		case 2500:
 			createModule(2600, 1);
 			break;
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index f453feb..af72d53 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -39,6 +39,7 @@ public:
 	void handleMouseDown(int16 x, int16 y);
 	void initScene1307Vars();
 	void initScene1405Vars();
+	void initScene2401Vars();
 	void initScene2808Vars1();
 	void initScene2808Vars2();
 	void initScene3009Vars();
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9d28b5f..9a6e4fe 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5215,6 +5215,150 @@ void KmScene2247::sub453520() {
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
+KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _readyToSpit(false) {
+	// Empty
+}
+	
+uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnPressButton);
+		} else if (param.asInteger() == 2) {
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnAwayFromUse);
+		} else if (param.asInteger() == 0) {
+			GotoState(&Klayman::stTurnToUseHalf);
+		} else {
+			GotoState(&Klayman::stWonderAbout);
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		gotoNextStateExt();
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWalkToFrontNoStep);
+		} else {
+			GotoState(&Klayman::stWalkToFront);
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnToFront);
+		} else {
+			GotoState(&Klayman::stTurnToBack);
+		}
+		break;
+	case 0x4832:
+		GotoState(&Klayman::sub421110);
+		break;
+	case 0x4833:
+		if (param.asInteger() == 1)
+			GotoState(&Klayman::stWonderAboutHalf);
+		else {
+			_spitPipeIndex = sendMessage(_parentScene, 0x2000, 0);
+			GotoState(&KmScene2401::stTrySpitIntoPipe);
+		}
+		break;
+	case 0x483F:
+		startSpecialWalkRight(param.asInteger());
+		break;		
+	case 0x4840:
+		startSpecialWalkLeft(param.asInteger());
+		break;
+	}
+	return messageResult;
+}
+
+uint32 KmScene2401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x16401CA6) {
+			_canSpit = true;
+			if (_contSpit)
+				spitIntoPipe();
+		} else if (param.asInteger() == 0xC11C0008) {
+			_canSpit = false;
+			_acceptInput = false;
+			_readyToSpit = false;
+		} else if (param.asInteger() == 0x018A0001) {
+			sendMessage(_parentScene, 0x2001, _spitDestPipeIndex);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2401::stTrySpitIntoPipe() {
+	if (_readyToSpit) {
+		_contSpit = true;
+		_spitContDestPipeIndex = _spitPipeIndex;
+		if (_canSpit)
+			spitIntoPipe();
+	} else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) {
+		_status2 = 2;
+		_acceptInput = true;
+		_spitDestPipeIndex = _spitPipeIndex;
+		_readyToSpit = true;
+		_canSpit = false;
+		_contSpit = false;
+		startAnimation(0x1808B150, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&KmScene2401::handleMessage);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void KmScene2401::spitIntoPipe() {
+	_contSpit = false;
+	_spitDestPipeIndex = _spitContDestPipeIndex;
+	_canSpit = false;
+	_acceptInput = false;
+	startAnimation(0x1B08B553, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene2401::handleMessage);
+	SetSpriteUpdate(NULL);
+	NextState(&KmScene2401::stContSpitIntoPipe);
+}
+
+void KmScene2401::stContSpitIntoPipe() {
+	_canSpit = true;
+	_acceptInput = true;
+	startAnimationByHash(0x1808B150, 0x16401CA6, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&KmScene2401::handleMessage);
+	SetSpriteUpdate(NULL);
+}
+
 KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index fea543c..fdf9b6e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -578,6 +578,23 @@ protected:
 	void sub453520();
 };
 
+class KmScene2401 : public Klayman {
+public:
+	KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	bool _canSpit;
+	bool _contSpit;
+	bool _readyToSpit;
+	uint32 _spitPipeIndex;
+	uint32 _spitDestPipeIndex;
+	uint32 _spitContDestPipeIndex;
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stTrySpitIntoPipe();
+	void spitIntoPipe();
+	void stContSpitIntoPipe();
+};
+
 class KmScene2501 : public Klayman {
 public:
 	KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index ac4064b..694d92d 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -25,6 +25,7 @@ MODULE_OBJS = \
 	module2100.o \
 	module2200.o \
 	module2300.o \
+	module2400.o \
 	module2500.o \
 	module2600.o \
 	module2700.o \
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
new file mode 100644
index 0000000..4febe74
--- /dev/null
+++ b/engines/neverhood/module2400.cpp
@@ -0,0 +1,501 @@
+/* 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/module2400.h"
+
+namespace Neverhood {
+
+Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	// TODO Music18hList_add(0x202D1010, 0xB110382D);
+
+	if (which < 0) {
+		createScene(_vm->gameState().sceneNum, _vm->gameState().which);
+	} else {
+		createScene(0, 0);
+	}
+
+}
+
+Module2400::~Module2400() {
+	// TODO Music18hList_deleteGroup(0x202D1010);
+}
+
+void Module2400::createScene(int sceneNum, int which) {
+	debug("Module2400::createScene(%d, %d)", sceneNum, which);
+	_vm->gameState().sceneNum = sceneNum;
+	switch (_vm->gameState().sceneNum) {
+	case 0:
+		// TODO Music18hList_stop(0xB110382D, 0, 0);
+		_childObject = new Scene2401(_vm, this, which);
+		break;
+	}
+	SetUpdateHandler(&Module2400::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2400::updateScene() {
+	if (!updateChild()) {
+		switch (_vm->gameState().sceneNum) {
+		case 0:
+			if (_moduleResult == 1)
+				createScene(1, 0);
+			else
+				leaveModule(0);
+			break;
+		}
+	}
+}
+
+static const NPoint kScene2401Points[] = {
+	{384, 389},
+	{406, 389},
+	{429, 389},
+	{453, 389},
+	{477, 389}
+};
+
+static const uint32 kScene2401FileHashes1[] = {
+	0x02842920,
+	0x02882920,
+	0x02902920,
+	0x02A02920,
+	0x02C02920,
+	0x02002920,
+	0x03802920,
+	0x00802920,
+	0x06802920,
+	0x03842920
+};
+
+static const uint32 kScene2401FileHashes2[] = {
+	0xD0910020,
+	0xD0910038,
+	0xD0910008,
+	0xD0910068,
+	0xD09100A8,
+	0
+};
+
+static const uint32 kScene2401FileHashes3[] = {
+	0xD0910020,
+	0xD0910038,
+	0xD0910008,
+	0xD0910068,
+	0xD09100A8,
+	0
+};
+
+static const NRect kScene2401Rects[] = {
+	NRect(369, 331, 394, 389),
+	NRect(395, 331, 419, 389),
+	NRect(420, 331, 441, 389),
+	NRect(442, 331, 464, 389),
+	NRect(465, 331, 491, 389)
+};
+
+static const uint32 kAsScene2401WaterSpitFileHashes2[] = {
+	0x5C044690,
+	0x5C644690,
+	0x5CA44690,
+	0x5D244690,
+	0x5E244690
+};
+
+static const uint32 kAsScene2401WaterSpitFileHashes1[] = {
+	0xF4418408,
+	0xF4418808,
+	0xF4419008,
+	0xF441A008,
+	0xCD4F8411
+};
+
+AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2401WaterSpit::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	createSurface(100, 146, 74);
+	_x = 240;
+	_y = 447;
+	setVisible(false);
+}
+
+uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x120A0013)
+			_soundResource.play(kAsScene2401WaterSpitFileHashes1[_soundIndex]);
+		break;
+	case 0x2000:
+		_x = 240;
+		_y = 447;
+		_soundIndex = getSubVar(0x0800547C, param.asInteger());
+		_soundResource.play(0x48640244);
+		startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1);
+		setVisible(true);
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1200), _isWaterFlowing(false) {
+	
+	createSurface1(0x10203116, 100);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2401FlowingWater::handleMessage);
+	_x = 88;
+	_y = 421;
+	setVisible(false);
+}
+
+AsScene2401FlowingWater::~AsScene2401FlowingWater() {
+	// TODO Sound1ChList_sub_407AF0(0x40F11C09);
+}
+
+uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_isWaterFlowing && param.asInteger() == 0x02421405) {
+			startAnimationByHash(0x10203116, 0x01084280, 0);
+		}
+		break;
+	case 0x2002:
+		if (!_isWaterFlowing) {
+			// TODO Sound1ChList_addSoundResource(0x40F11C09, 0x980C1420, true);
+			// TODO Sound1ChList_playLooping(0x980C1420);
+			startAnimation(0x10203116, 0, -1);
+			setVisible(true);
+			_isWaterFlowing = true;
+		}
+		break;
+	case 0x2003:
+		// TODO Sound1ChList_deleteSoundByHash(0x980C1420);
+		_isWaterFlowing = false;
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+	
+AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y)
+	: AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) {
+	
+	createSurface1(0xB8596884, 100);
+	SetUpdateHandler(&AsScene2401WaterFlushing::update);
+	SetMessageHandler(&AsScene2401WaterFlushing::handleMessage);
+	_x = x;
+	_y = y;
+	setVisible(false);
+}
+
+void AsScene2401WaterFlushing::update() {
+	if (_countdown != 0 && (--_countdown) == 0) {
+		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
+		startAnimation(0xB8596884, 0, -1);
+		setVisible(true);
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) {
+			startAnimationByHash(0xB8596884, 0x01084280, 0);
+			_flushLoopCount--;
+		}
+		break;
+	case 0x2002:
+		if (param.asInteger() > 0) {
+			_flushLoopCount = param.asInteger() - 1;
+			_countdown = _vm->_rnd->getRandomNumber(3) + 1;
+		}
+		break;
+	case 0x3002:
+		stopAnimation();
+		setVisible(false);
+		break;
+	}
+	return messageResult;
+}
+
+AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
+	: AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen), _soundResource(vm) {
+	
+	createSurface1(0x44687810, 100);
+	_x = 320;
+	_y = 240;
+	_newStickFrameIndex = -2;
+	SetUpdateHandler(&AsScene2401Door::update);
+	SetMessageHandler(&AsScene2401Door::handleMessage);
+	if (_isOpen) {
+		stopAnimation();
+		setVisible(false);
+		_countdown = 48;
+	} else {
+		startAnimation(0x44687810, 0, -1);
+		_newStickFrameIndex = 0;
+	}
+}
+
+void AsScene2401Door::update() {
+	if (_isOpen && _countdown != 0 && (--_countdown) == 0) {
+		_isOpen = false;
+		setVisible(true);
+		startAnimation(0x44687810, -1, -1);
+		_newStickFrameIndex = 0;
+		_playBackwards = true;
+		_soundResource.play(calcHash("fxDoorClose38"));
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2004:
+		if (_isOpen)
+			_countdown = 168;
+		messageResult = _isOpen ? 1 : 0;
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		if (!_isOpen) {
+			_countdown = 168;
+			_isOpen = true;
+			setVisible(true);
+			startAnimation(0x44687810, 0, -1);
+			_soundResource.play(calcHash("fxDoorOpen38"));
+			NextState(&AsScene2401Door::stDoorOpenFinished);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2401Door::stDoorOpenFinished() {
+	stopAnimation();
+	setVisible(false);
+}
+
+Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false),
+	_soundToggle(false), _asWaterSpitIndex(0), _soundResource1(vm), _soundResource2(vm) {
+
+	_vm->gameModule()->initScene2401Vars();
+
+	setGlobalVar(0x4E0BE910, 1); //DEBUG! Enables water
+	setGlobalVar(0x45080C38, 1); //DEBUG! Gives the test tube
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2401::handleMessage);
+	SetUpdateHandler(&Scene2401::update);
+
+	setRectList(0x004B3140);
+	setBackground(0x8C030206);
+	setPalette(0x8C030206);
+	addEntity(_palette);
+	_palette->addBasePalette(0x8C030206, 0, 256, 0);
+	_palette->addPalette(0x91D3A391, 0, 65, 0);
+	insertMouse433(0x302028C8);
+
+	_sprite1 = insertStaticSprite(0x2E068A23, 200);
+	insertStaticSprite(0x401410A6, 200);
+	_asFlowingWater = insertSprite<AsScene2401FlowingWater>();
+	insertStaticSprite(0x90C0A4B4, 200);
+	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x0092916A, 100, 0);
+	_ssFloorButton = insertSprite<Class427>(this, 0x28001120, 0x00911068, 100, 0);
+
+	for (uint i = 0; i < 5; i++)
+		_asWaterFlushing[i] = insertSprite<AsScene2401WaterFlushing>(kScene2401Points[i].x, kScene2401Points[i].y);
+
+	for (uint i = 0; i < 10; i++) {
+		_ssWaterPipes[i] = insertStaticSprite(kScene2401FileHashes1[i], 300);
+		_ssWaterPipes[i]->setVisible(false);
+	}
+	
+	_asWaterSpit[0] = insertSprite<AsScene2401WaterSpit>();
+	_asWaterSpit[1] = insertSprite<AsScene2401WaterSpit>();
+
+	if (which < 0) {
+		insertKlayman<KmScene2401>(200, 447);
+		setMessageList(0x004B2F70);
+		_asDoor = insertSprite<AsScene2401Door>(false);
+	} else if (which == 1) {
+		insertKlayman<KmScene2401>(280, 413);
+		setMessageList(0x004B2F80);
+		_palette->addBasePalette(0xB103B604, 0, 65, 0);
+		_palette->addPalette(0xB103B604, 0, 65, 0);
+		_asDoor = insertSprite<AsScene2401Door>(true);
+	} else {
+		insertKlayman<KmScene2401>(-20, 447);
+		setMessageList(0x004B2F78);
+		_asDoor = insertSprite<AsScene2401Door>(false);
+	}
+
+}
+
+void Scene2401::update() {
+
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		if (_pipeStatus > 0 && _pipeStatus <= 10)
+			_ssWaterPipes[_pipeStatus - 1]->setVisible(false);
+		if (_pipeStatus >= 10) {
+			bool puzzleSolved = true, waterInside = false;
+			for (uint i = 0; i < 5; i++) {
+				if (getSubVar(0x0800547C, i) != getSubVar(0x90405038, i))
+					puzzleSolved = false;
+				if (getSubVar(0x0800547C, i) != 0)
+					waterInside = true;
+			}
+			if (puzzleSolved) {
+				setGlobalVar(0x0045D021, 1);
+				setGlobalVar(0x86615030, 1);
+				sendMessage(_asDoor, 0x4808, 0);
+			} else if (waterInside) {
+				playPipeSound(0xD0431020);
+				for (uint i = 0; i < 5; i++) {
+					sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(0x0800547C, i));
+					setSubVar(0x0800547C, i, 0);
+				}
+			}
+		} else if (_pipeStatus >= 5) {
+			_ssWaterPipes[_pipeStatus]->setVisible(true);
+			_countdown1 = 8;
+			playPipeSound(kScene2401FileHashes3[getSubVar(0x0800547C, _pipeStatus - 5)]);
+		} else {
+			_ssWaterPipes[_pipeStatus]->setVisible(true);
+			_countdown1 = _pipeStatus == 4 ? 16 : 8;
+			playPipeSound(kScene2401FileHashes3[getSubVar(0x90405038, _pipeStatus)]);
+		}
+		_pipeStatus++;
+	}
+
+	if (_countdown2 != 0 && (--_countdown2) == 0) {
+		sendMessage(_asFlowingWater, 0x2003, 0);
+	}
+	
+	Scene::update();
+
+}
+
+uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	// case 0x0001: TODO DEBUG
+	// case 0x000D: TODO DEBUG
+	case 0x100D:
+		if (param.asInteger() == 0x402064D8)
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
+		else if (param.asInteger() == 0x02144CB1)
+			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
+		else if (param.asInteger() == 0x11C40840) {
+			if (getGlobalVar(0x0045D021) && sendMessage(_asDoor, 0x2004, 0)) {
+				setMessageList(0x004B3090);
+			} else {
+				setMessageList(0x004B30B0);
+			}
+		} else if (param.asInteger() == 0x412722C0) {
+			if (_countdown2 > 0 && getGlobalVar(0x45080C38)) {
+				_countdown2 = 144;
+				setMessageList(0x004B3020);
+			} else {
+				setMessageList(0x004B3050);
+			}
+		} else if (param.asInteger() == 0x21142050) {
+			if (_flag && _countdown1 == 0 && getGlobalVar(0x86615030) == 0) {
+				setMessageList(0x004B2FA8);
+			} else {
+				setMessageList(0x004B2FC8);
+			}
+		} else if (param.asInteger() == 0x87441031) {
+			setSurfacePriority(_sprite1->getSurface(), 1100);
+		} else if (param.asInteger() == 0x80C40322) {
+			setSurfacePriority(_sprite1->getSurface(), 200);
+			messageList402220();
+			_flag = true;
+		} else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) {
+			_countdown2 = 12;
+		}
+		break;
+	case 0x2000:
+		messageResult = 0;
+		for (uint32 i = 0; i < 5; i++)
+			if (kScene2401Rects[i].contains(_mouseClickPos.x, _mouseClickPos.y)) {
+				messageResult = i;
+				break;
+			}
+		break;
+	case 0x2001:
+		sendMessage(_asWaterSpit[_asWaterSpitIndex], 0x2000, param.asInteger());
+		_asWaterSpitIndex = (_asWaterSpitIndex + 1) & 1;
+		incSubVar(0x0800547C, param.asInteger(), 1);
+		if (getSubVar(0x0800547C, param.asInteger()) >= 5)
+			setSubVar(0x0800547C, param.asInteger(), 4);
+		break;
+	case 0x480B:
+		if (sender == _ssButton) {
+			_pipeStatus = 0;
+			_countdown1 = 8;
+		} else if (sender == _ssFloorButton && getGlobalVar(0x4E0BE910)) {
+			_countdown2 = 144;
+			sendMessage(_asFlowingWater, 0x2002, 0);
+			_soundResource1.play(0xE1130324);
+		}
+		break;
+	case 0x482A:
+		_palette->addBasePalette(0xB103B604, 0, 65, 0);
+		_palette->startFadeToPalette(12);
+		break;
+	case 0x482B:
+		_palette->addBasePalette(0x91D3A391, 0, 65, 0);
+		_palette->startFadeToPalette(12);
+		break;
+	}
+	return messageResult;
+}
+
+void Scene2401::playPipeSound(uint32 fileHash) {
+	if (_soundToggle)
+		_soundResource1.play(fileHash);
+	else
+		_soundResource2.play(fileHash);
+	_soundToggle = !_soundToggle;
+}
+		
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
new file mode 100644
index 0000000..c8cdb66
--- /dev/null
+++ b/engines/neverhood/module2400.h
@@ -0,0 +1,115 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef NEVERHOOD_MODULE2400_H
+#define NEVERHOOD_MODULE2400_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+#include "neverhood/gamemodule.h"
+#include "neverhood/module1000.h"
+#include "neverhood/module1100.h"
+#include "neverhood/module2100.h"
+
+namespace Neverhood {
+
+// Module2400
+
+class Module2400 : public Module {
+public:
+	Module2400(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Module2400();
+protected:
+	void createScene(int sceneNum, int which);
+	void updateScene();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401WaterSpit : public AnimatedSprite {
+public:
+	AsScene2401WaterSpit(NeverhoodEngine *vm);
+protected:
+	int _soundIndex;
+	SoundResource _soundResource;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401FlowingWater : public AnimatedSprite {
+public:
+	AsScene2401FlowingWater(NeverhoodEngine *vm);
+	virtual ~AsScene2401FlowingWater();
+protected:
+	bool _isWaterFlowing;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401WaterFlushing : public AnimatedSprite {
+public:
+	AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y);
+protected:
+	int _countdown;
+	int _flushLoopCount;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class AsScene2401Door : public AnimatedSprite {
+public:
+	AsScene2401Door(NeverhoodEngine *vm, bool isOpen);
+protected:
+	int _countdown;
+	bool _isOpen;
+	SoundResource _soundResource;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stDoorOpenFinished();
+};
+
+class Scene2401 : public Scene {
+public:
+	Scene2401(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite1;
+	Sprite *_asFlowingWater;
+	Sprite *_ssButton;
+	Sprite *_ssFloorButton;
+	Sprite *_asWaterSpit[2];
+	Sprite *_ssWaterPipes[10];
+	Sprite *_asWaterFlushing[5];
+	Sprite *_asDoor;
+	bool _soundToggle;
+	bool _flag;
+	int _countdown1;
+	int _countdown2;
+	int _pipeStatus;
+	int _asWaterSpitIndex;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void playPipeSound(uint32 fileHash);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2400_H */


Commit: 49f39b0da2bee93e8425c0686f7cc26df443a35f
    https://github.com/scummvm/scummvm/commit/49f39b0da2bee93e8425c0686f7cc26df443a35f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2402

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index c2f0d6a..5be95ee 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -114,6 +114,8 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B55C8,
 	// Scene2401
 	1, 0x004B3140,
+	// Scene2402
+	1, 0x004AF900,
 	// Scene2501
 	1, 0x004B2608,
 	// Scene2801
@@ -404,6 +406,14 @@ static const uint32 messageListOffsets[] = {
 	2, 0x004B3050,
 	4, 0x004B2FA8,
 	4, 0x004B2FC8,
+	// Scene2402
+	1, 0x004AF7C8,
+	2, 0x004AF7D8,
+	1, 0x004AF888,
+	1, 0x004AF7D0,
+	3, 0x004AF800,
+	1, 0x004AF818,
+	2, 0x004AF890,
 	// Scene2501
 	7, 0x004B2538,
 	6, 0x004B2570,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 6f7f629..13bf0bd 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 7c2aa2a22556c84fa8ec1d5f6993dfc8c47fb0c3
    https://github.com/scummvm/scummvm/commit/7c2aa2a22556c84fa8ec1d5f6993dfc8c47fb0c3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Implement Scene2402

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d657307..dcc0995 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -354,7 +354,7 @@ void GameModule::startup() {
 	createModule(2500, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 0;
+	_vm->gameState().sceneNum = 1;
 	createModule(2400, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9a6e4fe..17124e5 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5282,7 +5282,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4833:
 		if (param.asInteger() == 1)
-			GotoState(&Klayman::stWonderAboutHalf);
+			GotoState(&Klayman::stWonderAbout);
 		else {
 			_spitPipeIndex = sendMessage(_parentScene, 0x2000, 0);
 			GotoState(&KmScene2401::stTrySpitIntoPipe);
@@ -5359,6 +5359,90 @@ void KmScene2401::stContSpitIntoPipe() {
 	SetSpriteUpdate(NULL);
 }
 
+KmScene2402::KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+
+uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		if (!getGlobalVar(0x92603A79))
+			GotoState(&KmScene2402::sub415840);
+		else
+			GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_destX = param.asInteger();
+			GotoState(&Klayman::stWalking);
+		} else {
+			GotoState(&Klayman::stPeekWall);
+		}
+		break;
+	case 0x4812:
+		GotoState(&Klayman::stPickUpGeneric);
+		break;
+	case 0x4816:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnPressButton);
+		} else if (param.asInteger() == 2) {
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stWonderAboutHalf);
+		} else if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWonderAboutAfter);
+		} else if (param.asInteger() == 3) {
+			GotoState(&Klayman::stTurnToUseHalf);
+		} else if (param.asInteger() == 4) {
+			GotoState(&Klayman::stTurnAwayFromUse);
+		} else {
+			GotoState(&Klayman::stWonderAbout);
+		}
+		break;
+	case 0x483F:
+		startSpecialWalkRight(param.asInteger());
+		break;
+	case 0x4840:
+		startSpecialWalkLeft(param.asInteger());
+		break;
+	}
+	return messageResult;
+}
+
+void KmScene2402::sub415840() {
+	if (_x > 260)
+		setDoDeltaX(1);
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
+	_newStickFrameIndex = 10;
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteUpdate(NULL);
+}
+
 KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index fdf9b6e..7593bf1 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -595,6 +595,14 @@ protected:
 	void stContSpitIntoPipe();
 };
 
+class KmScene2402 : public Klayman {
+public:
+	KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+	void sub415840();
+};
+
 class KmScene2501 : public Klayman {
 public:
 	KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 4febe74..1c52d68 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -49,6 +49,10 @@ void Module2400::createScene(int sceneNum, int which) {
 		// TODO Music18hList_stop(0xB110382D, 0, 0);
 		_childObject = new Scene2401(_vm, this, which);
 		break;
+	case 1:
+		// TODO Music18hList_play(0xB110382D, 0, 2, 1);
+		_childObject = new Scene2402(_vm, this, which);
+		break;
 	}
 	SetUpdateHandler(&Module2400::updateScene);
 	_childObject->handleUpdate();
@@ -63,6 +67,14 @@ void Module2400::updateScene() {
 			else
 				leaveModule(0);
 			break;
+		case 1:
+			if (_moduleResult == 1)
+				createScene(5, 0);
+			else if (_moduleResult == 2)
+				createScene(7, -1);
+			else
+				createScene(0, 1);
+			break;
 		}
 	}
 }
@@ -497,5 +509,259 @@ void Scene2401::playPipeSound(uint32 fileHash) {
 		_soundResource2.play(fileHash);
 	_soundToggle = !_soundToggle;
 }
+
+static const uint32 kScene2402FileHashes[] = {
+	0xD0910020,
+	0xD0910038,
+	0xD0910008,
+	0xD0910068,
+	0xD09100A8
+};
+
+AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _soundResource(vm) {
+
+	SetUpdateHandler(&AsScene2402Door::update);
+	SetMessageHandler(&AsScene2402Door::handleMessage);
+	createSurface1(0x80495831, 100);
+	_x = 320;
+	_y = 240;
+	_newStickFrameIndex = -2;
+	if (_isOpen) {
+		startAnimation(0x80495831, -1, -1);
+		_countdown = 48;
+	} else {
+		stopAnimation();
+		setVisible(false);
+	}	
+}
+
+void AsScene2402Door::update() {
+	if (_isOpen && _countdown != 0 && (--_countdown) == 0) {
+		_isOpen = false;
+		setVisible(true);
+		startAnimation(0x80495831, -1, -1);
+		_playBackwards = true;
+		_soundResource.play(calcHash("fxDoorClose38"));
+		NextState(&AsScene2402Door::stDoorClosingFinished);
+	}
+	AnimatedSprite::update();
+}
+
+uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		if (_isOpen)
+			_countdown = 144;
+		messageResult = _isOpen ? 1 : 0;
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	case 0x4808:
+		_countdown = 144;
+		_isOpen = true;
+		setVisible(true);
+		startAnimation(0x80495831, 0, -1);
+		_newStickFrameIndex = -2;
+		_soundResource.play(calcHash("fxDoorOpen38"));
+		break;
+	}
+	return messageResult;
+}
+
+void AsScene2402Door::stDoorClosingFinished() {
+	sendMessage(_parentScene, 0x2001, 0);
+	setVisible(false);
+}
+
+AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0),
+	_soundResource(vm) {
+
+	createSurface(100, 640, 480); // TODO Use correct size	from the two hashes
+	SetMessageHandler(&Sprite::handleMessage);
+	_x = 260;
+	_y = 210;
+	setDoDeltaX(1);
+
+	if (!getGlobalVar(0x92603A79)) {
+		_soundResource.load(0x58208810);
+		_countdown1 = 48;
+		startAnimation(0x4919397A, 0, -1);
+		_newStickFrameIndex = 0;
+		SetUpdateHandler(&AsScene2402TV::upWait);
+	} else {
+		int16 frameIndex;
+		if (_klayman->getX() > 320)
+			_currFrameIndex = 29;
+		frameIndex = CLIP<int16>((_klayman->getX() - _x + 150) / 10, 0, 29);
+		startAnimation(0x050A0103, frameIndex, -1);
+		_newStickFrameIndex = frameIndex;
+		_countdown1 = 0;
+		SetUpdateHandler(&AsScene2402TV::upFocusKlayman);
+	}
+
+}
+
+AsScene2402TV::~AsScene2402TV() {
+	// TODO Sound1ChList_sub_407AF0(0x01520123);
+}
+
+void AsScene2402TV::upWait() {
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		startAnimation(0x4919397A, 0, -1);
+		SetMessageHandler(&AsScene2402TV::hmJoke);
+		NextState(&AsScene2402TV::stJokeFinished);
+	}
+	AnimatedSprite::update();
+}
+
+void AsScene2402TV::upFocusKlayman() {
+	int16 frameIndex = CLIP<int16>((_klayman->getX() - _x + 150) / 10, 0, 29);
+	if (frameIndex != _currFrameIndex) {
+		if (frameIndex > _currFrameIndex) {
+			_currFrameIndex++;
+		} else if (frameIndex < _currFrameIndex) {
+			_currFrameIndex--;
+		}
+		startAnimation(0x050A0103, _currFrameIndex, -1);
+		_newStickFrameIndex = _currFrameIndex;
+		if (_countdown2 == 0) {
+			// TODO Sound1ChList_addSoundResource(0x01520123, 0xC42D4528, true);
+			// TODO Sound1ChList_playLooping(0xC42D4528); 
+		}
+		_countdown2 = 5;
+	} else if (_countdown2 != 0 && (--_countdown2 == 0)) {
+		// TODO Sound1ChList_deleteSoundByHash(0xC42D4528);
+	}
+	AnimatedSprite::update();
+}
+
+void AsScene2402TV::stJokeFinished() {
+	setGlobalVar(0x92603A79, 1);
+	startAnimation(0x050A0103, 0, -1);
+	_newStickFrameIndex = 0;
+	SetUpdateHandler(&AsScene2402TV::upFocusKlayman);
+}
+
+uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x431EA0B0) {
+			_soundResource.play();
+		}
+		break;
+	case 0x3002:
+		gotoNextState();
+		break;
+	}
+	return messageResult;
+}
+
+Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _countdown(0), _soundToggle(false),
+	_soundResource1(vm), _soundResource2(vm) {
+	
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2402::handleMessage);
+	SetUpdateHandler(&Scene2402::update);
+
+	setRectList(0x004AF900);
+	setBackground(0x81660220);
+	setPalette(0x81660220);
+	insertMouse433(0x6022481E);
+	_asTape = insertSprite<AsScene1201Tape>(this, 9, 1100, 286, 409, 0x9148A011);
+	_vm->_collisionMan->addSprite(_asTape);
+	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
+	
+	if (which < 0) {
+		insertKlayman<KmScene2402>(198, 404);
+		setMessageList(0x004AF7C8);
+	} else if (which == 1) {
+		insertKlayman<KmScene2402>(660, 404);
+		setMessageList(0x004AF7D8);
+	} else if (which == 2) {
+		insertKlayman<KmScene2402>(409, 404);
+		_klayman->setDoDeltaX(getGlobalVar(0xC0418A02) ? 1 : 0);
+		setMessageList(0x004AF888);
+	} else {
+		insertKlayman<KmScene2402>(0, 404);
+		setMessageList(0x004AF7D0);
+	}
+
+	_sprite1 = insertStaticSprite(0x081A60A8, 1100);
+	_ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100);
+	_klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, _sprite1->getDrawRect().y2());
+	_asDoor = insertSprite<AsScene2402Door>(this, which == 1/*CHECKME or != ?*/);
+	insertSprite<AsScene2402TV>(_klayman);
+	insertStaticSprite(0x3A01A020, 200);
+
+}
+
+Scene2402::~Scene2402() {
+	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+}
+
+void Scene2402::update() {
+	if (_countdown != 0 && (--_countdown) == 0) {
+		if (_pipeStatus >= 10) {
+			sendMessage(_asDoor, 0x4808, 0);
+			_ssDoorFrame->load(0x00B415E0, true, true);
+			_ssDoorFrame->update();
+		} else if (_pipeStatus >= 5) {
+			_countdown = 8;
+			playPipeSound(kScene2402FileHashes[getSubVar(0x0800547C, _pipeStatus - 5)]);
+		} else {
+			_countdown = _pipeStatus == 4 ? 16 : 8;
+			playPipeSound(kScene2402FileHashes[getSubVar(0x90405038, _pipeStatus)]);
+		}
+		_pipeStatus++;
+	}
+	Scene::update();
+}
+
+uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x402064D8) {
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
+		} else if (param.asInteger() == 0x01C66840) {
+			if (sendMessage(_asDoor, 0x2000, 0))
+				setMessageList(0x004AF800);
+			else
+				setMessageList(0x004AF818);
+		}
+		break;
+	case 0x2001:
+		_ssDoorFrame->load(0x406C0AE0, true, true);
+		_ssDoorFrame->update();
+		break;
+	case 0x480B:
+		if (sender == _ssButton) {
+			_pipeStatus = 0;
+			_countdown = 8;
+		}
+		break;
+	case 0x4826:
+		if (sender == _asTape) {
+			sendEntityMessage(_klayman, 0x1014, _asTape);
+			setMessageList(0x004AF890);
+		}
+		break;
+	}
+	return messageResult;
+}
 		
+void Scene2402::playPipeSound(uint32 fileHash) {
+	if (_soundToggle)
+		_soundResource1.play(fileHash);
+	else
+		_soundResource2.play(fileHash);
+	_soundToggle = !_soundToggle;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index c8cdb66..4367901 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -29,6 +29,7 @@
 #include "neverhood/gamemodule.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1100.h"
+#include "neverhood/module1200.h"
 #include "neverhood/module2100.h"
 
 namespace Neverhood {
@@ -110,6 +111,54 @@ protected:
 	void playPipeSound(uint32 fileHash);
 };
 
+class AsScene2402Door : public AnimatedSprite {
+public:
+	AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen);
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	bool _isOpen;
+	SoundResource _soundResource;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void stDoorClosingFinished();
+};
+
+class AsScene2402TV : public AnimatedSprite {
+public:
+	AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman);
+	virtual ~AsScene2402TV();
+protected:
+	Klayman *_klayman;
+	int _countdown1;
+	int _countdown2;
+	SoundResource _soundResource;
+	void upWait();
+	void upFocusKlayman();
+	void stJokeFinished();
+	uint32 hmJoke(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2402 : public Scene {
+public:
+	Scene2402(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene2402();
+protected:
+	Sprite *_sprite1;
+	Sprite *_asDoor;
+	Sprite *_ssButton;
+	Sprite *_asTape;
+	StaticSprite *_ssDoorFrame;
+	int _pipeStatus;
+	int _countdown;
+	bool _soundToggle;
+	SoundResource _soundResource1;
+	SoundResource _soundResource2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void playPipeSound(uint32 fileHash);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2400_H */


Commit: 93614a17a8377a0cf4216c0fe9fbbf83fc82791f
    https://github.com/scummvm/scummvm/commit/93614a17a8377a0cf4216c0fe9fbbf83fc82791f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Implement Scene2406

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index dcc0995..23f6dbc 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -354,7 +354,7 @@ void GameModule::startup() {
 	createModule(2500, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 1;
+	_vm->gameState().sceneNum = 5;
 	createModule(2400, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 17124e5..cebf715 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5443,6 +5443,97 @@ void KmScene2402::sub415840() {
 	SetSpriteUpdate(NULL);
 }
 
+KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// TODO Cliprects
+}
+
+uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4804:
+		if (param.asInteger() != 0) {
+			_destX = param.asInteger();
+			GotoState(&Klayman::stWalking);
+		} else {
+			GotoState(&Klayman::stPeekWall);
+		}
+		break;
+	case 0x4812:
+		if (param.asInteger() == 2)
+			GotoState(&Klayman::stPickUpNeedle);
+		else if (param.asInteger() == 1)
+			GotoState(&Klayman::sub41FFF0);
+		else
+			GotoState(&Klayman::stPickUpGeneric);
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;
+	case 0x481A:
+		GotoState(&Klayman::stInsertDisk);		
+		break;
+	case 0x481B:
+		if (param.asPoint().y != 0)
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		else
+			sub41CCE0(param.asPoint().x);
+		break;
+	case 0x481D:
+		GotoState(&Klayman::stTurnToUse);
+		break;
+	case 0x481E:
+		GotoState(&Klayman::stReturnFromUse);
+		break;
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stWonderAboutHalf);
+		} else if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWonderAboutAfter);
+		} else if (param.asInteger() == 3) {
+			GotoState(&Klayman::stTurnToUseHalf);
+		} else if (param.asInteger() == 4) {
+			GotoState(&Klayman::stTurnAwayFromUse);
+		} else {
+			GotoState(&Klayman::stWonderAbout);
+		}
+		break;
+	case 0x4820:  
+		sendMessage(_parentScene, 0x2000, 0);
+		GotoState(&Klayman::stContinueClimbLadderUp);	 
+		break;
+	case 0x4821:	
+		sendMessage(_parentScene, 0x2000, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderDown);	 
+		break;
+	case 0x4822:  
+		sendMessage(_parentScene, 0x2000, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderUp);	 
+		break;
+	case 0x4823:
+		sendMessage(_parentScene, 0x2001, 0);
+		GotoState(&Klayman::stClimbLadderHalf);	 
+		break;
+	case 0x483F:
+		startSpecialWalkRight(param.asInteger());
+		break;
+	case 0x4840: 
+		startSpecialWalkLeft(param.asInteger());
+		break;
+	}
+	return messageResult;
+}
+	
 KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 7593bf1..0f2077e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -603,6 +603,13 @@ protected:
 	void sub415840();
 };
 
+class KmScene2406 : public Klayman {
+public:
+	KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene2501 : public Klayman {
 public:
 	KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 1c52d68..d161389 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -53,6 +53,10 @@ void Module2400::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xB110382D, 0, 2, 1);
 		_childObject = new Scene2402(_vm, this, which);
 		break;
+	case 5:
+		// TODO Music18hList_play(0xB110382D, 0, 2, 1);
+		_childObject = new Scene2406(_vm, this, which);
+		break;
 	}
 	SetUpdateHandler(&Module2400::updateScene);
 	_childObject->handleUpdate();
@@ -75,6 +79,16 @@ void Module2400::updateScene() {
 			else
 				createScene(0, 1);
 			break;
+		case 5:
+			if (_moduleResult == 1)
+				createScene(2, 0);
+			else if (_moduleResult == 2)
+				createScene(4, 0);
+			else if (_moduleResult == 3)
+				createScene(8, -1);
+			else
+				createScene(1, 1);
+			break;
 		}
 	}
 }
@@ -764,4 +778,115 @@ void Scene2402::playPipeSound(uint32 fileHash) {
 	_soundToggle = !_soundToggle;
 }
 
+Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true) {
+
+	Sprite *tempSprite;
+
+	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) {
+		setGlobalVar(0x13382860, 2);
+	}
+
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2406::handleMessage);
+	
+	setRectList(0x004B78C8);
+	insertMouse433(0xB03001A8);
+
+	if (getGlobalVar(0x13382860) == 2) {
+		_class545 = insertSprite<Class545>(this, 2, 1100, 560, 409);
+		_vm->_collisionMan->addSprite(_class545);
+	}
+
+	_asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011);
+	_vm->_collisionMan->addSprite(_asTape);
+
+	tempSprite = insertStaticSprite(0x19625293, 1100);
+	_clipRects[0].x1 = 0;
+	_clipRects[0].y1 = 0;
+	_clipRects[0].x2 = tempSprite->getDrawRect().x2();
+	_clipRects[0].y2 = 480;
+
+	if (getGlobalVar(0x18890C91)) {
+		setBackground(0x1A0B0304);
+		setPalette(0x1A0B0304);
+		_sprite1 = insertStaticSprite(0x32923922, 1100);
+	} else {
+		setBackground(0x0A038595);
+		setPalette(0x0A038595);
+		_sprite1 = insertStaticSprite(0x1712112A, 1100);
+	}
+	
+	tempSprite = insertStaticSprite(0x22300924, 1300);
+
+	_clipRects[1].x1 = _sprite1->getDrawRect().x;
+	_clipRects[1].y1 = tempSprite->getDrawRect().y;
+	_clipRects[1].x2 = 640;
+	_clipRects[1].y2 = 480;
+
+	if (which < 0) {
+		_flag1 = false;
+		insertKlayman<KmScene2406>(307, 404, _clipRects, 2);
+		setMessageList(0x004B76C8);
+		setRectList(0x004B78C8);
+	} else if (which == 1) {
+		_flag1 = true;
+		insertKlayman<KmScene2406>(253, -16, _clipRects, 2);
+		setMessageList(0x004B76D8);
+		setRectList(0x004B78D8);
+	} else if (which == 2) {
+		_flag1 = false;
+		insertKlayman<KmScene2406>(480, 404, _clipRects, 2);
+		setMessageList(0x004B77C0);
+		setRectList(0x004B78C8);
+	} else if (which == 3) {
+		_flag1 = false;
+		insertKlayman<KmScene2406>(387, 404, _clipRects, 2);
+		setMessageList(0x004B7810);
+		setRectList(0x004B78C8);
+	} else {
+		_flag1 = false;
+		insertKlayman<KmScene2406>(0, 404, _clipRects, 2);
+		setMessageList(0x004B76D0);
+		setRectList(0x004B78C8);
+	}
+
+	tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+	tempSprite->setClipRect(_clipRects[1]);
+
+}
+
+uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x41062804) {
+			if (getGlobalVar(0x18890C91)) {
+				setMessageList(0x004B7758);
+			} else {
+				setMessageList(0x004B7738);
+			}
+		}
+		break;
+	case 0x2000:
+		_flag1 = true;
+		setRectList(0x004B78D8);
+		break;
+	case 0x2001:
+		_flag1 = false;
+		setRectList(0x004B78C8);
+		break;
+	case 0x4826:
+		if (sender == _asTape && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _asTape);
+			setMessageList(0x004B77C8);
+		} else if (sender == _class545 && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _class545);
+			setMessageList(0x004B77D8);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index 4367901..9a593d8 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -31,6 +31,7 @@
 #include "neverhood/module1100.h"
 #include "neverhood/module1200.h"
 #include "neverhood/module2100.h"
+#include "neverhood/module2200.h"
 
 namespace Neverhood {
 
@@ -159,6 +160,18 @@ protected:
 	void playPipeSound(uint32 fileHash);
 };
 
+class Scene2406 : public Scene {
+public:
+	Scene2406(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_sprite1;
+	Sprite *_asTape;
+	Sprite *_class545;
+	NRect _clipRects[2];
+	bool _flag1;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2400_H */


Commit: 23864562238cacfc4bdd4d6ddc151e900c89c51d
    https://github.com/scummvm/scummvm/commit/23864562238cacfc4bdd4d6ddc151e900c89c51d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2406

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 5be95ee..2b51b6e 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -116,7 +116,10 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B3140,
 	// Scene2402
 	1, 0x004AF900,
-	// Scene2501
+	// Scene2406
+	1, 0x004B78C8,
+	1, 0x004B78D8,
+	// Scene2501	
 	1, 0x004B2608,
 	// Scene2801
 	1, 0x004B6CE0,
@@ -414,6 +417,16 @@ static const uint32 messageListOffsets[] = {
 	3, 0x004AF800,
 	1, 0x004AF818,
 	2, 0x004AF890,
+	// Scene2406
+	1, 0x004B76C8,
+	3, 0x004B76D8,
+	1, 0x004B77C0,
+	1, 0x004B7810,
+	1, 0x004B76D0,
+	2, 0x004B77C8,
+	2, 0x004B77D8,
+	2, 0x004B7758,
+	4, 0x004B7738,
 	// Scene2501
 	7, 0x004B2538,
 	6, 0x004B2570,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 13bf0bd..a341ae8 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: a94c1fcb8f8b1aac20a20c17a6b4a3bfff931ae6
    https://github.com/scummvm/scummvm/commit/a94c1fcb8f8b1aac20a20c17a6b4a3bfff931ae6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2403

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 2b51b6e..eb210f8 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -116,6 +116,9 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B3140,
 	// Scene2402
 	1, 0x004AF900,
+	// Scene2403
+	1, 0x004B5E18,
+	1, 0x004B5E28,
 	// Scene2406
 	1, 0x004B78C8,
 	1, 0x004B78D8,
@@ -417,6 +420,11 @@ static const uint32 messageListOffsets[] = {
 	3, 0x004AF800,
 	1, 0x004AF818,
 	2, 0x004AF890,
+	// Scene2403
+	1, 0x004B5C98,
+	1, 0x004B5D70,
+	4, 0x004B5CA0,
+	2, 0x004B5D98,
 	// Scene2406
 	1, 0x004B76C8,
 	3, 0x004B76D8,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index a341ae8..26a705e 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 1a581543a79ed90547e9db2d741cab66424d5225
    https://github.com/scummvm/scummvm/commit/1a581543a79ed90547e9db2d741cab66424d5225
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Implement Scene2403

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



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


Commit: ee36d5d5e3ae6f5cb357f3d68c711e2fbfbdef8b
    https://github.com/scummvm/scummvm/commit/ee36d5d5e3ae6f5cb357f3d68c711e2fbfbdef8b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add remaining scenes in Module2400

Changed paths:
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 22ea30b..02e6225 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -57,10 +57,27 @@ void Module2400::createScene(int sceneNum, int which) {
 		// TODO Music18hList_play(0xB110382D, 0, 0, 1);
 		_childObject = new Scene2403(_vm, this, which);
 		break;
+	case 4:
+		// TODO Music18hList_stop(0xB110382D, 0, 2);
+		_childObject = new DiskplayerScene(_vm, this, 0);
+		break;
 	case 5:
 		// TODO Music18hList_play(0xB110382D, 0, 2, 1);
 		_childObject = new Scene2406(_vm, this, which);
 		break;
+	case 6:
+		// TODO Music18hList_stop(0xB110382D, 0, 2);
+		createSmackerScene(0x20D80001, true, true, false);
+		break;
+	case 7:
+		_childObject = new Class152(_vm, this, 0x81523218, 0x2321C81D);
+		break;
+	case 8:
+		_childObject = new Class152(_vm, this, 0x08100210, 0x00214089);
+		break;
+	case 9:
+		_childObject = new Class152(_vm, this, 0x8C020505, 0x205018C8);
+		break;
 	}
 	SetUpdateHandler(&Module2400::updateScene);
 	_childObject->handleUpdate();
@@ -91,6 +108,9 @@ void Module2400::updateScene() {
 			else
 				createScene(5, 1);
 			break;
+		case 4:
+			createScene(5, 2);
+			break;
 		case 5:
 			if (_moduleResult == 1)
 				createScene(2, 0);
@@ -101,6 +121,18 @@ void Module2400::updateScene() {
 			else
 				createScene(1, 1);
 			break;
+		case 6:
+			createScene(2, 2);
+			break;
+		case 7:
+			createScene(1, 2);
+			break;
+		case 8:
+			createScene(5, 3);
+			break;
+		case 9:
+			createScene(2, 1);
+			break;
 		}
 	}
 }
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index 16c1d64..e29f03d 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -33,6 +33,7 @@
 #include "neverhood/module2100.h"
 #include "neverhood/module2200.h"
 #include "neverhood/module2800.h"
+#include "neverhood/diskplayerscene.h"
 
 namespace Neverhood {
 


Commit: d1d1596fd136783a7bc4db9264ba1627b8511355
    https://github.com/scummvm/scummvm/commit/d1d1596fd136783a7bc4db9264ba1627b8511355
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:41-07:00

Commit Message:
NEVERHOOD: Add support for shadow sprites, used only for the shadow of the car/vehicle thing

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 19bdc65..6245cc8 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -339,7 +339,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 8;
 	createModule(2600, -1);
 #endif
-#if 0
+#if 1
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
@@ -353,7 +353,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(2500, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 2;
 	createModule(2400, -1);
 #endif
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 5bb9424..a58cdcb 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -131,6 +131,19 @@ void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, N
 	}
 }
 
+// ShadowSurface
+
+ShadowSurface::ShadowSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height, BaseSurface *shadowSurface)
+	: BaseSurface(vm, priority, width, height), _shadowSurface(shadowSurface) {
+	// Empty
+}
+
+void ShadowSurface::draw() {
+	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
+		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _shadowSurface->getSurface());
+	}
+}
+
 // FontSurface
 
 FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 7725e73..5e91bdb 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -116,6 +116,14 @@ protected:
 	bool _transparent;
 };
 
+class ShadowSurface : public BaseSurface {
+public:
+	ShadowSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height, BaseSurface *shadowSurface);
+	virtual void draw();
+protected:
+	BaseSurface *_shadowSurface;
+};
+
 class FontSurface : public BaseSurface {
 public:
 	FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 3cb2379..84b98af 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -303,9 +303,9 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		_currTrackIndex = 0;
 	}
 
-	// TODO _class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-	// TODO _class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-	// TODO _class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
 	insertSprite<Class518>(_class521);
 	
 	_pointListsCount = 3;
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index c3c046e..756c75e 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -67,9 +67,9 @@ public:
 protected:
 	Class521 *_class521;
 	Sprite *_class437;
-	// TODO Sprite *_class517;
-	// TODO Sprite *_class519;
-	// TODO Sprite *_class520;
+	Sprite *_class517;
+	Sprite *_class519;
+	Sprite *_class520;
 	Sprite *_class541;
 	Sprite *_class542;
 	Klayman *_kmScene2501;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 862b832..71ce229 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -512,6 +512,19 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
 }
 
+static const NPoint kClass517Points[] = {
+	{-63,  3},
+	{-48, 40},
+	{-33, 58},
+	{  0, 65},
+	{ 40, 53},
+	{ 56, 27},
+	{ 63,  0},
+	{-30, 26},
+	{  0, 30},
+	{ 26, 25}
+};
+
 Class437::Class437(NeverhoodEngine *vm, uint32 fileHash)
 	: StaticSprite(vm, 0) {
 	
@@ -524,6 +537,70 @@ Class437::Class437(NeverhoodEngine *vm, uint32 fileHash)
 	StaticSprite::update();
 }
 
+Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index)
+	: AnimatedSprite(vm, 1100), _class521(class521), _index(index), _animFileHash(0) {
+
+	SetUpdateHandler(&Class517::update);
+	createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource
+	updateShadow();
+} 
+
+void Class517::update() {
+	updateShadow();
+	AnimatedSprite::update();
+}
+
+void Class517::updateShadow() {
+	if (_class521->getFrameIndex() != _currFrameIndex || _class521->getCurrAnimFileHash() != _animFileHash) {
+		uint32 fileHash = _class521->getCurrAnimFileHash();
+		if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 ||
+			fileHash == 0x9966B138 || fileHash == 0xB579A77C || fileHash == 0xA86A9538 ||
+			fileHash == 0xD4220027 || fileHash == 0xD00A1364 || fileHash == 0xD4AA03A4 ||
+			fileHash == 0xF46A0324) {
+			startAnimation(fileHash, _class521->getFrameIndex(), -1);
+			_newStickFrameIndex = _class521->getFrameIndex();
+		}
+		_animFileHash = fileHash;
+	}
+	_x = _class521->getX() + kClass517Points[_index].x;
+	_y = _class521->getY() + kClass517Points[_index].y;
+	if (!_class521->getVisible()) {
+		startAnimation(0x1209E09F, 0, -1);
+		_newStickFrameIndex = 0;
+	}
+	setDoDeltaX(_class521->isDoDeltaX() ? 1 : 0);
+}
+
+Class519::Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index)
+	: AnimatedSprite(vm, 1100), _class521(class521), _index(index) {
+
+	SetUpdateHandler(&Class519::update);
+	createShadowSurface1(shadowSurface, 0x60281C10, 150);
+	startAnimation(0x60281C10, -1, -1);
+	_newStickFrameIndex = -2;	
+} 
+
+void Class519::update() {
+	_x = _class521->getX() + kClass517Points[_index].x;
+	_y = _class521->getY() + kClass517Points[_index].y;
+	AnimatedSprite::update();
+}
+
+Class520::Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex)
+	: AnimatedSprite(vm, 1100), _class521(class521) {
+
+	SetUpdateHandler(&Class520::update);
+	createShadowSurface1(shadowSurface, 0x0759129C, 100);
+	startAnimation(0x0759129C, frameIndex, -1);
+	_newStickFrameIndex = frameIndex;
+} 
+
+void Class520::update() {
+	_x = _class521->getX();
+	_y = _class521->getY();
+	AnimatedSprite::update();
+}
+
 Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
@@ -546,17 +623,20 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2());
 
 	if (sceneInfo->class437Filename) {
-		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
+
+		_class437 = createSprite<Class437>(sceneInfo->class437Filename);
+		addEntity(_class437);
+
 		_class521 = insertSprite<Class521>(this, 320, 240);
-//TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-//TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-//TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
 	} else {
 		_class437 = NULL;
 		_class521 = insertSprite<Class521>(this, 320, 240);
 	}
 
-//TODO	_class518 = insertSprite<Class518>(_class521);
+	_class518 = insertSprite<Class518>(_class521);
 	
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
@@ -578,7 +658,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	_class521->setClipRect(clipRect);
-	// TODO _class518->setClipRect(clipRect);
+	_class518->setClipRect(clipRect);
 
 	if (which == 1) {
 		SetMessageHandler(&Scene2701::handleMessage42F500);
@@ -654,12 +734,14 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B04180);
 
-	_class437 = insertSprite<Class437>(0x12002035);
+	_class437 = createSprite<Class437>(0x12002035);
+	addEntity(_class437);
+	
 	_class521 = insertSprite<Class521>(this, 320, 240);
-	//TODO	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-	//TODO	insertSprite<Class518>(_class521);
-	//TODO	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-	//TODO	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+	insertSprite<Class518>(_class521);
+	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
 
 	_dataResource.load(0x04310014);
 	
@@ -828,18 +910,21 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	insertMouse433(sceneInfo->mouseCursorFilename);
 	
 	if (sceneInfo->class437Filename) {
-		_class437 = insertSprite<Class437>(sceneInfo->class437Filename);
+
+		_class437 = createSprite<Class437>(sceneInfo->class437Filename);
+		addEntity(_class437);
+
 		_class521 = insertSprite<Class521>(this, 320, 240);
-//TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-//TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-//TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
 	} else {
 		_class437 = NULL;
-//TODO		_class517 = NULL;
+		_class517 = NULL;
 		_class521 = insertSprite<Class521>(this, 320, 240);
 	}
 
-//TODO	_class518 = insertSprite<Class518>(_class521);
+	_class518 = insertSprite<Class518>(_class521);
 	
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
@@ -871,7 +956,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	
 	if (clipRect) {
 		_class521->getClipRect() = *clipRect;
-#if 0		
 		if (_class517)
 			_class517->getClipRect() = *clipRect; 
 		if (_class520)
@@ -880,7 +964,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 			_class519->getClipRect() = *clipRect; 
 		if (_class518)
 			_class518->getClipRect() = *clipRect;
-#endif			 
 	}
 
 }
@@ -932,12 +1015,14 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B8C180);
 
-	_class437 = insertSprite<Class437>(0x18808B88);
+	_class437 = createSprite<Class437>(0x18808B88);
+	addEntity(_class437);
+	
 	_class521 = insertSprite<Class521>(this, 320, 240);
-//TODO		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-//TODO		_class518 = insertSprite<Class518>(_class521);
-//TODO		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-//TODO		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
+	_class518 = insertSprite<Class518>(_class521);
+	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
+	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
 
 	_dataResource.load(0x06000162);
 	
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index f1ef3f5..bed9a7d 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -58,6 +58,34 @@ public:
 	Class437(NeverhoodEngine *vm, uint32 fileHash);
 };
 
+class Class517 : public AnimatedSprite {
+public:
+	Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index);
+protected:
+	uint _index;
+	AnimatedSprite *_class521;
+	uint32 _animFileHash;
+	void update();
+	void updateShadow();
+};
+
+class Class519 : public AnimatedSprite {
+public:
+	Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index);
+protected:
+	uint _index;
+	Sprite *_class521;
+	void update();
+};
+
+class Class520 : public AnimatedSprite {
+public:
+	Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex);
+protected:
+	Sprite *_class521;
+	void update();
+};
+
 class Scene2701 : public Scene {
 public:
 	Scene2701(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -104,6 +132,10 @@ public:
 protected:
 	Class521 *_class521;
 	Sprite *_class437;
+	Sprite *_class517;
+	Sprite *_class518;
+	Sprite *_class520;
+	Sprite *_class519;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
 	NRectArray *_rectList;
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 351e51a..dfc5358 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -36,6 +36,7 @@ Screen::Screen(NeverhoodEngine *vm)
 }
 
 Screen::~Screen() {
+	_backScreen->free();
 	delete _backScreen;
 }
 
@@ -94,16 +95,17 @@ void Screen::clear() {
 	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
 }
 
-void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent) {
+void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent,
+	const Graphics::Surface *shadowSurface) {
 
 	int16 destX, destY;
 	NRect ddRect;
-	
+
 	if (drawRect.x + drawRect.width >= clipRect.x2)
 		ddRect.x2 = clipRect.x2 - drawRect.x;
 	else
 		ddRect.x2 = drawRect.width;
-		
+
 	if (drawRect.x < clipRect.x1) {
 		destX = clipRect.x1;
 		ddRect.x1 = clipRect.x1 - drawRect.x;
@@ -127,7 +129,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 	
 	//debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
 
-	blit(surface, destX, destY, ddRect, transparent);
+	blit(surface, destX, destY, ddRect, transparent, shadowSurface);
 
 	// Useful for debugging	
 	//_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); 
@@ -171,7 +173,8 @@ void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, ND
 
 }
 
-void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent) {
+void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent,
+	const Graphics::Surface *shadowSurface) {
 
 	const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
 	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
@@ -181,7 +184,17 @@ void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NR
 	if (width <= 0 || height <= 0)
 		return;
 	
-	if (!transparent) {
+	if (shadowSurface) {
+		const byte *shadowSource = (const byte*)shadowSurface->getBasePtr(destX, destY);
+		while (height--) {
+			for (int xc = 0; xc < width; xc++)
+				if (source[xc] != 0)
+					dest[xc] = shadowSource[xc];
+			source += surface->pitch;
+			shadowSource += shadowSurface->pitch;
+			dest += _backScreen->pitch;
+		}
+	} else if (!transparent) {
 		while (height--) {
 			memcpy(dest, source, width);
 			source += surface->pitch;
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index e813e63..07be04c 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -42,9 +42,12 @@ public:
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();
-	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent);
+	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent,
+		const Graphics::Surface *shadowSurface = NULL);
 	void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent);
-	void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent);
+	void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect);
+	void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent,
+		const Graphics::Surface *shadowSurface = NULL);
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
 	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent);
 protected:
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index b68434b..66f1178 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -28,7 +28,7 @@ namespace Neverhood {
 
 Sprite::Sprite(NeverhoodEngine *vm, int objectPriority)
 	: Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
-	_dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0) {
+	_dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0), _surface(NULL) {
 
 	_name = "Sprite"; 
 	SetMessageHandler(&Sprite::handleMessage);
@@ -438,6 +438,15 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
 	_surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height);
 }
 
+void AnimatedSprite::createShadowSurface1(BaseSurface *shadowSurface, uint32 fileHash, int surfacePriority) {
+	NDimensions dimensions = _animResource.loadSpriteDimensions(fileHash);
+	_surface = new ShadowSurface(_vm, surfacePriority, dimensions.width, dimensions.height, shadowSurface);
+}
+
+void AnimatedSprite::createShadowSurface(BaseSurface *shadowSurface, int16 width, int16 height, int surfacePriority) {
+	_surface = new ShadowSurface(_vm, surfacePriority, width, height, shadowSurface);
+}
+
 void AnimatedSprite::startAnimation(uint32 fileHash, int16 plFirstFrameIndex, int16 plLastFrameIndex) {
 	debug(2, "AnimatedSprite::startAnimation(%08X, %d, %d)", fileHash, plFirstFrameIndex, plLastFrameIndex);
 	_newAnimFileHash = fileHash;
@@ -506,7 +515,7 @@ void AnimatedSprite::gotoNextState() {
 	if (_nextStateCb) {
 		_currStateCb = _nextStateCb;
 		_nextStateCb = NULL;
-		debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str());
+		//debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str());
 		(this->*_currStateCb)();
 #if 0 // TODO		
 	} else if (_callbackList) {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index bc7c0a5..d34704d 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -58,6 +58,7 @@ public:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void loadDataResource(uint32 fileHash);
 	int16 defFilterY(int16 y);
+	bool getVisible() const { return _surface->getVisible(); }
 	void setVisible(bool value) { _surface->setVisible(value); }
 	NDrawRect& getDrawRect() { return _surface->getDrawRect(); }
 	// Some shortcuts to set the clipRect
@@ -157,6 +158,8 @@ protected:
 	void updateFrameIndex();
 	void updateFrameInfo();
 	void createSurface1(uint32 fileHash, int surfacePriority);
+	void createShadowSurface1(BaseSurface *shadowSurface, uint32 fileHash, int surfacePriority);
+	void createShadowSurface(BaseSurface *shadowSurface, int16 width, int16 height, int surfacePriority);
 	void stopAnimation();
 	void startAnimationByHash(uint32 fileHash, uint32 plFirstFrameHash, uint32 plLastFrameHash);
 	void nextAnimationByHash(uint32 fileHash2, uint32 plFirstFrameHash, uint32 plLastFrameHash);


Commit: 96153bfe04fff5edc8253226125b225cee6681a0
    https://github.com/scummvm/scummvm/commit/96153bfe04fff5edc8253226125b225cee6681a0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: Implement TextSurface, used in the save/load menus

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index a58cdcb..b1597f2 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -168,6 +168,40 @@ void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const b
 	}	
 }
 
+// TextSurface
+
+TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount,
+		byte firstChar, uint16 charWidth, uint16 charHeight)
+		: BaseSurface(vm, 0, charWidth * charCount, charHeight * numRows),
+		_numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight),
+		_fileHash(fileHash), _charCount(charCount) {
+		
+		SpriteResource spriteResource(_vm);
+		spriteResource.load2(_fileHash);
+		drawSpriteResourceEx(spriteResource, false, false, 0, 0);
+}
+
+void TextSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) {
+	NDrawRect sourceRect;
+	chr -= _firstChar;
+	sourceRect.x = (chr % 16) * _charWidth;
+	sourceRect.y = (chr / 16) * _charHeight;
+	sourceRect.width = _charWidth;
+	sourceRect.height = _charHeight;
+	destSurface->copyFrom(_surface, x, y, sourceRect, true);
+}
+
+void TextSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) {
+	for (; stringLen > 0; stringLen--, string++) {
+		drawChar(destSurface, x, y, *string);
+		x += _charWidth;
+	}	
+}
+
+int16 TextSurface::getStringWidth(const byte *string, int stringLen) {
+	return string ? stringLen * _charWidth : 0;
+}
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 5e91bdb..3b30b25 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -137,6 +137,22 @@ protected:
 	uint16 _charHeight;
 };
 
+class TextSurface : public BaseSurface {
+public:
+	TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount,
+		byte firstChar, uint16 charWidth, uint16 charHeight);
+	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
+	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen);
+	int16 getStringWidth(const byte *string, int stringLen);
+protected:
+	uint16 _numRows;
+	byte _firstChar;
+	uint16 _charWidth;
+	uint16 _charHeight;
+	uint32 _fileHash;
+	uint _charCount;
+};
+
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels);


Commit: 65afa25c9f2862fffba5e8a0588547ef52854b35
    https://github.com/scummvm/scummvm/commit/65afa25c9f2862fffba5e8a0588547ef52854b35
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: Implement the SoundMan; no sound is played yet since the important code doesn't exist yet

Changed paths:
  A engines/neverhood/sound.cpp
  A engines/neverhood/sound.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 694d92d..f9f349b 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -41,6 +41,7 @@ MODULE_OBJS = \
 	screen.o \
 	smackerscene.o \
 	smackerplayer.o \
+	sound.o \
 	sprite.o \
 	staticdata.o
 
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 7fa6fb0..abd9374 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -35,6 +35,7 @@
 #include "neverhood/resourceman.h"
 #include "neverhood/resource.h"
 #include "neverhood/screen.h"
+#include "neverhood/sound.h"
 #include "neverhood/staticdata.h"
 
 namespace Neverhood {
@@ -98,6 +99,8 @@ Common::Error NeverhoodEngine::run() {
 
 #if 1
 
+	_soundMan = new SoundMan(this);
+	
 	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
 	
@@ -145,6 +148,7 @@ Common::Error NeverhoodEngine::run() {
 	
 	delete _gameModule;
 	delete _collisionMan;
+	delete _soundMan;
 #endif
 
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index b7c276e..13ea399 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -45,6 +45,7 @@ class GameModule;
 class GameVars;
 class ResourceMan;
 class Screen;
+class SoundMan;
 class StaticData;
 struct NPoint;
 
@@ -84,6 +85,8 @@ public:
 	GameModule *_gameModule;
 	StaticData *_staticData;
 	CollisionMan *_collisionMan;
+	
+	SoundMan *_soundMan;
 
 public:
 	
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 65f98a8..7b0aa94 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -654,12 +654,18 @@ bool SoundResource::isPlaying() {
 void SoundResource::load(uint32 fileHash) {
 }
 
+void SoundResource::unload() {
+}
+
 void SoundResource::play(uint32 fileHash, bool looping) {
 }
 
 void SoundResource::play() {
 }
 
+void SoundResource::setVolume(int volume) {
+}
+
 uint32 calcHash(const char *value) {
 	uint32 hash = 0, shiftValue = 0;
 	while (*value != 0) {
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 6436509..b0cd464 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -198,9 +198,11 @@ public:
 	SoundResource(NeverhoodEngine *vm);
 	bool isPlaying();
 	void load(uint32 fileHash);
+	void unload();
 	void play(uint32 fileHash, bool looping = false);
 	void play();
 	void stop() { /*DUMMY*/ }
+	void setVolume(int volume);
 protected:
 	NeverhoodEngine *_vm;	
 };
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
new file mode 100644
index 0000000..38ccce9
--- /dev/null
+++ b/engines/neverhood/sound.cpp
@@ -0,0 +1,413 @@
+/* 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 "graphics/palette.h"
+#include "neverhood/sound.h"
+
+namespace Neverhood {
+
+// TODO Put more stuff into the constructors/destructors of the item structs
+// TODO Some parts are quite bad here, but my priority is to get sound working at all
+
+MusicResource::MusicResource(NeverhoodEngine *vm)
+	: _vm(vm) {
+}
+
+bool MusicResource::isPlaying() { 
+	return false; 
+}
+
+void MusicResource::load(uint32 fileHash) {
+	// TODO
+}
+
+void MusicResource::unload() {
+	// TODO
+}
+
+void MusicResource::play(int16 fadeVolumeStep) {
+	// TODO
+}
+
+void MusicResource::stop(int16 fadeVolumeStep) {
+	// TODO
+}
+
+SoundMan::SoundMan(NeverhoodEngine *vm)
+	: _vm(vm),
+	_soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) {
+}
+
+SoundMan::~SoundMan() {
+	// TODO Clean up
+}
+
+void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) {
+	MusicItem *musicItem = new MusicItem();
+	musicItem->_nameHash = nameHash;
+	musicItem->_musicFileHash = musicFileHash;
+	musicItem->_play = false;
+	musicItem->_stop = false;
+	musicItem->_fadeVolumeStep = 0;
+	musicItem->_countdown = 24;
+	musicItem->_musicResource = new MusicResource(_vm);
+	musicItem->_musicResource->load(musicFileHash);
+	// TODO Is this needed? musicItem->_musicResource->init();
+	_musicItems.push_back(musicItem);
+}
+
+void SoundMan::deleteMusic(uint32 musicFileHash) {
+	for (uint i = 0; i < _musicItems.size(); ++i) {
+		MusicItem *musicItem = _musicItems[i];
+		if (musicItem->_musicFileHash == musicFileHash) {
+			musicItem->_musicResource->unload();
+			delete musicItem->_musicResource;
+			delete musicItem;
+			_musicItems.remove_at(i);
+			break;
+		}
+	}
+}
+
+void SoundMan::startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) {
+	for (uint i = 0; i < _musicItems.size(); ++i) {
+		MusicItem *musicItem = _musicItems[i];
+		if (musicItem->_musicFileHash == musicFileHash) {
+			musicItem->_play = true;
+			musicItem->_stop = false;
+			musicItem->_countdown = countdown;
+			musicItem->_fadeVolumeStep = fadeVolumeStep;
+			break;
+		}
+	}
+}
+
+void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) {
+	for (uint i = 0; i < _musicItems.size(); ++i) {
+		MusicItem *musicItem = _musicItems[i];
+		if (musicItem->_musicFileHash == musicFileHash) {
+			musicItem->_play = false;
+			musicItem->_stop = true;
+			musicItem->_countdown = countdown;
+			musicItem->_fadeVolumeStep = fadeVolumeStep;
+			break;
+		}
+	}
+}
+
+void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) {
+	SoundItem *soundItem = new SoundItem();
+	soundItem->_nameHash = nameHash;
+	soundItem->_soundFileHash = soundFileHash;
+	soundItem->_playOnceAfterRandomCountdown = false;
+	soundItem->_minCountdown = 50;
+	soundItem->_maxCountdown = 600;
+	soundItem->_playOnceAfterCountdown = false;
+	soundItem->_initialCountdown = 0;
+	soundItem->_playLooping = false;
+	soundItem->_currCountdown = 0;
+	soundItem->_soundResource = new SoundResource(_vm);
+	soundItem->_soundResource->load(soundFileHash);
+	_soundItems.push_back(soundItem);
+}
+
+void SoundMan::addSoundList(uint32 nameHash, uint32 *soundFileHashList) {
+	while (*soundFileHashList)
+		addSound(nameHash, *soundFileHashList++);
+}
+
+void SoundMan::deleteSound(uint32 soundFileHash) {
+	for (uint i = 0; i < _soundItems.size(); ++i) {
+		SoundItem *soundItem = _soundItems[i];
+		if (soundItem->_soundFileHash == soundFileHash) {
+			soundItem->_soundResource->unload();
+			delete soundItem->_soundResource;
+			delete soundItem;
+			_soundItems.remove_at(i);
+			break;
+		}
+	}
+}
+
+void SoundMan::setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown,
+	int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) {
+
+	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
+	if (soundItem) {
+		soundItem->_playOnceAfterCountdown = false;
+		soundItem->_playLooping = false;
+		soundItem->_playOnceAfterRandomCountdown = playOnceAfterRandomCountdown;
+		if (minCountdown > 0)
+			soundItem->_minCountdown = minCountdown;
+		if (maxCountdown > 0)
+			soundItem->_maxCountdown = maxCountdown;
+		if (firstMinCountdown >= firstMaxCountdown)
+			soundItem->_currCountdown = firstMinCountdown;
+		else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown)
+			soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown);
+	}
+}
+
+void SoundMan::setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
+	int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) {
+
+	while (*soundFileHashList)
+		setSoundParams(*soundFileHashList++, playOnceAfterRandomCountdown,
+			minCountdown, maxCountdown, firstMinCountdown, firstMaxCountdown);
+}
+
+void SoundMan::playSoundLooping(uint32 soundFileHash) {
+	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
+	if (soundItem) {
+		soundItem->_playOnceAfterRandomCountdown = false;
+		soundItem->_playOnceAfterCountdown = false;
+		soundItem->_playLooping = true;
+	}
+}
+
+void SoundMan::stopSound(uint32 soundFileHash) {
+	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
+	if (soundItem) {
+		soundItem->_playOnceAfterRandomCountdown = false;
+		soundItem->_playOnceAfterCountdown = false;
+		soundItem->_playLooping = false;
+		soundItem->_soundResource->stop();
+	}
+}
+
+void SoundMan::setSoundVolume(uint32 soundFileHash, int volume) {
+	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
+	if (soundItem)
+		soundItem->_soundResource->setVolume(volume);
+}
+
+void SoundMan::update() {
+	// TODO Check if active
+	
+	for (uint i = 0; i < _soundItems.size(); ++i) {
+		SoundItem *soundItem = _soundItems[i];
+		if (soundItem->_playOnceAfterCountdown) {
+			if (soundItem->_currCountdown == 0) {
+				soundItem->_currCountdown = soundItem->_initialCountdown;
+			} else if (--soundItem->_currCountdown == 0) {
+				soundItem->_soundResource->play();
+			}
+		} else if (soundItem->_playOnceAfterRandomCountdown) {
+			if (soundItem->_currCountdown == 0) {
+				if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown)
+					soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown);
+			} else if (--soundItem->_currCountdown == 0) {
+				soundItem->_soundResource->play();
+			}
+		} else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) {
+			soundItem->_soundResource->play(); // TODO Looping parameter?
+		}
+	}
+
+	for (uint i = 0; i < _musicItems.size(); ++i) {
+		MusicItem *musicItem = _musicItems[i];
+		if (musicItem->_countdown) {
+			--musicItem->_countdown;
+		} else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) {
+			musicItem->_musicResource->play(musicItem->_fadeVolumeStep);
+			musicItem->_fadeVolumeStep = 0;
+		} else if (musicItem->_stop) {
+			musicItem->_musicResource->stop(musicItem->_fadeVolumeStep);
+			musicItem->_fadeVolumeStep = 0;
+			musicItem->_stop = false;
+		}
+	}
+
+}
+
+void SoundMan::deleteGroup(uint32 nameHash) {
+	deleteMusicGroup(nameHash);
+	deleteSoundGroup(nameHash);
+}
+
+void SoundMan::deleteMusicGroup(uint32 nameHash) {
+	for (int index = _musicItems.size() - 1; index >= 0; --index) {
+		MusicItem *musicItem = _musicItems[index];
+		if (musicItem->_nameHash == nameHash) {
+			musicItem->_musicResource->unload();
+			delete musicItem->_musicResource;
+			delete musicItem;
+			_musicItems.remove_at(index);
+		}
+	}
+}
+
+void SoundMan::deleteSoundGroup(uint32 nameHash) {
+
+	SoundItem *soundItem;
+
+	if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) {
+		soundItem = _soundItems[_soundIndex1];
+		soundItem->_soundResource->unload();
+		delete soundItem->_soundResource;
+		delete soundItem;
+		_soundItems.remove_at(_soundIndex1);
+		_soundIndex1 = -1;
+	}
+
+	if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->_nameHash == nameHash) {
+		soundItem = _soundItems[_soundIndex2];
+		soundItem->_soundResource->unload();
+		delete soundItem->_soundResource;
+		delete soundItem;
+		_soundItems.remove_at(_soundIndex2);
+		_soundIndex2 = -1;
+	}
+
+	for (int index = _soundItems.size() - 1; index >= 0; --index) {
+		soundItem = _soundItems[index];
+		if (soundItem->_nameHash == nameHash) {
+			soundItem->_soundResource->unload();
+			delete soundItem->_soundResource;
+			delete soundItem;
+			_soundItems.remove_at(index);
+		}
+	}
+
+}
+
+void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown) {
+
+	SoundItem *soundItem;
+	int16 currCountdown1 = _initialCountdown;
+	int16 currCountdown2 = _initialCountdown / 2;
+
+	if (_soundIndex1 != -1) {
+		soundItem = _soundItems[_soundIndex1];
+		currCountdown1 = soundItem->_currCountdown;
+		soundItem->_soundResource->unload();
+		delete soundItem->_soundResource;
+		delete soundItem;
+		_soundItems.remove_at(_soundIndex1);
+		_soundIndex1 = -1;
+	}
+
+	if (_soundIndex2 != -1) {
+		soundItem = _soundItems[_soundIndex2];
+		currCountdown2 = soundItem->_currCountdown;
+		soundItem->_soundResource->unload();
+		delete soundItem->_soundResource;
+		delete soundItem;
+		_soundItems.remove_at(_soundIndex2);
+		_soundIndex2 = -1;
+	}
+
+	if (initialCountdown > 0)
+		_initialCountdown = initialCountdown;
+
+	if (soundFileHash1 != 0) {
+		soundItem = new SoundItem();
+		soundItem->_nameHash = nameHash;
+		soundItem->_soundFileHash = soundFileHash1;
+		soundItem->_playOnceAfterRandomCountdown = false;
+		soundItem->_minCountdown = 0;
+		soundItem->_maxCountdown = 0;
+		soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown;
+		soundItem->_initialCountdown = _initialCountdown;
+		soundItem->_playLooping = false;
+		soundItem->_currCountdown = currCountdown1;
+		soundItem->_soundResource = new SoundResource(_vm);
+		soundItem->_soundResource->load(soundFileHash1);
+		soundItem->_soundResource->setVolume(80);
+		_soundIndex1 = _soundItems.size();
+		_soundItems.push_back(soundItem);
+	}
+
+	if (soundFileHash2 != 0) {
+		soundItem = new SoundItem();
+		soundItem->_nameHash = nameHash;
+		soundItem->_soundFileHash = soundFileHash2;
+		soundItem->_playOnceAfterRandomCountdown = false;
+		soundItem->_minCountdown = 0;
+		soundItem->_maxCountdown = 0;
+		soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown;
+		soundItem->_initialCountdown = _initialCountdown;
+		soundItem->_playLooping = false;
+		soundItem->_currCountdown = currCountdown2;
+		soundItem->_soundResource = new SoundResource(_vm);
+		soundItem->_soundResource->load(soundFileHash2);
+		soundItem->_soundResource->setVolume(80);
+		_soundIndex2 = _soundItems.size();
+		_soundItems.push_back(soundItem);
+	}
+
+}
+
+void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) {
+
+	SoundItem *soundItem;
+
+	if (_soundIndex3 != -1) {
+		soundItem = _soundItems[_soundIndex3];
+		soundItem->_soundResource->unload();
+		delete soundItem->_soundResource;
+		delete soundItem;
+		_soundItems.remove_at(_soundIndex3);
+		_soundIndex3 = -1;
+	}
+
+	if (soundFileHash != 0) {
+		soundItem = new SoundItem();
+		soundItem->_nameHash = nameHash;
+		soundItem->_soundFileHash = soundFileHash;
+		soundItem->_playOnceAfterRandomCountdown = false;
+		soundItem->_minCountdown = 0;
+		soundItem->_maxCountdown = 0;
+		soundItem->_playOnceAfterCountdown = false;
+		soundItem->_initialCountdown = _initialCountdown3;
+		soundItem->_playLooping = false;
+		soundItem->_currCountdown = 0;
+		soundItem->_soundResource = new SoundResource(_vm);
+		soundItem->_soundResource->load(soundFileHash);
+		_soundIndex2 = _soundItems.size();
+		_soundItems.push_back(soundItem);
+	}
+	
+}
+
+void SoundMan::setTwoSoundsPlayFlag(bool playOnceAfterCountdown) {
+	if (_soundIndex1 != -1)
+		_soundItems[_soundIndex1]->_playOnceAfterCountdown = playOnceAfterCountdown;
+	if (_soundIndex2 != -1)
+		_soundItems[_soundIndex2]->_playOnceAfterCountdown = playOnceAfterCountdown;
+	_playOnceAfterCountdown = playOnceAfterCountdown;
+}
+
+void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) {
+	if (_soundIndex3 != -1)
+		_soundItems[_soundIndex3]->_playOnceAfterCountdown = playOnceAfterCountdown;
+	_playOnceAfterCountdown3 = playOnceAfterCountdown;
+}
+
+SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
+	for (uint i = 0; i < _soundItems.size(); ++i)
+		if (_soundItems[i]->_soundFileHash == soundFileHash)
+			return _soundItems[i];
+	return NULL;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
new file mode 100644
index 0000000..66ed700
--- /dev/null
+++ b/engines/neverhood/sound.h
@@ -0,0 +1,122 @@
+/* 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_SOUND_H
+#define NEVERHOOD_SOUND_H
+
+#include "common/array.h"
+#include "graphics/surface.h"
+#include "neverhood/neverhood.h"
+#include "neverhood/resource.h"
+
+namespace Neverhood {
+
+class MusicResource {
+public:
+	MusicResource(NeverhoodEngine *vm);
+	bool isPlaying();
+	void load(uint32 fileHash);
+	void unload();
+	void play(int16 fadeVolumeStep);
+	void stop(int16 fadeVolumeStep);
+protected:
+	NeverhoodEngine *_vm;
+};
+
+struct MusicItem {
+	uint32 _nameHash;
+	uint32 _musicFileHash;
+	bool _play;
+	bool _stop;
+	int16 _fadeVolumeStep;
+	int16 _countdown;
+	MusicResource *_musicResource;
+};
+
+struct SoundItem {
+	uint32 _nameHash;
+	uint32 _soundFileHash;
+	bool _playOnceAfterRandomCountdown;
+	int16 _minCountdown;
+	int16 _maxCountdown;
+	bool _playOnceAfterCountdown;
+	int16 _initialCountdown;
+	bool _playLooping;
+	int16 _currCountdown;
+	SoundResource *_soundResource;
+};
+
+class SoundMan {
+public:
+	SoundMan(NeverhoodEngine *vm);
+	~SoundMan();
+
+	// Music
+	void addMusic(uint32 nameHash, uint32 musicFileHash);
+	void deleteMusic(uint32 musicFileHash);
+	void startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep);
+	void stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep);
+	
+	// Sound
+	void addSound(uint32 nameHash, uint32 soundFileHash);
+	void addSoundList(uint32 nameHash, uint32 *soundFileHashList);
+	void deleteSound(uint32 soundFileHash);
+	void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown,
+		int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
+	void setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
+		int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
+	void playSoundLooping(uint32 soundFileHash);
+	void stopSound(uint32 soundFileHash);
+	void setSoundVolume(uint32 soundFileHash, int volume);
+	
+	// Misc
+	void update();
+	void deleteGroup(uint32 nameHash);
+	void deleteMusicGroup(uint32 nameHash);
+	void deleteSoundGroup(uint32 nameHash);
+	void playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown);
+	void playSoundThree(uint32 nameHash, uint32 soundFileHash);
+	void setTwoSoundsPlayFlag(bool playOnceAfterCountdown);
+	void setSoundThreePlayFlag(bool playOnceAfterCountdown);
+
+protected:
+	NeverhoodEngine *_vm;
+	
+	// TODO Find out what these special sounds are used for (door sounds?)
+	int _soundIndex1, _soundIndex2;
+	int16 _initialCountdown;
+	bool _playOnceAfterCountdown;
+	
+	int _soundIndex3;
+	int16 _initialCountdown3;
+	bool _playOnceAfterCountdown3;
+
+	Common::Array<MusicItem*> _musicItems;
+	Common::Array<SoundItem*> _soundItems;
+	
+	SoundItem *getSoundItemByHash(uint32 soundFileHash);
+	
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_SOUND_H */


Commit: 0bb70c39f084dc122d213b07b1ef2d946608fe88
    https://github.com/scummvm/scummvm/commit/0bb70c39f084dc122d213b07b1ef2d946608fe88
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: More work on the SoundMan

- Also changed all sound related function calls which are still TODO to the new names

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/sound.cpp
    engines/neverhood/sound.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6245cc8..e2494af 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -51,17 +51,17 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	// Other initializations moved to actual engine class
 	// TODO
-	// TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079);
+	// TODO SoundMan_playSoundThree(0x2D0031, 0x8861079);
 	SetMessageHandler(&GameModule::handleMessage);
 }
 
 GameModule::~GameModule() {
 
-	// TODO Sound1ChList_sub_407AF0(0x2D0031);
+	// TODO SoundMan_deleteSoundGroup(0x2D0031);
 	delete _childObject;
 	_childObject = NULL;
 	// TODO: Set palette to black but probably not neccessary
-	// TODO Sound1ChList_sub_408480();
+	// TODO SoundMan_deinit();
 	// TODO Set debug vars (maybe)
 }
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 957b9ef..ca30e3b 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -4733,11 +4733,11 @@ void KmScene2205::sub423980() {
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
-	// TODO Sound1ChList_addSoundResource(0x80101800, 0xD3B02847);
+	// TODO SoundMan_addSound(0x80101800, 0xD3B02847);
 }
 
 KmScene2206::~KmScene2206() {
-	// TODO Sound1ChList_sub_407AF0(0x80101800);
+	// TODO SoundMan_deleteSoundGroup(0x80101800);
 }
 
 void KmScene2206::xUpdate() {
@@ -4852,7 +4852,7 @@ void KmScene2206::sub482490() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 		SetSpriteUpdate(&KmScene2206::spriteUpdate482450);
-		// TODO Sound1ChList_playLooping(0xD3B02847);
+		// TODO SoundMan_playSoundLooping(0xD3B02847);
 	}
 }
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index edd9860..1c30681 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -31,8 +31,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;		
 
-	// TODO Music18hList_add(0x03294419, 0x061880C6);
-	// TODO Music18hList_add(0x03294419, _musicFileHash);
+	// TODO SoundMan_addMusic(0x03294419, 0x061880C6);
+	// TODO SoundMan_addMusic(0x03294419, _musicFileHash);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -45,7 +45,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1000::~Module1000() {
-	// TODO Music18hList_deleteGroup(0x03294419);
+	// TODO SoundMan_deleteMusicGroup(0x03294419);
 }
 
 void Module1000::createScene(int sceneNum, int which) {
@@ -53,24 +53,24 @@ void Module1000::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO Music18hList_play(0x061880C6, 0, 0, 1);
+		// TODO SoundMan_startMusic(0x061880C6, 0, 0, 1);
 		_childObject = new Scene1001(_vm, this, which);
 		break;
 	case 1:
-		// TODO Music18hList_play(0x061880C6, 0, 0, 1);
+		// TODO SoundMan_startMusic(0x061880C6, 0, 0, 1);
 		_childObject = new Scene1002(_vm, this, which);
 		break;
 	case 2:
-		// TODO Music18hList_play(0x061880C6, 0, 0);
+		// TODO SoundMan_startMusic(0x061880C6, 0, 0);
 		_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
 		break;
 	case 3:
-		// TODO Music18hList_stop(0x061880C6, 0, 2);
+		// TODO SoundMan_stopMusic(0x061880C6, 0, 2);
 		_childObject = new Scene1004(_vm, this, which);
 		break;
 	case 4:
-		// TODO Music18hList_stop(0x061880C6, 0, 0);
-		// TODO Music18hList_play(_musicFileHash, 0, 0, 1);
+		// TODO SoundMan_stopMusic(0x061880C6, 0, 0);
+		// TODO SoundMan_startMusic(_musicFileHash, 0, 0, 1);
 		_childObject = new Scene1005(_vm, this, which);
 		break;
 	}
@@ -105,7 +105,7 @@ void Module1000::updateScene() {
 				createScene(1, 2);
 			break;
 		case 4:
-			// TODO Music18hList_stop(_musicFileHash, 0, 1);
+			// TODO SoundMan_stopMusic(_musicFileHash, 0, 1);
 			createScene(3, 1);
 			break;
 		}
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 1efd7e3..8b73598 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -36,16 +36,16 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(9, 3);
 	}
 
-	// TODO Sound1ChList_addSoundResources(0x2C818, dword_4B85B0, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B85B0, true, 50, 600, 20, 250);
-	// TODO Sound1ChList_setSoundValues(0x74E01054, false, 100, 200, 10, 20);
-	// TODO Sound1ChList_setVolume(0x74E01054, 60);
-	// TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F);
+	// TODO SoundMan_addSoundList(0x2C818, dword_4B85B0, true);
+	// TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250);
+	// TODO SoundMan_setSoundParams(0x74E01054, false, 100, 200, 10, 20);
+	// TODO SoundMan_setSoundVolume(0x74E01054, 60);
+	// TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
 
 }
 
 Module1100::~Module1100() {
-	// TODO Sound1ChList_sub_407A50(0x2C818);
+	// TODO SoundMan_deleteGroup(0x2C818);
 }
 
 void Module1100::createScene(int sceneNum, int which) {
@@ -86,11 +86,11 @@ void Module1100::createScene(int sceneNum, int which) {
 			createSmackerScene(0x04180007, true, false, false);
 		break;
 	case 6:
-		// TODO Sound1ChList_sub_407AF0(0x2C818);
+		// TODO SoundMan_deleteSoundGroup(0x2C818);
 		createSmackerScene(kSmackerFileHashList06, true, true, false);
 		break;
 	case 7:
-		// TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0);
 		createSmackerScene(kSmackerFileHashList07, true, true, false);
 		break;
 	case 8:
@@ -98,7 +98,7 @@ void Module1100::createScene(int sceneNum, int which) {
 		break;
 	case 1002:
 		_countdown = 40;
-		// TODO Sound1ChList_sub_4080B0(true);
+		// TODO SoundMan_setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x00012211, true, true, false);
 		break;
 	}
@@ -111,9 +111,9 @@ void Module1100::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			_countdown = 0;
-			// TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64);
-			// TODO Sound1ChList_setVolume(0x48498E46, 65);
-			// TODO Sound1ChList_setVolume(0x50399F64, 65);
+			// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
+			// TODO SoundMan_setSoundVolume(0x48498E46, 65);
+			// TODO SoundMan_setSoundVolume(0x50399F64, 65);
 			if (_moduleResult == 0) {
 				createScene(1, 0);
 			} else if (_moduleResult == 1) {
@@ -121,7 +121,7 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 1:
-			// TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F);
+			// TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
 			if (getGlobalVar(0x0C0288F4)) {
 				if (_moduleResult == 0) {
 					createScene(6, -1);
@@ -137,7 +137,7 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 2:
-			// TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0);
+			// TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0);
 			if (_navigationAreaType == 3) {
 				createScene(7, -1);
 			} else if (_moduleResult == 1) {
@@ -182,7 +182,7 @@ void Module1100::updateScene() {
 			break;
 		case 1002:
 			_countdown = 0;
-			// TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64, 0);
+			// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64, 0);
 			createScene(1, 1);
 			break;
 		}
@@ -191,30 +191,30 @@ void Module1100::updateScene() {
 		case 0:
 #if 0 // TODO		
 			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
-				Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64);
-				Sound1ChList_setVolume(0x48498E46, 65);
-				Sound1ChList_setVolume(0x50399F64, 65);
+				SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
+				SoundMan_setSoundVolume(0x48498E46, 65);
+				SoundMan_setSoundVolume(0x50399F64, 65);
 			}
 #endif			
 			break;
 		case 1:
 #if 0 // TODO		
 			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
-				Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F);
+				SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
 			}
 #endif			
 			break;
 		case 2:
-			// TODO Sound1ChList_setSoundValues(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0);
+			// TODO SoundMan_setSoundParams(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0);
 			break;
 		case 5:
 		case 6:
 		case 7:
 		case 1002:
 			if (_countdown != 0 && (--_countdown == 0)) {
-				// TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64);
-				// TODO Sound1ChList_setVolume(0x48498E46, 65);
-				// TODO Sound1ChList_setVolume(0x50399F64, 65);
+				// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
+				// TODO SoundMan_setSoundVolume(0x48498E46, 65);
+				// TODO SoundMan_setSoundVolume(0x50399F64, 65);
 			}
 			break;
 		}
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 96ed46f..7599d76 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -39,12 +39,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	// TODO Music18hList_add(0x00478311, 0x62222CAE);
-	// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
+	// TODO SoundMan_addMusic(0x00478311, 0x62222CAE);
+	// TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1);
 }
 
 Module1200::~Module1200() {
-	// TODO Music18hList_deleteGroup(0x00478311);
+	// TODO SoundMan_deleteMusicGroup(0x00478311);
 }
 
 void Module1200::createScene(int sceneNum, int which) {
@@ -58,7 +58,7 @@ void Module1200::createScene(int sceneNum, int which) {
 		_childObject = new Scene1202(_vm, this, which);
 		break;
 	case 2:
-		// TODO Music18hList_stop(0x62222CAE, 0, 0);
+		// TODO SoundMan_stopMusic(0x62222CAE, 0, 0);
 		createSmackerScene(0x31890001, true, true, false);
 		setGlobalVar(0x2A02C07B, 1);
 		break;
@@ -87,7 +87,7 @@ void Module1200::updateScene() {
 			createScene(0, 1);
 			break;
 		case 2:
-			// TODO Music18hList_play(0x62222CAE, 0, 0, 1);
+			// TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1);
 			createScene(0, 3);
 			break;
 		}
@@ -371,7 +371,7 @@ AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sp
 }
 
 AsScene1201TntMan::~AsScene1201TntMan() {
-	// TODO Sound1ChList_sub_407AF0(0x01D00560);
+	// TODO SoundMan_deleteSoundGroup(0x01D00560);
 }	 
 
 uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -426,8 +426,8 @@ void AsScene1201TntMan::sub40CD60() {
 }
 
 void AsScene1201TntMan::sub40CD90() {
-	// TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true);
-	// TODO Sound1ChList_playLooping(0x4B044624);
+	// TODO SoundMan_addSound(0x01D00560, 0x4B044624, true);
+	// TODO SoundMan_playSoundLooping(0x4B044624);
 	_flag = true;
 	startAnimation(0x85084190, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
@@ -447,7 +447,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
 }
 
 Class465::~Class465() {
-	// TODO Sound1ChList_sub_407AF0(0x041080A4);
+	// TODO SoundMan_deleteSoundGroup(0x041080A4);
 }
 
 void Class465::update() {
@@ -455,8 +455,8 @@ void Class465::update() {
 	if (getGlobalVar(0x20A0C516)) {
 		setVisible(true);
 		SetUpdateHandler(&AnimatedSprite::update);
-		// TODO Sound1ChList_addSoundResource(0x041080A4, 0x460A1050, true);
-		// TODO Sound1ChList_playLooping(0x460A1050);
+		// TODO SoundMan_addSound(0x041080A4, 0x460A1050, true);
+		// TODO SoundMan_playSoundLooping(0x460A1050);
 	}
 }
 
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 2c7a5c8..b7c588f 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -35,12 +35,12 @@ namespace Neverhood {
 Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO Music18hList_add(0x61C090, 0x203197);
-	// TODO Sound1ChList_addSoundResources(0x61C090, dword_4B2868, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, 0, 50, 600, 20, 150);
-	// TODO Sound1ChList_sub_407C70(0x61C090, 0x48498E46, 0x50399F64, 0);
-	// TODO Sound1ChList_setVolume(0x48498E46, 70);
-	// TODO Sound1ChList_setVolume(0x50399F64, 70);
+	// TODO SoundMan_addMusic(0x61C090, 0x203197);
+	// TODO SoundMan_addSoundList(0x61C090, dword_4B2868, true);
+	// TODO SoundMan_setSoundListParams(dword_4B2868, false, 50, 600, 20, 150);
+	// TODO SoundMan_playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0);
+	// TODO SoundMan_setSoundVolume(0x48498E46, 70);
+	// TODO SoundMan_setSoundVolume(0x50399F64, 70);
 
 	if (which < 0) {
 		if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17)
@@ -94,7 +94,7 @@ Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1300::~Module1300() {
-	// TODO Sound1ChList_sub_407A50(0x61C090);
+	// TODO SoundMan_deleteGroup(0x61C090);
 }
 
 void Module1300::createScene(int sceneNum, int which) {
@@ -102,83 +102,83 @@ void Module1300::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 1:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
 		_childObject = new Scene1302(_vm, this, which);
 		break;
 	case 2:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1303(_vm, this, which);
 		break;
 	case 3:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1304(_vm, this, which);
 		break;
 	case 4:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
 		_childObject = new Scene1305(_vm, this, which);
 		break;
 	case 5:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
 		_childObject = new Scene1306(_vm, this, which);
 		break;
 	case 6:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
 		_childObject = new Scene1307(_vm, this, which);
 		break;
 	case 7:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_play(0x203197, 0, 2, 1);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
 		_childObject = new Scene1308(_vm, this, which);
 		break;
 	case 8:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 1);
 		break;
 	case 9:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createSmackerScene(0x20082818, true, true, false);
 		break;
 	case 10:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createSmackerScene(0x20082828, true, true, false);
 		break;
 	case 11:
-		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B27A8, which);
 		break;
 	case 12:
-		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2718, which);
 		break;
 	case 13:
-		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B27D8, which);
 		break;
 	case 14:
-		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2808, which);
 		break;
 	case 15:
-		// TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2838, which);
 		break;
 	case 16:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO Music18hList_stop(0x203197, 0, 2);
+		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		// TODO SoundMan_stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1317(_vm, this, which);
 		break;
 	case 17:
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 76bf41b..3707356 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -32,8 +32,8 @@ namespace Neverhood {
 Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO Music18hList_add(0x00AD0012, 0x06333232);
-	// TODO Music18hList_add(0x00AD0012, 0x624A220E);
+	// TODO SoundMan_addMusic(0x00AD0012, 0x06333232);
+	// TODO SoundMan_addMusic(0x00AD0012, 0x624A220E);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -44,7 +44,7 @@ Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1400::~Module1400() {
-	// TODO Music18hList_deleteGroup(0x00AD0012);
+	// TODO SoundMan_deleteMusicGroup(0x00AD0012);
 }
 
 void Module1400::createScene(int sceneNum, int which) {
@@ -52,33 +52,33 @@ void Module1400::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO Music18hList_play(0x06333232, 0, 2, 1);
+		// TODO SoundMan_startMusic(0x06333232, 0, 2, 1);
 		_childObject = new Scene1401(_vm, this, which);
 		break;
 	case 1:
-		// TODO Music18hList_stop(0x06333232, 0, 2);
-		// TODO Music18hList_stop(0x624A220E, 0, 2);
+		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
+		// TODO SoundMan_stopMusic(0x624A220E, 0, 2);
 		_childObject = new Scene1402(_vm, this, which);
 		break;
 	case 2:
-		// TODO Music18hList_stop(0x06333232, 0, 2);
-		// TODO Music18hList_play(0x624A220E, 0, 2, 1);
+		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
+		// TODO SoundMan_startMusic(0x624A220E, 0, 2, 1);
 		_childObject = new Scene1403(_vm, this, which);
 		break;
 	case 3:
-		// TODO Music18hList_play(0x06333232, 0, 2, 1);
+		// TODO SoundMan_startMusic(0x06333232, 0, 2, 1);
 		_childObject = new Scene1404(_vm, this, which);
 		break;
 	case 4:
-		// TODO Music18hList_play(0x06333232, 0, 2, 1);
+		// TODO SoundMan_startMusic(0x06333232, 0, 2, 1);
 		_childObject = new Scene1405(_vm, this, which);
 		break;
 	case 5:
-		// TODO Music18hList_stop(0x06333232, 0, 2);
+		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 2);
 		break;
 	case 6:
-		// TODO Music18hList_stop(0x06333232, 0, 2);
+		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
 		_childObject = new Scene1407(_vm, this, which);
 		break;
 	}
@@ -148,7 +148,7 @@ Class525::Class525(NeverhoodEngine *vm)
 }
 
 Class525::~Class525() {
-	// TODO Sound1ChList_sub_407AF0(0x01104C08);
+	// TODO SoundMan_deleteSoundGroup(0x01104C08);
 }
 
 void Class525::update4662A0() {
@@ -157,8 +157,8 @@ void Class525::update4662A0() {
 		sub466460();
 	}
 	if (_countdown2 != 0 && (--_countdown2 == 0)) {
-		// TODO Sound1ChList_addSoundResource(0x01104C08, 0x4A116437, true);
-		// TODO Sound1ChList_playLooping(0x4A116437);
+		// TODO SoundMan_addSound(0x01104C08, 0x4A116437, true);
+		// TODO SoundMan_playSoundLooping(0x4A116437);
 	}
 }
 
@@ -211,7 +211,7 @@ void Class525::sub466420() {
 }
 
 void Class525::sub466460() {
-	// TODO Sound1ChList_deleteSoundByHash(0x4A116437);
+	// TODO SoundMan_deleteSound(0x4A116437);
 	_soundResource1.play(0x4A120435);
 	startAnimation(0x4C210500, 0, -1);
 }
@@ -406,7 +406,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr
 }
 
 Class489::~Class489() {
-	// TODO Sound1ChList_sub_407AF0(0x05331081);
+	// TODO SoundMan_deleteSoundGroup(0x05331081);
 }
 
 uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -616,8 +616,8 @@ void Class489::sub434EC0() {
 	NextState(&Class489::sub434F40);
 	setGlobalVar(0x12A10DB3, 1);
 	_soundResource1.play(0xCC4A8456);
-	// TODO Sound1ChList_addSoundResource(0x05331081, 0xCE428854, true);
-	// TODO Sound1ChList_playLooping(0xCE428854);
+	// TODO SoundMan_addSound(0x05331081, 0xCE428854, true);
+	// TODO SoundMan_playSoundLooping(0xCE428854);
 }
 
 void Class489::sub434F40() {
@@ -634,7 +634,7 @@ void Class489::sub434F80() {
 	NextState(&Class489::sub434E90);
 	setGlobalVar(0x12A10DB3, 0);
 	_soundResource1.play(0xCC4A8456);
-	// TODO Sound1ChList_deleteSoundByHash(0xCE428854);
+	// TODO SoundMan_deleteSound(0xCE428854);
 }
 
 void Class489::sub434FF0() {
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 6519efa..77d135d 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -44,14 +44,14 @@ Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	// TODO Sound1ChList_addSoundResources(0x1A008D8, dword_4B3BB0, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B3BB0, true, 50, 600, 5, 150);
-	// TODO Sound1ChList_sub_407C70(0x1A008D8, 0x41861371, 0x43A2507F, 0);
+	// TODO SoundMan_addSoundList(0x1A008D8, dword_4B3BB0, true);
+	// TODO SoundMan_setSoundListParams(dword_4B3BB0, true, 50, 600, 5, 150);
+	// TODO SoundMan_playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0);
 
 }
 
 Module1600::~Module1600() {
-	// TODO Sound1ChList_sub_407A50(0x1A008D8);
+	// TODO SoundMan_deleteGroup(0x1A008D8);
 }
 
 void Module1600::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index f9dc6b7..696f646 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -27,10 +27,10 @@ namespace Neverhood {
 Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource(vm) {
 	
-	// TODO Music18hList_add(0x04212331);
-	// TODO Sound1ChList_addSoundResources(0x04212331, dword_4AE930, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 50, 600, 5, 150);
-	// TODO Sound1ChList_sub_407C70(0x04212331, 0x41861371, 0x43A2507F, 0);
+	// TODO SoundMan_addMusic(0x04212331);
+	// TODO SoundMan_addSoundList(0x04212331, dword_4AE930, true);
+	// TODO SoundMan_setSoundListParams(dword_4AE930, true, 50, 600, 5, 150);
+	// TODO SoundMan_playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -45,7 +45,7 @@ Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1700::~Module1700() {
-	// TODO Sound1ChList_sub_407A50(0x04212331);
+	// TODO SoundMan_deleteGroup(0x04212331);
 }
 
 void Module1700::createScene(int sceneNum, int which) {
@@ -53,7 +53,7 @@ void Module1700::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
 		createSmackerScene(0x3028A005, true, true, false);
 		break;
 	case 1:
@@ -63,12 +63,12 @@ void Module1700::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004AE8E8, which);
 		break;
 	case 3:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
 		createSmackerScene(0x01190041, true, true, false);
 		break;
 	case 4:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0);
-		// TODO Music18hList_play(0x31114225, 0, 2, 1);
+		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
+		// TODO SoundMan_startMusic(0x31114225, 0, 2, 1);
 		_childObject = new Scene1705(_vm, this, which);
 		break;
 	}
@@ -80,7 +80,7 @@ void Module1700::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			// TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0);
+			// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0);
 			createScene(1, 0);
 			break;
 		case 1:
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index cce72b0..7526a3a 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -28,9 +28,9 @@ namespace Neverhood {
 Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO Sound1ChList_addSoundResources(0x04A14718, dword_4AFE70);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 1, 50, 600, 10, 150);
-	// TODO Sound1ChList_sub_407C70(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
+	// TODO SoundMan_addSoundList(0x04A14718, dword_4AFE70);
+	// TODO SoundMan_setSoundListParams(dword_4AFE70, true, 50, 600, 10, 150);
+	// TODO SoundMan_playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -45,7 +45,7 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1800::~Module1800() {
-	// TODO Sound1ChList_sub_407A50(0x04A14718);
+	// TODO SoundMan_deleteGroup(0x04A14718);
 }
 
 void Module1800::createScene(int sceneNum, int which) {
@@ -73,11 +73,11 @@ void Module1800::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004AFE40, which);
 		break;
 	case 6:
-		// TODO Sound1ChList_sub_407A50(0x04A14718);
+		// TODO SoundMan_deleteGroup(0x04A14718);
 		createSmackerScene(0x08D84010, true, true, false);
 		break;
 	case 7:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundListParams(dword_4AFE70, false, 0, 0, 0, 0);
 		createSmackerScene(0x0168B121, true, true, false);
 		break;
 	case 8:
@@ -159,7 +159,7 @@ void Module1800::updateScene() {
 #if 0 // TODO
 			NavigationScene *navigationScene = (NavigationScene*)_childObject;
 			if (navigationScene->soundFlag1 && navigationScene->index == 2) {
-				// TODO Sound1ChList_sub_4080B0(false);
+				// TODO SoundMan_setTwoSoundsPlayFlag(false);
 			}
 #endif	
 			break;
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 45d3b83..bf1aad6 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -36,13 +36,13 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	// TODO Sound1ChList_addSoundResources(0x04E1C09C, dword_4B8800, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B8800, true, 50, 600, 5, 150);
+	// TODO SoundMan_addSoundList(0x04E1C09C, dword_4B8800, true);
+	// TODO SoundMan_setSoundListParams(dword_4B8800, true, 50, 600, 5, 150);
 
 }
 
 Module1900::~Module1900() {
-	// TODO Sound1ChList_sub_407A50(0x04E1C09C);
+	// TODO SoundMan_deleteGroup(0x04E1C09C);
 }
 
 void Module1900::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index bd22c7b..e071291 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -40,7 +40,7 @@ Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2000::~Module2000() {
-	// TODO Sound1ChList_sub_407A50(0x81293110);
+	// TODO SoundMan_deleteGroup(0x81293110);
 }
 
 void Module2000::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index c6de482..33c9d23 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -29,7 +29,7 @@ namespace Neverhood {
 Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 
-	// TODO Music18hList_add(0x10A10C14, 0x11482B95);
+	// TODO SoundMan_addMusic(0x10A10C14, 0x11482B95);
 	
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -44,7 +44,7 @@ Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2100::~Module2100() {
-	// TODO Music18hList_deleteGroup(0x10A10C14);
+	// TODO SoundMan_deleteMusicGroup(0x10A10C14);
 }
 
 void Module2100::createScene(int sceneNum, int which) {
@@ -52,7 +52,7 @@ void Module2100::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO Music18hList_play(0x11482B95, 0, 1, 1);
+		// TODO SoundMan_startMusic(0x11482B95, 0, 1, 1);
 		_childObject = new Scene2101(_vm, this, which);
 		break;
 	}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 9846bc5..cbd232e 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -33,7 +33,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	debug("Create Module2200(%d)", which);
 
-	// TODO: Music18hList_add(0x11391412, 0x601C908C); 
+	// TODO: SoundMan_addMusic(0x11391412, 0x601C908C); 
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -44,7 +44,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2200::~Module2200() {
-	// TODO Sound1ChList_sub_407A50(0x11391412);
+	// TODO SoundMan_deleteGroup(0x11391412);
 }
 
 void Module2200::createScene(int sceneNum, int which) {
@@ -57,23 +57,23 @@ void Module2200::createScene(int sceneNum, int which) {
 		_childObject = new Scene2201(_vm, this, which);
 		break;
 	case 1:
-		// TODO Music18hList_play(0x601C908C, 0, 2, 1);
+		// TODO SoundMan_startMusic(0x601C908C, 0, 2, 1);
 		_childObject = new Scene2202(_vm, this, which);
 		break;
 	case 2:
-		// TODO Music18hList_play(0x601C908C, 0, 2, 1);
+		// TODO SoundMan_startMusic(0x601C908C, 0, 2, 1);
 		_childObject = new Scene2203(_vm, this, which);
 		break;
 	case 3:
-		// TODO Music18hList_stop(0x601C908C, 0, 2);
+		// TODO SoundMan_stopMusic(0x601C908C, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 3);
 		break;
 	case 4:
-		// TODO Music18hList_stop(0x601C908C, 0, 2);
+		// TODO SoundMan_stopMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2205(_vm, this, which);
 		break;
 	case 5:
-		// TODO Music18hList_stop(0x601C908C, 0, 2);
+		// TODO SoundMan_stopMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2206(_vm, this, which);
 		break;
 	case 6:
@@ -576,19 +576,19 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertSprite<AsScene2201CeilingFan>();
 
-	// TODO Sound1ChList_addSoundResource(0x04106220, 0x81212040, true);
+	// TODO SoundMan_addSound(0x04106220, 0x81212040, true);
 
 }
 
 Scene2201::~Scene2201() {
 	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
-	// TODO Sound1ChList_sub_407AF0(0x04106220);
+	// TODO SoundMan_deleteSoundGroup(0x04106220);
 }
 
 void Scene2201::update() {
 	Scene::update();
 	if (!_soundFlag) {
-		// TODO Sound1ChList_playLooping(0x81212040);
+		// TODO SoundMan_playSoundLooping(0x81212040);
 		_soundFlag = true;
 	}
 }
@@ -918,13 +918,13 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_soundResource1.load(0x68E25540);
 	_soundResource2.load(0x40400457);
 
-	// TODO Sound1ChList_addSoundResource(0x60400854, 0x8101A241, true);
-	// TODO Sound1ChList_playLooping(0x8101A241);
+	// TODO SoundMan_addSound(0x60400854, 0x8101A241, true);
+	// TODO SoundMan_playSoundLooping(0x8101A241);
 
 }
 
 Scene2202::~Scene2202() {
-	// TODO Sound1ChList_sub_407AF0(0x60400854);
+	// TODO SoundMan_deleteSoundGroup(0x60400854);
 }
 
 void Scene2202::update() {
@@ -1714,7 +1714,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene
 }
 
 AsScene2207Elevator::~AsScene2207Elevator() {
-	// TODO Sound1ChList_sub_407AF0(0x02700413);
+	// TODO SoundMan_deleteSoundGroup(0x02700413);
 }
 
 void AsScene2207Elevator::update() {
@@ -1727,7 +1727,7 @@ void AsScene2207Elevator::update() {
 			if (_destPointIndexDelta != 0) {
 				_destPointIndexDelta = 0;
 			} else {
-				// TODO Sound1ChList_deleteSoundByHash(0xD3B02847);
+				// TODO SoundMan_deleteSound(0xD3B02847);
 				_soundResource.play(0x53B8284A);
 			}
 		}
@@ -1743,7 +1743,7 @@ void AsScene2207Elevator::update() {
 			if (_destPointIndexDelta != 0) {
 				_destPointIndexDelta = 0;
 			} else {
-				// TODO Sound1ChList_deleteSoundByHash(0xD3B02847);
+				// TODO SoundMan_deleteSound(0xD3B02847);
 				_soundResource.play(0x53B8284A);
 			}
 		}
@@ -1802,8 +1802,8 @@ void AsScene2207Elevator::moveToY(int16 y) {
 		} else {
 			_destPointIndexDelta = 2;
 		}
-		// TODO Sound1ChList_addSoundResource(0x02700413, 0xD3B02847, true);
-		// TODO Sound1ChList_playLooping(0xD3B02847);
+		// TODO SoundMan_addSound(0x02700413, 0xD3B02847, true);
+		// TODO SoundMan_playSoundLooping(0xD3B02847);
 	}
 
 	_isMoving = true;
@@ -1888,7 +1888,7 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm
 }
 
 AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
-	// TODO Sound1ChList_sub_407AF0(0x80D00820);
+	// TODO SoundMan_deleteSoundGroup(0x80D00820);
 }
 
 uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1897,14 +1897,14 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
 	case 0x100D:
 		if (!_idle) {
 			if (param.asInteger() == 0x3423093) {
-				// TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true);
-				// TODO Sound1ChList_playLooping(0x12121943);
+				// TODO SoundMan_addSound(0x80D00820, 0x12121943, true);
+				// TODO SoundMan_playSoundLooping(0x12121943);
 			} else if (param.asInteger() == 0x834AB011) {
 				_soundResource1.stop();
 				_soundResource2.stop();
 				_soundResource3.stop();
 				_soundResource4.stop();
-				// TODO Sound1ChList_deleteSoundByHash(0x12121943);
+				// TODO SoundMan_deleteSound(0x12121943);
 			} else if (param.asInteger() == 0x3A980501) {
 				_soundResource2.play();
 			} else if (param.asInteger() == 0x2A2AD498) {
@@ -1949,7 +1949,7 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() {
 	_soundResource2.stop();
 	_soundResource3.stop();
 	_soundResource4.stop();
-	// TODO Sound1ChList_deleteSoundByHash(0x12121943);
+	// TODO SoundMan_deleteSound(0x12121943);
 	_idle = true;
 	setVisible(false);
 }
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 1513f7b..d3346eb 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -27,20 +27,20 @@ namespace Neverhood {
 Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _volume(0) {
 	
-	// TODO Sound1ChList_addSoundResources(0x1A214010, dword_4B6938, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B6938, true, 50, 600, 10, 10, 150);
+	// TODO SoundMan_addSoundList(0x1A214010, dword_4B6938, true);
+	// TODO SoundMan_setSoundListParams(dword_4B6938, true, 50, 600, 10, 10, 150);
 
 	_flag = getGlobalVar(0x10938830) == 0;
 	
 	if (_flag) {
-		// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
-		// TODO Sound1ChList_playLooping(0x90F0D1C3);
+		// TODO SoundMan_setSoundVolume(0x90F0D1C3, 0);
+		// TODO SoundMan_playSoundLooping(0x90F0D1C3);
 	} else {
-		// TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0);
 	}
 
-	// TODO Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64, 0);
-	// TODO Sound1ChList_sub_407C70(0x1A214010, 0x41861371, 0x43A2507F, 0);
+	// TODO SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0);
+	// TODO SoundMan_playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -59,7 +59,7 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2300::~Module2300() {
-	// TODO Sound1ChList_sub_407A50(0x1A214010);
+	// TODO SoundMan_deleteGroup(0x1A214010);
 }
 
 void Module2300::createScene(int sceneNum, int which) {
@@ -73,7 +73,7 @@ void Module2300::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B67E8, which);
 		if (_flag) {
 			_volume = 15;
-			// TODO Sound1ChList_setVolume(0x90F0D1C3, 15);
+			// TODO SoundMan_setSoundVolume(0x90F0D1C3, 15);
 		}
 		break;
 	case 2:
@@ -83,16 +83,16 @@ void Module2300::createScene(int sceneNum, int which) {
 		if (getGlobalVar(0x10938830)) {
 			createNavigationScene(0x004B68F0, which);
 		} else {
-			// TODO Sound1ChList_setVolume(0x90F0D1C3, _volume);
+			// TODO SoundMan_setSoundVolume(0x90F0D1C3, _volume);
 			createNavigationScene(0x004B68A8, which);
 			if (_flag) {
 				_volume = 87;
-				// TODO Sound1ChList_setVolume(0x90F0D1C3, 87);
+				// TODO SoundMan_setSoundVolume(0x90F0D1C3, 87);
 			}
 		}
 		break;
 	case 4:
-		// TODO Sound1ChList_sub_4080B0(true);
+		// TODO SoundMan_setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x20080A0B, true, true, false);
 		break;
 	}
@@ -140,7 +140,7 @@ void Module2300::updateScene() {
 			}
 			break;
 		case 4:
-			// TODO Sound1ChList_sub_4080B0(false);
+			// TODO SoundMan_setTwoSoundsPlayFlag(false);
 			createScene(1, 2);
 			break;
 		}
@@ -152,15 +152,15 @@ void Module2300::updateScene() {
 			if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
 				navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
 				_volume++;
-				Sound1ChList_setVolume(0x90F0D1C3, _volume);
+				SoundMan_setSoundVolume(0x90F0D1C3, _volume);
 			}
 #endif
 #if 0 // TODO
 			if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
 				navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
-				Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64);
-				Sound1ChList_setVolume(0x48498E46, 70);
-				Sound1ChList_setVolume(0x50399F64, 70);
+				SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64);
+				SoundMan_setSoundVolume(0x48498E46, 70);
+				SoundMan_setSoundVolume(0x50399F64, 70);
 			}
 #endif
 			break;
@@ -170,7 +170,7 @@ void Module2300::updateScene() {
 			if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
 				navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
 				_volume--;
-				Sound1ChList_setVolume(0x90F0D1C3, _volume);
+				SoundMan_setSoundVolume(0x90F0D1C3, _volume);
 			}
 #endif
 			break;
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 02e6225..f2f2da9 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -27,7 +27,7 @@ namespace Neverhood {
 Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO Music18hList_add(0x202D1010, 0xB110382D);
+	// TODO SoundMan_addMusic(0x202D1010, 0xB110382D);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, _vm->gameState().which);
@@ -38,7 +38,7 @@ Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2400::~Module2400() {
-	// TODO Music18hList_deleteGroup(0x202D1010);
+	// TODO SoundMan_deleteMusicGroup(0x202D1010);
 }
 
 void Module2400::createScene(int sceneNum, int which) {
@@ -46,27 +46,27 @@ void Module2400::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO Music18hList_stop(0xB110382D, 0, 0);
+		// TODO SoundMan_stopMusic(0xB110382D, 0, 0);
 		_childObject = new Scene2401(_vm, this, which);
 		break;
 	case 1:
-		// TODO Music18hList_play(0xB110382D, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xB110382D, 0, 2, 1);
 		_childObject = new Scene2402(_vm, this, which);
 		break;
 	case 2:
-		// TODO Music18hList_play(0xB110382D, 0, 0, 1);
+		// TODO SoundMan_startMusic(0xB110382D, 0, 0, 1);
 		_childObject = new Scene2403(_vm, this, which);
 		break;
 	case 4:
-		// TODO Music18hList_stop(0xB110382D, 0, 2);
+		// TODO SoundMan_stopMusic(0xB110382D, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 0);
 		break;
 	case 5:
-		// TODO Music18hList_play(0xB110382D, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xB110382D, 0, 2, 1);
 		_childObject = new Scene2406(_vm, this, which);
 		break;
 	case 6:
-		// TODO Music18hList_stop(0xB110382D, 0, 2);
+		// TODO SoundMan_stopMusic(0xB110382D, 0, 2);
 		createSmackerScene(0x20D80001, true, true, false);
 		break;
 	case 7:
@@ -247,7 +247,7 @@ AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm)
 }
 
 AsScene2401FlowingWater::~AsScene2401FlowingWater() {
-	// TODO Sound1ChList_sub_407AF0(0x40F11C09);
+	// TODO SoundMan_deleteSoundGroup(0x40F11C09);
 }
 
 uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -260,15 +260,15 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam
 		break;
 	case 0x2002:
 		if (!_isWaterFlowing) {
-			// TODO Sound1ChList_addSoundResource(0x40F11C09, 0x980C1420, true);
-			// TODO Sound1ChList_playLooping(0x980C1420);
+			// TODO SoundMan_addSound(0x40F11C09, 0x980C1420, true);
+			// TODO SoundMan_playSoundLooping(0x980C1420);
 			startAnimation(0x10203116, 0, -1);
 			setVisible(true);
 			_isWaterFlowing = true;
 		}
 		break;
 	case 0x2003:
-		// TODO Sound1ChList_deleteSoundByHash(0x980C1420);
+		// TODO SoundMan_deleteSound(0x980C1420);
 		_isWaterFlowing = false;
 		break;
 	case 0x3002:
@@ -664,7 +664,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 }
 
 AsScene2402TV::~AsScene2402TV() {
-	// TODO Sound1ChList_sub_407AF0(0x01520123);
+	// TODO SoundMan_deleteSoundGroup(0x01520123);
 }
 
 void AsScene2402TV::upWait() {
@@ -687,12 +687,12 @@ void AsScene2402TV::upFocusKlayman() {
 		startAnimation(0x050A0103, _currFrameIndex, -1);
 		_newStickFrameIndex = _currFrameIndex;
 		if (_countdown2 == 0) {
-			// TODO Sound1ChList_addSoundResource(0x01520123, 0xC42D4528, true);
-			// TODO Sound1ChList_playLooping(0xC42D4528); 
+			// TODO SoundMan_addSound(0x01520123, 0xC42D4528, true);
+			// TODO SoundMan_playSoundLooping(0xC42D4528); 
 		}
 		_countdown2 = 5;
 	} else if (_countdown2 != 0 && (--_countdown2 == 0)) {
-		// TODO Sound1ChList_deleteSoundByHash(0xC42D4528);
+		// TODO SoundMan_deleteSound(0xC42D4528);
 	}
 	AnimatedSprite::update();
 }
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 84b98af..822204f 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -59,8 +59,8 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
 	_soundResource3(vm), _soundResource4(vm), _soundIndex(0) {
 	
-	// TODO Music18hList_add(0x29220120, 0x05343184);
-	// TODO Music18hList_play(0x05343184, 0, 0, 1);
+	// TODO SoundMan_addMusic(0x29220120, 0x05343184);
+	// TODO SoundMan_startMusic(0x05343184, 0, 0, 1);
 	SetMessageHandler(&Module2500::handleMessage);
 
 	if (which < 0) {
@@ -77,7 +77,7 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2500::~Module2500() {
-	// TODO Music18hList_deleteGroup(0x29220120);
+	// TODO SoundMan_deleteMusicGroup(0x29220120);
 }
 
 void Module2500::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 7975fcb..be05037 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -35,14 +35,14 @@ Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 1);
 	}
 
-	// TODO Sound1ChList_addSoundResources(0x40271018, dword_4B87E8, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B87E8, true, 50, 600, 5, 150);
-	// TODO Sound1ChList_sub_407C70(0x40271018, 0x41861371, 0x43A2507F);
+	// TODO SoundMan_addSoundList(0x40271018, dword_4B87E8, true);
+	// TODO SoundMan_setSoundListParams(dword_4B87E8, true, 50, 600, 5, 150);
+	// TODO SoundMan_playTwoSounds(0x40271018, 0x41861371, 0x43A2507F);
 
 }
 
 Module2600::~Module2600() {
-	// TODO Sound1ChList_sub_407A50(0x40271018);
+	// TODO SoundMan_deleteGroup(0x40271018);
 }
 
 void Module2600::createScene(int sceneNum, int which) {
@@ -72,7 +72,7 @@ void Module2600::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B8698, which);
 		break;
 	case 7:
-		// TODO Sound1ChList_sub_407A50(0x40271018);
+		// TODO SoundMan_deleteGroup(0x40271018);
 		createSmackerScene(0x30090001, true, true, false);
 		break;
 	case 8:
@@ -268,7 +268,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
 	setDoDeltaX(1);
 	createSurface1(0x9C210C90, 1200);
 	setClipRect(260, 260, 400, 368);
-	// TODO Sound1ChList_addSoundResource(0xDC2769B0, true);
+	// TODO SoundMan_addSound(0xDC2769B0, true);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2609Water::handleMessage);
 	if (getGlobalVar(0x4E0BE910))
@@ -281,12 +281,12 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 	case 0x2001:
 		stopAnimation();
 		setVisible(false);
-		// TODO Sound1ChList_stop(0xDC2769B0);
+		// TODO SoundMan_stopSound(0xDC2769B0);
 		break;
 	case 0x2002:
 		startAnimation(0x9C210C90, 0, -1);
 		setVisible(true);
-		// TODO Sound1ChList_playLooping(0xDC2769B0);
+		// TODO SoundMan_playSoundLooping(0xDC2769B0);
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 71ce229..a91eea2 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -86,8 +86,8 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
 	_soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) {
 	
-	// TODO Music18hList_add(0x42212411, 0x04020210);
-	// TODO Music18hList_play(0x04020210, 24, 2, 1);
+	// TODO SoundMan_addMusic(0x42212411, 0x04020210);
+	// TODO SoundMan_startMusic(0x04020210, 24, 2, 1);
 	SetMessageHandler(&Module2700::handleMessage);
 
 	if (which < 0) {
@@ -107,7 +107,7 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2700::~Module2700() {
-	// TODO Sound1ChList_sub_407A50(0x42212411);
+	// TODO SoundMan_deleteGroup(0x42212411);
 }
 
 void Module2700::createScene(int sceneNum, int which) {
@@ -414,9 +414,9 @@ void Module2700::updateScene() {
 		case 21:
 			// TODO? GameState_sub_469C50(&field_52, 0);
 			// TODO MusicMan_stopAll (if field_52 above = 1)
-			// TODO Music18hList_delete(_musicFileHash);
-			// TODO Music18hList_play(0x04020210, 0, 2, 1);
-			// TODO Sound1ChList_sub_407AF0(0x42212411);
+			// TODO SoundMan_deleteMusic(_musicFileHash);
+			// TODO SoundMan_startMusic(0x04020210, 0, 2, 1);
+			// TODO SoundMan_deleteSoundGroup(0x42212411);
 			createScene(20, 3);
 			break;
 		case 22:
@@ -458,15 +458,15 @@ void Module2700::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 21:
 			if (!_flag1) {
-				// TODO Music18hList_stop(0x04020210, 0, 1);
+				// TODO SoundMan_stopMusic(0x04020210, 0, 1);
 				// TODO _vm->gameModule()->initScene2801Vars();
 				_musicFileHash = getGlobalVar(0x89A82A15);
 				// TODO? GameState_sub_469C50(&field_52, 0);
-				// TODO MusicMan_create();
-				// TODO Music18hList_add2(0x42212411, _musicFileHash);
-				// TODO Music18hList_play2(_musicFileHash, 0, /*TODO */???, 1);
-				// TODO Sound1ChList_addSoundResource(0x42212411, 0x44014282, true);
-				// TODO Sound1ChList_setSoundValues(0x44014282, true, 120, 360, 72, 0);
+				// TODO MusicMan_create(); // Why?
+				// TODO SoundMan_addMusic(0x42212411, _musicFileHash);
+				// TODO SoundMan_startMusic(_musicFileHash, 0, /*TODO */???, 1);
+				// TODO SoundMan_addSound(0x42212411, 0x44014282, true);
+				// TODO SoundMan_setSoundParams(0x44014282, true, 120, 360, 72, 0);
 				_flag1 = true;
 			}
 			break;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 97fb18f..558819c 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -35,7 +35,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_fileHash = 0;
 	// TODO music stuff
-	// TODO Music18hList_add(0x64210814, 0xD2FA4D14);
+	// TODO SoundMan_addMusic(0x64210814, 0xD2FA4D14);
 	setGlobalVar(0x28D8C940, 1);
 	
 	if (which < 0) {
@@ -52,7 +52,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 
 Module2800::~Module2800() {
 	// TODO music stuff
-	// TODO Sound1ChList_sub_407A50(0x64210814);
+	// TODO SoundMan_deleteGroup(0x64210814);
 	// TODO Module2800_sub471DF0();
 }
 
@@ -61,11 +61,11 @@ void Module2800::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO Music18hList_stop(0xD2FA4D14, 0, 0);
+		// TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0);
 		_childObject = new Scene2801(_vm, this, which);
 		break;
 	case 1:
-		// TODO Music18hList_stop(0xD2FA4D14, 0, 0);
+		// TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0);
 #if 0		
 		_flag = true; // DEBUG!
 		if (_flag) {
@@ -76,7 +76,7 @@ void Module2800::createScene(int sceneNum, int which) {
 #endif		
 		break;
 	case 2:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		//setGlobalVar(0x1860C990,1);//DEBUG
 		if (getGlobalVar(0x1860C990))
 			_childObject = new Scene2803b(_vm, this, which);
@@ -87,98 +87,98 @@ void Module2800::createScene(int sceneNum, int which) {
 		_childObject = new Scene2804(_vm, this, which);
 		break;
 	case 4:
-		// TODO Music18hList_stop(0xD2FA4D14, 0, 2);
+		// TODO SoundMan_stopMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
 		break;
 	case 5:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2806(_vm, this, which);
 		break;
 	case 6:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2807(_vm, this, which);
 		break;
 	case 7:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 0);
 		break;
 	case 8:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2809(_vm, this, which);
 		break;
 	case 9:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2810(_vm, this, which);
 		break;
 	case 10:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2808(_vm, this, 1);
 		break;
 	case 11:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2812(_vm, this, which);
 		break;
 	case 12:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008);
 		break;
 	case 13:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x81C60635, 0x60631814);
 		break;
 	case 14:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0);
 		break;
 	case 15:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC);
 		break;
 	case 16:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0);
 		break;
 	case 17:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018);
 		break;
 	case 18:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018);
 		break;
 	case 19:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x10866205, 0x66201100);
 		break;
 	case 20:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x01C58000, 0x58004014);
 		break;
 	case 21:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Scene2822(_vm, this, which);
 		break;
 	case 22:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948);
 		break;
 	case 23:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040);
 		break;
 	case 24:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A);
 		break;
 	case 25:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		if (getGlobalVar(0x190A1D18))
 			_childObject = new Class152(_vm, this, 0x01600204, 0x0020001E);
 		else
 			_childObject = new Class152(_vm, this, 0x08611204, 0x1120008E);
 		break;
 	case 26:
-		// TODO Music18hList_play(0xD2FA4D14, 0, 2, 1);
+		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
 		_childObject = new DiskplayerScene(_vm, this, 4);
 		break;
 	//		
@@ -1527,7 +1527,7 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene
 	_needRefresh = true;
 	AnimatedSprite::updatePosition();
 	_soundResource.load(0x6352F051);
-	// TODO Sound1ChList_addSoundResource(0xC5EA0B28, 0xEF56B094, true);
+	// TODO SoundMan_addSound(0xC5EA0B28, 0xEF56B094, true);
 	SetUpdateHandler(&AsScene2804BeamCoil::update);
 	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
 }
@@ -1572,13 +1572,13 @@ void AsScene2804BeamCoil::hide() {
 	setVisible(false);
 	_ssBeamCoilBody->setVisible(false);
 	// TODO _ssBeamCoilBody->update(); -> hide()
-	// TODO Sound1ChList_stop(0xEF56B094);
+	// TODO SoundMan_stopSound(0xEF56B094);
 }
 
 void AsScene2804BeamCoil::stBeaming() {
 	startAnimation(0x00494891, 93, -1);
 	NextState(&AsScene2804BeamCoil::stBeaming);
-	// TODO Sound1ChList_playLooping(0xEF56B094);
+	// TODO SoundMan_playSoundLooping(0xEF56B094);
 }
 
 uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2735,9 +2735,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AE738);
 		_klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
 		_asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
-		// TODO Sound1ChList_addSoundResource(0x84400112, 0xC874EE6C, true);
-		// TODO Sound1ChList_playLooping(0xC874EE6C);
-		// TODO Sound1ChList_setVolume(0xC874EE6C, 50);
+		// TODO SoundMan_addSound(0x84400112, 0xC874EE6C, true);
+		// TODO SoundMan_playSoundLooping(0xC874EE6C);
+		// TODO SoundMan_setSoundVolume(0xC874EE6C, 50);
 		_flag1 = false;
 	} else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) {
 		if (getGlobalVar(0x1860C990)) {
@@ -2798,7 +2798,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 Scene2810::~Scene2810() {
 	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
 	setGlobalVar(0x00D30138, _klayman->getX());
-	// TODO Sound1ChList_sub_407AF0(0x84400112);
+	// TODO SoundMan_deleteSoundGroup(0x84400112);
 }
 
 void Scene2810::sub406650() {
@@ -2887,7 +2887,7 @@ AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm)
 }
 
 AsScene2812Winch::~AsScene2812Winch() {
-	// TODO Sound1ChList_sub_407AF0(0x00B000E2);
+	// TODO SoundMan_deleteSoundGroup(0x00B000E2);
 }
 
 uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2896,8 +2896,8 @@ uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam &param
 	case 0x2000:
 		startAnimation(0x20DA08A0, 0, -1);
 		setVisible(true);
-		// TODO Sound1ChList_addSoundResource(0x00B000E2, 0xC874EE6C, true);
-		// TODO Sound1ChList_playLooping(0xC874EE6C);
+		// TODO SoundMan_addSound(0x00B000E2, 0xC874EE6C, true);
+		// TODO SoundMan_playSoundLooping(0xC874EE6C);
 		break;
 	case 0x3002:
 		startAnimation(0x20DA08A0, 7, -1);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 8c797f3..ab86c48 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -29,18 +29,18 @@ namespace Neverhood {
 Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundVolume(0) {
 	
-	// TODO Sound1ChList_addSoundResources(0x81293110, dword_4B7FC8, true);
-	// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 1, 50, 600, 5, 150);
-	// TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
-	// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-	// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
-	// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+	// TODO SoundMan_addSoundList(0x81293110, dword_4B7FC8, true);
+	// TODO SoundMan_setSoundListParams(dword_4B7FC8, true, 50, 600, 5, 150);
+	// TODO SoundMan_setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
+	// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+	// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
+	// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 
 	_flag = getGlobalVar(0x10938830) != 0;
 
 	if (_flag) {
-		// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
-		// TODO Sound1ChList_playLooping(0x90F0D1C3);
+		// TODO SoundMan_setSoundVolume(0x90F0D1C3, 0);
+		// TODO SoundMan_playSoundLooping(0x90F0D1C3);
 	}
 
 	if (which < 0) {
@@ -58,7 +58,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module3000::~Module3000() {
-	// TODO Sound1ChList_sub_407A50(0x81293110);
+	// TODO SoundMan_deleteGroup(0x81293110);
 }
 
 void Module3000::createScene(int sceneNum, int which) {
@@ -77,10 +77,10 @@ void Module3000::createScene(int sceneNum, int which) {
 		}
 		break;
 	case 2:
-		// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+		// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 		if (_flag) {
 			_soundVolume = 90;
-			// TODO Sound1ChList_setVolume(0x90F0D1C3, 90);
+			// TODO SoundMan_setSoundVolume(0x90F0D1C3, 90);
 		}
 		if (getGlobalVar(0x10938830)) {
 			createNavigationScene(0x004B7D58, which);
@@ -109,7 +109,7 @@ void Module3000::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B7FB0, which, kNavigationTypes06);
 		break;
 	case 7:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0);
 		if (!getSubVar(0x40050052, 0x089809C2)) {
 			setSubVar(0x40050052, 0x089809C2, 1);
 			createSmackerScene(0x90022001, true, true, false);
@@ -126,7 +126,7 @@ void Module3000::createScene(int sceneNum, int which) {
 		_childObject = new Scene3011(_vm, this, 0);
 		break;
 	case 11:
-		// TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0);
+		// TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0);
 		if (!getSubVar(0x40050052, 0x10130993)) {
 			setSubVar(0x40050052, 0x10130993, 1);
 			createSmackerScene(0x31093019, true, true, false);
@@ -181,10 +181,10 @@ void Module3000::updateScene() {
 			}
 			break;
 		case 2:
-			// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+			// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 			if (_flag) {
 				_soundVolume = 0;
-				// TODO Sound1ChList_setVolume(0x90F0D1C3, 0);
+				// TODO SoundMan_setSoundVolume(0x90F0D1C3, 0);
 			}
 			if (_moduleResult == 0) {
 				createScene(3, 0);
@@ -229,12 +229,12 @@ void Module3000::updateScene() {
 		case 8:
 			_flag = getGlobalVar(0x10938830); // CHECKME
 			if (_moduleResult != 1) {
-				// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0):
+				// TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0):
 				createScene(4, 1);
 			} else if (getGlobalVar(0xF0402B0A)) {
 				createScene(1008, -1);
 			} else {
-				// TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0);
+				// TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0);
 				createScene(4, 1);
 			}
 			break;
@@ -275,26 +275,26 @@ void Module3000::updateScene() {
 				int navigationIndex = navigationScene()->getIndex();
 				if (navigationIndex == 1) {
 					if (frameNumber == 0) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-						// TODO Sound1ChList_setVolume(0x48498E46, 70);
-						// TODO Sound1ChList_setVolume(0x50399F64, 70);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+						// TODO SoundMan_setSoundVolume(0x48498E46, 70);
+						// TODO SoundMan_setSoundVolume(0x50399F64, 70);
 					} else if (frameNumber == 100) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 					}
 				} else if (navigationIndex == 0) {
 					if (frameNumber == 0) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-						// TODO Sound1ChList_setVolume(0x48498E46, 70);
-						// TODO Sound1ChList_setVolume(0x50399F64, 70);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+						// TODO SoundMan_setSoundVolume(0x48498E46, 70);
+						// TODO SoundMan_setSoundVolume(0x50399F64, 70);
 					} else if (frameNumber == 10) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 					}
 					if (_flag && _soundVolume < 90 && frameNumber % 2) {
 						if (frameNumber == 0)
 							_soundVolume = 40;
 						else
 							_soundVolume++;
-						// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+						// TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume);
 					}
 				}
 			}
@@ -307,17 +307,17 @@ void Module3000::updateScene() {
 				int navigationIndex = navigationScene()->getIndex();
 				if (_flag && _soundVolume > 1 && frameNumber % 2) {
 					_soundVolume--;
-					// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+					// TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume);
 				}
 				if (navigationIndex == 0) {
 					if (frameNumber == 35) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 					}
 				} else if (navigationIndex == 1) {
 					if (frameNumber == 55) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0);
-						// TODO Sound1ChList_setVolume(0x48498E46, 70);
-						// TODO Sound1ChList_setVolume(0x50399F64, 70);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+						// TODO SoundMan_setSoundVolume(0x48498E46, 70);
+						// TODO SoundMan_setSoundVolume(0x50399F64, 70);
 					}
 				}
 			}
@@ -330,14 +330,14 @@ void Module3000::updateScene() {
 				int navigationIndex = navigationScene()->getIndex();
 				if (navigationIndex == 2) {
 					if (frameNumber == 40) {
-						// TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0);
+						// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 					}
 					if (_flag && _soundVolume < 90 && frameNumber % 2) {
 						if (frameNumber == 0)
 							_soundVolume = 40;
 						else
 							_soundVolume++;
-						// TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume);
+						// TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume);
 					}
 				}
 			}
@@ -346,7 +346,7 @@ void Module3000::updateScene() {
 		case 5:
 #if 0 // ALL TODO
 			if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
-				// TODO Sound1ChList_sub_4080B0(false);
+				// TODO SoundMan_setTwoSoundsPlayFlag(false);
 			}
 #endif
 			break;
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 7a3161c..981e703 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -60,8 +60,8 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 }
 
 NavigationScene::~NavigationScene() {
-	// TODO Sound1ChList_sub_4080B0(0);
-	// TODO Sound1ChList_sub_408110(0);
+	// TODO SoundMan_setTwoSoundsPlayFlag(false);
+	// TODO SoundMan_setSoundThreePlayFlag(false);
 }
 
 int NavigationScene::getNavigationAreaType() {
@@ -88,8 +88,8 @@ void NavigationScene::update() {
 			_soundFlag2 = false;
 			_soundFlag1 = false;
 			_interactive = true;
-			// TODO Sound1ChList_sub_4080B0(0);
-			// TODO Sound1ChList_sub_408110(0);
+			// TODO SoundMan_setTwoSoundsPlayFlag(false);
+			// TODO SoundMan_setSoundThreePlayFlag(false);
 			_smackerDone = false;
 			_smackerPlayer->open(navigationItem.fileHash, true);
 			_vm->_screen->clear();
@@ -205,11 +205,11 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 	}
 	
 	if (oldSoundFlag2 != _soundFlag2) {
-		// TODO Sound1ChList_sub_408110(_soundFlag2);
+		// TODO SoundMan_setSoundThreePlayFlag(_soundFlag2);
 	}
 
 	if (oldSoundFlag1 != _soundFlag1) {
-		// TODO Sound1ChList_sub_4080B0(_soundFlag1);
+		// TODO SoundMan_setTwoSoundsPlayFlag(_soundFlag1);
 	}
 
 }
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 38ccce9..91a23bf 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -52,6 +52,34 @@ void MusicResource::stop(int16 fadeVolumeStep) {
 	// TODO
 }
 
+MusicItem::MusicItem()
+	: _musicResource(NULL) {
+}
+
+MusicItem::~MusicItem() {
+	if (_musicResource)
+		_musicResource->unload();
+	delete _musicResource;
+}
+
+SoundItem::SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash,
+		bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
+		bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown)
+	: _soundResource(NULL),	_nameHash(nameHash), _soundFileHash(soundFileHash),
+	_playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0),
+	_playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown),
+	_playLooping(false), _currCountdown(currCountdown) {
+	
+	_soundResource = new SoundResource(vm);
+	_soundResource->load(soundFileHash);
+}
+
+SoundItem::~SoundItem() {
+	if (_soundResource)
+		_soundResource->unload();
+	delete _soundResource;
+}
+
 SoundMan::SoundMan(NeverhoodEngine *vm)
 	: _vm(vm),
 	_soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) {
@@ -71,62 +99,43 @@ void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) {
 	musicItem->_countdown = 24;
 	musicItem->_musicResource = new MusicResource(_vm);
 	musicItem->_musicResource->load(musicFileHash);
-	// TODO Is this needed? musicItem->_musicResource->init();
 	_musicItems.push_back(musicItem);
 }
 
 void SoundMan::deleteMusic(uint32 musicFileHash) {
-	for (uint i = 0; i < _musicItems.size(); ++i) {
-		MusicItem *musicItem = _musicItems[i];
-		if (musicItem->_musicFileHash == musicFileHash) {
-			musicItem->_musicResource->unload();
-			delete musicItem->_musicResource;
-			delete musicItem;
-			_musicItems.remove_at(i);
-			break;
-		}
+	MusicItem *musicItem = getMusicItemByHash(musicFileHash);
+	if (musicItem) {
+		delete musicItem;
+		for (uint i = 0; i < _musicItems.size(); ++i)
+			if (_musicItems[i]->_musicFileHash == musicFileHash) {
+				_musicItems.remove_at(i);
+				break;
+			}
 	}
 }
 
 void SoundMan::startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) {
-	for (uint i = 0; i < _musicItems.size(); ++i) {
-		MusicItem *musicItem = _musicItems[i];
-		if (musicItem->_musicFileHash == musicFileHash) {
-			musicItem->_play = true;
-			musicItem->_stop = false;
-			musicItem->_countdown = countdown;
-			musicItem->_fadeVolumeStep = fadeVolumeStep;
-			break;
-		}
+	MusicItem *musicItem = getMusicItemByHash(musicFileHash);
+	if (musicItem) {
+		musicItem->_play = true;
+		musicItem->_stop = false;
+		musicItem->_countdown = countdown;
+		musicItem->_fadeVolumeStep = fadeVolumeStep;
 	}
 }
 
 void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) {
-	for (uint i = 0; i < _musicItems.size(); ++i) {
-		MusicItem *musicItem = _musicItems[i];
-		if (musicItem->_musicFileHash == musicFileHash) {
-			musicItem->_play = false;
-			musicItem->_stop = true;
-			musicItem->_countdown = countdown;
-			musicItem->_fadeVolumeStep = fadeVolumeStep;
-			break;
-		}
+	MusicItem *musicItem = getMusicItemByHash(musicFileHash);
+	if (musicItem) {
+		musicItem->_play = false;
+		musicItem->_stop = true;
+		musicItem->_countdown = countdown;
+		musicItem->_fadeVolumeStep = fadeVolumeStep;
 	}
 }
 
 void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) {
-	SoundItem *soundItem = new SoundItem();
-	soundItem->_nameHash = nameHash;
-	soundItem->_soundFileHash = soundFileHash;
-	soundItem->_playOnceAfterRandomCountdown = false;
-	soundItem->_minCountdown = 50;
-	soundItem->_maxCountdown = 600;
-	soundItem->_playOnceAfterCountdown = false;
-	soundItem->_initialCountdown = 0;
-	soundItem->_playLooping = false;
-	soundItem->_currCountdown = 0;
-	soundItem->_soundResource = new SoundResource(_vm);
-	soundItem->_soundResource->load(soundFileHash);
+	SoundItem *soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 50, 600, false, 0, false, 0);
 	_soundItems.push_back(soundItem);
 }
 
@@ -136,15 +145,14 @@ void SoundMan::addSoundList(uint32 nameHash, uint32 *soundFileHashList) {
 }
 
 void SoundMan::deleteSound(uint32 soundFileHash) {
-	for (uint i = 0; i < _soundItems.size(); ++i) {
-		SoundItem *soundItem = _soundItems[i];
-		if (soundItem->_soundFileHash == soundFileHash) {
-			soundItem->_soundResource->unload();
-			delete soundItem->_soundResource;
-			delete soundItem;
-			_soundItems.remove_at(i);
-			break;
-		}
+	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
+	if (soundItem) {
+		delete soundItem;
+		for (uint i = 0; i < _soundItems.size(); ++i)
+			if (_soundItems[i]->_soundFileHash == soundFileHash) {
+				_soundItems.remove_at(i);
+				break;
+			}
 	}
 }
 
@@ -248,8 +256,6 @@ void SoundMan::deleteMusicGroup(uint32 nameHash) {
 	for (int index = _musicItems.size() - 1; index >= 0; --index) {
 		MusicItem *musicItem = _musicItems[index];
 		if (musicItem->_nameHash == nameHash) {
-			musicItem->_musicResource->unload();
-			delete musicItem->_musicResource;
 			delete musicItem;
 			_musicItems.remove_at(index);
 		}
@@ -261,28 +267,18 @@ void SoundMan::deleteSoundGroup(uint32 nameHash) {
 	SoundItem *soundItem;
 
 	if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) {
-		soundItem = _soundItems[_soundIndex1];
-		soundItem->_soundResource->unload();
-		delete soundItem->_soundResource;
-		delete soundItem;
-		_soundItems.remove_at(_soundIndex1);
+		deleteSoundByIndex(_soundIndex1);
 		_soundIndex1 = -1;
 	}
 
 	if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->_nameHash == nameHash) {
-		soundItem = _soundItems[_soundIndex2];
-		soundItem->_soundResource->unload();
-		delete soundItem->_soundResource;
-		delete soundItem;
-		_soundItems.remove_at(_soundIndex2);
+		deleteSoundByIndex(_soundIndex2);
 		_soundIndex2 = -1;
 	}
 
 	for (int index = _soundItems.size() - 1; index >= 0; --index) {
 		soundItem = _soundItems[index];
 		if (soundItem->_nameHash == nameHash) {
-			soundItem->_soundResource->unload();
-			delete soundItem->_soundResource;
 			delete soundItem;
 			_soundItems.remove_at(index);
 		}
@@ -297,22 +293,14 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun
 	int16 currCountdown2 = _initialCountdown / 2;
 
 	if (_soundIndex1 != -1) {
-		soundItem = _soundItems[_soundIndex1];
-		currCountdown1 = soundItem->_currCountdown;
-		soundItem->_soundResource->unload();
-		delete soundItem->_soundResource;
-		delete soundItem;
-		_soundItems.remove_at(_soundIndex1);
+		currCountdown1 = _soundItems[_soundIndex1]->_currCountdown;
+		deleteSoundByIndex(_soundIndex1);
 		_soundIndex1 = -1;
 	}
 
 	if (_soundIndex2 != -1) {
-		soundItem = _soundItems[_soundIndex2];
-		currCountdown2 = soundItem->_currCountdown;
-		soundItem->_soundResource->unload();
-		delete soundItem->_soundResource;
-		delete soundItem;
-		_soundItems.remove_at(_soundIndex2);
+		currCountdown2 = _soundItems[_soundIndex2]->_currCountdown;
+		deleteSoundByIndex(_soundIndex2);
 		_soundIndex2 = -1;
 	}
 
@@ -320,36 +308,16 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun
 		_initialCountdown = initialCountdown;
 
 	if (soundFileHash1 != 0) {
-		soundItem = new SoundItem();
-		soundItem->_nameHash = nameHash;
-		soundItem->_soundFileHash = soundFileHash1;
-		soundItem->_playOnceAfterRandomCountdown = false;
-		soundItem->_minCountdown = 0;
-		soundItem->_maxCountdown = 0;
-		soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown;
-		soundItem->_initialCountdown = _initialCountdown;
-		soundItem->_playLooping = false;
-		soundItem->_currCountdown = currCountdown1;
-		soundItem->_soundResource = new SoundResource(_vm);
-		soundItem->_soundResource->load(soundFileHash1);
+		soundItem = new SoundItem(_vm, nameHash, soundFileHash1, false, 0, 0,
+			_playOnceAfterCountdown, _initialCountdown, false, currCountdown1);
 		soundItem->_soundResource->setVolume(80);
 		_soundIndex1 = _soundItems.size();
 		_soundItems.push_back(soundItem);
 	}
 
 	if (soundFileHash2 != 0) {
-		soundItem = new SoundItem();
-		soundItem->_nameHash = nameHash;
-		soundItem->_soundFileHash = soundFileHash2;
-		soundItem->_playOnceAfterRandomCountdown = false;
-		soundItem->_minCountdown = 0;
-		soundItem->_maxCountdown = 0;
-		soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown;
-		soundItem->_initialCountdown = _initialCountdown;
-		soundItem->_playLooping = false;
-		soundItem->_currCountdown = currCountdown2;
-		soundItem->_soundResource = new SoundResource(_vm);
-		soundItem->_soundResource->load(soundFileHash2);
+		soundItem = new SoundItem(_vm, nameHash, soundFileHash2, false, 0, 0,
+			_playOnceAfterCountdown, _initialCountdown, false, currCountdown2);
 		soundItem->_soundResource->setVolume(80);
 		_soundIndex2 = _soundItems.size();
 		_soundItems.push_back(soundItem);
@@ -362,28 +330,14 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) {
 	SoundItem *soundItem;
 
 	if (_soundIndex3 != -1) {
-		soundItem = _soundItems[_soundIndex3];
-		soundItem->_soundResource->unload();
-		delete soundItem->_soundResource;
-		delete soundItem;
-		_soundItems.remove_at(_soundIndex3);
+		deleteSoundByIndex(_soundIndex3);
 		_soundIndex3 = -1;
 	}
 
 	if (soundFileHash != 0) {
-		soundItem = new SoundItem();
-		soundItem->_nameHash = nameHash;
-		soundItem->_soundFileHash = soundFileHash;
-		soundItem->_playOnceAfterRandomCountdown = false;
-		soundItem->_minCountdown = 0;
-		soundItem->_maxCountdown = 0;
-		soundItem->_playOnceAfterCountdown = false;
-		soundItem->_initialCountdown = _initialCountdown3;
-		soundItem->_playLooping = false;
-		soundItem->_currCountdown = 0;
-		soundItem->_soundResource = new SoundResource(_vm);
-		soundItem->_soundResource->load(soundFileHash);
-		_soundIndex2 = _soundItems.size();
+		soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 0, 0,
+			false, _initialCountdown3, false, 0);
+		_soundIndex3 = _soundItems.size();
 		_soundItems.push_back(soundItem);
 	}
 	
@@ -403,6 +357,13 @@ void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) {
 	_playOnceAfterCountdown3 = playOnceAfterCountdown;
 }
 
+MusicItem *SoundMan::getMusicItemByHash(uint32 musicFileHash) {
+	for (uint i = 0; i < _musicItems.size(); ++i)
+		if (_musicItems[i]->_musicFileHash == musicFileHash)
+			return _musicItems[i];
+	return NULL;
+}
+
 SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
 	for (uint i = 0; i < _soundItems.size(); ++i)
 		if (_soundItems[i]->_soundFileHash == soundFileHash)
@@ -410,4 +371,9 @@ SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
 	return NULL;
 }
 
+void SoundMan::deleteSoundByIndex(int index) {
+	delete _soundItems[index];
+	_soundItems.remove_at(index);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index 66ed700..39bf7cd 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -50,6 +50,8 @@ struct MusicItem {
 	int16 _fadeVolumeStep;
 	int16 _countdown;
 	MusicResource *_musicResource;
+	MusicItem();
+	~MusicItem();
 };
 
 struct SoundItem {
@@ -63,6 +65,11 @@ struct SoundItem {
 	bool _playLooping;
 	int16 _currCountdown;
 	SoundResource *_soundResource;
+
+	SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash,
+		bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
+		bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown);
+	~SoundItem();
 };
 
 class SoundMan {
@@ -113,7 +120,9 @@ protected:
 	Common::Array<MusicItem*> _musicItems;
 	Common::Array<SoundItem*> _soundItems;
 	
+	MusicItem *getMusicItemByHash(uint32 musicFileHash);
 	SoundItem *getSoundItemByHash(uint32 soundFileHash);
+	void deleteSoundByIndex(int index);
 	
 };
 


Commit: fc0e40db304aa489d4117299fcce1f80ba0b6379
    https://github.com/scummvm/scummvm/commit/fc0e40db304aa489d4117299fcce1f80ba0b6379
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: Implement the actual audio code

Sounds and music play now in some scenes
(I didn't change the comments to code in all modules yet)

- Fix calcHash to ignore non-alphanumeric characters, this fixes at least
  one animation glitch (when inserting tapes into the player)
- Move SoundResource to sound.cpp

Changed paths:
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/navigationscene.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/resourceman.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/sound.cpp
    engines/neverhood/sound.h



diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 9256c13..22eb780 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -27,6 +27,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/gamevars.h"
 #include "neverhood/graphics.h"
+#include "neverhood/sound.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e2494af..7841e27 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -298,9 +298,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule(1500, 0); // Logos and intro video //Real
-#if 0
+#if 1
 	_vm->gameState().sceneNum = 0;
-	createModule(1200, -1);
+	createModule(1400, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -339,7 +339,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 8;
 	createModule(2600, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index ca30e3b..0000883 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -60,7 +60,7 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
 	_counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0),
-	_counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
+	_tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
 	_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
 	_flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) {
 	
@@ -2119,16 +2119,16 @@ void Klayman::cbLeverReleasedEvent() {
 void Klayman::stInsertDisk() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) {
 		_status2 = 2;
-		_counter2 = 0;
+		_tapesToInsert = 0;
 		for (uint32 i = 0; i < 20; i++) {
 			if (getSubVar(0x02038314, i)) {
 				setSubVar(0x02720344, i, 1);
 				setSubVar(0x02038314, i, 0);
-				_counter2++;
+				_tapesToInsert++;
 			}
 		}
-		if (_counter2 == 0) {
-			gotoState(NULL);
+		if (_tapesToInsert == 0) {
+			GotoState(NULL);
 			gotoNextStateExt();
 		} else {
 			startAnimation(0xD8C8D100, 0, -1);
@@ -2136,7 +2136,7 @@ void Klayman::stInsertDisk() {
 			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 			SetMessageHandler(&Klayman::hmInsertDisk);
 			_acceptInput = false;
-			_counter2--;
+			_tapesToInsert--;
 		}
 	}
 }
@@ -2145,12 +2145,12 @@ uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x06040580) {
-			if (_counter2 == 0) {
-				// TODO: Calc calcHash value somewhere else 
+			if (_tapesToInsert == 0) {
+				// TODO: Calc calcHash value somewhere else
 				nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
 			}
-		} else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
-			_counter2--;
+		} else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
+			_tapesToInsert--;
 			startAnimationByHash(0xD8C8D100, 0x01084280, 0);
 		} else if (param.asInteger() == 0x062A1510) {
 			_soundResource1.play(0x41688704);
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index b752b1e..cbf17a0 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -185,7 +185,7 @@ protected:
 	int16 _counter, _counterMax;
 	int16 _counter3, _counter3Max;
 	int16 _counter1;
-	int16 _counter2;
+	int16 _tapesToInsert;
 	bool _flagF6;
 	bool _isLeverDown;
 	bool _isWalkingOpenDoorNotified;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 1c30681..2db598b 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -31,8 +31,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;		
 
-	// TODO SoundMan_addMusic(0x03294419, 0x061880C6);
-	// TODO SoundMan_addMusic(0x03294419, _musicFileHash);
+	_vm->_soundMan->addMusic(0x03294419, 0x061880C6);
+	_vm->_soundMan->addMusic(0x03294419, _musicFileHash);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -45,7 +45,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1000::~Module1000() {
-	// TODO SoundMan_deleteMusicGroup(0x03294419);
+	_vm->_soundMan->deleteMusicGroup(0x03294419);
 }
 
 void Module1000::createScene(int sceneNum, int which) {
@@ -53,24 +53,24 @@ void Module1000::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO SoundMan_startMusic(0x061880C6, 0, 0, 1);
+		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
 		_childObject = new Scene1001(_vm, this, which);
 		break;
 	case 1:
-		// TODO SoundMan_startMusic(0x061880C6, 0, 0, 1);
+		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
 		_childObject = new Scene1002(_vm, this, which);
 		break;
 	case 2:
-		// TODO SoundMan_startMusic(0x061880C6, 0, 0);
+		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
 		_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
 		break;
 	case 3:
-		// TODO SoundMan_stopMusic(0x061880C6, 0, 2);
+		_vm->_soundMan->stopMusic(0x061880C6, 0, 2);
 		_childObject = new Scene1004(_vm, this, which);
 		break;
 	case 4:
-		// TODO SoundMan_stopMusic(0x061880C6, 0, 0);
-		// TODO SoundMan_startMusic(_musicFileHash, 0, 0, 1);
+		_vm->_soundMan->stopMusic(0x061880C6, 0, 0);
+		_vm->_soundMan->startMusic(_musicFileHash, 0, 0);
 		_childObject = new Scene1005(_vm, this, which);
 		break;
 	}
@@ -105,7 +105,7 @@ void Module1000::updateScene() {
 				createScene(1, 2);
 			break;
 		case 4:
-			// TODO SoundMan_stopMusic(_musicFileHash, 0, 1);
+			_vm->_soundMan->stopMusic(_musicFileHash, 0, 1);
 			createScene(3, 1);
 			break;
 		}
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 8b73598..e948c2b 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/module1100.h"
 #include "neverhood/gamemodule.h"
+#include "neverhood/navigationscene.h"
 
 namespace Neverhood {
 
@@ -36,16 +37,16 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(9, 3);
 	}
 
-	// TODO SoundMan_addSoundList(0x2C818, dword_4B85B0, true);
+	// TODO SoundMan_addSoundList(0x0002C818, dword_4B85B0, true);
 	// TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250);
-	// TODO SoundMan_setSoundParams(0x74E01054, false, 100, 200, 10, 20);
-	// TODO SoundMan_setSoundVolume(0x74E01054, 60);
-	// TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
+	_vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20);
+	_vm->_soundMan->setSoundVolume(0x74E01054, 60);
+	_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
 
 }
 
 Module1100::~Module1100() {
-	// TODO SoundMan_deleteGroup(0x2C818);
+	_vm->_soundMan->deleteGroup(0x0002C818);
 }
 
 void Module1100::createScene(int sceneNum, int which) {
@@ -86,11 +87,11 @@ void Module1100::createScene(int sceneNum, int which) {
 			createSmackerScene(0x04180007, true, false, false);
 		break;
 	case 6:
-		// TODO SoundMan_deleteSoundGroup(0x2C818);
+		_vm->_soundMan->deleteSoundGroup(0x0002C818);
 		createSmackerScene(kSmackerFileHashList06, true, true, false);
 		break;
 	case 7:
-		// TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
 		createSmackerScene(kSmackerFileHashList07, true, true, false);
 		break;
 	case 8:
@@ -98,7 +99,7 @@ void Module1100::createScene(int sceneNum, int which) {
 		break;
 	case 1002:
 		_countdown = 40;
-		// TODO SoundMan_setTwoSoundsPlayFlag(true);
+		_vm->_soundMan->setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x00012211, true, true, false);
 		break;
 	}
@@ -111,9 +112,9 @@ void Module1100::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			_countdown = 0;
-			// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
-			// TODO SoundMan_setSoundVolume(0x48498E46, 65);
-			// TODO SoundMan_setSoundVolume(0x50399F64, 65);
+			_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
+			_vm->_soundMan->setSoundVolume(0x48498E46, 65);
+			_vm->_soundMan->setSoundVolume(0x50399F64, 65);
 			if (_moduleResult == 0) {
 				createScene(1, 0);
 			} else if (_moduleResult == 1) {
@@ -121,7 +122,7 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 1:
-			// TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
+			_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
 			if (getGlobalVar(0x0C0288F4)) {
 				if (_moduleResult == 0) {
 					createScene(6, -1);
@@ -137,7 +138,7 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 2:
-			// TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0);
+			_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
 			if (_navigationAreaType == 3) {
 				createScene(7, -1);
 			} else if (_moduleResult == 1) {
@@ -161,6 +162,7 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 5:
+			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			if (getGlobalVar(0x610210B7)) {
 				createScene(3, 0);
 			} else {
@@ -168,9 +170,11 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 6:
+			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			leaveModule(1);
 			break;
 		case 7:
+			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			createScene(2, 2);
 			break;
 		case 8:
@@ -181,8 +185,9 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 1002:
+			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			_countdown = 0;
-			// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64, 0);
+			_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
 			createScene(1, 1);
 			break;
 		}
@@ -191,7 +196,7 @@ void Module1100::updateScene() {
 		case 0:
 #if 0 // TODO		
 			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
-				SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
+				SoundMan_playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64);
 				SoundMan_setSoundVolume(0x48498E46, 65);
 				SoundMan_setSoundVolume(0x50399F64, 65);
 			}
@@ -200,21 +205,21 @@ void Module1100::updateScene() {
 		case 1:
 #if 0 // TODO		
 			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
-				SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F);
+				SoundMan_playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F);
 			}
 #endif			
 			break;
 		case 2:
-			// TODO SoundMan_setSoundParams(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0);
+			_vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->getSoundFlag1(), 0, 0, 0, 0);
 			break;
 		case 5:
 		case 6:
 		case 7:
 		case 1002:
 			if (_countdown != 0 && (--_countdown == 0)) {
-				// TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64);
-				// TODO SoundMan_setSoundVolume(0x48498E46, 65);
-				// TODO SoundMan_setSoundVolume(0x50399F64, 65);
+				_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
+				_vm->_soundMan->setSoundVolume(0x48498E46, 65);
+				_vm->_soundMan->setSoundVolume(0x50399F64, 65);
 			}
 			break;
 		}
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 7599d76..33b791a 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -39,12 +39,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	// TODO SoundMan_addMusic(0x00478311, 0x62222CAE);
-	// TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1);
+	_vm->_soundMan->addMusic(0x00478311, 0x62222CAE);
+	_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
 }
 
 Module1200::~Module1200() {
-	// TODO SoundMan_deleteMusicGroup(0x00478311);
+	_vm->_soundMan->deleteMusicGroup(0x00478311);
 }
 
 void Module1200::createScene(int sceneNum, int which) {
@@ -58,7 +58,7 @@ void Module1200::createScene(int sceneNum, int which) {
 		_childObject = new Scene1202(_vm, this, which);
 		break;
 	case 2:
-		// TODO SoundMan_stopMusic(0x62222CAE, 0, 0);
+		_vm->_soundMan->stopMusic(0x62222CAE, 0, 0);
 		createSmackerScene(0x31890001, true, true, false);
 		setGlobalVar(0x2A02C07B, 1);
 		break;
@@ -87,7 +87,7 @@ void Module1200::updateScene() {
 			createScene(0, 1);
 			break;
 		case 2:
-			// TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1);
+			_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
 			createScene(0, 3);
 			break;
 		}
@@ -371,7 +371,7 @@ AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sp
 }
 
 AsScene1201TntMan::~AsScene1201TntMan() {
-	// TODO SoundMan_deleteSoundGroup(0x01D00560);
+	_vm->_soundMan->deleteSoundGroup(0x01D00560);
 }	 
 
 uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -426,8 +426,8 @@ void AsScene1201TntMan::sub40CD60() {
 }
 
 void AsScene1201TntMan::sub40CD90() {
-	// TODO SoundMan_addSound(0x01D00560, 0x4B044624, true);
-	// TODO SoundMan_playSoundLooping(0x4B044624);
+	_vm->_soundMan->addSound(0x01D00560, 0x4B044624);
+	_vm->_soundMan->playSoundLooping(0x4B044624);
 	_flag = true;
 	startAnimation(0x85084190, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
@@ -447,7 +447,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
 }
 
 Class465::~Class465() {
-	// TODO SoundMan_deleteSoundGroup(0x041080A4);
+	_vm->_soundMan->deleteSoundGroup(0x041080A4);
 }
 
 void Class465::update() {
@@ -455,8 +455,8 @@ void Class465::update() {
 	if (getGlobalVar(0x20A0C516)) {
 		setVisible(true);
 		SetUpdateHandler(&AnimatedSprite::update);
-		// TODO SoundMan_addSound(0x041080A4, 0x460A1050, true);
-		// TODO SoundMan_playSoundLooping(0x460A1050);
+		_vm->_soundMan->addSound(0x041080A4, 0x460A1050);
+		_vm->_soundMan->playSoundLooping(0x460A1050);
 	}
 }
 
@@ -1227,10 +1227,7 @@ bool Scene1202::isSolved() {
 }
 
 void Scene1202::doPaletteEffect() {
-#if 0 // TODO
-	Palette2 *palette2 = (Palette2*)_palette;
-	palette2->startFadeToPalette(24);
-#endif
+	// TODO
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index b7c588f..ee4dc7a 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -35,12 +35,12 @@ namespace Neverhood {
 Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO SoundMan_addMusic(0x61C090, 0x203197);
+	_vm->_soundMan->addMusic(0x61C090, 0x203197);
 	// TODO SoundMan_addSoundList(0x61C090, dword_4B2868, true);
 	// TODO SoundMan_setSoundListParams(dword_4B2868, false, 50, 600, 20, 150);
-	// TODO SoundMan_playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0);
-	// TODO SoundMan_setSoundVolume(0x48498E46, 70);
-	// TODO SoundMan_setSoundVolume(0x50399F64, 70);
+	_vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0);
+	_vm->_soundMan->setSoundVolume(0x48498E46, 70);
+	_vm->_soundMan->setSoundVolume(0x50399F64, 70);
 
 	if (which < 0) {
 		if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17)
@@ -94,7 +94,7 @@ Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1300::~Module1300() {
-	// TODO SoundMan_deleteGroup(0x61C090);
+	_vm->_soundMan->deleteGroup(0x61C090);
 }
 
 void Module1300::createScene(int sceneNum, int which) {
@@ -103,82 +103,82 @@ void Module1300::createScene(int sceneNum, int which) {
 	switch (_vm->gameState().sceneNum) {
 	case 1:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1302(_vm, this, which);
 		break;
 	case 2:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1303(_vm, this, which);
 		break;
 	case 3:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1304(_vm, this, which);
 		break;
 	case 4:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1305(_vm, this, which);
 		break;
 	case 5:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1306(_vm, this, which);
 		break;
 	case 6:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1307(_vm, this, which);
 		break;
 	case 7:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_startMusic(0x203197, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1308(_vm, this, which);
 		break;
 	case 8:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 1);
 		break;
 	case 9:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createSmackerScene(0x20082818, true, true, false);
 		break;
 	case 10:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createSmackerScene(0x20082828, true, true, false);
 		break;
 	case 11:
 		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B27A8, which);
 		break;
 	case 12:
 		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2718, which);
 		break;
 	case 13:
 		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B27D8, which);
 		break;
 	case 14:
 		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2808, which);
 		break;
 	case 15:
 		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2838, which);
 		break;
 	case 16:
 		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
-		// TODO SoundMan_stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1317(_vm, this, which);
 		break;
 	case 17:
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 3707356..8d40c34 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -32,8 +32,8 @@ namespace Neverhood {
 Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO SoundMan_addMusic(0x00AD0012, 0x06333232);
-	// TODO SoundMan_addMusic(0x00AD0012, 0x624A220E);
+	_vm->_soundMan->addMusic(0x00AD0012, 0x06333232);
+	_vm->_soundMan->addMusic(0x00AD0012, 0x624A220E);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -44,7 +44,7 @@ Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1400::~Module1400() {
-	// TODO SoundMan_deleteMusicGroup(0x00AD0012);
+	_vm->_soundMan->deleteMusicGroup(0x00AD0012);
 }
 
 void Module1400::createScene(int sceneNum, int which) {
@@ -52,33 +52,33 @@ void Module1400::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO SoundMan_startMusic(0x06333232, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x06333232, 0, 2);
 		_childObject = new Scene1401(_vm, this, which);
 		break;
 	case 1:
-		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
-		// TODO SoundMan_stopMusic(0x624A220E, 0, 2);
+		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
+		_vm->_soundMan->stopMusic(0x624A220E, 0, 2);
 		_childObject = new Scene1402(_vm, this, which);
 		break;
 	case 2:
-		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
-		// TODO SoundMan_startMusic(0x624A220E, 0, 2, 1);
+		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
+		_vm->_soundMan->startMusic(0x624A220E, 0, 2);
 		_childObject = new Scene1403(_vm, this, which);
 		break;
 	case 3:
-		// TODO SoundMan_startMusic(0x06333232, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x06333232, 0, 2);
 		_childObject = new Scene1404(_vm, this, which);
 		break;
 	case 4:
-		// TODO SoundMan_startMusic(0x06333232, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x06333232, 0, 2);
 		_childObject = new Scene1405(_vm, this, which);
 		break;
 	case 5:
-		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
+		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 2);
 		break;
 	case 6:
-		// TODO SoundMan_stopMusic(0x06333232, 0, 2);
+		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
 		_childObject = new Scene1407(_vm, this, which);
 		break;
 	}
@@ -148,7 +148,7 @@ Class525::Class525(NeverhoodEngine *vm)
 }
 
 Class525::~Class525() {
-	// TODO SoundMan_deleteSoundGroup(0x01104C08);
+	_vm->_soundMan->deleteSoundGroup(0x01104C08);
 }
 
 void Class525::update4662A0() {
@@ -157,8 +157,8 @@ void Class525::update4662A0() {
 		sub466460();
 	}
 	if (_countdown2 != 0 && (--_countdown2 == 0)) {
-		// TODO SoundMan_addSound(0x01104C08, 0x4A116437, true);
-		// TODO SoundMan_playSoundLooping(0x4A116437);
+		_vm->_soundMan->addSound(0x01104C08, 0x4A116437);
+		_vm->_soundMan->playSoundLooping(0x4A116437);
 	}
 }
 
@@ -211,7 +211,7 @@ void Class525::sub466420() {
 }
 
 void Class525::sub466460() {
-	// TODO SoundMan_deleteSound(0x4A116437);
+	_vm->_soundMan->deleteSound(0x4A116437);
 	_soundResource1.play(0x4A120435);
 	startAnimation(0x4C210500, 0, -1);
 }
@@ -406,7 +406,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr
 }
 
 Class489::~Class489() {
-	// TODO SoundMan_deleteSoundGroup(0x05331081);
+	_vm->_soundMan->deleteSoundGroup(0x05331081);
 }
 
 uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -616,8 +616,8 @@ void Class489::sub434EC0() {
 	NextState(&Class489::sub434F40);
 	setGlobalVar(0x12A10DB3, 1);
 	_soundResource1.play(0xCC4A8456);
-	// TODO SoundMan_addSound(0x05331081, 0xCE428854, true);
-	// TODO SoundMan_playSoundLooping(0xCE428854);
+	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
+	_vm->_soundMan->playSoundLooping(0xCE428854);
 }
 
 void Class489::sub434F40() {
@@ -634,7 +634,7 @@ void Class489::sub434F80() {
 	NextState(&Class489::sub434E90);
 	setGlobalVar(0x12A10DB3, 0);
 	_soundResource1.play(0xCC4A8456);
-	// TODO SoundMan_deleteSound(0xCE428854);
+	_vm->_soundMan->deleteSound(0xCE428854);
 }
 
 void Class489::sub434FF0() {
diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h
index c37a7fc..4397a43 100644
--- a/engines/neverhood/navigationscene.h
+++ b/engines/neverhood/navigationscene.h
@@ -34,6 +34,8 @@ public:
 	NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes);
 	virtual ~NavigationScene();
 	int getNavigationAreaType();
+	bool getSoundFlag1() const { return _soundFlag1; }
+	bool getSoundFlag2() const { return _soundFlag2; }
 protected:
 	SmackerPlayer *_smackerPlayer;
 	bool _smackerDone;
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index abd9374..e5c07b5 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -100,6 +100,7 @@ Common::Error NeverhoodEngine::run() {
 #if 1
 
 	_soundMan = new SoundMan(this);
+	_audioResourceMan = new AudioResourceMan(this);
 	
 	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
@@ -139,6 +140,8 @@ Common::Error NeverhoodEngine::run() {
 		//debug("millis %d", _system->getMillis());		
 		_gameModule->handleUpdate();
 		_gameModule->draw();
+		_soundMan->update();
+		_audioResourceMan->update();
 		_screen->wait();
 		_screen->update();
 		
@@ -149,6 +152,7 @@ Common::Error NeverhoodEngine::run() {
 	delete _gameModule;
 	delete _collisionMan;
 	delete _soundMan;
+	delete _audioResourceMan;
 #endif
 
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 13ea399..2aa84e5 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -46,6 +46,7 @@ class GameVars;
 class ResourceMan;
 class Screen;
 class SoundMan;
+class AudioResourceMan;
 class StaticData;
 struct NPoint;
 
@@ -87,6 +88,7 @@ public:
 	CollisionMan *_collisionMan;
 	
 	SoundMan *_soundMan;
+	AudioResourceMan *_audioResourceMan;
 
 public:
 	
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 7b0aa94..9bf6549 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -640,44 +640,20 @@ DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash
 	return NULL;
 }
 
-// SoundResource
-// ALL TODO
-
-SoundResource::SoundResource(NeverhoodEngine *vm)
-	: _vm(vm) {
-}
-
-bool SoundResource::isPlaying() { 
-	return false; 
-}
-
-void SoundResource::load(uint32 fileHash) {
-}
-
-void SoundResource::unload() {
-}
-
-void SoundResource::play(uint32 fileHash, bool looping) {
-}
-
-void SoundResource::play() {
-}
-
-void SoundResource::setVolume(int volume) {
-}
-
 uint32 calcHash(const char *value) {
 	uint32 hash = 0, shiftValue = 0;
 	while (*value != 0) {
 		char ch = *value++;
-		if (ch >= 'a' && ch <= 'z')
-			ch -= 32;
-		else if (ch >= '0' && ch <= '9')
-			ch += 22;
-		shiftValue += ch - 64;
-		if (shiftValue >= 32)
-			shiftValue -= 32;
-		hash ^= 1 << shiftValue;
+		if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
+			if (ch >= 'a' && ch <= 'z')
+				ch -= 32;
+			else if (ch >= '0' && ch <= '9')
+				ch += 22;
+			shiftValue += ch - 64;
+			if (shiftValue >= 32)
+				shiftValue -= 32;
+			hash ^= 1 << shiftValue;
+		}
 	}
 	return hash;
 }
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index b0cd464..1678296 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -191,22 +191,6 @@ protected:
 	DataResource::DRDirectoryItem *findDRDirectoryItem(uint32 nameHash, uint16 type); 
 };
 
-// TODO: Dummy class atm
-
-class SoundResource {
-public:
-	SoundResource(NeverhoodEngine *vm);
-	bool isPlaying();
-	void load(uint32 fileHash);
-	void unload();
-	void play(uint32 fileHash, bool looping = false);
-	void play();
-	void stop() { /*DUMMY*/ }
-	void setVolume(int volume);
-protected:
-	NeverhoodEngine *_vm;	
-};
-
 uint32 calcHash(const char *value);
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 0538f58..c073e97 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -35,7 +35,7 @@ void ResourceMan::addArchive(const Common::String &filename) {
 	uint archiveIndex = _archives.size();
 	archive->open(filename);
 	_archives.push_back(archive);
-	debug("ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount());
+	debug(3, "ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount());
 	_entries.reserve(_entries.size() + archive->getCount());
 	for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) {
 		BlbArchiveEntry *archiveEntry = archive->getEntry(archiveEntryIndex);
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index d189fad..8520d64 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -375,7 +375,7 @@ uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam &param, En
 }
 
 bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
-	debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY);
+	//debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY);
 	for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) {
 		Sprite *sprite = _vm->_collisionMan->getSprite(i);
 		if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && 
@@ -397,7 +397,7 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 				for (uint j = 0; j < rectList[i].subRects.size(); j++) {
 					debug(2, "  (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2);
 					if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) {
-						debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId);
+						//debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId);
 						return setMessageList2(rectList[i].subRects[j].messageListId);
 					}
 				}
@@ -416,7 +416,7 @@ void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackF
 }
 
 void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
-	debug("Scene::setMessageList(%p)", (void*)messageList);
+	//debug("Scene::setMessageList(%p)", (void*)messageList);
 	_messageList = messageList;
 	_messageListCount = _messageList ? _messageList->size() : 0;
 	_messageListIndex = 0;
@@ -426,11 +426,13 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool
 	_messageListStatus = 1;
 	sendMessage(_klayman, 0x101C, 0);
 	
+#if 0
 	// DEBUG: Show message list
 	for (uint i = 0; i < messageList->size(); i++) {
 		debug("A: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
 	}
 	debug("A: ================================================================");
+#endif	
 	
 }
 
@@ -441,13 +443,15 @@ bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallback
 bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
 	bool result = false;
 	
-	debug("Scene::setMessageList2(%p)", (void*)messageList);
+	//debug("Scene::setMessageList2(%p)", (void*)messageList);
 
+#if 0
 	// DEBUG: Show message list
 	for (uint i = 0; i < messageList->size(); i++) {
 		debug("B: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
 	}
 	debug("B: ================================================================");
+#endif
 	
 	if (_messageListStatus == 1) {
 		if (messageList != _messageList2) {
@@ -500,7 +504,7 @@ void Scene::runMessageList() {
 			uint32 messageNum = (*_messageList)[_messageListIndex].messageNum;
 			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
 			
-			debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
+			//debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
 			
 			_messageListIndex++;
 			if (_messageListIndex == _messageListCount) {
@@ -573,7 +577,7 @@ void Scene::clearRectList() {
 
 void Scene::loadHitRectList() {
 	HitRectList *hitRectList = _dataResource.getHitRectList();
-	debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList);
+	//debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList);
 	if (hitRectList) {
 		_hitRectList = *hitRectList;
 		_vm->_collisionMan->setHitRects(&_hitRectList);
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 91a23bf..bd2f223 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -20,36 +20,101 @@
  *
  */
 
+#include "common/memstream.h"
 #include "graphics/palette.h"
 #include "neverhood/sound.h"
+#include "neverhood/resourceman.h"
 
 namespace Neverhood {
 
 // TODO Put more stuff into the constructors/destructors of the item structs
 // TODO Some parts are quite bad here, but my priority is to get sound working at all
 
+SoundResource::SoundResource(NeverhoodEngine *vm)
+	: _vm(vm), _soundIndex(-1) {
+}
+
+SoundResource::~SoundResource() {
+	unload();
+}
+
+bool SoundResource::isPlaying() { 
+	return _soundIndex >= 0 &&
+		_vm->_audioResourceMan->isSoundPlaying(_soundIndex); 
+}
+
+void SoundResource::load(uint32 fileHash) {
+	unload();
+	_soundIndex = _vm->_audioResourceMan->addSound(fileHash);
+	_vm->_audioResourceMan->loadSound(_soundIndex);
+}
+
+void SoundResource::unload() {
+	if (_soundIndex >= 0) {
+		_vm->_audioResourceMan->removeSound(_soundIndex);
+		_soundIndex = -1;
+	}
+}
+
+void SoundResource::play(uint32 fileHash) {
+	load(fileHash);
+	play();
+}
+
+void SoundResource::play() {
+	if (_soundIndex >= 0)
+		_vm->_audioResourceMan->playSound(_soundIndex, false);
+}
+
+void SoundResource::stop() {
+	if (_soundIndex >= 0)
+		_vm->_audioResourceMan->stopSound(_soundIndex);
+}
+
+void SoundResource::setVolume(int16 volume) {
+	if (_soundIndex >= 0)
+		_vm->_audioResourceMan->setSoundVolume(_soundIndex, volume);
+}
+
+void SoundResource::setPan(int16 pan) {
+	if (_soundIndex >= 0)
+		_vm->_audioResourceMan->setSoundPan(_soundIndex, pan);
+}
+
 MusicResource::MusicResource(NeverhoodEngine *vm)
-	: _vm(vm) {
+	: _vm(vm), _musicIndex(-1) {
 }
 
 bool MusicResource::isPlaying() { 
-	return false; 
+	return _musicIndex >= 0 &&
+		_vm->_audioResourceMan->isMusicPlaying(_musicIndex); 
 }
 
 void MusicResource::load(uint32 fileHash) {
-	// TODO
+	unload();
+	_musicIndex = _vm->_audioResourceMan->loadMusic(fileHash);
 }
 
 void MusicResource::unload() {
-	// TODO
+	if (_musicIndex >= 0) {
+		_vm->_audioResourceMan->unloadMusic(_musicIndex);
+		_musicIndex = -1;
+	}
 }
 
 void MusicResource::play(int16 fadeVolumeStep) {
-	// TODO
+	if (_musicIndex >= 0)
+		_vm->_audioResourceMan->playMusic(_musicIndex, fadeVolumeStep);
 }
 
 void MusicResource::stop(int16 fadeVolumeStep) {
-	// TODO
+	if (_musicIndex >= 0)
+		_vm->_audioResourceMan->stopMusic(_musicIndex, fadeVolumeStep);
+}
+
+void MusicResource::setVolume(int16 volume) {
+	if (_musicIndex >= 0)
+		_vm->_audioResourceMan->setMusicVolume(_musicIndex, volume);
 }
 
 MusicItem::MusicItem()
@@ -80,6 +145,8 @@ SoundItem::~SoundItem() {
 	delete _soundResource;
 }
 
+// SoundMan
+
 SoundMan::SoundMan(NeverhoodEngine *vm)
 	: _vm(vm),
 	_soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) {
@@ -107,8 +174,8 @@ void SoundMan::deleteMusic(uint32 musicFileHash) {
 	if (musicItem) {
 		delete musicItem;
 		for (uint i = 0; i < _musicItems.size(); ++i)
-			if (_musicItems[i]->_musicFileHash == musicFileHash) {
-				_musicItems.remove_at(i);
+			if (_musicItems[i] == musicItem) {
+				_musicItems[i] = NULL;
 				break;
 			}
 	}
@@ -149,8 +216,8 @@ void SoundMan::deleteSound(uint32 soundFileHash) {
 	if (soundItem) {
 		delete soundItem;
 		for (uint i = 0; i < _soundItems.size(); ++i)
-			if (_soundItems[i]->_soundFileHash == soundFileHash) {
-				_soundItems.remove_at(i);
+			if (_soundItems[i] == soundItem) {
+				_soundItems[i] = NULL;
 				break;
 			}
 	}
@@ -213,35 +280,41 @@ void SoundMan::update() {
 	
 	for (uint i = 0; i < _soundItems.size(); ++i) {
 		SoundItem *soundItem = _soundItems[i];
-		if (soundItem->_playOnceAfterCountdown) {
-			if (soundItem->_currCountdown == 0) {
-				soundItem->_currCountdown = soundItem->_initialCountdown;
-			} else if (--soundItem->_currCountdown == 0) {
-				soundItem->_soundResource->play();
+		if (soundItem) {
+			if (soundItem->_playOnceAfterCountdown) {
+				if (soundItem->_currCountdown == 0) {
+					soundItem->_currCountdown = soundItem->_initialCountdown;
+				} else if (--soundItem->_currCountdown == 0) {
+					soundItem->_soundResource->play();
+				}
+			} else if (soundItem->_playOnceAfterRandomCountdown) {
+				if (soundItem->_currCountdown == 0) {
+					if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown)
+						soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown);
+				} else if (--soundItem->_currCountdown == 0) {
+					soundItem->_soundResource->play();
+				}
+			} else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) {
+				soundItem->_soundResource->play(); // TODO Looping parameter?
 			}
-		} else if (soundItem->_playOnceAfterRandomCountdown) {
-			if (soundItem->_currCountdown == 0) {
-				if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown)
-					soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown);
-			} else if (--soundItem->_currCountdown == 0) {
-				soundItem->_soundResource->play();
-			}
-		} else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) {
-			soundItem->_soundResource->play(); // TODO Looping parameter?
 		}
 	}
 
 	for (uint i = 0; i < _musicItems.size(); ++i) {
 		MusicItem *musicItem = _musicItems[i];
-		if (musicItem->_countdown) {
-			--musicItem->_countdown;
-		} else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) {
-			musicItem->_musicResource->play(musicItem->_fadeVolumeStep);
-			musicItem->_fadeVolumeStep = 0;
-		} else if (musicItem->_stop) {
-			musicItem->_musicResource->stop(musicItem->_fadeVolumeStep);
-			musicItem->_fadeVolumeStep = 0;
-			musicItem->_stop = false;
+		if (musicItem) {
+			if (musicItem->_countdown) {
+				--musicItem->_countdown;
+			} else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) {
+				debug("SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
+				musicItem->_musicResource->play(musicItem->_fadeVolumeStep);
+				musicItem->_fadeVolumeStep = 0;
+			} else if (musicItem->_stop) {
+				debug("SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
+				musicItem->_musicResource->stop(musicItem->_fadeVolumeStep);
+				musicItem->_fadeVolumeStep = 0;
+				musicItem->_stop = false;
+			}
 		}
 	}
 
@@ -253,11 +326,11 @@ void SoundMan::deleteGroup(uint32 nameHash) {
 }
 
 void SoundMan::deleteMusicGroup(uint32 nameHash) {
-	for (int index = _musicItems.size() - 1; index >= 0; --index) {
+	for (uint index = 0; index < _musicItems.size(); ++index) {
 		MusicItem *musicItem = _musicItems[index];
-		if (musicItem->_nameHash == nameHash) {
+		if (musicItem && musicItem->_nameHash == nameHash) {
 			delete musicItem;
-			_musicItems.remove_at(index);
+			_musicItems[index] = NULL;
 		}
 	}
 }
@@ -276,11 +349,11 @@ void SoundMan::deleteSoundGroup(uint32 nameHash) {
 		_soundIndex2 = -1;
 	}
 
-	for (int index = _soundItems.size() - 1; index >= 0; --index) {
+	for (uint index = 0; index < _soundItems.size(); ++index) {
 		soundItem = _soundItems[index];
-		if (soundItem->_nameHash == nameHash) {
+		if (soundItem && soundItem->_nameHash == nameHash) {
 			delete soundItem;
-			_soundItems.remove_at(index);
+			_soundItems[index] = NULL;
 		}
 	}
 
@@ -359,21 +432,327 @@ void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) {
 
 MusicItem *SoundMan::getMusicItemByHash(uint32 musicFileHash) {
 	for (uint i = 0; i < _musicItems.size(); ++i)
-		if (_musicItems[i]->_musicFileHash == musicFileHash)
+		if (_musicItems[i] && _musicItems[i]->_musicFileHash == musicFileHash)
 			return _musicItems[i];
 	return NULL;
 }
 
 SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
 	for (uint i = 0; i < _soundItems.size(); ++i)
-		if (_soundItems[i]->_soundFileHash == soundFileHash)
+		if (_soundItems[i] && _soundItems[i]->_soundFileHash == soundFileHash)
 			return _soundItems[i];
 	return NULL;
 }
 
+int16 SoundMan::addMusicItem(MusicItem *musicItem) {
+	return 0; // TODO
+}
+
+int16 SoundMan::addSoundItem(SoundItem *soundItem) {
+	for (uint i = 0; i < _soundItems.size(); ++i)
+		if (!_soundItems[i]) {
+			_soundItems[i] = soundItem;
+			return i;
+		}
+	int16 soundIndex = _soundItems.size();
+	_soundItems.push_back(soundItem);
+	return soundIndex;
+}
+
 void SoundMan::deleteSoundByIndex(int index) {
 	delete _soundItems[index];
-	_soundItems.remove_at(index);
+	_soundItems[index] = NULL;
+}
+
+// NeverhoodAudioStream
+
+NeverhoodAudioStream::NeverhoodAudioStream(int rate, byte shiftValue, bool isLooping, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream)
+	: _rate(rate), _shiftValue(shiftValue), _isLooping(isLooping), _isStereo(false), _stream(stream, disposeStream), _endOfData(false), _buffer(0),
+	_isCompressed(_shiftValue != 0xFF), _prevValue(0) {
+	// Setup our buffer for readBuffer
+	_buffer = new byte[kSampleBufferLength * (_isCompressed ? 1 : 2)];
+	assert(_buffer);
+}
+
+NeverhoodAudioStream::~NeverhoodAudioStream() {
+	delete[] _buffer;
+}
+
+int NeverhoodAudioStream::readBuffer(int16 *buffer, const int numSamples) {
+	int samplesLeft = numSamples;
+	
+	while (samplesLeft > 0 && !_endOfData) {
+
+		const int maxSamples = MIN<int>(kSampleBufferLength, samplesLeft);
+		const int bytesToRead = maxSamples * (_isCompressed ? 1 : 2);
+		int bytesRead = _stream->read(_buffer, bytesToRead);
+		int samplesRead = bytesRead / (_isCompressed ? 1 : 2);
+		
+		samplesLeft -= samplesRead;
+		
+		const byte *src = _buffer;
+		if (_isCompressed) {
+			while (samplesRead--) {
+				_prevValue += (int8)(*src++);
+				*buffer++ = _prevValue << _shiftValue;
+			}
+		} else {
+			memcpy(buffer, _buffer, bytesRead);
+			buffer += bytesRead;
+		}
+
+		if (bytesRead < bytesToRead || _stream->pos() >= _stream->size() || _stream->err() || _stream->eos()) {
+			if (_isLooping)
+				_stream->seek(0);
+			else
+				_endOfData = true;
+		}
+
+	}
+
+	return numSamples - samplesLeft;
+}
+
+AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm)
+	: _vm(vm) {
+}
+
+AudioResourceMan::~AudioResourceMan() {
+}
+
+int16 AudioResourceMan::addSound(uint32 fileHash) {
+	AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem();
+	soundItem->_resourceHandle = _vm->_res->useResource(fileHash);
+	soundItem->_fileHash = fileHash;
+	soundItem->_data = NULL;
+	soundItem->_isLoaded = false;
+	soundItem->_isPlaying = false;
+	soundItem->_volume = 100;
+	soundItem->_panning = 50;
+
+	for (uint i = 0; i < _soundItems.size(); ++i)
+		if (!_soundItems[i]) {
+			_soundItems[i] = soundItem;
+			return i;
+		}
+
+	int16 soundIndex = (int16)_soundItems.size();
+	_soundItems.push_back(soundItem);
+	return soundIndex;
+}
+
+void AudioResourceMan::removeSound(int16 soundIndex) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (soundItem->_data) {
+		_vm->_res->unloadResource(soundItem->_resourceHandle);
+		soundItem->_data = NULL;
+	}
+	if (soundItem->_resourceHandle != 1) {
+		_vm->_res->unuseResource(soundItem->_resourceHandle);
+		soundItem->_resourceHandle = -1;
+	}
+	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
+		_vm->_mixer->stopHandle(soundItem->_soundHandle);
+	delete soundItem;
+	_soundItems[soundIndex] = NULL;
+}
+
+void AudioResourceMan::loadSound(int16 soundIndex) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (!soundItem->_data) {
+		// TODO Check if it's a sound resource
+		soundItem->_data = _vm->_res->loadResource(soundItem->_resourceHandle);
+	}
+}
+
+void AudioResourceMan::unloadSound(int16 soundIndex) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (soundItem->_data) {
+		_vm->_res->unloadResource(soundItem->_resourceHandle);
+		soundItem->_data = NULL;
+	}
+}
+
+void AudioResourceMan::setSoundVolume(int16 soundIndex, int16 volume) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	soundItem->_volume = MIN<int16>(volume, 100);
+	if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
+		_vm->_mixer->setChannelVolume(soundItem->_soundHandle, VOLUME(soundItem->_volume));
+}
+
+void AudioResourceMan::setSoundPan(int16 soundIndex, int16 pan) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	soundItem->_panning = MIN<int16>(pan, 100);
+	if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
+		_vm->_mixer->setChannelVolume(soundItem->_soundHandle, PANNING(soundItem->_panning));
+}
+
+void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (!soundItem->_data)
+		loadSound(soundIndex);
+		
+	uint32 soundSize = _vm->_res->getResourceSize(soundItem->_resourceHandle);
+	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundSize, DisposeAfterUse::NO);
+	byte *shiftValue = _vm->_res->getResourceExtData(soundItem->_resourceHandle);
+	NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream);
+
+	_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle,
+		audioStream, -1, VOLUME(soundItem->_volume), PANNING(soundItem->_panning));
+		
+	debug("playing sound %08X", soundItem->_fileHash);
+	
+	soundItem->_isPlaying = true;
+	
+}
+
+void AudioResourceMan::stopSound(int16 soundIndex) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
+		_vm->_mixer->stopHandle(soundItem->_soundHandle);
+	soundItem->_isPlaying = false;
+}
+
+bool AudioResourceMan::isSoundPlaying(int16 soundIndex) {
+	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	return soundItem->_isPlaying;
+}
+
+int16 AudioResourceMan::loadMusic(uint32 fileHash) {
+
+	AudioResourceManMusicItem *musicItem;
+
+	for (uint i = 0; i < _musicItems.size(); ++i) {
+		musicItem = _musicItems[i];
+		if (musicItem && musicItem->_fileHash == fileHash && musicItem->_remove) {
+			musicItem->_remove = false;
+			musicItem->_isFadingOut = false;
+			musicItem->_isFadingIn = true;
+			return i;
+		}
+	}
+	
+	musicItem = new AudioResourceManMusicItem();
+	musicItem->_fileHash = fileHash;
+	musicItem->_isPlaying = false;
+	musicItem->_remove = false;
+	musicItem->_volume = 100;
+	musicItem->_panning = 50;
+	musicItem->_start = false;
+	musicItem->_isFadingIn = false;
+	musicItem->_isFadingOut = false;
+
+	for (uint i = 0; i < _musicItems.size(); ++i) {
+		if (!_musicItems[i]) {
+			_musicItems[i] = musicItem;
+			return i;
+		}
+	}
+	
+	int16 musicIndex = _musicItems.size();
+	_musicItems.push_back(musicItem);
+	return musicIndex;
+	
+}
+
+void AudioResourceMan::unloadMusic(int16 musicIndex) {
+	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+	if (musicItem->_isFadingOut) {
+		musicItem->_remove = true;
+	} else {
+		if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle))
+			_vm->_mixer->stopHandle(musicItem->_soundHandle);
+		musicItem->_isPlaying = false;
+		_musicItems[musicIndex] = NULL;
+	}
+}
+
+void AudioResourceMan::setMusicVolume(int16 musicIndex, int16 volume) {
+	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+	musicItem->_volume = MIN<int16>(volume, 100);
+	if (musicItem->_isPlaying && _vm->_mixer->isSoundHandleActive(musicItem->_soundHandle))
+		_vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_volume));
+}	
+
+void AudioResourceMan::playMusic(int16 musicIndex, int16 fadeVolumeStep) {
+	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+	if (!musicItem->_isPlaying) {
+		musicItem->_isFadingIn = false;
+		musicItem->_isFadingOut = false;
+		if (fadeVolumeStep != 0) {
+			musicItem->_isFadingIn = true;
+			musicItem->_fadeVolume = 0;
+			musicItem->_fadeVolumeStep = fadeVolumeStep;
+		}
+		musicItem->_start = true;
+	}
+}
+
+void AudioResourceMan::stopMusic(int16 musicIndex, int16 fadeVolumeStep) {
+	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+	if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
+		if (fadeVolumeStep != 0) {
+			if (musicItem->_isFadingIn)
+				musicItem->_isFadingIn = false;
+			else
+				musicItem->_fadeVolume = musicItem->_volume;
+			musicItem->_isFadingOut = true;
+			musicItem->_fadeVolumeStep = fadeVolumeStep;
+		} else {
+			_vm->_mixer->stopHandle(musicItem->_soundHandle);
+		}
+		musicItem->_isPlaying = false;
+	}
+}
+
+bool AudioResourceMan::isMusicPlaying(int16 musicIndex) {
+	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+	return musicItem->_isPlaying;
+}
+
+void AudioResourceMan::updateMusicItem(int16 musicIndex) {
+	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+
+	if (musicItem->_start && !_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
+		Common::SeekableReadStream *stream = _vm->_res->createStream(musicItem->_fileHash);
+		byte *shiftValue = _vm->_res->getResourceExtDataByHash(musicItem->_fileHash);
+		NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream);
+		_vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &musicItem->_soundHandle,
+			audioStream, -1, VOLUME(musicItem->_isFadingIn ? musicItem->_fadeVolume : musicItem->_volume),
+			PANNING(musicItem->_panning));
+		musicItem->_start = false;
+		musicItem->_isPlaying = true;
+	}
+	
+	if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
+		if (musicItem->_isFadingIn) {
+			musicItem->_fadeVolume += musicItem->_fadeVolumeStep;
+			if (musicItem->_fadeVolume >= musicItem->_volume) {
+				musicItem->_fadeVolume = musicItem->_volume;
+				musicItem->_isFadingIn = false;
+			}
+			_vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume));
+		}
+		if (musicItem->_isFadingOut) {
+			musicItem->_fadeVolume -= musicItem->_fadeVolumeStep;
+			if (musicItem->_fadeVolume < 0)
+				musicItem->_fadeVolume = 0;
+			_vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume));
+			if (musicItem->_fadeVolume == 0) {
+				musicItem->_isFadingOut = false;
+				stopMusic(musicIndex, 0);
+				if (musicItem->_remove)
+					unloadMusic(musicIndex);
+			}
+		}
+	}
+
+}
+
+void AudioResourceMan::update() {
+	for (uint i = 0; i < _musicItems.size(); ++i)
+		if (_musicItems[i])
+			updateMusicItem(i);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index 39bf7cd..b724e89 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -23,6 +23,7 @@
 #ifndef NEVERHOOD_SOUND_H
 #define NEVERHOOD_SOUND_H
 
+#include "audio/audiostream.h"
 #include "common/array.h"
 #include "graphics/surface.h"
 #include "neverhood/neverhood.h"
@@ -30,6 +31,29 @@
 
 namespace Neverhood {
 
+// Convert volume from percent to 0..255
+#define VOLUME(volume) (Audio::Mixer::kMaxChannelVolume / 100 * (volume))
+
+// Convert panning from percent (50% equals center) to -127..0..+127
+#define PANNING(panning) (254 / 100 * (panning) - 127)
+
+class SoundResource {
+public:
+	SoundResource(NeverhoodEngine *vm);
+	~SoundResource();
+	bool isPlaying();
+	void load(uint32 fileHash);
+	void unload();
+	void play(uint32 fileHash);
+	void play();
+	void stop();
+	void setVolume(int16 volume);
+	void setPan(int16 pan);
+protected:
+	NeverhoodEngine *_vm;
+	int16 _soundIndex;	
+};
+
 class MusicResource {
 public:
 	MusicResource(NeverhoodEngine *vm);
@@ -38,8 +62,10 @@ public:
 	void unload();
 	void play(int16 fadeVolumeStep);
 	void stop(int16 fadeVolumeStep);
+	void setVolume(int16 volume);
 protected:
 	NeverhoodEngine *_vm;
+	int16 _musicIndex;	
 };
 
 struct MusicItem {
@@ -72,6 +98,8 @@ struct SoundItem {
 	~SoundItem();
 };
 
+// TODO Give this a better name
+
 class SoundMan {
 public:
 	SoundMan(NeverhoodEngine *vm);
@@ -122,10 +150,102 @@ protected:
 	
 	MusicItem *getMusicItemByHash(uint32 musicFileHash);
 	SoundItem *getSoundItemByHash(uint32 soundFileHash);
+	int16 addMusicItem(MusicItem *musicItem);
+	int16 addSoundItem(SoundItem *soundItem);
 	void deleteSoundByIndex(int index);
 	
 };
 
+class NeverhoodAudioStream : public Audio::AudioStream {
+public:
+	NeverhoodAudioStream(int rate, byte shiftValue, bool isLooping, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream);
+	~NeverhoodAudioStream();
+	int readBuffer(int16 *buffer, const int numSamples);
+	bool isStereo() const  { return _isStereo; }
+	bool endOfData() const { return _endOfData; }
+	int getRate() const { return _rate; }
+private:
+	const int _rate;
+	const bool _isLooping;
+	const bool _isStereo;
+	const byte _shiftValue;
+	const bool _isCompressed;
+	int16 _prevValue;
+	Common::DisposablePtr<Common::SeekableReadStream> _stream;
+	bool _endOfData;
+	byte *_buffer;
+	enum {
+		kSampleBufferLength = 2048
+	};
+	int fillBuffer(int maxSamples);
+};
+
+// TODO Rename these
+
+struct AudioResourceManSoundItem {
+	uint32 _fileHash;
+	int _resourceHandle;
+	byte *_data;
+	bool _isLoaded;
+	bool _isPlaying;
+	int16 _volume;
+	int16 _panning;
+	Audio::SoundHandle _soundHandle;
+};
+
+struct AudioResourceManMusicItem {
+	uint32 _fileHash;
+	// streamIndex dw
+	// needCreate db
+	bool _isPlaying;
+	bool _remove;
+	int16 _volume;
+	int16 _panning;
+	bool _start;
+	bool _isFadingIn;
+	bool _isFadingOut;
+	int16 _fadeVolume;
+	int16 _fadeVolumeStep;
+	Audio::SoundHandle _soundHandle;
+	// status dw
+	// updateCounter dd
+};
+
+class AudioResourceMan {
+public:
+	AudioResourceMan(NeverhoodEngine *vm);
+	~AudioResourceMan();
+	
+	int16 addSound(uint32 fileHash);
+	void removeSound(int16 soundIndex);
+	void loadSound(int16 soundIndex);
+	void unloadSound(int16 soundIndex);
+	void setSoundVolume(int16 soundIndex, int16 volume);
+	void setSoundPan(int16 soundIndex, int16 pan);
+	void playSound(int16 soundIndex, bool looping);
+	void stopSound(int16 soundIndex);
+	bool isSoundPlaying(int16 soundIndex);
+	
+	int16 loadMusic(uint32 fileHash);
+	void unloadMusic(int16 musicIndex);
+	void setMusicVolume(int16 musicIndex, int16 volume);
+	void playMusic(int16 musicIndex, int16 fadeVolumeStep);
+	void stopMusic(int16 musicIndex, int16 fadeVolumeStep);
+	bool isMusicPlaying(int16 musicIndex);
+	void updateMusicItem(int16 musicIndex);
+	
+	void update();
+	
+protected:
+	NeverhoodEngine *_vm;
+
+	Common::Array<AudioResourceManMusicItem*> _musicItems;
+	Common::Array<AudioResourceManSoundItem*> _soundItems;
+
+	int16 addSoundItem(AudioResourceManSoundItem *soundItem);
+
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_SOUND_H */


Commit: f5a8c9d90d66de98f7eba43a2de0c4fdf3517a0d
    https://github.com/scummvm/scummvm/commit/f5a8c9d90d66de98f7eba43a2de0c4fdf3517a0d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: Add most SoundMan remaining calls

Except for those which need a sound hash array (later)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/navigationscene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7841e27..3cd7e1d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -51,13 +51,13 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	
 	// Other initializations moved to actual engine class
 	// TODO
-	// TODO SoundMan_playSoundThree(0x2D0031, 0x8861079);
+	_vm->_soundMan->playSoundThree(0x002D0031, 0x8861079);
 	SetMessageHandler(&GameModule::handleMessage);
 }
 
 GameModule::~GameModule() {
 
-	// TODO SoundMan_deleteSoundGroup(0x2D0031);
+	_vm->_soundMan->deleteSoundGroup(0x002D0031);
 	delete _childObject;
 	_childObject = NULL;
 	// TODO: Set palette to black but probably not neccessary
@@ -300,7 +300,7 @@ void GameModule::startup() {
 //	createModule(1500, 0); // Logos and intro video //Real
 #if 1
 	_vm->gameState().sceneNum = 0;
-	createModule(1400, -1);
+	createModule(1200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 0000883..87ab6e0 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -4733,11 +4733,11 @@ void KmScene2205::sub423980() {
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
-	// TODO SoundMan_addSound(0x80101800, 0xD3B02847);
+	_vm->_soundMan->addSound(0x80101800, 0xD3B02847);
 }
 
 KmScene2206::~KmScene2206() {
-	// TODO SoundMan_deleteSoundGroup(0x80101800);
+	_vm->_soundMan->deleteSoundGroup(0x80101800);
 }
 
 void KmScene2206::xUpdate() {
@@ -4852,7 +4852,7 @@ void KmScene2206::sub482490() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 		SetSpriteUpdate(&KmScene2206::spriteUpdate482450);
-		// TODO SoundMan_playSoundLooping(0xD3B02847);
+		_vm->_soundMan->playSoundLooping(0xD3B02847);
 	}
 }
 
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 77d135d..5ff6cd0 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -46,12 +46,12 @@ Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	// TODO SoundMan_addSoundList(0x1A008D8, dword_4B3BB0, true);
 	// TODO SoundMan_setSoundListParams(dword_4B3BB0, true, 50, 600, 5, 150);
-	// TODO SoundMan_playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0);
+	_vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0);
 
 }
 
 Module1600::~Module1600() {
-	// TODO SoundMan_deleteGroup(0x1A008D8);
+	_vm->_soundMan->deleteGroup(0x1A008D8);
 }
 
 void Module1600::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 696f646..0057926 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -27,10 +27,10 @@ namespace Neverhood {
 Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource(vm) {
 	
-	// TODO SoundMan_addMusic(0x04212331);
+	_vm->_soundMan->addMusic(0x04212331, 0x31114225);
 	// TODO SoundMan_addSoundList(0x04212331, dword_4AE930, true);
 	// TODO SoundMan_setSoundListParams(dword_4AE930, true, 50, 600, 5, 150);
-	// TODO SoundMan_playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0);
+	_vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -45,7 +45,7 @@ Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1700::~Module1700() {
-	// TODO SoundMan_deleteGroup(0x04212331);
+	_vm->_soundMan->deleteGroup(0x04212331);
 }
 
 void Module1700::createScene(int sceneNum, int which) {
@@ -68,7 +68,7 @@ void Module1700::createScene(int sceneNum, int which) {
 		break;
 	case 4:
 		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
-		// TODO SoundMan_startMusic(0x31114225, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x31114225, 0, 2);
 		_childObject = new Scene1705(_vm, this, which);
 		break;
 	}
@@ -97,7 +97,7 @@ void Module1700::updateScene() {
 				createScene(1, 1);
 			} else if (_moduleResult == 2) {
 				if (!_soundResource.isPlaying()) {
-					// TODO _soundResource.setVolume(60);
+					_soundResource.setVolume(60);
 					_soundResource.play(0x58B45E58);
 				}
 				createScene(2, 2);
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 7526a3a..fc31b2d 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -30,7 +30,7 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	// TODO SoundMan_addSoundList(0x04A14718, dword_4AFE70);
 	// TODO SoundMan_setSoundListParams(dword_4AFE70, true, 50, 600, 10, 150);
-	// TODO SoundMan_playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
+	_vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -45,7 +45,7 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1800::~Module1800() {
-	// TODO SoundMan_deleteGroup(0x04A14718);
+	_vm->_soundMan->deleteGroup(0x04A14718);
 }
 
 void Module1800::createScene(int sceneNum, int which) {
@@ -73,7 +73,7 @@ void Module1800::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004AFE40, which);
 		break;
 	case 6:
-		// TODO SoundMan_deleteGroup(0x04A14718);
+		_vm->_soundMan->deleteGroup(0x04A14718);
 		createSmackerScene(0x08D84010, true, true, false);
 		break;
 	case 7:
@@ -156,12 +156,9 @@ void Module1800::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-#if 0 // TODO
-			NavigationScene *navigationScene = (NavigationScene*)_childObject;
-			if (navigationScene->soundFlag1 && navigationScene->index == 2) {
-				// TODO SoundMan_setTwoSoundsPlayFlag(false);
+			if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 2) {
+				_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			}
-#endif	
 			break;
 		}
 	}
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index bf1aad6..d432bcb 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -42,7 +42,7 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module1900::~Module1900() {
-	// TODO SoundMan_deleteGroup(0x04E1C09C);
+	_vm->_soundMan->deleteGroup(0x04E1C09C);
 }
 
 void Module1900::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index e071291..d1d6b82 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -40,7 +40,7 @@ Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2000::~Module2000() {
-	// TODO SoundMan_deleteGroup(0x81293110);
+	_vm->_soundMan->deleteGroup(0x81293110);
 }
 
 void Module2000::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 33c9d23..fd2a793 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -29,7 +29,7 @@ namespace Neverhood {
 Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 
-	// TODO SoundMan_addMusic(0x10A10C14, 0x11482B95);
+	_vm->_soundMan->addMusic(0x10A10C14, 0x11482B95);
 	
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -44,7 +44,7 @@ Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2100::~Module2100() {
-	// TODO SoundMan_deleteMusicGroup(0x10A10C14);
+	_vm->_soundMan->deleteMusicGroup(0x10A10C14);
 }
 
 void Module2100::createScene(int sceneNum, int which) {
@@ -52,7 +52,7 @@ void Module2100::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO SoundMan_startMusic(0x11482B95, 0, 1, 1);
+		_vm->_soundMan->startMusic(0x11482B95, 0, 1);
 		_childObject = new Scene2101(_vm, this, which);
 		break;
 	}
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index cbd232e..bb2f59b 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -33,7 +33,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	debug("Create Module2200(%d)", which);
 
-	// TODO: SoundMan_addMusic(0x11391412, 0x601C908C); 
+	_vm->_soundMan->addMusic(0x11391412, 0x601C908C); 
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -44,7 +44,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2200::~Module2200() {
-	// TODO SoundMan_deleteGroup(0x11391412);
+	_vm->_soundMan->deleteGroup(0x11391412);
 }
 
 void Module2200::createScene(int sceneNum, int which) {
@@ -57,23 +57,23 @@ void Module2200::createScene(int sceneNum, int which) {
 		_childObject = new Scene2201(_vm, this, which);
 		break;
 	case 1:
-		// TODO SoundMan_startMusic(0x601C908C, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2202(_vm, this, which);
 		break;
 	case 2:
-		// TODO SoundMan_startMusic(0x601C908C, 0, 2, 1);
+		_vm->_soundMan->startMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2203(_vm, this, which);
 		break;
 	case 3:
-		// TODO SoundMan_stopMusic(0x601C908C, 0, 2);
+		_vm->_soundMan->stopMusic(0x601C908C, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 3);
 		break;
 	case 4:
-		// TODO SoundMan_stopMusic(0x601C908C, 0, 2);
+		_vm->_soundMan->stopMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2205(_vm, this, which);
 		break;
 	case 5:
-		// TODO SoundMan_stopMusic(0x601C908C, 0, 2);
+		_vm->_soundMan->stopMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2206(_vm, this, which);
 		break;
 	case 6:
@@ -576,19 +576,19 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertSprite<AsScene2201CeilingFan>();
 
-	// TODO SoundMan_addSound(0x04106220, 0x81212040, true);
+	_vm->_soundMan->addSound(0x04106220, 0x81212040);
 
 }
 
 Scene2201::~Scene2201() {
 	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
-	// TODO SoundMan_deleteSoundGroup(0x04106220);
+	_vm->_soundMan->deleteSoundGroup(0x04106220);
 }
 
 void Scene2201::update() {
 	Scene::update();
 	if (!_soundFlag) {
-		// TODO SoundMan_playSoundLooping(0x81212040);
+		_vm->_soundMan->playSoundLooping(0x81212040);
 		_soundFlag = true;
 	}
 }
@@ -918,13 +918,13 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	_soundResource1.load(0x68E25540);
 	_soundResource2.load(0x40400457);
 
-	// TODO SoundMan_addSound(0x60400854, 0x8101A241, true);
-	// TODO SoundMan_playSoundLooping(0x8101A241);
+	_vm->_soundMan->addSound(0x60400854, 0x8101A241);
+	_vm->_soundMan->playSoundLooping(0x8101A241);
 
 }
 
 Scene2202::~Scene2202() {
-	// TODO SoundMan_deleteSoundGroup(0x60400854);
+	_vm->_soundMan->deleteSoundGroup(0x60400854);
 }
 
 void Scene2202::update() {
@@ -1714,7 +1714,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene
 }
 
 AsScene2207Elevator::~AsScene2207Elevator() {
-	// TODO SoundMan_deleteSoundGroup(0x02700413);
+	_vm->_soundMan->deleteSoundGroup(0x02700413);
 }
 
 void AsScene2207Elevator::update() {
@@ -1727,7 +1727,7 @@ void AsScene2207Elevator::update() {
 			if (_destPointIndexDelta != 0) {
 				_destPointIndexDelta = 0;
 			} else {
-				// TODO SoundMan_deleteSound(0xD3B02847);
+				_vm->_soundMan->deleteSound(0xD3B02847);
 				_soundResource.play(0x53B8284A);
 			}
 		}
@@ -1743,7 +1743,7 @@ void AsScene2207Elevator::update() {
 			if (_destPointIndexDelta != 0) {
 				_destPointIndexDelta = 0;
 			} else {
-				// TODO SoundMan_deleteSound(0xD3B02847);
+				_vm->_soundMan->deleteSound(0xD3B02847);
 				_soundResource.play(0x53B8284A);
 			}
 		}
@@ -1802,8 +1802,8 @@ void AsScene2207Elevator::moveToY(int16 y) {
 		} else {
 			_destPointIndexDelta = 2;
 		}
-		// TODO SoundMan_addSound(0x02700413, 0xD3B02847, true);
-		// TODO SoundMan_playSoundLooping(0xD3B02847);
+		_vm->_soundMan->addSound(0x02700413, 0xD3B02847);
+		_vm->_soundMan->playSoundLooping(0xD3B02847);
 	}
 
 	_isMoving = true;
@@ -1888,7 +1888,7 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm
 }
 
 AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
-	// TODO SoundMan_deleteSoundGroup(0x80D00820);
+	_vm->_soundMan->deleteSoundGroup(0x80D00820);
 }
 
 uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1897,14 +1897,14 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
 	case 0x100D:
 		if (!_idle) {
 			if (param.asInteger() == 0x3423093) {
-				// TODO SoundMan_addSound(0x80D00820, 0x12121943, true);
-				// TODO SoundMan_playSoundLooping(0x12121943);
+				_vm->_soundMan->addSound(0x80D00820, 0x12121943);
+				_vm->_soundMan->playSoundLooping(0x12121943);
 			} else if (param.asInteger() == 0x834AB011) {
 				_soundResource1.stop();
 				_soundResource2.stop();
 				_soundResource3.stop();
 				_soundResource4.stop();
-				// TODO SoundMan_deleteSound(0x12121943);
+				_vm->_soundMan->deleteSound(0x12121943);
 			} else if (param.asInteger() == 0x3A980501) {
 				_soundResource2.play();
 			} else if (param.asInteger() == 0x2A2AD498) {
@@ -1949,7 +1949,7 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() {
 	_soundResource2.stop();
 	_soundResource3.stop();
 	_soundResource4.stop();
-	// TODO SoundMan_deleteSound(0x12121943);
+	_vm->_soundMan->deleteSound(0x12121943);
 	_idle = true;
 	setVisible(false);
 }
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index d3346eb..3f7c5e6 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -33,14 +33,14 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	_flag = getGlobalVar(0x10938830) == 0;
 	
 	if (_flag) {
-		// TODO SoundMan_setSoundVolume(0x90F0D1C3, 0);
-		// TODO SoundMan_playSoundLooping(0x90F0D1C3);
+		_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
+		_vm->_soundMan->playSoundLooping(0x90F0D1C3);
 	} else {
-		// TODO SoundMan_setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0);
 	}
 
-	// TODO SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0);
-	// TODO SoundMan_playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0);
+	_vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0);
+	_vm->_soundMan->playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
@@ -59,7 +59,7 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2300::~Module2300() {
-	// TODO SoundMan_deleteGroup(0x1A214010);
+	_vm->_soundMan->deleteGroup(0x1A214010);
 }
 
 void Module2300::createScene(int sceneNum, int which) {
@@ -73,7 +73,7 @@ void Module2300::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B67E8, which);
 		if (_flag) {
 			_volume = 15;
-			// TODO SoundMan_setSoundVolume(0x90F0D1C3, 15);
+			_vm->_soundMan->setSoundVolume(0x90F0D1C3, 15);
 		}
 		break;
 	case 2:
@@ -83,16 +83,16 @@ void Module2300::createScene(int sceneNum, int which) {
 		if (getGlobalVar(0x10938830)) {
 			createNavigationScene(0x004B68F0, which);
 		} else {
-			// TODO SoundMan_setSoundVolume(0x90F0D1C3, _volume);
+			_vm->_soundMan->setSoundVolume(0x90F0D1C3, _volume);
 			createNavigationScene(0x004B68A8, which);
 			if (_flag) {
 				_volume = 87;
-				// TODO SoundMan_setSoundVolume(0x90F0D1C3, 87);
+				_vm->_soundMan->setSoundVolume(0x90F0D1C3, 87);
 			}
 		}
 		break;
 	case 4:
-		// TODO SoundMan_setTwoSoundsPlayFlag(true);
+		_vm->_soundMan->setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x20080A0B, true, true, false);
 		break;
 	}
@@ -140,7 +140,7 @@ void Module2300::updateScene() {
 			}
 			break;
 		case 4:
-			// TODO SoundMan_setTwoSoundsPlayFlag(false);
+			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			createScene(1, 2);
 			break;
 		}
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index f2f2da9..f1f9f04 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -27,7 +27,7 @@ namespace Neverhood {
 Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO SoundMan_addMusic(0x202D1010, 0xB110382D);
+	_vm->_soundMan->addMusic(0x202D1010, 0xB110382D);
 
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, _vm->gameState().which);
@@ -38,7 +38,7 @@ Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2400::~Module2400() {
-	// TODO SoundMan_deleteMusicGroup(0x202D1010);
+	_vm->_soundMan->deleteMusicGroup(0x202D1010);
 }
 
 void Module2400::createScene(int sceneNum, int which) {
@@ -46,27 +46,27 @@ void Module2400::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO SoundMan_stopMusic(0xB110382D, 0, 0);
+		_vm->_soundMan->stopMusic(0xB110382D, 0, 0);
 		_childObject = new Scene2401(_vm, this, which);
 		break;
 	case 1:
-		// TODO SoundMan_startMusic(0xB110382D, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xB110382D, 0, 2);
 		_childObject = new Scene2402(_vm, this, which);
 		break;
 	case 2:
-		// TODO SoundMan_startMusic(0xB110382D, 0, 0, 1);
+		_vm->_soundMan->startMusic(0xB110382D, 0, 0);
 		_childObject = new Scene2403(_vm, this, which);
 		break;
 	case 4:
-		// TODO SoundMan_stopMusic(0xB110382D, 0, 2);
+		_vm->_soundMan->stopMusic(0xB110382D, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 0);
 		break;
 	case 5:
-		// TODO SoundMan_startMusic(0xB110382D, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xB110382D, 0, 2);
 		_childObject = new Scene2406(_vm, this, which);
 		break;
 	case 6:
-		// TODO SoundMan_stopMusic(0xB110382D, 0, 2);
+		_vm->_soundMan->stopMusic(0xB110382D, 0, 2);
 		createSmackerScene(0x20D80001, true, true, false);
 		break;
 	case 7:
@@ -247,7 +247,7 @@ AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm)
 }
 
 AsScene2401FlowingWater::~AsScene2401FlowingWater() {
-	// TODO SoundMan_deleteSoundGroup(0x40F11C09);
+	_vm->_soundMan->deleteSoundGroup(0x40F11C09);
 }
 
 uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -260,15 +260,15 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam
 		break;
 	case 0x2002:
 		if (!_isWaterFlowing) {
-			// TODO SoundMan_addSound(0x40F11C09, 0x980C1420, true);
-			// TODO SoundMan_playSoundLooping(0x980C1420);
+			_vm->_soundMan->addSound(0x40F11C09, 0x980C1420);
+			_vm->_soundMan->playSoundLooping(0x980C1420);
 			startAnimation(0x10203116, 0, -1);
 			setVisible(true);
 			_isWaterFlowing = true;
 		}
 		break;
 	case 0x2003:
-		// TODO SoundMan_deleteSound(0x980C1420);
+		_vm->_soundMan->deleteSound(0x980C1420);
 		_isWaterFlowing = false;
 		break;
 	case 0x3002:
@@ -664,7 +664,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 }
 
 AsScene2402TV::~AsScene2402TV() {
-	// TODO SoundMan_deleteSoundGroup(0x01520123);
+	_vm->_soundMan->deleteSoundGroup(0x01520123);
 }
 
 void AsScene2402TV::upWait() {
@@ -687,12 +687,12 @@ void AsScene2402TV::upFocusKlayman() {
 		startAnimation(0x050A0103, _currFrameIndex, -1);
 		_newStickFrameIndex = _currFrameIndex;
 		if (_countdown2 == 0) {
-			// TODO SoundMan_addSound(0x01520123, 0xC42D4528, true);
-			// TODO SoundMan_playSoundLooping(0xC42D4528); 
+			_vm->_soundMan->addSound(0x01520123, 0xC42D4528);
+			_vm->_soundMan->playSoundLooping(0xC42D4528); 
 		}
 		_countdown2 = 5;
 	} else if (_countdown2 != 0 && (--_countdown2 == 0)) {
-		// TODO SoundMan_deleteSound(0xC42D4528);
+		_vm->_soundMan->deleteSound(0xC42D4528);
 	}
 	AnimatedSprite::update();
 }
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 822204f..a12c516 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -59,8 +59,8 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
 	_soundResource3(vm), _soundResource4(vm), _soundIndex(0) {
 	
-	// TODO SoundMan_addMusic(0x29220120, 0x05343184);
-	// TODO SoundMan_startMusic(0x05343184, 0, 0, 1);
+	_vm->_soundMan->addMusic(0x29220120, 0x05343184);
+	_vm->_soundMan->startMusic(0x05343184, 0, 0);
 	SetMessageHandler(&Module2500::handleMessage);
 
 	if (which < 0) {
@@ -77,7 +77,7 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2500::~Module2500() {
-	// TODO SoundMan_deleteMusicGroup(0x29220120);
+	_vm->_soundMan->deleteMusicGroup(0x29220120);
 }
 
 void Module2500::createScene(int sceneNum, int which) {
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index be05037..9106eeb 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -37,12 +37,12 @@ Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	// TODO SoundMan_addSoundList(0x40271018, dword_4B87E8, true);
 	// TODO SoundMan_setSoundListParams(dword_4B87E8, true, 50, 600, 5, 150);
-	// TODO SoundMan_playTwoSounds(0x40271018, 0x41861371, 0x43A2507F);
+	_vm->_soundMan->playTwoSounds(0x40271018, 0x41861371, 0x43A2507F, 0);
 
 }
 
 Module2600::~Module2600() {
-	// TODO SoundMan_deleteGroup(0x40271018);
+	_vm->_soundMan->deleteGroup(0x40271018);
 }
 
 void Module2600::createScene(int sceneNum, int which) {
@@ -72,7 +72,7 @@ void Module2600::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B8698, which);
 		break;
 	case 7:
-		// TODO SoundMan_deleteGroup(0x40271018);
+		_vm->_soundMan->deleteGroup(0x40271018);
 		createSmackerScene(0x30090001, true, true, false);
 		break;
 	case 8:
@@ -268,7 +268,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
 	setDoDeltaX(1);
 	createSurface1(0x9C210C90, 1200);
 	setClipRect(260, 260, 400, 368);
-	// TODO SoundMan_addSound(0xDC2769B0, true);
+	_vm->_soundMan->addSound(0xDC2769B0, true);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2609Water::handleMessage);
 	if (getGlobalVar(0x4E0BE910))
@@ -281,12 +281,12 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 	case 0x2001:
 		stopAnimation();
 		setVisible(false);
-		// TODO SoundMan_stopSound(0xDC2769B0);
+		_vm->_soundMan->stopSound(0xDC2769B0);
 		break;
 	case 0x2002:
 		startAnimation(0x9C210C90, 0, -1);
 		setVisible(true);
-		// TODO SoundMan_playSoundLooping(0xDC2769B0);
+		_vm->_soundMan->playSoundLooping(0xDC2769B0);
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index a91eea2..aa5c98e 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -86,8 +86,8 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
 	_soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) {
 	
-	// TODO SoundMan_addMusic(0x42212411, 0x04020210);
-	// TODO SoundMan_startMusic(0x04020210, 24, 2, 1);
+	_vm->_soundMan->addMusic(0x42212411, 0x04020210);
+	_vm->_soundMan->startMusic(0x04020210, 24, 2);
 	SetMessageHandler(&Module2700::handleMessage);
 
 	if (which < 0) {
@@ -107,7 +107,7 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2700::~Module2700() {
-	// TODO SoundMan_deleteGroup(0x42212411);
+	_vm->_soundMan->deleteGroup(0x42212411);
 }
 
 void Module2700::createScene(int sceneNum, int which) {
@@ -414,9 +414,9 @@ void Module2700::updateScene() {
 		case 21:
 			// TODO? GameState_sub_469C50(&field_52, 0);
 			// TODO MusicMan_stopAll (if field_52 above = 1)
-			// TODO SoundMan_deleteMusic(_musicFileHash);
-			// TODO SoundMan_startMusic(0x04020210, 0, 2, 1);
-			// TODO SoundMan_deleteSoundGroup(0x42212411);
+			_vm->_soundMan->deleteMusic(_musicFileHash);
+			_vm->_soundMan->startMusic(0x04020210, 0, 2);
+			_vm->_soundMan->deleteSoundGroup(0x42212411);
 			createScene(20, 3);
 			break;
 		case 22:
@@ -458,15 +458,15 @@ void Module2700::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 21:
 			if (!_flag1) {
-				// TODO SoundMan_stopMusic(0x04020210, 0, 1);
+				_vm->_soundMan->stopMusic(0x04020210, 0, 1);
 				// TODO _vm->gameModule()->initScene2801Vars();
 				_musicFileHash = getGlobalVar(0x89A82A15);
 				// TODO? GameState_sub_469C50(&field_52, 0);
 				// TODO MusicMan_create(); // Why?
-				// TODO SoundMan_addMusic(0x42212411, _musicFileHash);
-				// TODO SoundMan_startMusic(_musicFileHash, 0, /*TODO */???, 1);
-				// TODO SoundMan_addSound(0x42212411, 0x44014282, true);
-				// TODO SoundMan_setSoundParams(0x44014282, true, 120, 360, 72, 0);
+				_vm->_soundMan->addMusic(0x42212411, _musicFileHash);
+				_vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */);
+				_vm->_soundMan->addSound(0x42212411, 0x44014282);
+				_vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0);
 				_flag1 = true;
 			}
 			break;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 558819c..f6c6748 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -35,7 +35,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_fileHash = 0;
 	// TODO music stuff
-	// TODO SoundMan_addMusic(0x64210814, 0xD2FA4D14);
+	_vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14);
 	setGlobalVar(0x28D8C940, 1);
 	
 	if (which < 0) {
@@ -52,8 +52,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 
 Module2800::~Module2800() {
 	// TODO music stuff
-	// TODO SoundMan_deleteGroup(0x64210814);
-	// TODO Module2800_sub471DF0();
+	_vm->_soundMan->deleteGroup(0x64210814);
 }
 
 void Module2800::createScene(int sceneNum, int which) {
@@ -61,11 +60,11 @@ void Module2800::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0);
+		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
 		_childObject = new Scene2801(_vm, this, which);
 		break;
 	case 1:
-		// TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0);
+		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
 #if 0		
 		_flag = true; // DEBUG!
 		if (_flag) {
@@ -76,7 +75,7 @@ void Module2800::createScene(int sceneNum, int which) {
 #endif		
 		break;
 	case 2:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		//setGlobalVar(0x1860C990,1);//DEBUG
 		if (getGlobalVar(0x1860C990))
 			_childObject = new Scene2803b(_vm, this, which);
@@ -87,98 +86,98 @@ void Module2800::createScene(int sceneNum, int which) {
 		_childObject = new Scene2804(_vm, this, which);
 		break;
 	case 4:
-		// TODO SoundMan_stopMusic(0xD2FA4D14, 0, 2);
+		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
 		break;
 	case 5:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2806(_vm, this, which);
 		break;
 	case 6:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2807(_vm, this, which);
 		break;
 	case 7:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2808(_vm, this, 0);
 		break;
 	case 8:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2809(_vm, this, which);
 		break;
 	case 9:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2810(_vm, this, which);
 		break;
 	case 10:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2808(_vm, this, 1);
 		break;
 	case 11:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2812(_vm, this, which);
 		break;
 	case 12:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008);
 		break;
 	case 13:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x81C60635, 0x60631814);
 		break;
 	case 14:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0);
 		break;
 	case 15:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC);
 		break;
 	case 16:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0);
 		break;
 	case 17:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018);
 		break;
 	case 18:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018);
 		break;
 	case 19:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x10866205, 0x66201100);
 		break;
 	case 20:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x01C58000, 0x58004014);
 		break;
 	case 21:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2822(_vm, this, which);
 		break;
 	case 22:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948);
 		break;
 	case 23:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040);
 		break;
 	case 24:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A);
 		break;
 	case 25:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		if (getGlobalVar(0x190A1D18))
 			_childObject = new Class152(_vm, this, 0x01600204, 0x0020001E);
 		else
 			_childObject = new Class152(_vm, this, 0x08611204, 0x1120008E);
 		break;
 	case 26:
-		// TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1);
+		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 4);
 		break;
 	//		
@@ -359,10 +358,10 @@ void Module2800::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			// TODO Module2800_sub4731E0(true);
+			// TODO Module2800_updateMusic(true);
 			break;
 		case 1:
-			// TODO Module2800_sub4731E0(false);
+			// TODO Module2800_updateMusic(false);
 			break;
 		}
 	}
@@ -1527,7 +1526,7 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene
 	_needRefresh = true;
 	AnimatedSprite::updatePosition();
 	_soundResource.load(0x6352F051);
-	// TODO SoundMan_addSound(0xC5EA0B28, 0xEF56B094, true);
+	_vm->_soundMan->addSound(0xC5EA0B28, 0xEF56B094);
 	SetUpdateHandler(&AsScene2804BeamCoil::update);
 	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
 }
@@ -1572,13 +1571,13 @@ void AsScene2804BeamCoil::hide() {
 	setVisible(false);
 	_ssBeamCoilBody->setVisible(false);
 	// TODO _ssBeamCoilBody->update(); -> hide()
-	// TODO SoundMan_stopSound(0xEF56B094);
+	_vm->_soundMan->stopSound(0xEF56B094);
 }
 
 void AsScene2804BeamCoil::stBeaming() {
 	startAnimation(0x00494891, 93, -1);
 	NextState(&AsScene2804BeamCoil::stBeaming);
-	// TODO SoundMan_playSoundLooping(0xEF56B094);
+	_vm->_soundMan->playSoundLooping(0xEF56B094);
 }
 
 uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2735,9 +2734,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AE738);
 		_klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
 		_asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2());
-		// TODO SoundMan_addSound(0x84400112, 0xC874EE6C, true);
-		// TODO SoundMan_playSoundLooping(0xC874EE6C);
-		// TODO SoundMan_setSoundVolume(0xC874EE6C, 50);
+		_vm->_soundMan->addSound(0x84400112, 0xC874EE6C);
+		_vm->_soundMan->playSoundLooping(0xC874EE6C);
+		_vm->_soundMan->setSoundVolume(0xC874EE6C, 50);
 		_flag1 = false;
 	} else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) {
 		if (getGlobalVar(0x1860C990)) {
@@ -2798,7 +2797,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 Scene2810::~Scene2810() {
 	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
 	setGlobalVar(0x00D30138, _klayman->getX());
-	// TODO SoundMan_deleteSoundGroup(0x84400112);
+	_vm->_soundMan->deleteSoundGroup(0x84400112);
 }
 
 void Scene2810::sub406650() {
@@ -2887,7 +2886,7 @@ AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm)
 }
 
 AsScene2812Winch::~AsScene2812Winch() {
-	// TODO SoundMan_deleteSoundGroup(0x00B000E2);
+	_vm->_soundMan->deleteSoundGroup(0x00B000E2);
 }
 
 uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2896,8 +2895,8 @@ uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam &param
 	case 0x2000:
 		startAnimation(0x20DA08A0, 0, -1);
 		setVisible(true);
-		// TODO SoundMan_addSound(0x00B000E2, 0xC874EE6C, true);
-		// TODO SoundMan_playSoundLooping(0xC874EE6C);
+		_vm->_soundMan->addSound(0x00B000E2, 0xC874EE6C);
+		_vm->_soundMan->playSoundLooping(0xC874EE6C);
 		break;
 	case 0x3002:
 		startAnimation(0x20DA08A0, 7, -1);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index ab86c48..b76f9c7 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -31,16 +31,16 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	// TODO SoundMan_addSoundList(0x81293110, dword_4B7FC8, true);
 	// TODO SoundMan_setSoundListParams(dword_4B7FC8, true, 50, 600, 5, 150);
-	// TODO SoundMan_setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
-	// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
-	// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
-	// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
+	_vm->_soundMan->setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
+	_vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+	_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
+	_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 
 	_flag = getGlobalVar(0x10938830) != 0;
 
 	if (_flag) {
-		// TODO SoundMan_setSoundVolume(0x90F0D1C3, 0);
-		// TODO SoundMan_playSoundLooping(0x90F0D1C3);
+		_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
+		_vm->_soundMan->playSoundLooping(0x90F0D1C3);
 	}
 
 	if (which < 0) {
@@ -58,7 +58,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module3000::~Module3000() {
-	// TODO SoundMan_deleteGroup(0x81293110);
+	_vm->_soundMan->deleteGroup(0x81293110);
 }
 
 void Module3000::createScene(int sceneNum, int which) {
@@ -77,10 +77,10 @@ void Module3000::createScene(int sceneNum, int which) {
 		}
 		break;
 	case 2:
-		// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
+		_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 		if (_flag) {
 			_soundVolume = 90;
-			// TODO SoundMan_setSoundVolume(0x90F0D1C3, 90);
+			_vm->_soundMan->setSoundVolume(0x90F0D1C3, 90);
 		}
 		if (getGlobalVar(0x10938830)) {
 			createNavigationScene(0x004B7D58, which);
@@ -181,10 +181,10 @@ void Module3000::updateScene() {
 			}
 			break;
 		case 2:
-			// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
+			_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 			if (_flag) {
 				_soundVolume = 0;
-				// TODO SoundMan_setSoundVolume(0x90F0D1C3, 0);
+				_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
 			}
 			if (_moduleResult == 0) {
 				createScene(3, 0);
@@ -275,26 +275,26 @@ void Module3000::updateScene() {
 				int navigationIndex = navigationScene()->getIndex();
 				if (navigationIndex == 1) {
 					if (frameNumber == 0) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
-						// TODO SoundMan_setSoundVolume(0x48498E46, 70);
-						// TODO SoundMan_setSoundVolume(0x50399F64, 70);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+						_vm->_soundMan->setSoundVolume(0x48498E46, 70);
+						_vm->_soundMan->setSoundVolume(0x50399F64, 70);
 					} else if (frameNumber == 100) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 					}
 				} else if (navigationIndex == 0) {
 					if (frameNumber == 0) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
-						// TODO SoundMan_setSoundVolume(0x48498E46, 70);
-						// TODO SoundMan_setSoundVolume(0x50399F64, 70);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+						_vm->_soundMan->setSoundVolume(0x48498E46, 70);
+						_vm->_soundMan->setSoundVolume(0x50399F64, 70);
 					} else if (frameNumber == 10) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 					}
 					if (_flag && _soundVolume < 90 && frameNumber % 2) {
 						if (frameNumber == 0)
 							_soundVolume = 40;
 						else
 							_soundVolume++;
-						// TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume);
+						_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 					}
 				}
 			}
@@ -307,17 +307,17 @@ void Module3000::updateScene() {
 				int navigationIndex = navigationScene()->getIndex();
 				if (_flag && _soundVolume > 1 && frameNumber % 2) {
 					_soundVolume--;
-					// TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume);
+					_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 				}
 				if (navigationIndex == 0) {
 					if (frameNumber == 35) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 					}
 				} else if (navigationIndex == 1) {
 					if (frameNumber == 55) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
-						// TODO SoundMan_setSoundVolume(0x48498E46, 70);
-						// TODO SoundMan_setSoundVolume(0x50399F64, 70);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
+						_vm->_soundMan->setSoundVolume(0x48498E46, 70);
+						_vm->_soundMan->setSoundVolume(0x50399F64, 70);
 					}
 				}
 			}
@@ -330,25 +330,23 @@ void Module3000::updateScene() {
 				int navigationIndex = navigationScene()->getIndex();
 				if (navigationIndex == 2) {
 					if (frameNumber == 40) {
-						// TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
+						_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 					}
 					if (_flag && _soundVolume < 90 && frameNumber % 2) {
 						if (frameNumber == 0)
 							_soundVolume = 40;
 						else
 							_soundVolume++;
-						// TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume);
+						_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 					}
 				}
 			}
 #endif
 			break;
 		case 5:
-#if 0 // ALL TODO
-			if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) {
-				// TODO SoundMan_setTwoSoundsPlayFlag(false);
+			if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 0) {
+				_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			}
-#endif
 			break;
 		}
 	}
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 981e703..a3e1536 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -60,8 +60,8 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 }
 
 NavigationScene::~NavigationScene() {
-	// TODO SoundMan_setTwoSoundsPlayFlag(false);
-	// TODO SoundMan_setSoundThreePlayFlag(false);
+	_vm->_soundMan->setTwoSoundsPlayFlag(false);
+	_vm->_soundMan->setSoundThreePlayFlag(false);
 }
 
 int NavigationScene::getNavigationAreaType() {
@@ -88,8 +88,8 @@ void NavigationScene::update() {
 			_soundFlag2 = false;
 			_soundFlag1 = false;
 			_interactive = true;
-			// TODO SoundMan_setTwoSoundsPlayFlag(false);
-			// TODO SoundMan_setSoundThreePlayFlag(false);
+			_vm->_soundMan->setTwoSoundsPlayFlag(false);
+			_vm->_soundMan->setSoundThreePlayFlag(false);
 			_smackerDone = false;
 			_smackerPlayer->open(navigationItem.fileHash, true);
 			_vm->_screen->clear();
@@ -205,11 +205,11 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 	}
 	
 	if (oldSoundFlag2 != _soundFlag2) {
-		// TODO SoundMan_setSoundThreePlayFlag(_soundFlag2);
+		_vm->_soundMan->setSoundThreePlayFlag(_soundFlag2);
 	}
 
 	if (oldSoundFlag1 != _soundFlag1) {
-		// TODO SoundMan_setTwoSoundsPlayFlag(_soundFlag1);
+		_vm->_soundMan->setTwoSoundsPlayFlag(_soundFlag1);
 	}
 
 }
diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h
index 4397a43..cf351d1 100644
--- a/engines/neverhood/navigationscene.h
+++ b/engines/neverhood/navigationscene.h
@@ -34,6 +34,7 @@ public:
 	NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes);
 	virtual ~NavigationScene();
 	int getNavigationAreaType();
+	int getNavigationIndex() const { return _navigationIndex; }
 	bool getSoundFlag1() const { return _soundFlag1; }
 	bool getSoundFlag2() const { return _soundFlag2; }
 protected:


Commit: a2bc19291216fd137a09fe6f9a9f5e6321e7b67e
    https://github.com/scummvm/scummvm/commit/a2bc19291216fd137a09fe6f9a9f5e6321e7b67e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: Add sound lists to all modules which have them

Changed paths:
    engines/neverhood/module1100.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sound.cpp
    engines/neverhood/sound.h



diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index e948c2b..e5cca26 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -26,6 +26,18 @@
 
 namespace Neverhood {
 
+static const uint32 kModule1100SoundList[] = {
+	0x90805C50,
+	0xB288D450,
+	0x98C05840,
+	0x98A01500,
+	0xB4005E50,
+	0x92025040,
+	0x90035066,
+	0x74E01054,
+	0
+};
+
 Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
@@ -37,8 +49,8 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(9, 3);
 	}
 
-	// TODO SoundMan_addSoundList(0x0002C818, dword_4B85B0, true);
-	// TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250);
+	_vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList);
+	_vm->_soundMan->setSoundListParams(kModule1100SoundList, true, 50, 600, 20, 250);
 	_vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20);
 	_vm->_soundMan->setSoundVolume(0x74E01054, 60);
 	_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index ee4dc7a..45c6842 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -32,12 +32,22 @@
 
 namespace Neverhood {
 
+static const uint32 kModule1300SoundList[] = {
+	0x16805648,
+	0x16805C48,
+	0xB4964448,
+	0x96A05481,
+	0xD0E14441,
+	0x90815450,
+	0
+};
+
 Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
 	_vm->_soundMan->addMusic(0x61C090, 0x203197);
-	// TODO SoundMan_addSoundList(0x61C090, dword_4B2868, true);
-	// TODO SoundMan_setSoundListParams(dword_4B2868, false, 50, 600, 20, 150);
+	_vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList);
+	_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150);
 	_vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0);
 	_vm->_soundMan->setSoundVolume(0x48498E46, 70);
 	_vm->_soundMan->setSoundVolume(0x50399F64, 70);
@@ -102,82 +112,82 @@ void Module1300::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 1:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1302(_vm, this, which);
 		break;
 	case 2:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1303(_vm, this, which);
 		break;
 	case 3:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1304(_vm, this, which);
 		break;
 	case 4:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1305(_vm, this, which);
 		break;
 	case 5:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1306(_vm, this, which);
 		break;
 	case 6:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1307(_vm, this, which);
 		break;
 	case 7:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x203197, 0, 2);
 		_childObject = new Scene1308(_vm, this, which);
 		break;
 	case 8:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 1);
 		break;
 	case 9:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createSmackerScene(0x20082818, true, true, false);
 		break;
 	case 10:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createSmackerScene(0x20082828, true, true, false);
 		break;
 	case 11:
-		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B27A8, which);
 		break;
 	case 12:
-		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2718, which);
 		break;
 	case 13:
-		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B27D8, which);
 		break;
 	case 14:
-		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2808, which);
 		break;
 	case 15:
-		// TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		createNavigationScene(0x004B2838, which);
 		break;
 	case 16:
-		// TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x203197, 0, 2);
 		_childObject = new Scene1317(_vm, this, which);
 		break;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 5ff6cd0..864e4a6 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -27,6 +27,15 @@
 
 namespace Neverhood {
 
+static const uint32 kModule1600SoundList[] = {
+	0x90805C50,
+	0x90804450,
+	0xB4005E60,
+	0x91835066,
+	0x90E14440,
+	0
+};
+
 Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
@@ -44,8 +53,8 @@ Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	// TODO SoundMan_addSoundList(0x1A008D8, dword_4B3BB0, true);
-	// TODO SoundMan_setSoundListParams(dword_4B3BB0, true, 50, 600, 5, 150);
+	_vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList);
+	_vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150);
 	_vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0);
 
 }
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 0057926..13d0f35 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -24,12 +24,21 @@
 
 namespace Neverhood {
 
+static const uint32 kModule1700SoundList[] = {
+	0xB288D450,
+	0x90804450,
+	0x99801500,
+	0xB288D455,
+	0x93825040,
+	0
+};
+
 Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundResource(vm) {
 	
 	_vm->_soundMan->addMusic(0x04212331, 0x31114225);
-	// TODO SoundMan_addSoundList(0x04212331, dword_4AE930, true);
-	// TODO SoundMan_setSoundListParams(dword_4AE930, true, 50, 600, 5, 150);
+	_vm->_soundMan->addSoundList(0x04212331, kModule1700SoundList);
+	_vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 50, 600, 5, 150);
 	_vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0);
 
 	if (which < 0) {
@@ -53,7 +62,7 @@ void Module1700::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
-		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0);
 		createSmackerScene(0x3028A005, true, true, false);
 		break;
 	case 1:
@@ -63,11 +72,11 @@ void Module1700::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004AE8E8, which);
 		break;
 	case 3:
-		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0);
 		createSmackerScene(0x01190041, true, true, false);
 		break;
 	case 4:
-		// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x31114225, 0, 2);
 		_childObject = new Scene1705(_vm, this, which);
 		break;
@@ -80,7 +89,7 @@ void Module1700::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			// TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0);
+			_vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 0, 0, 0, 0);
 			createScene(1, 0);
 			break;
 		case 1:
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index fc31b2d..14c4868 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -25,11 +25,21 @@
 
 namespace Neverhood {
 
+static const uint32 kModule1800SoundList[] = {
+	0x16805548,
+	0x16805048,
+	0xD0E14441,
+	0x90E090C2,
+	0x90E1D0C2,
+	0x90E2D0C2,
+	0
+};
+
 Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	// TODO SoundMan_addSoundList(0x04A14718, dword_4AFE70);
-	// TODO SoundMan_setSoundListParams(dword_4AFE70, true, 50, 600, 10, 150);
+	_vm->_soundMan->addSoundList(0x04A14718, kModule1800SoundList);
+	_vm->_soundMan->setSoundListParams(kModule1800SoundList, true, 50, 600, 10, 150);
 	_vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
 
 	if (which < 0) {
@@ -77,7 +87,7 @@ void Module1800::createScene(int sceneNum, int which) {
 		createSmackerScene(0x08D84010, true, true, false);
 		break;
 	case 7:
-		// TODO SoundMan_setSoundListParams(dword_4AFE70, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule1800SoundList, false, 0, 0, 0, 0);
 		createSmackerScene(0x0168B121, true, true, false);
 		break;
 	case 8:
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index d432bcb..c6ce15c 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -25,6 +25,13 @@
 
 namespace Neverhood {
 
+static const uint32 kModule1900SoundList[] = {
+	0xB4005E60,
+	0x91835066,
+	0x90E14440,
+	0
+};
+
 Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 
@@ -36,8 +43,8 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	// TODO SoundMan_addSoundList(0x04E1C09C, dword_4B8800, true);
-	// TODO SoundMan_setSoundListParams(dword_4B8800, true, 50, 600, 5, 150);
+	_vm->_soundMan->addSoundList(0x04E1C09C, kModule1900SoundList);
+	_vm->_soundMan->setSoundListParams(kModule1900SoundList, true, 50, 600, 5, 150);
 
 }
 
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 3f7c5e6..4f35122 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -24,11 +24,21 @@
 
 namespace Neverhood {
 
+static const uint32 kModule2300SoundList[] = {
+	0x90805C50,
+	0x90804450,
+	0xB4005E60,
+	0x91835066,
+	0x90E14440,
+	0x90F0D1C3,
+	0
+};
+
 Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _volume(0) {
 	
-	// TODO SoundMan_addSoundList(0x1A214010, dword_4B6938, true);
-	// TODO SoundMan_setSoundListParams(dword_4B6938, true, 50, 600, 10, 10, 150);
+	_vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList);
+	_vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150);
 
 	_flag = getGlobalVar(0x10938830) == 0;
 	
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 9106eeb..7cdfb69 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -24,6 +24,15 @@
 
 namespace Neverhood {
 
+static const uint32 kModule2600SoundList[] = {
+	0xB288D450,
+	0x90804450,
+	0x99801500,
+	0xB288D455,
+	0x93825040,
+	0
+};
+
 Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
@@ -35,8 +44,8 @@ Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 1);
 	}
 
-	// TODO SoundMan_addSoundList(0x40271018, dword_4B87E8, true);
-	// TODO SoundMan_setSoundListParams(dword_4B87E8, true, 50, 600, 5, 150);
+	_vm->_soundMan->addSoundList(0x40271018, kModule2600SoundList);
+	_vm->_soundMan->setSoundListParams(kModule2600SoundList, true, 50, 600, 5, 150);
 	_vm->_soundMan->playTwoSounds(0x40271018, 0x41861371, 0x43A2507F, 0);
 
 }
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index b76f9c7..3a6209e 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -26,11 +26,22 @@
 
 namespace Neverhood {
 
+static const uint32 kModule3000SoundList[] = {
+	0x92025040,
+	0x90035066,
+	0x90815450,
+	0x99801500,
+	0x90E14440,
+	0x16805048,
+	0x90F0D1C3,
+	0
+};
+
 Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _soundVolume(0) {
 	
-	// TODO SoundMan_addSoundList(0x81293110, dword_4B7FC8, true);
-	// TODO SoundMan_setSoundListParams(dword_4B7FC8, true, 50, 600, 5, 150);
+	_vm->_soundMan->addSoundList(0x81293110, kModule3000SoundList);
+	_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 50, 600, 5, 150);
 	_vm->_soundMan->setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000);
 	_vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
 	_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
@@ -109,7 +120,7 @@ void Module3000::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B7FB0, which, kNavigationTypes06);
 		break;
 	case 7:
-		// TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0);
 		if (!getSubVar(0x40050052, 0x089809C2)) {
 			setSubVar(0x40050052, 0x089809C2, 1);
 			createSmackerScene(0x90022001, true, true, false);
@@ -126,7 +137,7 @@ void Module3000::createScene(int sceneNum, int which) {
 		_childObject = new Scene3011(_vm, this, 0);
 		break;
 	case 11:
-		// TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0);
+		_vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0);
 		if (!getSubVar(0x40050052, 0x10130993)) {
 			setSubVar(0x40050052, 0x10130993, 1);
 			createSmackerScene(0x31093019, true, true, false);
@@ -229,12 +240,12 @@ void Module3000::updateScene() {
 		case 8:
 			_flag = getGlobalVar(0x10938830); // CHECKME
 			if (_moduleResult != 1) {
-				// TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0):
+				// TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0):
 				createScene(4, 1);
 			} else if (getGlobalVar(0xF0402B0A)) {
 				createScene(1008, -1);
 			} else {
-				// TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0);
+				// TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
 				createScene(4, 1);
 			}
 			break;
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index bd2f223..df66c6b 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -206,7 +206,7 @@ void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) {
 	_soundItems.push_back(soundItem);
 }
 
-void SoundMan::addSoundList(uint32 nameHash, uint32 *soundFileHashList) {
+void SoundMan::addSoundList(uint32 nameHash, const uint32 *soundFileHashList) {
 	while (*soundFileHashList)
 		addSound(nameHash, *soundFileHashList++);
 }
@@ -242,7 +242,7 @@ void SoundMan::setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCoun
 	}
 }
 
-void SoundMan::setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
+void SoundMan::setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
 	int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) {
 
 	while (*soundFileHashList)
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index b724e89..1f0940c 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -113,11 +113,11 @@ public:
 	
 	// Sound
 	void addSound(uint32 nameHash, uint32 soundFileHash);
-	void addSoundList(uint32 nameHash, uint32 *soundFileHashList);
+	void addSoundList(uint32 nameHash, const uint32 *soundFileHashList);
 	void deleteSound(uint32 soundFileHash);
 	void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown,
 		int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
-	void setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
+	void setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
 		int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
 	void playSoundLooping(uint32 soundFileHash);
 	void stopSound(uint32 soundFileHash);


Commit: ba991fe7021df572fd003ddda2f7f090081fd299
    https://github.com/scummvm/scummvm/commit/ba991fe7021df572fd003ddda2f7f090081fd299
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:42-07:00

Commit Message:
NEVERHOOD: Fix addSound in AsScene2609Water and add a destructor

Changed paths:
    engines/neverhood/module2600.cpp
    engines/neverhood/module2600.h



diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 7cdfb69..43c55ea 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -277,13 +277,17 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
 	setDoDeltaX(1);
 	createSurface1(0x9C210C90, 1200);
 	setClipRect(260, 260, 400, 368);
-	_vm->_soundMan->addSound(0xDC2769B0, true);
+	_vm->_soundMan->addSound(0x08526C36, 0xDC2769B0);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2609Water::handleMessage);
 	if (getGlobalVar(0x4E0BE910))
 		sendMessage(this, 0x2002, 0);
 }
 
+AsScene2609Water::~AsScene2609Water() {
+	_vm->_soundMan->deleteSoundGroup(0x08526C36);
+}
+
 uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h
index d6580a6..04c7800 100644
--- a/engines/neverhood/module2600.h
+++ b/engines/neverhood/module2600.h
@@ -57,6 +57,7 @@ protected:
 class AsScene2609Water : public AnimatedSprite {
 public:
 	AsScene2609Water(NeverhoodEngine *vm);
+	virtual ~AsScene2609Water();
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: 2ba49676eaff16c43be612579347ce0be8589812
    https://github.com/scummvm/scummvm/commit/2ba49676eaff16c43be612579347ce0be8589812
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:43-07:00

Commit Message:
NEVERHOOD: Add destructor to AsScene2804BeamCoil

Changed paths:
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index f6c6748..597227c 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -1531,6 +1531,10 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene
 	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
 }
 
+AsScene2804BeamCoil::~AsScene2804BeamCoil() {
+	_vm->_soundMan->deleteSoundGroup(0xC5EA0B28);
+}
+
 void AsScene2804BeamCoil::update() {
 	updateAnim();
 	updatePosition();
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 50db161..89e4d71 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -224,6 +224,7 @@ protected:
 class AsScene2804BeamCoil : public AnimatedSprite {
 public:
 	AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody);
+	virtual ~AsScene2804BeamCoil();
 protected:
 	SoundResource _soundResource;
 	Scene *_parentScene;


Commit: 21d1372d7e2ab6a6263ebc3167ca141594756a96
    https://github.com/scummvm/scummvm/commit/21d1372d7e2ab6a6263ebc3167ca141594756a96
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:43-07:00

Commit Message:
NEVERHOOD: Some work on the Klayman "idle" code (when the user doesn't do something for a certain time)

- Fix startIdleAnimation and the Klayman update code which calls the idle code
- Rename related variables/methods

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 87ab6e0..fa2dc7a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -42,12 +42,10 @@ static const KlaymanIdleTableItem klaymanTable2[] = {
 	{1, &Klayman::sub41FEB0}
 }; 
 
-#if 0
 static const KlaymanIdleTableItem klaymanTable3[] = {
 	{1, &Klayman::sub421430},
 	{1, &Klayman::sub421480}
 }; 
-#endif
 
 static const KlaymanIdleTableItem klaymanTable4[] = {
 	{1, &Klayman::sub41FDA0},
@@ -59,10 +57,10 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
 
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
 	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
-	_counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0),
+	_idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0),
 	_tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
 	_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
-	_flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) {
+	_flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
@@ -105,9 +103,8 @@ void Klayman::setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCo
 	_idleTable = table;
 	_idleTableCount = tableCount;
 	_idleTableMaxValue = 0;
-	for (int i = 0; i < tableCount; i++) {
+	for (int i = 0; i < tableCount; i++)
 		_idleTableMaxValue += table[i].value;
-	}
 }
 
 void Klayman::setKlaymanIdleTable1() {
@@ -119,7 +116,7 @@ void Klayman::setKlaymanIdleTable2() {
 }
 
 void Klayman::setKlaymanIdleTable3() {
-	// TODO setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
+	setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
 }
 
 void Klayman::stDoIdlePickEar() {
@@ -276,38 +273,35 @@ void Klayman::sub421350() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x582EC138, 0, -1);
-	_counter = 0;
+	_idleCounter = 0;
 	SetSpriteUpdate(NULL);
 	SetUpdateHandler(&Klayman::update41D1C0);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	_counter3 = 0;
-	_counterMax = 8;
-	_counter3Max = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+	_blinkCounter = 0;
+	_idleCounterMax = 8;
+	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
 void Klayman::update41D1C0() {
 	update();
-	_counter++;
-	if (_counter >= _counterMax) {
-		_counter = 0;
+	_idleCounter++;
+	if (_idleCounter >= _idleCounterMax) {
+		_idleCounter = 0;
 		if (_idleTable) {
 			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
 			for (int i = 0; i < _idleTableCount; i++) {
-				if (randomValue < _idleTable[_idleTableCount].value) {
-					(this->*(_idleTable[_idleTableCount].callback))();
-					_counterMax = _vm->_rnd->getRandomNumber(128) + 24;
+				if (randomValue < _idleTable[i].value) {
+					(this->*(_idleTable[i].callback))();
+					_idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24;
 					break;
 				}
-				randomValue -= _idleTable[_idleTableCount].value;
+				randomValue -= _idleTable[i].value;
 			}
 		}
-	} else {
-		_counter3++;
-		if (_counter3 >= _counter3Max) {
-			_counter3 = 0;
-			_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
-			stIdleSitBlink();
-		}
+	} else if (++_blinkCounter >= _blinkCounterMax) {
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+		stIdleSitBlink();
 	}
 }
 
@@ -449,24 +443,13 @@ void Klayman::sub41CE70() {
 }
 
 void Klayman::startIdleAnimation(uint32 fileHash, AnimationCb callback) {
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	if (_resourceHandle != -1) {
-		// TODO _vm->_res->moveToFront(_resourceHandle);
-		NextState(callback);
-		SetUpdateHandler(&Klayman::upIdleAnimation);
-	}
+	debug("startIdleAnimation(%08X)", fileHash);
+	NextState(callback);
+	SetUpdateHandler(&Klayman::upIdleAnimation);
 }
 
 void Klayman::upIdleAnimation() {
-	// TODO Check if this odd stuff is needed or just some cache optimization
-	if (_vm->_res->isResourceDataValid(_resourceHandle)) {
-		gotoNextStateExt();
-		// TODO _vm->_res->moveToBack(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-	} else {
-		// TODO _vm->_res->moveToFront(_resourceHandle);
-	}
+	gotoNextStateExt();
 	update();
 }
 
@@ -518,9 +501,9 @@ void Klayman::stTryStandIdle() {
 		_status2 = 1;
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
-		_counter = 0;
-		_counter3 = 0;
-		_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+		_idleCounter = 0;
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 		SetUpdateHandler(&Klayman::update41D0F0);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 		SetSpriteUpdate(NULL);
@@ -529,22 +512,22 @@ void Klayman::stTryStandIdle() {
 
 void Klayman::update41D0F0() {
 	update();
-	if (++_counter >= 720) {
-		_counter = 0;
+	if (++_idleCounter >= 720) {
+		_idleCounter = 0;
 		if (_idleTable) {
-			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
+			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1);
 			for (int i = 0; i < _idleTableCount; i++) {
-				if (randomValue < _idleTable[_idleTableCount].value) {
-					(this->*(_idleTable[_idleTableCount].callback))();
+				if (randomValue < _idleTable[i].value) {
+					(this->*(_idleTable[i].callback))();
 					break;
 				}
-				randomValue -= _idleTable[_idleTableCount].value;
+				randomValue -= _idleTable[i].value;
 			}
 		}
-	} else if (++_counter3 >= _counter3Max) {
-		_counter3 = 0;
-		_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
-		stStand();
+	} else if (++_blinkCounter >= _blinkCounterMax) {
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+		stIdleBlink();
 	}
 }
 
@@ -583,7 +566,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::stStand() {
+void Klayman::stIdleBlink() {
 	_status2 = 1;
 	_acceptInput = true;
 	startAnimation(0x5900C41E, 0, -1);
@@ -2299,6 +2282,34 @@ uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
+void Klayman::sub421430() {
+	startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::sub421440));
+}
+
+void Klayman::sub421440() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x90EF8D38, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteUpdate(NULL);
+	NextState(&Klayman::stIdleSitBlinkSecond);
+}
+
+void Klayman::sub421480() {
+	startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::sub421440));
+}
+
+void Klayman::sub421490() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x900F0930, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetSpriteUpdate(NULL);
+	NextState(&Klayman::stIdleSitBlinkSecond);
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -2528,7 +2539,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 
 void KmScene1002::update4497D0() {
 	Klayman::update();
-	if (_counter1 != 0 && (--_counter1 == 0)) {
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		_surface->setVisible(true);
 		SetUpdateHandler(&Klayman::update);
 	}
@@ -2719,7 +2730,7 @@ void KmScene1002::sub449E90() {
 }
 
 void KmScene1002::sub449EF0() {
-	_counter1 = 1;
+	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x000BAB02, 0, -1);
@@ -2752,7 +2763,7 @@ void KmScene1002::sub449F70() {
 }
 
 void KmScene1002::stSpitOutFall() {
-	_counter1 = 1;
+	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x9308C132, 0, -1);
@@ -2765,7 +2776,7 @@ void KmScene1002::stSpitOutFall() {
 }
 
 void KmScene1002::sub44A0D0() {
-	_counter1 = 1;
+	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x0013A206, 0, -1);
@@ -3309,9 +3320,9 @@ uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam &param,
 
 void KmScene1303::update4161A0() {
 	Klayman::update();
-	_counter3++;
-	if (_counter3 >= _counter3Max)
-		stPeekWall3();
+	_blinkCounter++;
+	if (_blinkCounter >= _blinkCounterMax)
+		stPeekWallBlink();
 }
 
 void KmScene1303::stPeekWall1() {
@@ -3321,7 +3332,7 @@ void KmScene1303::stPeekWall1() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	NextState(&KmScene1303::stPeekWall3);
+	NextState(&KmScene1303::stPeekWallBlink);
 }
 
 void KmScene1303::stPeekWall2() {
@@ -3333,11 +3344,11 @@ void KmScene1303::stPeekWall2() {
 	SetMessageHandler(&Klayman::handleMessage41D480);
 }
 
-void KmScene1303::stPeekWall3() {
-	_counter3 = 0;
+void KmScene1303::stPeekWallBlink() {
+	_blinkCounter = 0;
 	_status2 = 0;
 	_acceptInput = true;
-	_counter3Max = _vm->_rnd->getRandomNumber(64) + 24;
+	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 	startAnimation(0xAC20C012, 38, 42);
 	SetUpdateHandler(&KmScene1303::update4161A0);
 	SetSpriteUpdate(NULL);
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index cbf17a0..9e31cf2 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -171,6 +171,12 @@ public:
 	
 	void sub420500();
 	uint32 handleMessage41F0E0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void sub421430();
+	void sub421440();
+	
+	void sub421480();
+	void sub421490();
 
 protected:
 	Entity *_parentScene;
@@ -182,9 +188,9 @@ protected:
 	bool _isMoveObjectRequested;
 	bool _acceptInput;
 	int16 _destX, _destY;
-	int16 _counter, _counterMax;
-	int16 _counter3, _counter3Max;
-	int16 _counter1;
+	int16 _idleCounter, _idleCounterMax;
+	int16 _blinkCounter, _blinkCounterMax;
+	int16 _countdown1;
 	int16 _tapesToInsert;
 	bool _flagF6;
 	bool _isLeverDown;
@@ -199,7 +205,6 @@ protected:
 	int _idleTableMaxValue;
 	NPointArray *_pathPoints;
 	bool _soundFlag;
-	int _resourceHandle;
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
@@ -230,7 +235,7 @@ protected:
 	
 	void update41D0F0();
 
-	void stStand();
+	void stIdleBlink();
 	void stStandAround();
 	
 	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
@@ -381,7 +386,7 @@ protected:
 	void update4161A0();
 	void stPeekWall1();
 	void stPeekWall2();
-	void stPeekWall3();
+	void stPeekWallBlink();
 	void stPeekWallReturn();
 };
 


Commit: 8bdddfdb02c0327af2985b81b4803b79de5a2b33
    https://github.com/scummvm/scummvm/commit/8bdddfdb02c0327af2985b81b4803b79de5a2b33
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:43-07:00

Commit Message:
NEVERHOOD: Rename many Klayman functions/variables

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 3cd7e1d..3b1a8c9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -298,7 +298,7 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule(1500, 0); // Logos and intro video //Real
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 0;
 	createModule(1200, -1);
 #endif
@@ -310,8 +310,8 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(2000, -1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 4;
+#if 1
+	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
 #if 0
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index fa2dc7a..d7e68e6 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -29,28 +29,28 @@ namespace Neverhood {
 
 static const KlaymanIdleTableItem klaymanTable1[] = {
 	{1, &Klayman::stDoIdlePickEar},
-	{1, &Klayman::sub41FDA0},
-	{1, &Klayman::sub41FDF0},
+	{1, &Klayman::stDoIdleSpinHead},
+	{1, &Klayman::stDoIdleArms},
 	{1, &Klayman::stDoIdleChest},
-	{1, &Klayman::sub41FEB0}
+	{1, &Klayman::stDoIdleHeadOff}
 }; 
 
 static const KlaymanIdleTableItem klaymanTable2[] = {
 	{1, &Klayman::stDoIdlePickEar},
-	{1, &Klayman::sub41FDA0},
+	{1, &Klayman::stDoIdleSpinHead},
 	{1, &Klayman::stDoIdleChest},
-	{1, &Klayman::sub41FEB0}
+	{1, &Klayman::stDoIdleHeadOff}
 }; 
 
 static const KlaymanIdleTableItem klaymanTable3[] = {
-	{1, &Klayman::sub421430},
-	{1, &Klayman::sub421480}
+	{1, &Klayman::stDoIdleTeleporterHands},
+	{1, &Klayman::stDoIdleTeleporterHands2}
 }; 
 
 static const KlaymanIdleTableItem klaymanTable4[] = {
-	{1, &Klayman::sub41FDA0},
+	{1, &Klayman::stDoIdleSpinHead},
 	{1, &Klayman::stDoIdleChest},
-	{1, &Klayman::sub41FEB0},
+	{1, &Klayman::stDoIdleHeadOff},
 };
 
 // Klayman
@@ -150,21 +150,21 @@ void Klayman::evIdlePickEarDone() {
 	_soundResource1.stop();
 }
 
-void Klayman::sub41FDA0() {
-	startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::sub41FDB0));
+void Klayman::stDoIdleSpinHead() {
+	startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::stIdleSpinHead));
 }
 
-void Klayman::sub41FDB0() {
+void Klayman::stIdleSpinHead() {
 	_status2 = 1;
 	_acceptInput = true;
 	startAnimation(0xD122C137, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E980);
+	SetMessageHandler(&Klayman::hmIdleSpinHead);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
-uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -176,26 +176,26 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub41FDF0() {
-	startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::sub41FE00));
+void Klayman::stDoIdleArms() {
+	startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::stIdleArms));
 }
 
-void Klayman::sub41FE00() {
+void Klayman::stIdleArms() {
 	_status2 = 1;
 	_acceptInput = true;
 	startAnimation(0x543CD054, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E9E0);
+	SetMessageHandler(&Klayman::hmIdleArms);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
-	FinalizeState(&Klayman::sub41FE50);
+	FinalizeState(&Klayman::evIdleArmsDone);
 }
 
-void Klayman::sub41FE50() {
+void Klayman::evIdleArmsDone() {
 	_soundResource1.stop();
 }
 
-uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmIdleArms(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -237,21 +237,21 @@ uint32 Klayman::hmIdleChest(int messageNum, const MessageParam &param, Entity *s
 	return messageResult;
 }
 
-void Klayman::sub41FEB0() {
-	startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::sub41FEC0));
+void Klayman::stDoIdleHeadOff() {
+	startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::stIdleHeadOff));
 }
 
-void Klayman::sub41FEC0() {
+void Klayman::stIdleHeadOff() {
 	_status2 = 1;
 	_acceptInput = true;
 	startAnimation(0x5120E137, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EFE0);
+	SetMessageHandler(&Klayman::hmIdleHeadOff);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
-uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -269,20 +269,20 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421350() {
+void Klayman::stSitIdleTeleporter() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x582EC138, 0, -1);
 	_idleCounter = 0;
 	SetSpriteUpdate(NULL);
-	SetUpdateHandler(&Klayman::update41D1C0);
+	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_blinkCounter = 0;
 	_idleCounterMax = 8;
 	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void Klayman::update41D1C0() {
+void Klayman::upSitIdleTeleporter() {
 	update();
 	_idleCounter++;
 	if (_idleCounter >= _idleCounterMax) {
@@ -319,7 +319,7 @@ void Klayman::stIdleSitBlinkSecond() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
-	SetUpdateHandler(&Klayman::update41D1C0);
+	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteUpdate(NULL);
 }
@@ -336,9 +336,9 @@ void Klayman::stPickUpNeedle() {
 	}
 }
 
-void Klayman::sub41FFF0() {
+void Klayman::stPickUpTube() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	if (!stStartAction(AnimationCallback(&Klayman::sub41FFF0))) {
+	if (!stStartAction(AnimationCallback(&Klayman::stPickUpTube))) {
 		_status2 = 1;
 		_acceptInput = false;
 		startAnimation(0x0018C032, 0, -1);
@@ -396,7 +396,7 @@ void Klayman::stStepOver() {
 		startAnimation(0x004AA310, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -407,7 +407,7 @@ void Klayman::stSitInTeleporter() {
 		startAnimation(0x392A0330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmSitInTeleporter);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -429,12 +429,12 @@ void Klayman::stGetUpFromTeleporter() {
 	startAnimation(0x913AB120, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
 /////////////////////////////////////////////////////////////////
 
-void Klayman::sub41CE70() {
+void Klayman::stopWalking() {
 	_destX = _x;
 	if (!_isWalking && !_isSneaking && !_isLargeStep) {
 		gotoState(NULL);
@@ -504,13 +504,13 @@ void Klayman::stTryStandIdle() {
 		_idleCounter = 0;
 		_blinkCounter = 0;
 		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
-		SetUpdateHandler(&Klayman::update41D0F0);
+		SetUpdateHandler(&Klayman::upIdle);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-void Klayman::update41D0F0() {
+void Klayman::upIdle() {
 	update();
 	if (++_idleCounter >= 720) {
 		_idleCounter = 0;
@@ -590,7 +590,7 @@ void Klayman::stStandAround() {
 	_status2 = 1;
 	_acceptInput = true;
 	startAnimation(0x5420E254, 0, -1);
-	SetUpdateHandler(&Klayman::update41D0F0);
+	SetUpdateHandler(&Klayman::upIdle);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteUpdate(NULL);
 }
@@ -633,7 +633,7 @@ void Klayman::startWalkToX(int16 x, bool flag) {
 		_destX = x;
 	} else if (flag) {
 		_destX = x;
-		GotoState(&Klayman::sub421550);
+		GotoState(&Klayman::stStartWalkingExt);
 	} else {
 		_destX = x;
 		GotoState(&Klayman::stStartWalking);
@@ -771,7 +771,7 @@ void Klayman::stSneak() {
 	setDoDeltaX(_destX < _x ? 1 : 0);
 	startAnimation(0x5C48C506, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
+	SetMessageHandler(&Klayman::hmSneaking);
 	SetSpriteUpdate(&Klayman::suWalking);
 	FinalizeState(&Klayman::stWalkingDone);	
 }
@@ -780,7 +780,7 @@ void Klayman::stWalkingDone() {
 	_isSneaking = false;
 }
 
-uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmSneaking(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -841,7 +841,7 @@ void Klayman::stWalking() {
 	_acceptInput = true;
 	startAnimation(0x1A249001, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	FinalizeState(&Klayman::stStartWalkingDone);	
 	NextState(&Klayman::stUpdateWalking);
@@ -852,7 +852,7 @@ void Klayman::spriteUpdate41F300() {
 	_deltaX = 0;
 }
 
-uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -892,7 +892,7 @@ void Klayman::stUpdateWalking() {
 			}
 		}
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmWalking);
+		SetMessageHandler(&Klayman::hmSneaking);
 		SetSpriteUpdate(&Klayman::suWalking);
 		FinalizeState(&Klayman::stWalkingDone);	
 	}
@@ -1054,7 +1054,7 @@ void Klayman::startSpecialWalkRight(int16 x) {
 	} else if (_x < x) {
 		startWalkToX(x, false);
 	} else if (_x - x <= 105) {
-		sub41CAC0(x);
+		startWalkToXExt(x);
 	} else {
 		startWalkToX(x, false);
 	}
@@ -1068,13 +1068,13 @@ void Klayman::startSpecialWalkLeft(int16 x) {
 	} else if (x < _x) {
 		startWalkToX(x, false);
 	} else if (x - _x <= 105) {
-		sub41CAC0(x);
+		startWalkToXExt(x);
 	} else {
 		startWalkToX(x, false);
 	}
 }
 
-void Klayman::sub41CDE0(int16 x) {
+void Klayman::startWalkToXSmall(int16 x) {
 	_status3 = 2;
 	if (_x == x) {
 		_destX = x;
@@ -1086,23 +1086,23 @@ void Klayman::sub41CDE0(int16 x) {
 		_destX = x;
 	} else {
 		_destX = x;
-		GotoState(&Klayman::sub421680);
+		GotoState(&Klayman::stStartWalkingSmall);
 	}
 }
 
-void Klayman::sub421680() {
+void Klayman::stStartWalkingSmall() {
 	_isWalking = true;
 	_acceptInput = true;
 	_status3 = 2;
 	setDoDeltaX(_destX < _x ? 1 : 0);
 	startAnimation(0x3A4CD934, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41ED70);
+	SetMessageHandler(&Klayman::hmWalkingSmall);
 	SetSpriteUpdate(&Klayman::suWalkingTestExit);
 	FinalizeState(&Klayman::stStartWalkingDone);
 }
 
-uint32 Klayman::handleMessage41ED70(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1114,7 +1114,7 @@ uint32 Klayman::handleMessage41ED70(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421640() {
+void Klayman::stStandIdleSmall() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x90D0D1D0, 0, -1);
@@ -1123,7 +1123,7 @@ void Klayman::sub421640() {
 	SetSpriteUpdate(NULL);
 }
 
-void Klayman::sub421740() {
+void Klayman::stWonderAboutAfterSmall() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 30, -1);
@@ -1132,7 +1132,7 @@ void Klayman::sub421740() {
 	SetSpriteUpdate(NULL);
 }
 
-void Klayman::sub421780() {
+void Klayman::stWonderAboutHalfSmall() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 0, 10);
@@ -1141,7 +1141,7 @@ void Klayman::sub421780() {
 	SetSpriteUpdate(NULL);
 }
 
-void Klayman::sub421700() {
+void Klayman::stWonderAboutSmall() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 0, -1);
@@ -1150,16 +1150,16 @@ void Klayman::sub421700() {
 	SetSpriteUpdate(NULL);
 }
 
-void Klayman::sub421840() {
+void Klayman::stWalkToFrontNoStepSmall() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimationByHash(0x3F9CC394, 0x14884392, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EE00);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-uint32 Klayman::handleMessage41EE00(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1176,72 +1176,72 @@ uint32 Klayman::handleMessage41EE00(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421800() {
+void Klayman::stWalkToFront2Small() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x2F1C4694, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EE00);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-void Klayman::sub4217C0() {
+void Klayman::stWalkToFrontSmall() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x3F9CC394, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EE00);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-void Klayman::sub421900() {
+void Klayman::stTurnToBackHalfSmall() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimationByHash(0x37ECD436, 0, 0x8520108C);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EE00);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-void Klayman::sub4218C0() {
+void Klayman::stTurnToBackWalkSmall() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x16EDDE36, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EE00);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-void Klayman::sub421880() {
+void Klayman::stTurnToBackSmall() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x37ECD436, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EE00);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-void Klayman::sub420F60() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420F60))) {
+void Klayman::stPullCord() {
+	if (!stStartAction(AnimationCallback(&Klayman::stPullCord))) {
 		_status2 = 2;
 		_acceptInput = false;
 		startAnimation(0x3F28E094, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E6C0);
+		SetMessageHandler(&Klayman::hmPullCord);
 		SetSpriteUpdate(NULL);
-		NextState(&Klayman::sub420FB0);
+		NextState(&Klayman::stReleaseCord);
 	}
 }
 
-void Klayman::sub420FB0() {
+void Klayman::stReleaseCord() {
 	_acceptInput = false;
 	startAnimation(0x3A28C094, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41E6C0);
+	SetMessageHandler(&Klayman::hmPullCord);
 	SetSpriteUpdate(NULL);
 }
 
-uint32 Klayman::handleMessage41E6C0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPullCord(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1256,18 +1256,18 @@ uint32 Klayman::handleMessage41E6C0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421110() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub421110))) {
+void Klayman::stUseTube() {
+	if (!stStartAction(AnimationCallback(&Klayman::stUseTube))) {
 		_status2 = 1;
 		_acceptInput = false;
 		startAnimation(0x1A38A814, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E750);
+		SetMessageHandler(&Klayman::hmUseTube);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-uint32 Klayman::handleMessage41E750(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmUseTube(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1292,20 +1292,20 @@ uint32 Klayman::handleMessage41E750(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub4215E0() {
+void Klayman::stWalkingExt() {
 	_status2 = 0;
 	_isWalking = true;
 	_acceptInput = true;
+	startAnimation(0x5A2CBC00, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
-	startAnimation(0x5A2CBC00, 0, -1);
 }
 
-void Klayman::sub421550() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub421550))) {
+void Klayman::stStartWalkingExt() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalkingExt))) {
 		_status2 = 0;
 		_isWalking = true;
 		_acceptInput = true;
@@ -1314,8 +1314,8 @@ void Klayman::sub421550() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		FinalizeState(&Klayman::stStartWalkingDone);	
-		NextState(&Klayman::sub4215E0);
+		FinalizeState(&Klayman::stStartWalkingDone);
+		NextState(&Klayman::stWalkingExt);
 	}
 }
 
@@ -1326,7 +1326,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 			gotoState(NULL);
 			gotoNextStateExt();
 		} else if (_x < x1 + x2) {
-			sub41CAC0(x1 + x2);
+			startWalkToXExt(x1 + x2);
 		} else {
 			startWalkToX(x1 + x2, false);
 		}
@@ -1336,14 +1336,14 @@ void Klayman::sub41CC40(int16 x1, int16 x2) {
 			gotoState(NULL);
 			gotoNextStateExt();
 		} else if (_x > x1 - x2) {
-			sub41CAC0(x1 - x2);
+			startWalkToXExt(x1 - x2);
 		} else {
 			startWalkToX(x1 - x2, false);
 		}
 	}
 }
 
-void Klayman::sub41CAC0(int16 x) {
+void Klayman::startWalkToXExt(int16 x) {
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
 		_destX = x;
@@ -1540,8 +1540,8 @@ void Klayman::setupJumpToRing() {
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmJumpToRing);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
-	NextState(&Klayman::sub420340);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
+	NextState(&Klayman::stHangOnRing);
 	sendMessage(_attachedSprite, 0x482B, 0);
 }
 
@@ -1566,12 +1566,12 @@ uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam &param, Entity *
 	return messageResult;
 }
 
-void Klayman::spriteUpdate41F230() {
+void Klayman::suUpdateDestX() {
 	AnimatedSprite::updateDeltaXY();
 	_destX = _x;
 }
 
-void Klayman::sub420340() {
+void Klayman::stHangOnRing() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x4829E0B8, 0, -1);
@@ -1594,7 +1594,7 @@ void Klayman::stJumpToRing3() {
 		_acceptInput = false;
 		startAnimation(0xBA1910B2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmJumpToRing3);
 		NextState(&Klayman::stHoldRing);
 		sendMessage(_attachedSprite, 0x482B, 0);
@@ -1691,14 +1691,14 @@ void Klayman::stStartClimbLadderDown() {
 			startAnimation(0x122D1505, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
 		} else if (_ladderStatus == 3) {
 			_ladderStatus = 2;
 			_acceptInput = true;
 			startAnimationByHash(0x122D1505, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
 		} else if (_ladderStatus == 1) {
 			_ladderStatus = 2;
 			_acceptInput = true;
@@ -1715,14 +1715,14 @@ void Klayman::stClimbLadderHalf() {
 		startAnimationByHash(0x3A292504, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	} else if (_ladderStatus == 2) {
 		_ladderStatus = 0;
 		_acceptInput = false;
 		startAnimationByHash(0x122D1505, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41DFD0);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	} else {
 		gotoNextStateExt();
 	}
@@ -1783,14 +1783,14 @@ void Klayman::stStartClimbLadderUp() {
 			startAnimation(0x3A292504, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
 		} else if (_ladderStatus == 3) {
 			_ladderStatus = 1;
 			_acceptInput = true;
 			startAnimationByHash(0x3A292504, 0x01084280, 0);
 			SetUpdateHandler(&Klayman::update);
 			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
 		} else if (_ladderStatus == 2) {
 			_ladderStatus = 1;
 			_acceptInput = true;
@@ -1805,7 +1805,7 @@ void Klayman::stWalkToFrontNoStep() {
 	startAnimationByHash(0xF229C003, 0x14884392, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalkToFront);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
 uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1833,7 +1833,7 @@ void Klayman::stWalkToFront() {
 		startAnimation(0xF229C003, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -1844,7 +1844,7 @@ void Klayman::stTurnToFront() {
 		startAnimationByHash(0xCA221107, 0x8520108C, 0);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -1855,7 +1855,7 @@ void Klayman::stTurnToBack() {
 		startAnimation(0xCA221107, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -1887,7 +1887,7 @@ void Klayman::stTurnToBackToUse() {
 		startAnimation(0x91540140, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmTurnToBackToUse);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -1913,7 +1913,7 @@ void Klayman::stClayDoorOpen() {
 		_acceptInput = false;
 		startAnimation(0x5CCCB330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmClayDoorOpen);
 	}
 }
@@ -1938,8 +1938,8 @@ void Klayman::stTurnToUse() {
 		_acceptInput = false;
 		startAnimation(0x9B250AD2, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
 		SetMessageHandler(&Klayman::hmTurnToUse);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -1948,7 +1948,7 @@ void Klayman::stReturnFromUse() {
 	_acceptInput = false;
 	startAnimation(0x98F88391, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmTurnToUse);
 }
 
@@ -1975,11 +1975,11 @@ void Klayman::stMoveObjectSkipTurnFaceObject() {
 	_acceptInput = true;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmMoveObjectTurn);
 }
 
-void Klayman::sub420660() {
+void Klayman::evMoveObjectTurnDone() {
 	sendMessage(_attachedSprite, 0x4807, 0);
 }
 
@@ -1993,7 +1993,7 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
 			if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
 				stMoveObjectSkipTurn();
 			} else {
-				FinalizeState(&Klayman::sub420660);
+				FinalizeState(&Klayman::evMoveObjectTurnDone);
 				SetMessageHandler(&Klayman::handleMessage41D480);
 			}
 		} else if (param.asInteger() == 0x32180101) {
@@ -2014,7 +2014,7 @@ void Klayman::stMoveObjectSkipTurn() {
 	_acceptInput = true;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmMoveObjectTurn);
 }
 
@@ -2026,7 +2026,7 @@ void Klayman::stMoveObjectFaceObject() {
 		_acceptInput = true;
 		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmMoveObjectTurn);
 	}
 }
@@ -2040,7 +2040,7 @@ void Klayman::stUseLever() {
 			sendMessage(_attachedSprite, 0x482B, 0);
 			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
 			SetMessageHandler(&Klayman::handleMessage41E210);
 			NextState(&Klayman::stPullLeverDown);
 			_acceptInput = false;
@@ -2058,7 +2058,7 @@ void Klayman::stPullLeverDown() {
 void Klayman::stHoldLeverDown() {
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_isLeverDown = true;
 	_acceptInput = true;
@@ -2067,7 +2067,7 @@ void Klayman::stHoldLeverDown() {
 void Klayman::stUseLeverRelease() {
 	startAnimation(0x09018068, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::handleMessage41E210);
 	sendMessage(_attachedSprite, 0x4807, 0);
 	NextState(&Klayman::stPullLeverDown);
@@ -2079,7 +2079,7 @@ void Klayman::stReleaseLever() {
 		_status2 = 2;
 		startAnimation(0x09018068, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::handleMessage41E210);
 		sendMessage(_attachedSprite, 0x4807, 0);
 		NextState(&Klayman::stLetGoOfLever);
@@ -2183,16 +2183,16 @@ void Klayman::walkAlongPathPoints() {
 	}
 }
 
-void Klayman::sub4204C0() {
+void Klayman::stJumpToGrab() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimationByHash(0x00AB8C10, 0x01084280, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F920);
-	SetMessageHandler(&Klayman::handleMessage41E5F0);
+	SetSpriteUpdate(&Klayman::suJumpToGrab);
+	SetMessageHandler(&Klayman::hmJumpToGrab);
 }
 
-void Klayman::spriteUpdate41F920() {
+void Klayman::suJumpToGrab() {
 	updateDeltaXY();
 	if (_y >= _destY) {
 		_y = _destY;
@@ -2201,7 +2201,7 @@ void Klayman::spriteUpdate41F920() {
 	}
 }
 
-uint32 Klayman::handleMessage41E5F0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2218,7 +2218,7 @@ uint32 Klayman::handleMessage41E5F0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421230() {
+void Klayman::sub421230() {//stGrow
 	_status2 = 2;
 	_acceptInput = false;
 	startAnimationByHash(0x38445000, 0, -1);
@@ -2238,40 +2238,40 @@ uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421270() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub421270))) {
+void Klayman::stTurnToUseExt() {
+	if (!stStartAction(AnimationCallback(&Klayman::stTurnToUseExt))) {
 		_status2 = 2;
 		_acceptInput = false;
 		startAnimation(0x1B3D8216, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmTurnToUse);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
-void Klayman::sub420460() {
-	if (!stStartAction(AnimationCallback(&Klayman::sub420460))) {
+void Klayman::stJumpToGrabFall() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpToGrabFall))) {
 		_status2 = 0;
 		_acceptInput = false;
 		startAnimation(0x00AB8C10, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41E5F0);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F920);
+		SetMessageHandler(&Klayman::hmJumpToGrab);
+		SetSpriteUpdate(&Klayman::suJumpToGrab);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
 
-void Klayman::sub420500() {
+void Klayman::stJumpToGrabRelease() {
 	_status2 = 1;
 	_acceptInput = false;
 	startAnimationByHash(0x00AB8C10, 0x320AC306, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41F0E0);
+	SetMessageHandler(&Klayman::hmJumpToGrabRelease);
 	NextState(&Klayman::stReleaseRing);
 }
 
-uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2282,11 +2282,11 @@ uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klayman::sub421430() {
-	startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::sub421440));
+void Klayman::stDoIdleTeleporterHands() {
+	startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::stIdleTeleporterHands));
 }
 
-void Klayman::sub421440() {
+void Klayman::stIdleTeleporterHands() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x90EF8D38, 0, -1);
@@ -2296,11 +2296,11 @@ void Klayman::sub421440() {
 	NextState(&Klayman::stIdleSitBlinkSecond);
 }
 
-void Klayman::sub421480() {
-	startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::sub421440));
+void Klayman::stDoIdleTeleporterHands2() {
+	startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::stIdleTeleporterHands2));
 }
 
-void Klayman::sub421490() {
+void Klayman::stIdleTeleporterHands2() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x900F0930, 0, -1);
@@ -2332,7 +2332,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stSleeping);
 		break;
 	case 0x480D:
-		GotoState(&KmScene1001::sub44FA50);
+		GotoState(&KmScene1001::stPullLever);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
@@ -2391,18 +2391,18 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1001::sub44FA50() {
-	if (!stStartAction(AnimationCallback(&KmScene1001::sub44FA50))) {
+void KmScene1001::stPullLever() {
+	if (!stStartAction(AnimationCallback(&KmScene1001::stPullLever))) {
 		_status2 = 2;
 		_acceptInput = false;
 		startAnimation(0x00648953, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1001::handleMessage44FA00);
+		SetMessageHandler(&KmScene1001::hmPullLever);
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	}
 }
 
-uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1001::hmPullLever(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2439,7 +2439,7 @@ void KmScene1002::xUpdate() {
 uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2001:
-		GotoState(&KmScene1002::sub449E90);
+		GotoState(&KmScene1002::stStandIdleSpecial);
 		break;
 	case 0x2007:
 		_otherSprite = (Sprite*)param.asEntity();
@@ -2481,7 +2481,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&KmScene1002::stMoveVenusFlyTrap);
 		break;
 	case 0x480D:			   
-		GotoState(&KmScene1002::sub449E20);
+		GotoState(&KmScene1002::stJumpToRingVenusFlyTrap);
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:  
 		if (param.asInteger() == 0) {
@@ -2545,7 +2545,7 @@ void KmScene1002::update4497D0() {
 	}
 }
 
-uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2571,7 +2571,7 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x4811:
 		_soundResource1.play(0x5252A0E4);
@@ -2705,20 +2705,20 @@ void KmScene1002::suFallDown() {
 	_vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0);
 }
 
-void KmScene1002::sub449E20() {
-	if (!stStartAction(AnimationCallback(&KmScene1002::sub449E20))) {
+void KmScene1002::stJumpToRingVenusFlyTrap() {
+	if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRingVenusFlyTrap))) {
 		_status2 = 2;
 		_acceptInput = false;
 		startAnimation(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1002::handleMessage449800);
+		SetMessageHandler(&KmScene1002::hmJumpToRingVenusFlyTrap);
 		NextState(&Klayman::stLandOnFeet);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
 
-void KmScene1002::sub449E90() {
+void KmScene1002::stStandIdleSpecial() {
 	_soundResource1.play(0x56548280);
 	_status2 = 0;
 	_acceptInput = false;
@@ -2726,7 +2726,7 @@ void KmScene1002::sub449E90() {
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1002::handleMessage4498E0);
+	SetMessageHandler(&KmScene1002::hmStandIdleSpecial);
 }
 
 void KmScene1002::sub449EF0() {
@@ -2998,7 +2998,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -3036,16 +3036,16 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		sub461F30();
+		stTeleporterAppear();
 		break;
 	case 0x483E:
-		sub461F70();
+		stTeleporterDisappear();
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1109::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -3059,22 +3059,22 @@ uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene1109::sub461F30() {
+void KmScene1109::stTeleporterAppear() {
 	_status2 = 0;
 	_acceptInput = false;
+	startAnimation(0x2C2A4A1C, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1109::handleMessage461EA0);
-	startAnimation(0x2C2A4A1C, 0, -1);
+	SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear);
 }
 
-void KmScene1109::sub461F70() {
+void KmScene1109::stTeleporterDisappear() {
 	_status2 = 0;
 	_acceptInput = false;
+	startAnimation(0x3C2E4245, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1109::handleMessage461EA0);
-	startAnimation(0x3C2E4245, 0, -1);
+	SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear);
 }
 
 // KmScene1201
@@ -3109,7 +3109,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&KmScene1201::stTumbleHeadless);
 		break;
 	case 0x4815:
-		GotoState(&KmScene1201::sub40E040);
+		GotoState(&KmScene1201::stCloseEyes);
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 0) {
@@ -3150,7 +3150,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1201::update40DBE0() {
+void KmScene1201::upMoveObject() {
 	if (_x >= 380)
 		gotoNextStateExt();
 	Klayman::update();		
@@ -3239,7 +3239,7 @@ void KmScene1201::stMoveObject() {
 		_countdown = 8;
 		setDoDeltaX(0);
 		startAnimation(0x0C1CA072, 0, -1);
-		SetUpdateHandler(&KmScene1201::update40DBE0);
+		SetUpdateHandler(&KmScene1201::upMoveObject);
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1201::hmMoveObject);
 	}
@@ -3248,7 +3248,7 @@ void KmScene1201::stMoveObject() {
 void KmScene1201::stMoveObjectSkipTurn() {
 	_acceptInput = false;
 	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
-	SetUpdateHandler(&KmScene1201::update40DBE0);
+	SetUpdateHandler(&KmScene1201::upMoveObject);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene1201::hmMoveObject);
 }
@@ -3268,8 +3268,8 @@ void KmScene1201::stTumbleHeadless() {
 	}
 }
 
-void KmScene1201::sub40E040() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::sub40E040))) {
+void KmScene1201::stCloseEyes() {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stCloseEyes))) {
 		_status2 = 1;
 		_acceptInput = false;		
 		startAnimation(0x5420E254, 0, -1);
@@ -3318,7 +3318,7 @@ uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-void KmScene1303::update4161A0() {
+void KmScene1303::upPeekWallBlink() {
 	Klayman::update();
 	_blinkCounter++;
 	if (_blinkCounter >= _blinkCounterMax)
@@ -3350,7 +3350,7 @@ void KmScene1303::stPeekWallBlink() {
 	_acceptInput = true;
 	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 	startAnimation(0xAC20C012, 38, 42);
-	SetUpdateHandler(&KmScene1303::update4161A0);
+	SetUpdateHandler(&KmScene1303::upPeekWallBlink);
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_newStickFrameIndex = 42;
@@ -3384,7 +3384,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -3479,7 +3479,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -3487,7 +3487,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -3572,10 +3572,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		sub417D40();
+		stTeleporterAppear();
 		break;																				
 	case 0x483E:
-		sub417D80();
+		stTeleporterDisappear();
 		break;																				
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -3587,25 +3587,25 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-void KmScene1306::sub417D40() {
+void KmScene1306::stTeleporterAppear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0xEE084A04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1306::handleMessage417CB0);
+	SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear);
 }
 
-void KmScene1306::sub417D80() {
+void KmScene1306::stTeleporterDisappear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0xB86A4274, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1306::handleMessage417CB0);
+	SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear);
 }
 
-uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1306::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -3647,7 +3647,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -3658,7 +3658,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case NM_KLAYMAN_INSERT_DISK:
 		if (param.asInteger() == 1) {
-			GotoState(&KmScene1308::sub456150);		
+			GotoState(&KmScene1308::stInsertDiskSide);		
 		} else {
 			GotoState(&Klayman::stInsertDisk);		
 		}
@@ -3692,7 +3692,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene1308::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1308::hmInsertDiskSide(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -3717,8 +3717,8 @@ uint32 KmScene1308::handleMessage(int messageNum, const MessageParam &param, Ent
 	return messageResult;
 }
 
-void KmScene1308::sub456150() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::sub456150))) {
+void KmScene1308::stInsertDiskSide() {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::stInsertDiskSide))) {
 		_status2 = 2;
 		_flag1 = false;
 		for (uint i = 0; i < 3; i++) {
@@ -3747,7 +3747,7 @@ void KmScene1308::sub456150() {
 			startAnimation(0xDC409440, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
-			SetMessageHandler(&KmScene1308::handleMessage);
+			SetMessageHandler(&KmScene1308::hmInsertDiskSide);
 			_flag1 = false;
 		}
 	}
@@ -3904,7 +3904,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -3961,7 +3961,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -4028,7 +4028,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -4036,7 +4036,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -4057,7 +4057,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_isSittingInTeleporter)//CHECKME
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		break;
 	case 0x481F:
@@ -4121,7 +4121,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		} else {
 			GotoState(&Klayman::stTryStandIdle);
 		}
@@ -4133,7 +4133,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -4186,16 +4186,16 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		sub468AD0();
+		stTeleporterAppear();
 		break;																				
 	case 0x483E:
-		sub468B10();
+		stTeleporterDisappear();
 		break;																				
 	}
 	return messageResult;
 }
 
-uint32 KmScene1705::handleMessage4689A0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1705::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -4209,7 +4209,7 @@ uint32 KmScene1705::handleMessage4689A0(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene1705::spriteUpdate468A30() {
+void KmScene1705::suFallSkipJump() {
 	updateDeltaXY();
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
@@ -4224,27 +4224,27 @@ void KmScene1705::stFallSkipJump() {
 	_acceptInput = false;
 	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&KmScene1705::spriteUpdate468A30);
+	SetSpriteUpdate(&KmScene1705::suFallSkipJump);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	NextState(&Klayman::stLandOnFeet);
 }
 
-void KmScene1705::sub468AD0() {
+void KmScene1705::stTeleporterAppear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x5E0A4905, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1705::handleMessage4689A0);
+	SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear);
 }
 
-void KmScene1705::sub468B10() {
+void KmScene1705::stTeleporterDisappear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0xD86E4477, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1705::handleMessage4689A0);
+	SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear);
 }
 
 KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4303,7 +4303,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		} else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -4341,16 +4341,16 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		sub440230();
+		stTeleporterAppear();
 		break;
 	case 0x483E:
-		stDoTeleport();
+		stTeleporterDisappear();
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2001::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -4364,22 +4364,22 @@ uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene2001::sub440230() {
+void KmScene2001::stTeleporterAppear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0xBE68CC54, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2001::handleMessage4401A0);
+	SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear);
 }
 
-void KmScene2001::stDoTeleport() {
+void KmScene2001::stTeleporterDisappear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x18AB4ED4, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2001::handleMessage4401A0);
+	SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear);
 }
 
 KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4401,18 +4401,18 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4811:
-		GotoState(&KmScene2101::sub4862C0);
+		GotoState(&KmScene2101::stHitByDoor);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -4459,16 +4459,16 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		sub486320();
+		stTeleporterAppear();
 		break;
 	case 0x483E:
-		sub486360();
+		stTeleporterDisappear();
 		break;
 	}
 	return messageResult;	
 }
 
-uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	int16 speedUpFrameIndex;
 	switch (messageNum) {
@@ -4491,7 +4491,7 @@ uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2101::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -4505,32 +4505,32 @@ uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene2101::sub4862C0() {
+void KmScene2101::stHitByDoor() {
 	_status2 = 1;
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene2101::handleMessage486160);
+	SetMessageHandler(&KmScene2101::hmHitByDoor);
 	_soundResource1.play(0x402E82D4);
 }
 
-void KmScene2101::sub486320() {
+void KmScene2101::stTeleporterAppear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0xFF290E30, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2101::handleMessage486230);
+	SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear);
 }
 
-void KmScene2101::sub486360() {
+void KmScene2101::stTeleporterDisappear() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x9A28CA1C, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2101::handleMessage486230);
+	SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear);
 }
 
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
@@ -4624,7 +4624,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -4699,7 +4699,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2205::sub423980);
+			GotoState(&KmScene2205::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -4726,7 +4726,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2205::sub423980() {
+void KmScene2205::stStartWalkingResume() {
 	int16 frameIndex = getGlobalVar(0x18288913);
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
@@ -4735,7 +4735,7 @@ void KmScene2205::sub423980() {
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
@@ -4765,19 +4765,19 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4803:
-		GotoState(&KmScene2206::sub482490);
+		GotoState(&KmScene2206::stRidePlatformDown);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2206::sub482530);
+			GotoState(&KmScene2206::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
 		break;
 	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -4834,7 +4834,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -4846,15 +4846,15 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2206::spriteUpdate482450() {
+void KmScene2206::suRidePlatformDown() {
 	_yDelta++;
 	_y += _yDelta;
 	if (_y > 600)
 		sendMessage(this, 0x1019, 0);
 }
 
-void KmScene2206::sub482490() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::sub482490))) {
+void KmScene2206::stRidePlatformDown() {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) {
 		_status2 = 1;
 		sendMessage(_parentScene, 0x4803, 0);
 		_acceptInput = false;
@@ -4862,12 +4862,12 @@ void KmScene2206::sub482490() {
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::handleMessage41D360);
-		SetSpriteUpdate(&KmScene2206::spriteUpdate482450);
+		SetSpriteUpdate(&KmScene2206::suRidePlatformDown);
 		_vm->_soundMan->playSoundLooping(0xD3B02847);
 	}
 }
 
-void KmScene2206::sub482530() {
+void KmScene2206::stStartWalkingResume() {
 	int16 frameIndex = getGlobalVar(0x18288913) + 1;
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
@@ -4876,7 +4876,7 @@ void KmScene2206::sub482530() {
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
@@ -4890,10 +4890,10 @@ KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2001:
-		GotoState(&KmScene2207::sub442460);
+		GotoState(&KmScene2207::stRidePlatform);
 		break;
 	case 0x2005:
-		spriteUpdate442430();
+		suRidePlatform();
 		GotoState(&KmScene2207::stTryStandIdle);
 		break;
 	case 0x4001:
@@ -4904,7 +4904,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480D:
-		GotoState(&KmScene2207::sub4424B0);
+		GotoState(&KmScene2207::stInteractLever);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
@@ -4946,25 +4946,25 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2207::spriteUpdate442430() {
+void KmScene2207::suRidePlatform() {
 	_x = _attachedSprite->getX() - 20;
 	_y = _attachedSprite->getY() + 46;
 	processDelta();
 }
 
-void KmScene2207::sub442460() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::sub442460))) {
+void KmScene2207::stRidePlatform() {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::stRidePlatform))) {
 		_status2 = 1;
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&KmScene2207::spriteUpdate442430);
+		SetSpriteUpdate(&KmScene2207::suRidePlatform);
 		SetMessageHandler(&Klayman::handleMessage41D360);
 	}
 }
 
-void KmScene2207::sub4424B0() {
-	if (!stStartAction(AnimationCallback(&KmScene2207::sub4424B0))) {
+void KmScene2207::stInteractLever() {
+	if (!stStartAction(AnimationCallback(&KmScene2207::stInteractLever))) {
 		_status2 = 0;
 		if (_isLeverDown) {
 			stUseLeverRelease();
@@ -4972,32 +4972,32 @@ void KmScene2207::sub4424B0() {
 			_acceptInput = false;
 			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&KmScene2207::spriteUpdate41F230);
+			SetSpriteUpdate(&KmScene2207::suUpdateDestX);
 			SetMessageHandler(&Klayman::handleMessage41E210);
-			NextState(&KmScene2207::sub442520);
+			NextState(&KmScene2207::stPullLever);
 		}
 	}
 }
 
-void KmScene2207::sub442520() {
+void KmScene2207::stPullLever() {
 	startAnimation(0x0D318140, 0, -1);
 	sendMessage(_attachedSprite, 0x480F, 0);
-	NextState(&KmScene2207::sub442560);
+	NextState(&KmScene2207::stLookLeverDown);
 }
 
-void KmScene2207::sub442560() {
+void KmScene2207::stLookLeverDown() {
 	startAnimation(0x1564A2C0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
-	NextState(&KmScene2207::sub4425A0);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
+	NextState(&KmScene2207::stWaitLeverDown);
 	_acceptInput = true;
 	_isLeverDown = true;
 }
 
-void KmScene2207::sub4425A0() {
+void KmScene2207::stWaitLeverDown() {
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F230);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	_acceptInput = true;
 	_isLeverDown = true;
@@ -5033,7 +5033,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2) {
 			GotoState(&Klayman::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		} else {
 			GotoState(&Klayman::stPickUpGeneric);
 		}
@@ -5067,7 +5067,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	}
 	return 0;
@@ -5082,7 +5082,7 @@ void KmScene2242::sub444D20() {
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
@@ -5136,7 +5136,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 		gotoNextStateExt();
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	}
 	return 0;
@@ -5151,7 +5151,7 @@ void KmHallOfRecords::sub43B130() {
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
@@ -5205,7 +5205,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	}
 	return 0;
@@ -5220,7 +5220,7 @@ void KmScene2247::sub453520() {
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41EB70);
+	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
 	NextState(&Klayman::stUpdateWalking);
 	FinalizeState(&Klayman::stStartWalkingDone);
@@ -5289,7 +5289,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4832:
-		GotoState(&Klayman::sub421110);
+		GotoState(&Klayman::stUseTube);
 		break;
 	case 0x4833:
 		if (param.asInteger() == 1)
@@ -5470,7 +5470,7 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480D:
-		GotoState(&Klayman::sub420F60);
+		GotoState(&Klayman::stPullCord);
 		break;
 	case 0x4812:
 		GotoState(&Klayman::stPickUpGeneric);
@@ -5567,7 +5567,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 2)
 			GotoState(&Klayman::stPickUpNeedle);
 		else if (param.asInteger() == 1)
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		else
 			GotoState(&Klayman::stPickUpGeneric);
 		break;
@@ -5649,7 +5649,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -5748,7 +5748,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	}
 	return 0;
@@ -5772,14 +5772,14 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4803:
 		_destY = param.asInteger();
-		GotoState(&Klayman::sub4204C0);
+		GotoState(&Klayman::stJumpToGrab);
 		break;
 	case 0x4804:
 		if (param.asInteger() == 3)
 			GotoState(&Klayman::sub421230);
 		break;
 	case 0x480D:
-		GotoState(&Klayman::sub420F60);
+		GotoState(&Klayman::stPullCord);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -5811,7 +5811,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stStepOver);
 		break;
 	case 0x4838:
-		GotoState(&Klayman::sub420500);
+		GotoState(&Klayman::stJumpToGrabRelease);
 		break;
 	}
 	return 0;
@@ -5828,41 +5828,41 @@ uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41CDE0(param.asPoint().x);
+		startWalkToXSmall(param.asPoint().x);
 		break;
 	case 0x4004:
-		GotoState(&Klayman::sub421640);
+		GotoState(&Klayman::stStandIdleSmall);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
 	case 0x4818:
-		sub41CDE0(_dataResource.getPoint(param.asInteger()).x);
+		startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1)
-			GotoState(&Klayman::sub421740);
+			GotoState(&Klayman::stWonderAboutAfterSmall);
 		else if (param.asInteger() == 0)
-			GotoState(&Klayman::sub421780);
+			GotoState(&Klayman::stWonderAboutHalfSmall);
 		else
-			GotoState(&Klayman::sub421700);
+			GotoState(&Klayman::stWonderAboutSmall);
 		break;
 	case 0x482E:
 		if (param.asInteger() == 1)
-			GotoState(&Klayman::sub421840);
+			GotoState(&Klayman::stWalkToFrontNoStepSmall);
 		else if (param.asInteger() == 2)
-			GotoState(&Klayman::sub421800);
+			GotoState(&Klayman::stWalkToFront2Small);
 		else
-			GotoState(&Klayman::sub4217C0);
+			GotoState(&Klayman::stWalkToFrontSmall);
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1)
-			GotoState(&Klayman::sub421900);
+			GotoState(&Klayman::stTurnToBackHalfSmall);
 		else if (param.asInteger() == 2)
-			GotoState(&Klayman::sub4218C0);
+			GotoState(&Klayman::stTurnToBackWalkSmall);
 		else
-			GotoState(&Klayman::sub421880);
+			GotoState(&Klayman::stTurnToBackSmall);
 		break;
 	case 0x4830:
 		GotoState(&KmScene2803b::sub460670);
@@ -5910,7 +5910,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (_isSittingInTeleporter)
-			GotoState(&Klayman::sub421350);
+			GotoState(&Klayman::stSitIdleTeleporter);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -6012,7 +6012,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(440, true);
 		break;
 	case 0x480D:
-		GotoState(&Klayman::sub420F60);
+		GotoState(&Klayman::stPullCord);
 		break;
 	case 0x4816:
 		if (param.asInteger() == 0) {
@@ -6033,7 +6033,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 1) {
 			GotoState(&KmScene2806::sub40F7C0);
 		} else {
-			GotoState(&Klayman::sub421110);
+			GotoState(&Klayman::stUseTube);
 		}
 		break;
 	}
@@ -6174,7 +6174,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(226, true);
 		break;
 	case 0x480D:
-		GotoState(&Klayman::sub420F60);
+		GotoState(&Klayman::stPullCord);
 		break;
 	case 0x4816:
 		if (param.asInteger() == 0) {
@@ -6195,7 +6195,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 1) {
 			GotoState(&KmScene2809::sub458590);
 		} else {
-			GotoState(&Klayman::sub421110);
+			GotoState(&Klayman::stUseTube);
 		}
 		break;
 	}
@@ -6317,42 +6317,42 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
-		sub41CDE0(param.asPoint().x);
+		startWalkToXSmall(param.asPoint().x);
 		break;
 	case 0x4004:
-		GotoState(&Klayman::sub421640);
+		GotoState(&Klayman::stStandIdleSmall);
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x4818:
-		sub41CDE0(_dataResource.getPoint(param.asInteger()).x);
+		startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1)
-			GotoState(&Klayman::sub421740);
+			GotoState(&Klayman::stWonderAboutAfterSmall);
 		else if (param.asInteger() == 0)
-			GotoState(&Klayman::sub421780);
+			GotoState(&Klayman::stWonderAboutHalfSmall);
 		else
-			GotoState(&Klayman::sub421700);
+			GotoState(&Klayman::stWonderAboutSmall);
 		break;
 	case 0x482E:	 
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421840);
+			GotoState(&Klayman::stWalkToFrontNoStepSmall);
 		} else {
-			GotoState(&Klayman::sub4217C0);
+			GotoState(&Klayman::stWalkToFrontSmall);
 		}
 		break;
 	case 0x482F:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::sub421900);
+			GotoState(&Klayman::stTurnToBackHalfSmall);
 		} else {
-			GotoState(&Klayman::sub421880);
+			GotoState(&Klayman::stTurnToBackSmall);
 		}
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	}
 	return 0;
@@ -6376,7 +6376,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4803:
 		_destY = param.asInteger();
-		GotoState(&Klayman::sub4204C0);
+		GotoState(&Klayman::stJumpToGrab);
 		break;
 	case 0x4804:
 		if (param.asInteger() == 3)
@@ -6409,7 +6409,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		} else if (param.asInteger() == 4) {
 			GotoState(&Klayman::stTurnAwayFromUse);
 		} else if (param.asInteger() == 5) {
-			GotoState(&Klayman::sub421270);
+			GotoState(&Klayman::stTurnToUseExt);
 		} else {
 			GotoState(&Klayman::stWonderAbout);
 		}
@@ -6447,7 +6447,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x4837:
-		sub41CE70();
+		stopWalking();
 		break;
 	}
 	return 0;
@@ -6469,14 +6469,13 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4805:
 		_destY = param.asInteger();
-		debug("_destY = %d", _destY);
-		GotoState(&Klayman::sub420460);
+		GotoState(&Klayman::stJumpToGrabFall);
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2)
 			GotoState(&Klayman::stPickUpNeedle);
 		else if (param.asInteger() == 1)
-			GotoState(&Klayman::sub41FFF0);
+			GotoState(&Klayman::stPickUpTube);
 		else
 			GotoState(&Klayman::stPickUpGeneric);
 		break;
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 9e31cf2..3f3aafd 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -53,10 +53,10 @@ public:
 	void update();
 
 	void stDoIdlePickEar();
-	void sub41FDA0();
-	void sub41FDF0();
+	void stDoIdleSpinHead();
+	void stDoIdleArms();
 	void stDoIdleChest();
-	void sub41FEB0();
+	void stDoIdleHeadOff();
 	void stTryStandIdle();
 	void stWakeUp();
 	void stSleeping();
@@ -73,7 +73,7 @@ public:
 	void stPeekWall();
 	void stJumpToRing1();
 	void setupJumpToRing();
-	void sub420340();
+	void stHangOnRing();
 	void stJumpToRing2();
 	void stJumpToRing3();
 	void stHoldRing();
@@ -93,18 +93,18 @@ public:
 	void stTurnToUse();
 	void stReturnFromUse();
 	void stWalkingOpenDoor();
-	void sub421350();
+	void stSitIdleTeleporter();
 	void stIdleSitBlink();
 	void stIdleSitBlinkSecond();
 	void stPickUpNeedle();
-	void sub41FFF0();
+	void stPickUpTube();
 	void stTurnToUseInTeleporter();
 	void stReturnFromUseInTeleporter();
 	void stStepOver();
 	void stSitInTeleporter();
 	void stGetUpFromTeleporter();
 	void stMoveObjectSkipTurnFaceObject();
-	void sub420660();
+	void evMoveObjectTurnDone();
 	void stMoveObjectSkipTurn();
 	void stMoveObjectFaceObject();
 	void stUseLever();
@@ -119,19 +119,19 @@ public:
 	void stUpdateWalking();
 	void stStartWalkingDone();
 
-	void sub41CE70();
+	void stopWalking();
 	
 	void spriteUpdate41F250();
 	void suWalking();
 	void suLargeStep();
-	void spriteUpdate41F230();
+	void suUpdateDestX();
 	void suWalkingOpenDoor();
 	void spriteUpdate41F300();
 	void suWalkingTestExit();
 
 	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41EB70(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
 
 	void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount);
@@ -141,42 +141,42 @@ public:
 	
 	void setSoundFlag(bool value) { _soundFlag = value; }
 
-	void sub421640();
-	void sub421740();
-	void sub421780();
-	void sub421700();
-	void sub421840();
-	void sub421800();
-	void sub4217C0();
-	void sub421900();
-	void sub4218C0();
-	void sub421880();
-	void sub420F60();
-	void sub420FB0();
-	uint32 handleMessage41E6C0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub421110();
-	uint32 handleMessage41E750(int messageNum, const MessageParam &param, Entity *sender);
-	void sub4215E0();
-	void sub421550();
+	void stStandIdleSmall();
+	void stWonderAboutAfterSmall();
+	void stWonderAboutHalfSmall();
+	void stWonderAboutSmall();
+	void stWalkToFrontNoStepSmall();
+	void stWalkToFront2Small();
+	void stWalkToFrontSmall();
+	void stTurnToBackHalfSmall();
+	void stTurnToBackWalkSmall();
+	void stTurnToBackSmall();
+	void stPullCord();
+	void stReleaseCord();
+	uint32 hmPullCord(int messageNum, const MessageParam &param, Entity *sender);
+	void stUseTube();
+	uint32 hmUseTube(int messageNum, const MessageParam &param, Entity *sender);
+	void stWalkingExt();
+	void stStartWalkingExt();
 	
-	void sub4204C0();
-	void spriteUpdate41F920();
-	uint32 handleMessage41E5F0(int messageNum, const MessageParam &param, Entity *sender);
+	void stJumpToGrab();
+	void suJumpToGrab();
+	uint32 hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub421230();
+	void sub421230();//stGrow??
 	uint32 handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub421270();
-	void sub420460();
+	void stTurnToUseExt();
+	void stJumpToGrabFall();
 	
-	void sub420500();
-	uint32 handleMessage41F0E0(int messageNum, const MessageParam &param, Entity *sender);
+	void stJumpToGrabRelease();
+	uint32 hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub421430();
-	void sub421440();
+	void stDoIdleTeleporterHands();
+	void stIdleTeleporterHands();
 	
-	void sub421480();
-	void sub421490();
+	void stDoIdleTeleporterHands2();
+	void stIdleTeleporterHands2();
 
 protected:
 	Entity *_parentScene;
@@ -212,18 +212,18 @@ protected:
 	void evIdlePickEarDone();
 	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
 
-	void sub41FDB0();
-	uint32 handleMessage41E980(int messageNum, const MessageParam &param, Entity *sender);
+	void stIdleSpinHead();
+	uint32 hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender);
 
-	void sub41FE00();
-	void sub41FE50();
-	uint32 handleMessage41E9E0(int messageNum, const MessageParam &param, Entity *sender);
+	void stIdleArms();
+	void evIdleArmsDone();
+	uint32 hmIdleArms(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void stIdleChest();
 	uint32 hmIdleChest(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub41FEC0();
-	uint32 handleMessage41EFE0(int messageNum, const MessageParam &param, Entity *sender);
+	void stIdleHeadOff();
+	uint32 hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender);
 
 	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
 	void upIdleAnimation();
@@ -233,7 +233,7 @@ protected:
 	void sub41C770();
 	void sub41C790();
 	
-	void update41D0F0();
+	void upIdle();
 
 	void stIdleBlink();
 	void stStandAround();
@@ -248,7 +248,7 @@ protected:
 	
 	void stSneak();
 	void stWalkingDone();
-	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmSneaking(int messageNum, const MessageParam &param, Entity *sender);
 	void startSpecialWalkLeft(int16 x);
 	void stStartWalking();
 	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
@@ -259,7 +259,7 @@ protected:
 	
 	void startSpecialWalkRight(int16 x);
 	void sub41CC40(int16 x1, int16 x2);
-	void sub41CAC0(int16 x);
+	void startWalkToXExt(int16 x);
 	void sub41CCE0(int16 x);
 	void stLargeStepDone();
 	
@@ -279,14 +279,14 @@ protected:
 	uint32 hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void update41D1C0();
+	void upSitIdleTeleporter();
 	
 	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void sub41CDE0(int16 x);
-	void sub421680();
-	uint32 handleMessage41ED70(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41EE00(int messageNum, const MessageParam &param, Entity *sender);
+	void startWalkToXSmall(int16 x);
+	void stStartWalkingSmall();
+	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void walkAlongPathPoints();
 	
@@ -297,8 +297,8 @@ public:
 	KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub44FA50();
-	uint32 handleMessage44FA00(int messageNum, const MessageParam &param, Entity *sender);
+	void stPullLever();
+	uint32 hmPullLever(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class KmScene1002 : public Klayman {
@@ -312,16 +312,16 @@ protected:
 	void xUpdate();	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	void update4497D0();
-	uint32 handleMessage449800(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage4498E0(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender);
 	void suFallDown();
-	void sub449E20();
-	void sub449E90();
+	void stJumpToRingVenusFlyTrap();
+	void stStandIdleSpecial();
 	void sub449EF0();
 	void sub449F70();
 	void stSpitOutFall();
@@ -353,9 +353,9 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage461EA0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub461F30();
-	void sub461F70();
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+	void stTeleporterAppear();
+	void stTeleporterDisappear();
 };
 
 class KmScene1201 : public Klayman {
@@ -365,7 +365,7 @@ protected:
 	Entity *_class464;
 	int _countdown;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void update40DBE0();
+	void upMoveObject();
 	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
 	void stFetchMatch();
 	void stLightMatch();
@@ -374,7 +374,7 @@ protected:
 	void stMoveObject();
 	void stMoveObjectSkipTurn();
 	void stTumbleHeadless();
-	void sub40E040();
+	void stCloseEyes();
 };
 
 class KmScene1303 : public Klayman {
@@ -383,7 +383,7 @@ public:
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
-	void update4161A0();
+	void upPeekWallBlink();
 	void stPeekWall1();
 	void stPeekWall2();
 	void stPeekWallBlink();
@@ -412,9 +412,9 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage417CB0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub417D40();
-	void sub417D80();
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+	void stTeleporterAppear();
+	void stTeleporterDisappear();
 };
 
 class KmScene1308 : public Klayman {
@@ -423,8 +423,8 @@ public:
 protected:
 	bool _flag1;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub456150();
+	uint32 hmInsertDiskSide(int messageNum, const MessageParam &param, Entity *sender);
+	void stInsertDiskSide();
 };
 
 class KmScene1401 : public Klayman {
@@ -469,11 +469,11 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage4689A0(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate468A30();
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+	void suFallSkipJump();
 	void stFallSkipJump();
-	void sub468AD0();
-	void sub468B10();
+	void stTeleporterAppear();
+	void stTeleporterDisappear();
 };
 
 class KmScene1901 : public Klayman {
@@ -489,9 +489,9 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage4401A0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub440230();
-	void stDoTeleport();
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+	void stTeleporterAppear();
+	void stTeleporterDisappear();
 };
 
 class KmScene2101 : public Klayman {
@@ -500,11 +500,11 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage486160(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage486230(int messageNum, const MessageParam &param, Entity *sender);
-	void sub4862C0();
-	void sub486320();
-	void sub486360();
+	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+	void stHitByDoor();
+	void stTeleporterAppear();
+	void stTeleporterDisappear();
 };
 
 class KmScene2201 : public Klayman {
@@ -524,7 +524,7 @@ protected:
 class KmScene2205 : public Klayman {
 public:
 	KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-	void sub423980();
+	void stStartWalkingResume();
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -538,9 +538,9 @@ protected:
 	int16 _yDelta;
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void spriteUpdate482450();
-	void sub482490();
-	void sub482530();
+	void suRidePlatformDown();
+	void stRidePlatformDown();
+	void stStartWalkingResume();
 };
 
 class KmScene2207 : public Klayman {
@@ -548,12 +548,12 @@ public:
 	KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void spriteUpdate442430();
-	void sub442460();
-	void sub4424B0();
-	void sub442520();
-	void sub442560();
-	void sub4425A0();
+	void suRidePlatform();
+	void stRidePlatform();
+	void stInteractLever();
+	void stPullLever();
+	void stLookLeverDown();
+	void stWaitLeverDown();
 };
 
 class KmScene2242 : public Klayman {


Commit: a5986fd7222f32dfb00487542086cdd765a39208
    https://github.com/scummvm/scummvm/commit/a5986fd7222f32dfb00487542086cdd765a39208
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:43-07:00

Commit Message:
NEVERHOOD: Fix resource file reading by introducing SafeMutexedSeekableSubReadStream which locks a mutex during reads and also lock the same mutex in BlbArchive::load; loading resources while music is playing shouldn't mess up the file position now

- Fix loading of non-existent resources (not elegant and not checked everywhere yet, the resource system is subject to a minor rewrite anyway)
- Rename more Klayman stuff

Changed paths:
    engines/neverhood/blbarchive.cpp
    engines/neverhood/blbarchive.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/resourceman.cpp
    engines/neverhood/sound.cpp



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index f003728..cb422a1 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -25,6 +25,29 @@
 
 namespace Neverhood {
 
+/**
+ * A special variant of SafeSeekableSubReadStream which locks a mutex during each read.
+ * This is neccessary because the music is streamed from disk and it could happen
+ * that a sound effect or another music track is played from the same read stream
+ * while the first music track is updated/read.
+ */
+
+class SafeMutexedSeekableSubReadStream : public Common::SafeSeekableSubReadStream {
+public:
+	SafeMutexedSeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, DisposeAfterUse::Flag disposeParentStream,
+		Common::Mutex &mutex)
+		: SafeSeekableSubReadStream(parentStream, begin, end, disposeParentStream), _mutex(mutex) {
+	}
+	virtual uint32 read(void *dataPtr, uint32 dataSize);
+protected:
+	Common::Mutex &_mutex;
+};
+
+uint32 SafeMutexedSeekableSubReadStream::read(void *dataPtr, uint32 dataSize) {
+	Common::StackLock lock(_mutex);
+	return Common::SafeSeekableSubReadStream::read(dataPtr, dataSize);
+}
+
 BlbArchive::BlbArchive() : _extData(NULL) {
 }
 
@@ -84,6 +107,8 @@ void BlbArchive::open(const Common::String &filename) {
 }
 
 void BlbArchive::load(uint index, byte *buffer, uint32 size) {
+	Common::StackLock lock(_mutex);
+	
 	BlbArchiveEntry &entry = _entries[index];
 	
 	_fd.seek(entry.offset);
@@ -95,7 +120,11 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) {
 		_fd.read(buffer, size);
 		break;
 	case 3: // DCL-compressed
-		Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size);
+		if (!Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size)) {
+			debug("decompressDCL(diskSize: %d; size: %d)", entry.diskSize, entry.size);
+			debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry.fileHash, entry.type, entry.offset, entry.offset + entry.diskSize);
+			debug("-> fd.pos() = %08X", _fd.pos());
+		}
 		break;
 	default:
 		error("BlbArchive::load() Unknown compression type %d", entry.comprType);
@@ -110,7 +139,8 @@ byte *BlbArchive::getEntryExtData(uint index) {
 
 Common::SeekableReadStream *BlbArchive::createStream(uint index) {
 	const BlbArchiveEntry &entry = _entries[index];
-	return new Common::SafeSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize);
+	return new SafeMutexedSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize,
+		DisposeAfterUse::NO,_mutex);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h
index ddb3f01..cd2fd11 100644
--- a/engines/neverhood/blbarchive.h
+++ b/engines/neverhood/blbarchive.h
@@ -25,6 +25,7 @@
 
 #include "common/array.h"
 #include "common/file.h"
+#include "common/mutex.h"
 #include "common/stream.h"
 #include "common/substream.h"
 #include "neverhood/neverhood.h"
@@ -63,6 +64,7 @@ public:
 	Common::SeekableReadStream *createStream(uint index);
 private:
 	Common::File _fd;
+	Common::Mutex _mutex;
 	Common::Array<BlbArchiveEntry> _entries;
 	byte *_extData;
 };
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 3b1a8c9..5b84e61 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -310,7 +310,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(2000, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
@@ -344,8 +344,9 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 11;
+#if 1
+	setGlobalVar(0x1860C990, 1); // DEBUG Make Klayman small
+	_vm->gameState().sceneNum = 2;
 	createModule(2800, -1);
 #endif
 #if 0
@@ -354,7 +355,7 @@ void GameModule::startup() {
 	createModule(2500, -1);
 #endif
 #if 0
-	_vm->gameState().sceneNum = 2;
+	_vm->gameState().sceneNum = 1;
 	createModule(2400, -1);
 #endif
 }
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index d7e68e6..dd5a588 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5024,7 +5024,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2242::sub444D20);
+			GotoState(&KmScene2242::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5073,8 +5073,8 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2242::sub444D20() {
-	int16 frameIndex = (int16)getGlobalVar(0x18288913);
+void KmScene2242::stStartWalkingResume() {
+	int16 frameIndex = getGlobalVar(0x18288913);
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
@@ -5109,7 +5109,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmHallOfRecords::sub43B130);
+			GotoState(&KmHallOfRecords::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5142,8 +5142,8 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 	return 0;
 }
 
-void KmHallOfRecords::sub43B130() {
-	int16 frameIndex = (int16)getGlobalVar(0x18288913);
+void KmHallOfRecords::stStartWalkingResume() {
+	int16 frameIndex = getGlobalVar(0x18288913);
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
@@ -5178,7 +5178,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2247::sub453520);
+			GotoState(&KmScene2247::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5211,8 +5211,8 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
   
-void KmScene2247::sub453520() {
-	int16 frameIndex = (int16)getGlobalVar(0x18288913);
+void KmScene2247::stStartWalkingResume() {
+	int16 frameIndex = getGlobalVar(0x18288913);
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
@@ -5384,7 +5384,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (!getGlobalVar(0x92603A79))
-			GotoState(&KmScene2402::sub415840);
+			GotoState(&KmScene2402::stStandWonderAbout);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -5442,7 +5442,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-void KmScene2402::sub415840() {
+void KmScene2402::stStandWonderAbout() {
 	if (_x > 260)
 		setDoDeltaX(1);
 	_status2 = 0;
@@ -6027,11 +6027,11 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4831:
-		GotoState(&KmScene2806::sub40F780);
+		GotoState(&KmScene2806::stGrow);
 		break;
 	case 0x4832:
 		if (param.asInteger() == 1) {
-			GotoState(&KmScene2806::sub40F7C0);
+			GotoState(&KmScene2806::stDrinkPotion);
 		} else {
 			GotoState(&Klayman::stUseTube);
 		}
@@ -6040,7 +6040,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene2806::handleMessage40F1F0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2806::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
@@ -6090,7 +6090,7 @@ uint32 KmScene2806::handleMessage40F1F0(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 KmScene2806::handleMessage40F570(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2806::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -6123,23 +6123,23 @@ uint32 KmScene2806::handleMessage40F570(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene2806::sub40F780() {
+void KmScene2806::stGrow() {
 	_status2 = 0;
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene2806::handleMessage40F570);
+	SetMessageHandler(&KmScene2806::hmGrow);
 	startAnimation(0x2838C010, 0, -1);
 }
 
-void KmScene2806::sub40F7C0() {
+void KmScene2806::stDrinkPotion() {
 	_status2 = 1;
 	_acceptInput = false;
 	_flag1 = false;
 	_flag2 = false;
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene2806::handleMessage40F1F0);
+	SetMessageHandler(&KmScene2806::hmDrinkPotion);
 	startAnimation(0x1C388C04, 0, -1);
 }
 
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3f3aafd..25e6d38 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -562,7 +562,7 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub444D20();
+	void stStartWalkingResume();
 };
 
 class KmHallOfRecords : public Klayman {
@@ -571,7 +571,7 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub43B130();
+	void stStartWalkingResume();
 };
 
 class KmScene2247 : public Klayman {
@@ -580,7 +580,7 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub453520();
+	void stStartWalkingResume();
 };
 
 class KmScene2401 : public Klayman {
@@ -605,7 +605,7 @@ public:
 	KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void sub415840();
+	void stStandWonderAbout();
 };
 
 class KmScene2403 : public Klayman {
@@ -678,10 +678,10 @@ protected:
 	bool _flag1;
 	bool _flag2;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage40F1F0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40F570(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40F780();
-	void sub40F7C0();
+	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
+	void stGrow();
+	void stDrinkPotion();
 };
 
 class KmScene2809 : public Klayman {
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index c073e97..28cef36 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -77,6 +77,8 @@ BlbArchiveEntry *ResourceMan::getArchiveEntry(ResourceFileEntry *entry) const {
 
 int ResourceMan::useResource(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntry(fileHash);
+	if (!entry)
+		return -1;
 	if (entry->resourceHandle != -1) {
 		_resources[entry->resourceHandle]->useRefCount++;
 	} else {
@@ -94,6 +96,8 @@ int ResourceMan::useResource(uint32 fileHash) {
 }
 
 void ResourceMan::unuseResource(int resourceHandle) {
+	if (resourceHandle < 0)
+		return;
 	Resource *resource = _resources[resourceHandle];
 	if (resource->useRefCount > 0)
 		resource->useRefCount--;
@@ -111,15 +115,21 @@ int ResourceMan::getResourceHandleByHash(uint32 fileHash) {
 }
 
 bool ResourceMan::isResourceDataValid(int resourceHandle) const {
+	if (resourceHandle < 0)
+		return false;
 	return _resources[resourceHandle]->data != NULL;
 }
 
 uint32 ResourceMan::getResourceSize(int resourceHandle) const {
+	if (resourceHandle < 0)
+		return 0;
 	Resource *resource = _resources[resourceHandle];
 	return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->size;
 }
 
 byte ResourceMan::getResourceType(int resourceHandle) {
+	if (resourceHandle < 0)
+		return 0;
 	Resource *resource = _resources[resourceHandle];
 	return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->type;
 }
@@ -130,6 +140,8 @@ byte ResourceMan::getResourceTypeByHash(uint32 fileHash) {
 }
 
 byte *ResourceMan::getResourceExtData(int resourceHandle) {
+	if (resourceHandle < 0)
+		return NULL;
 	Resource *resource = _resources[resourceHandle];
 	return _archives[resource->archiveIndex]->getEntryExtData(resource->entryIndex);
 }
@@ -140,6 +152,8 @@ byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) {
 }
 
 byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) {
+	if (resourceHandle < 0)
+		return NULL;
 	Resource *resource = _resources[resourceHandle];
 	if (resource->data != NULL) {
 		resource->dataRefCount++;
@@ -154,6 +168,8 @@ byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) {
 }
 
 void ResourceMan::unloadResource(int resourceHandle) {
+	if (resourceHandle < 0)
+		return;
 	Resource *resource = _resources[resourceHandle];
 	if (resource->dataRefCount > 0)
 		resource->dataRefCount--;
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index df66c6b..c1db48c 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -306,11 +306,11 @@ void SoundMan::update() {
 			if (musicItem->_countdown) {
 				--musicItem->_countdown;
 			} else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) {
-				debug("SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
+				debug(1, "SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
 				musicItem->_musicResource->play(musicItem->_fadeVolumeStep);
 				musicItem->_fadeVolumeStep = 0;
 			} else if (musicItem->_stop) {
-				debug("SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
+				debug(1, "SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
 				musicItem->_musicResource->stop(musicItem->_fadeVolumeStep);
 				musicItem->_fadeVolumeStep = 0;
 				musicItem->_stop = false;
@@ -529,13 +529,11 @@ int16 AudioResourceMan::addSound(uint32 fileHash) {
 	soundItem->_isPlaying = false;
 	soundItem->_volume = 100;
 	soundItem->_panning = 50;
-
 	for (uint i = 0; i < _soundItems.size(); ++i)
 		if (!_soundItems[i]) {
 			_soundItems[i] = soundItem;
 			return i;
 		}
-
 	int16 soundIndex = (int16)_soundItems.size();
 	_soundItems.push_back(soundItem);
 	return soundIndex;
@@ -591,6 +589,9 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
 	if (!soundItem->_data)
 		loadSound(soundIndex);
+
+	if (!soundItem->_data)
+		return;
 		
 	uint32 soundSize = _vm->_res->getResourceSize(soundItem->_resourceHandle);
 	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundSize, DisposeAfterUse::NO);
@@ -600,7 +601,7 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
 	_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle,
 		audioStream, -1, VOLUME(soundItem->_volume), PANNING(soundItem->_panning));
 		
-	debug("playing sound %08X", soundItem->_fileHash);
+	debug(1, "playing sound %08X", soundItem->_fileHash);
 	
 	soundItem->_isPlaying = true;
 	


Commit: cce19001fd353664f4348adf291080cef9da50b0
    https://github.com/scummvm/scummvm/commit/cce19001fd353664f4348adf291080cef9da50b0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:43-07:00

Commit Message:
NEVERHOOD: Rename more Klayman stuff (not much left :)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 5b84e61..56812ba 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -314,8 +314,8 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 0;
+#if 1
+	_vm->gameState().sceneNum = 1;
 	createModule(1000, -1);
 #endif
 #if 0
@@ -344,7 +344,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
 #endif
-#if 1
+#if 0
 	setGlobalVar(0x1860C990, 1); // DEBUG Make Klayman small
 	_vm->gameState().sceneNum = 2;
 	createModule(2800, -1);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index dd5a588..6ce39a7 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2537,7 +2537,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1002::update4497D0() {
+void KmScene1002::upSpitOutFall() {
 	Klayman::update();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		_surface->setVisible(true);
@@ -2583,11 +2583,12 @@ uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam &param
 		}
 		_y = ((Sprite*)sender)->getY() - 200;
 		if (param.asInteger() == 0) {
-			sub449EF0();
+			stSpitOutFall0();
 		} else if (param.asInteger() == 1) {
-			sub44A0D0();
+			// NOTE This is never used and the code was removed
+			// Also the animations used here in the original don't exist...
 		} else if (param.asInteger() == 2) {
-			stSpitOutFall();
+			stSpitOutFall2();
 		}
 		break;
 	}
@@ -2659,7 +2660,7 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
 	int16 speedUpFrameIndex;
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
@@ -2682,7 +2683,7 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2729,22 +2730,20 @@ void KmScene1002::stStandIdleSpecial() {
 	SetMessageHandler(&KmScene1002::hmStandIdleSpecial);
 }
 
-void KmScene1002::sub449EF0() {
+void KmScene1002::stSpitOutFall0() {
 	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x000BAB02, 0, -1);
-	SetUpdateHandler(&KmScene1002::update4497D0);
-	// Weird stuff happening
+	SetUpdateHandler(&KmScene1002::upSpitOutFall);
 	SetMessageHandler(&Klayman::handleMessage41D360);
-	//SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteUpdate(&KmScene1002::suFallDown);
-	NextState(&KmScene1002::sub449F70);
+	NextState(&KmScene1002::stFalling);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
 }
 
-void KmScene1002::sub449F70() {
+void KmScene1002::stFalling() {
 	sendMessage(_parentScene, 0x1024, 1);
 	_soundResource1.play(0x41648271);
 	_status2 = 1;
@@ -2754,7 +2753,7 @@ void KmScene1002::sub449F70() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&KmScene1002::handleMessage41D480);
-	NextState(&KmScene1002::sub44A230);
+	NextState(&KmScene1002::stFallTouchdown);
 	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
@@ -2762,51 +2761,20 @@ void KmScene1002::sub449F70() {
 	sendMessage(_ssLadderArch, 0x482B, 0);
 }
 
-void KmScene1002::stSpitOutFall() {
+void KmScene1002::stSpitOutFall2() {
 	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x9308C132, 0, -1);
-	SetUpdateHandler(&KmScene1002::update4497D0);
-	SetSpriteUpdate(&KmScene1002::suFallDown);
+	SetUpdateHandler(&KmScene1002::upSpitOutFall);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	NextState(&KmScene1002::sub449F70);
-	sendMessage(_class599, 0x482A, 0);
-	sendMessage(_ssLadderArch, 0x482A, 0);
-}
-
-void KmScene1002::sub44A0D0() {
-	_countdown1 = 1;
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x0013A206, 0, -1);
-	SetUpdateHandler(&KmScene1002::update4497D0);
-	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteUpdate(&KmScene1002::suFallDown);
-	NextState(&KmScene1002::sub44A150);
+	NextState(&KmScene1002::stFalling);
 	sendMessage(_class599, 0x482A, 0);
 	sendMessage(_ssLadderArch, 0x482A, 0);
 }
 
-void KmScene1002::sub44A150() {
-	sendMessage(_parentScene, 0x1024, 1);
-	_soundResource1.play(0x41648271);
-	_status2 = 1;
-	_acceptInput = false;
-	_isWalking = false;
-	startAnimationByHash(0x0013A206, 0x88003000, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::handleMessage41D480);
-	SetSpriteUpdate(NULL);
-	NextState(&KmScene1002::sub44A230);
-	sendMessage(_parentScene, 0x2002, 0);
-	// TODO _callbackList = NULL;
-	_attachedSprite = NULL;
-	sendMessage(_class599, 0x482B, 0);
-	sendMessage(_ssLadderArch, 0x482B, 0);
-}
-
-void KmScene1002::sub44A230() {
+void KmScene1002::stFallTouchdown() {
 	setDoDeltaX(2);
 	stTryStandIdle();
 }
@@ -2818,7 +2786,7 @@ void KmScene1002::stJumpAndFall() {
 		_acceptInput = false;
 		startAnimation(0xB93AB151, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1002::handleMessage449D60);
+		SetMessageHandler(&KmScene1002::hmJumpAndFall);
 		SetSpriteUpdate(&KmScene1002::suFallDown);
 		NextState(&Klayman::stLandOnFeet);
 	}
@@ -2854,7 +2822,7 @@ void KmScene1002::stHitByBoxingGlove() {
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::handleMessage449C90);
+	SetMessageHandler(&KmScene1002::hmHitByBoxingGlove);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	FinalizeState(&KmScene1002::stHitByBoxingGloveDone);
 }
@@ -5865,13 +5833,13 @@ uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stTurnToBackSmall);
 		break;
 	case 0x4830:
-		GotoState(&KmScene2803b::sub460670);
+		GotoState(&KmScene2803b::stShrink);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene2803b::handleMessage460600(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2803b::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -5884,14 +5852,14 @@ uint32 KmScene2803b::handleMessage460600(int messageNum, const MessageParam &par
 	return messageResult;
 }
 
-void KmScene2803b::sub460670() {
+void KmScene2803b::stShrink() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x1AE88904, 0, -1);
 	_soundResource1.play(0x4C69EA53);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene2803b::handleMessage460600);
+	SetMessageHandler(&KmScene2803b::hmShrink);
 }
 
 KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -5940,16 +5908,16 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		sub404890();
+		stTeleporterAppear();
 		break;
 	case 0x483E:
-		sub4048D0();
+		stTeleporterDisappear();
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene2805::handleMessage404800(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2805::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -5962,21 +5930,21 @@ uint32 KmScene2805::handleMessage404800(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene2805::sub404890() {
+void KmScene2805::stTeleporterAppear() {
 	_status2 = 0;
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2805::handleMessage404800);
+	SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear);
 	startAnimation(0xDE284B74, 0, -1);
 }
 
-void KmScene2805::sub4048D0() {
+void KmScene2805::stTeleporterDisappear() {
 	_status2 = 0;
 	_acceptInput = false;
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2805::handleMessage404800);
+	SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear);
 	startAnimation(0xD82A4094, 0, -1);
 }
 
@@ -6126,10 +6094,10 @@ uint32 KmScene2806::hmGrow(int messageNum, const MessageParam &param, Entity *se
 void KmScene2806::stGrow() {
 	_status2 = 0;
 	_acceptInput = false;
+	startAnimation(0x2838C010, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene2806::hmGrow);
-	startAnimation(0x2838C010, 0, -1);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
 void KmScene2806::stDrinkPotion() {
@@ -6137,10 +6105,10 @@ void KmScene2806::stDrinkPotion() {
 	_acceptInput = false;
 	_flag1 = false;
 	_flag2 = false;
+	startAnimation(0x1C388C04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene2806::hmDrinkPotion);
-	startAnimation(0x1C388C04, 0, -1);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
 KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
@@ -6189,11 +6157,11 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4831:
-		GotoState(&KmScene2809::sub458550);
+		GotoState(&KmScene2809::stGrow);
 		break;
 	case 0x4832:
 		if (param.asInteger() == 1) {
-			GotoState(&KmScene2809::sub458590);
+			GotoState(&KmScene2809::stDrinkPotion);
 		} else {
 			GotoState(&Klayman::stUseTube);
 		}
@@ -6202,7 +6170,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene2809::handleMessage457FC0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2809::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
@@ -6254,7 +6222,7 @@ uint32 KmScene2809::handleMessage457FC0(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 KmScene2809::handleMessage458340(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2809::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -6287,23 +6255,23 @@ uint32 KmScene2809::handleMessage458340(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-void KmScene2809::sub458550() {
+void KmScene2809::stGrow() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x2838C010, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2809::handleMessage458340);
+	SetMessageHandler(&KmScene2809::hmGrow);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
-void KmScene2809::sub458590() {
+void KmScene2809::stDrinkPotion() {
 	_status2 = 1;
 	_acceptInput = false;
 	_flag1 = false;
 	_flag2 = false;
 	startAnimation(0x1C388C04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2809::handleMessage457FC0);
+	SetMessageHandler(&KmScene2809::hmDrinkPotion);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 25e6d38..787ad7e 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -311,23 +311,21 @@ protected:
 	int _status;
 	void xUpdate();	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void update4497D0();
+	void upSpitOutFall();
 	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage449C90(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage449D60(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
 	void suFallDown();
 	void stJumpToRingVenusFlyTrap();
 	void stStandIdleSpecial();
-	void sub449EF0();
-	void sub449F70();
-	void stSpitOutFall();
-	void sub44A0D0();
-	void sub44A150();
-	void sub44A230();
+	void stSpitOutFall0();
+	void stFalling();
+	void stSpitOutFall2();
+	void stFallTouchdown();
 	void stJumpAndFall();
 	void stDropFromRing();
 	void stPressDoorButton();
@@ -650,8 +648,8 @@ public:
 protected:
 	SoundResource _soundResource;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage460600(int messageNum, const MessageParam &param, Entity *sender);
-	void sub460670();
+	uint32 hmShrink(int messageNum, const MessageParam &param, Entity *sender);
+	void stShrink();
 };
 
 class KmScene2805 : public Klayman {
@@ -660,9 +658,9 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage404800(int messageNum, const MessageParam &param, Entity *sender);
-	void sub404890();
-	void sub4048D0();
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+	void stTeleporterAppear();
+	void stTeleporterDisappear();
 };
 
 class KmScene2806 : public Klayman {
@@ -697,10 +695,10 @@ protected:
 	bool _flag1;
 	bool _flag2;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage457FC0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage458340(int messageNum, const MessageParam &param, Entity *sender);
-	void sub458550();
-	void sub458590();
+	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
+	void stGrow();
+	void stDrinkPotion();
 };
 
 class KmScene2810Small : public Klayman {


Commit: d1927ef8e6e0ebcc02400e97fa8f2055fc86983e
    https://github.com/scummvm/scummvm/commit/d1927ef8e6e0ebcc02400e97fa8f2055fc86983e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:43-07:00

Commit Message:
NEVERHOOD: Move Klayman teleporter appear/disappear animation code from the several subclasses to the base Klayman class; the code was equal except for the animation hashes

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 6ce39a7..2954852 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2310,6 +2310,38 @@ void Klayman::stIdleTeleporterHands2() {
 	NextState(&Klayman::stIdleSitBlinkSecond);
 }
 
+void Klayman::teleporterAppear(uint32 fileHash) {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(fileHash, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmTeleporterAppearDisappear);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::teleporterDisappear(uint32 fileHash) {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(fileHash, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmTeleporterAppearDisappear);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			_soundResource1.play(0x85B10BB8);
+		} else if (param.asInteger() == 0x4E6A0CA0) {
+			_soundResource1.play(0xC5B709B0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -3004,47 +3036,15 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		stTeleporterAppear();
+		teleporterAppear(0x2C2A4A1C);
 		break;
 	case 0x483E:
-		stTeleporterDisappear();
+		teleporterDisappear(0x3C2E4245);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene1109::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24) {
-			_soundResource1.play(0x85B10BB8);
-		} else if (param.asInteger() == 0x4E6A0CA0) {
-			_soundResource1.play(0xC5B709B0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene1109::stTeleporterAppear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2C2A4A1C, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear);
-}
-
-void KmScene1109::stTeleporterDisappear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x3C2E4245, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear);
-}
-
 // KmScene1201
 
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464)
@@ -3540,10 +3540,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		stTeleporterAppear();
+		teleporterAppear(0xEE084A04);
 		break;																				
 	case 0x483E:
-		stTeleporterDisappear();
+		teleporterDisappear(0xB86A4274);
 		break;																				
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -3555,37 +3555,6 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-void KmScene1306::stTeleporterAppear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0xEE084A04, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear);
-}
-
-void KmScene1306::stTeleporterDisappear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0xB86A4274, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear);
-}
-
-uint32 KmScene1306::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24) {
-			_soundResource1.play(0x85B10BB8);
-		} else if (param.asInteger() == 0x4E6A0CA0) {
-			_soundResource1.play(0xC5B709B0);
-		}
-	}
-	return messageResult;
-}
-
 KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
 
@@ -4154,29 +4123,15 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		stTeleporterAppear();
+		teleporterAppear(0x5E0A4905);
 		break;																				
 	case 0x483E:
-		stTeleporterDisappear();
+		teleporterDisappear(0xD86E4477);
 		break;																				
 	}
 	return messageResult;
 }
 
-uint32 KmScene1705::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24) {
-			_soundResource1.play(0x85B10BB8);
-		} else if (param.asInteger() == 0x4E6A0CA0) {
-			_soundResource1.play(0xC5B709B0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
 void KmScene1705::suFallSkipJump() {
 	updateDeltaXY();
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
@@ -4197,24 +4152,6 @@ void KmScene1705::stFallSkipJump() {
 	NextState(&Klayman::stLandOnFeet);
 }
 
-void KmScene1705::stTeleporterAppear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x5E0A4905, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear);
-}
-
-void KmScene1705::stTeleporterDisappear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0xD86E4477, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear);
-}
-
 KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -4309,47 +4246,15 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		stTeleporterAppear();
+		teleporterAppear(0xBE68CC54);
 		break;
 	case 0x483E:
-		stTeleporterDisappear();
+		teleporterDisappear(0x18AB4ED4);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene2001::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24) {
-			_soundResource1.play(0x85B10BB8);
-		} if (param.asInteger() == 0x4E6A0CA0) {
-			_soundResource1.play(0xC5B709B0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2001::stTeleporterAppear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0xBE68CC54, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear);
-}
-
-void KmScene2001::stTeleporterDisappear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x18AB4ED4, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear);
-}
-
 KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
 	
@@ -4427,10 +4332,10 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		stTeleporterAppear();
+		teleporterAppear(0xFF290E30);
 		break;
 	case 0x483E:
-		stTeleporterDisappear();
+		teleporterDisappear(0x9A28CA1C);
 		break;
 	}
 	return messageResult;	
@@ -4459,20 +4364,6 @@ uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-uint32 KmScene2101::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24) {
-			_soundResource1.play(0x85B10BB8);
-		} else if (param.asInteger() == 0x4E6A0CA0) {
-			_soundResource1.play(0xC5B709B0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
 void KmScene2101::stHitByDoor() {
 	_status2 = 1;
 	_acceptInput = false;
@@ -4483,24 +4374,6 @@ void KmScene2101::stHitByDoor() {
 	_soundResource1.play(0x402E82D4);
 }
 
-void KmScene2101::stTeleporterAppear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0xFF290E30, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear);
-}
-
-void KmScene2101::stTeleporterDisappear() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x9A28CA1C, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear);
-}
-
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	// TODO: NRect *rect1, int16 unk in Klayman ctor
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
@@ -5277,7 +5150,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-uint32 KmScene2401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 KmScene2401::hmSpit(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -5312,7 +5185,7 @@ void KmScene2401::stTrySpitIntoPipe() {
 		_contSpit = false;
 		startAnimation(0x1808B150, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene2401::handleMessage);
+		SetMessageHandler(&KmScene2401::hmSpit);
 		SetSpriteUpdate(NULL);
 	}
 }
@@ -5324,7 +5197,7 @@ void KmScene2401::spitIntoPipe() {
 	_acceptInput = false;
 	startAnimation(0x1B08B553, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2401::handleMessage);
+	SetMessageHandler(&KmScene2401::hmSpit);
 	SetSpriteUpdate(NULL);
 	NextState(&KmScene2401::stContSpitIntoPipe);
 }
@@ -5334,7 +5207,7 @@ void KmScene2401::stContSpitIntoPipe() {
 	_acceptInput = true;
 	startAnimationByHash(0x1808B150, 0x16401CA6, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2401::handleMessage);
+	SetMessageHandler(&KmScene2401::hmSpit);
 	SetSpriteUpdate(NULL);
 }
 
@@ -5908,46 +5781,15 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stGetUpFromTeleporter);
 		break;
 	case 0x483D:
-		stTeleporterAppear();
+		teleporterAppear(0xDE284B74);
 		break;
 	case 0x483E:
-		stTeleporterDisappear();
+		teleporterDisappear(0xD82A4094);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene2805::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24)
-			_soundResource1.play(0x85B10BB8);
-		else if (param.asInteger() == 0x4E6A0CA0)
-			_soundResource1.play(0xC5B709B0);
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2805::stTeleporterAppear() {
-	_status2 = 0;
-	_acceptInput = false;
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear);
-	startAnimation(0xDE284B74, 0, -1);
-}
-
-void KmScene2805::stTeleporterDisappear() {
-	_status2 = 0;
-	_acceptInput = false;
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear);
-	startAnimation(0xD82A4094, 0, -1);
-}
-
 KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000),
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 787ad7e..600cdbf 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -178,6 +178,10 @@ public:
 	void stDoIdleTeleporterHands2();
 	void stIdleTeleporterHands2();
 
+    void teleporterAppear(uint32 fileHash);
+    void teleporterDisappear(uint32 fileHash);
+	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
+
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
@@ -351,7 +355,6 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 	void stTeleporterAppear();
 	void stTeleporterDisappear();
 };
@@ -410,7 +413,6 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 	void stTeleporterAppear();
 	void stTeleporterDisappear();
 };
@@ -467,7 +469,6 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 	void suFallSkipJump();
 	void stFallSkipJump();
 	void stTeleporterAppear();
@@ -487,7 +488,6 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 	void stTeleporterAppear();
 	void stTeleporterDisappear();
 };
@@ -499,7 +499,6 @@ protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 	void stHitByDoor();
 	void stTeleporterAppear();
 	void stTeleporterDisappear();
@@ -592,7 +591,7 @@ protected:
 	uint32 _spitDestPipeIndex;
 	uint32 _spitContDestPipeIndex;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmSpit(int messageNum, const MessageParam &param, Entity *sender);
 	void stTrySpitIntoPipe();
 	void spitIntoPipe();
 	void stContSpitIntoPipe();
@@ -658,7 +657,6 @@ public:
 protected:
 	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 	void stTeleporterAppear();
 	void stTeleporterDisappear();
 };


Commit: e1943c1e2bd83bad9dfb55a54a365d2d54e0ec06
    https://github.com/scummvm/scummvm/commit/e1943c1e2bd83bad9dfb55a54a365d2d54e0ec06
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Move more into the Klayman base class

- Fix header from previous commit

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 2954852..da3004d 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -56,11 +56,11 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
 // Klayman
 
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
-	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm),
+	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
 	_idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0),
 	_tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
 	_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
-	_flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) {
+	_isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
@@ -2342,6 +2342,41 @@ uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam &
 	return messageResult;
 }
 
+uint32 Klayman::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5)
+			sendMessage(_parentScene, 0x482A, 0);
+		else if (param.asInteger() == 0x33288344)
+			_soundResource3.play(0x10688664);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stShrink() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x1AE88904, 0, -1);
+	_soundResource1.play(0x4C69EA53);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&Klayman::hmShrink);
+}
+
+void Klayman::stStandWonderAbout() {
+	if (_x > 260)
+		setDoDeltaX(1);
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
+	_newStickFrameIndex = 10;
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetSpriteUpdate(NULL);
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -2982,7 +3017,7 @@ void KmScene1004::stReadNote() {
 }
 
 KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty
 }
@@ -3019,7 +3054,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_isSittingInTeleporter)//CHECKME
+		if (_isSittingInTeleporter)
 			GotoState(&Klayman::stReturnFromUseInTeleporter);
 		break;
 	case 0x4834:
@@ -3432,7 +3467,6 @@ void KmScene1305::cbCrashDownEvent() {
 KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
-	_isSittingInTeleporter = false;	
 }
 
 uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3951,7 +3985,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 }
 
 uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4040,7 +4074,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1705
 
 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
 }
@@ -4192,7 +4226,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
 }
@@ -4256,7 +4290,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty
 }
@@ -5155,11 +5189,11 @@ uint32 KmScene2401::hmSpit(int messageNum, const MessageParam &param, Entity *se
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x16401CA6) {
-			_canSpit = true;
-			if (_contSpit)
+			_canSpitPipe = true;
+			if (_contSpitPipe)
 				spitIntoPipe();
 		} else if (param.asInteger() == 0xC11C0008) {
-			_canSpit = false;
+			_canSpitPipe = false;
 			_acceptInput = false;
 			_readyToSpit = false;
 		} else if (param.asInteger() == 0x018A0001) {
@@ -5172,17 +5206,17 @@ uint32 KmScene2401::hmSpit(int messageNum, const MessageParam &param, Entity *se
 
 void KmScene2401::stTrySpitIntoPipe() {
 	if (_readyToSpit) {
-		_contSpit = true;
+		_contSpitPipe = true;
 		_spitContDestPipeIndex = _spitPipeIndex;
-		if (_canSpit)
+		if (_canSpitPipe)
 			spitIntoPipe();
 	} else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) {
 		_status2 = 2;
 		_acceptInput = true;
 		_spitDestPipeIndex = _spitPipeIndex;
 		_readyToSpit = true;
-		_canSpit = false;
-		_contSpit = false;
+		_canSpitPipe = false;
+		_contSpitPipe = false;
 		startAnimation(0x1808B150, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&KmScene2401::hmSpit);
@@ -5191,9 +5225,9 @@ void KmScene2401::stTrySpitIntoPipe() {
 }
 
 void KmScene2401::spitIntoPipe() {
-	_contSpit = false;
+	_contSpitPipe = false;
 	_spitDestPipeIndex = _spitContDestPipeIndex;
-	_canSpit = false;
+	_canSpitPipe = false;
 	_acceptInput = false;
 	startAnimation(0x1B08B553, 0, -1);
 	SetUpdateHandler(&Klayman::update);
@@ -5203,7 +5237,7 @@ void KmScene2401::spitIntoPipe() {
 }
 
 void KmScene2401::stContSpitIntoPipe() {
-	_canSpit = true;
+	_canSpitPipe = true;
 	_acceptInput = true;
 	startAnimationByHash(0x1808B150, 0x16401CA6, 0);
 	SetUpdateHandler(&Klayman::update);
@@ -5225,7 +5259,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4004:
 		if (!getGlobalVar(0x92603A79))
-			GotoState(&KmScene2402::stStandWonderAbout);
+			GotoState(&Klayman::stStandWonderAbout);
 		else
 			GotoState(&Klayman::stTryStandIdle);
 		break;
@@ -5283,18 +5317,6 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-void KmScene2402::stStandWonderAbout() {
-	if (_x > 260)
-		setDoDeltaX(1);
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xD820A114, 0, -1);
-	_newStickFrameIndex = 10;
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteUpdate(NULL);
-}
-
 KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
@@ -5473,7 +5495,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 	
 KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
 	
@@ -5659,10 +5681,9 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _soundResource(vm) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	_dataResource.load(0x81120132);
-	_soundResource.load(0x10688664);
 }
 
 uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5706,37 +5727,14 @@ uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stTurnToBackSmall);
 		break;
 	case 0x4830:
-		GotoState(&KmScene2803b::stShrink);
+		GotoState(&Klayman::stShrink);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene2803b::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x80C110B5)
-			sendMessage(_parentScene, 0x482A, 0);
-		else if (param.asInteger() == 0x33288344)
-			_soundResource.play();
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2803b::stShrink() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x1AE88904, 0, -1);
-	_soundResource1.play(0x4C69EA53);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene2803b::hmShrink);
-}
-
 KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
 
@@ -5854,23 +5852,23 @@ uint32 KmScene2806::hmDrinkPotion(int messageNum, const MessageParam &param, Ent
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
-		if (_flag1) {
+		if (_potionFlag1) {
 			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
 			messageResult = 0;
 		} else
-			_flag2 = true;
+			_potionFlag2 = true;
 		break;
 	case 0x100D:
 		if (param.asInteger() == 0x0002418E)
 			sendMessage(_parentScene, 0x2000, 0);
 		else if (param.asInteger() == 0x924090C2) {
-			_flag1 = true;
-			if (_flag2) {
+			_potionFlag1 = true;
+			if (_potionFlag2) {
 				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
 				messageResult = 0;
 			}
 		} else if (param.asInteger() == 0x004A2148)
-			_flag1 = false;
+			_potionFlag1 = false;
 		else if (param.asInteger() == 0x02B20220)
 			_soundResource1.play(0xC5408620);
 		else if (param.asInteger() == 0x0A720138)
@@ -5945,8 +5943,8 @@ void KmScene2806::stGrow() {
 void KmScene2806::stDrinkPotion() {
 	_status2 = 1;
 	_acceptInput = false;
-	_flag1 = false;
-	_flag2 = false;
+	_potionFlag1 = false;
+	_potionFlag2 = false;
 	startAnimation(0x1C388C04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene2806::hmDrinkPotion);
@@ -6016,23 +6014,23 @@ uint32 KmScene2809::hmDrinkPotion(int messageNum, const MessageParam &param, Ent
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
-		if (_flag1) {
+		if (_potionFlag1) {
 			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
 			messageResult = 0;
 		} else
-			_flag2 = true;
+			_potionFlag2 = true;
 		break;
 	case 0x100D:
 		if (param.asInteger() == 0x0002418E)
 			sendMessage(_parentScene, 0x2000, 0);
 		else if (param.asInteger() == 0x924090C2) {
-			_flag1 = true;
-			if (_flag2) {
+			_potionFlag1 = true;
+			if (_potionFlag2) {
 				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
 				messageResult = 0;
 			}
 		} else if (param.asInteger() == 0x004A2148)
-			_flag1 = false;
+			_potionFlag1 = false;
 		else if (param.asInteger() == 0x02B20220)
 			_soundResource1.play(0xC5408620);
 		else if (param.asInteger() == 0x0A720138)
@@ -6109,15 +6107,14 @@ void KmScene2809::stGrow() {
 void KmScene2809::stDrinkPotion() {
 	_status2 = 1;
 	_acceptInput = false;
-	_flag1 = false;
-	_flag2 = false;
+	_potionFlag1 = false;
+	_potionFlag2 = false;
 	startAnimation(0x1C388C04, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&KmScene2809::hmDrinkPotion);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
-
 KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) 
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 600cdbf..b32143d 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -178,10 +178,15 @@ public:
 	void stDoIdleTeleporterHands2();
 	void stIdleTeleporterHands2();
 
-    void teleporterAppear(uint32 fileHash);
-    void teleporterDisappear(uint32 fileHash);
+	void teleporterAppear(uint32 fileHash);
+	void teleporterDisappear(uint32 fileHash);
 	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 
+	uint32 hmShrink(int messageNum, const MessageParam &param, Entity *sender);
+	void stShrink();
+
+	void stStandWonderAbout();
+
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
@@ -203,12 +208,16 @@ protected:
 	bool _flagFA;
 	SoundResource _soundResource1;
 	SoundResource _soundResource2;
+	SoundResource _soundResource3;
 	int _status3;
 	const KlaymanIdleTableItem *_idleTable;
 	int _idleTableCount;
 	int _idleTableMaxValue;
 	NPointArray *_pathPoints;
 	bool _soundFlag;
+	
+	bool _isSittingInTeleporter;
+
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
@@ -353,10 +362,7 @@ class KmScene1109 : public Klayman {
 public:
 	KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stTeleporterAppear();
-	void stTeleporterDisappear();
 };
 
 class KmScene1201 : public Klayman {
@@ -411,10 +417,7 @@ class KmScene1306 : public Klayman {
 public:
 	KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stTeleporterAppear();
-	void stTeleporterDisappear();
 };
 
 class KmScene1308 : public Klayman {
@@ -459,7 +462,6 @@ class KmScene1608 : public Klayman {
 public:
 	KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
@@ -467,12 +469,9 @@ class KmScene1705 : public Klayman {
 public:
 	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	void suFallSkipJump();
 	void stFallSkipJump();
-	void stTeleporterAppear();
-	void stTeleporterDisappear();
 };
 
 class KmScene1901 : public Klayman {
@@ -486,22 +485,16 @@ class KmScene2001 : public Klayman {
 public:
 	KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stTeleporterAppear();
-	void stTeleporterDisappear();
 };
 
 class KmScene2101 : public Klayman {
 public:
 	KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
 	void stHitByDoor();
-	void stTeleporterAppear();
-	void stTeleporterDisappear();
 };
 
 class KmScene2201 : public Klayman {
@@ -584,8 +577,8 @@ class KmScene2401 : public Klayman {
 public:
 	KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _canSpit;
-	bool _contSpit;
+	bool _canSpitPipe;
+	bool _contSpitPipe;
 	bool _readyToSpit;
 	uint32 _spitPipeIndex;
 	uint32 _spitDestPipeIndex;
@@ -602,7 +595,6 @@ public:
 	KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stStandWonderAbout();
 };
 
 class KmScene2403 : public Klayman {
@@ -623,7 +615,6 @@ class KmScene2501 : public Klayman {
 public:
 	KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
@@ -645,20 +636,14 @@ class KmScene2803b : public Klayman {
 public:
 	KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	SoundResource _soundResource;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmShrink(int messageNum, const MessageParam &param, Entity *sender);
-	void stShrink();
 };
 
 class KmScene2805 : public Klayman {
 public:
 	KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _isSittingInTeleporter;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stTeleporterAppear();
-	void stTeleporterDisappear();
 };
 
 class KmScene2806 : public Klayman {
@@ -671,8 +656,8 @@ protected:
 	SoundResource _soundRes3;
 	SoundResource _soundRes4;
 	SoundResource _soundRes5;
-	bool _flag1;
-	bool _flag2;
+	bool _potionFlag1;
+	bool _potionFlag2;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
@@ -690,8 +675,8 @@ protected:
 	SoundResource _soundRes3;
 	SoundResource _soundRes4;
 	SoundResource _soundRes5;
-	bool _flag1;
-	bool _flag2;
+	bool _potionFlag1;
+	bool _potionFlag2;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);


Commit: 6160ee3cf2f0cb93807ea115b94601b11d5543c4
    https://github.com/scummvm/scummvm/commit/6160ee3cf2f0cb93807ea115b94601b11d5543c4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Move code from entity.h to new entity.cpp

Changed paths:
  A engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/module.mk



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
new file mode 100644
index 0000000..e837225
--- /dev/null
+++ b/engines/neverhood/entity.cpp
@@ -0,0 +1,115 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "neverhood/entity.h"
+
+namespace Neverhood {
+
+uint32 MessageParam::asInteger() const { 
+	assert(_type == mptInteger); 
+	return _integer; 
+}
+
+NPoint MessageParam::asPoint() const { 
+	assert(_type == mptInteger || _type == mptPoint);
+	if (_type == mptInteger) {
+		NPoint pt;
+		pt.x = _integer & 0xFFFF;
+		pt.y = (_integer >> 16) & 0xFFFF; 
+		return pt;
+	} 
+	return _point; 
+}
+
+Entity *MessageParam::asEntity() const {
+	assert(_type == mptEntity); 
+	return _entity; 
+}
+
+// TODO: Disable heavy debug stuff in release mode
+
+#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler
+#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
+
+Entity::Entity(NeverhoodEngine *vm, int priority)
+	: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") {
+}
+
+Entity::~Entity() {
+}
+
+void Entity::draw() {
+}
+
+void Entity::handleUpdate() {
+	//debug("Entity(%s).handleUpdate", _name.c_str());
+	debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str());
+	if (_updateHandlerCb)
+		(this->*_updateHandlerCb)();
+}
+
+uint32 Entity::receiveMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
+	return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
+}
+
+uint32 Entity::sendMessage(Entity *receiver, int messageNum, const MessageParam &param) {
+	return receiver ? receiver->receiveMessage(messageNum, param, this) : 0;
+}
+
+uint32 Entity::sendMessage(Entity *receiver, int messageNum, uint32 param) {
+	return sendMessage(receiver, messageNum, MessageParam(param));
+}
+
+uint32 Entity::sendPointMessage(Entity *receiver, int messageNum, const NPoint &param) {
+	return sendMessage(receiver, messageNum, MessageParam(param));
+}
+
+uint32 Entity::sendEntityMessage(Entity *receiver, int messageNum, Entity *param) {
+	return sendMessage(receiver, messageNum, MessageParam((Entity*)param));
+}
+
+uint32 Entity::getGlobalVar(uint32 nameHash) {
+	return _vm->_gameVars->getGlobalVar(nameHash);
+}
+
+void Entity::setGlobalVar(uint32 nameHash, uint32 value) {
+	_vm->_gameVars->setGlobalVar(nameHash, value);
+}
+
+uint32 Entity::getSubVar(uint32 nameHash, uint32 subNameHash) {
+	return _vm->_gameVars->getSubVar(nameHash, subNameHash);
+}
+
+void Entity::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
+	_vm->_gameVars->setSubVar(nameHash, subNameHash, value);
+}
+
+void Entity::incGlobalVar(uint32 nameHash, int incrValue) {
+	setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue);
+}
+
+void Entity::incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) {
+	setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue);
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 22eb780..0f96eba 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -44,24 +44,9 @@ public:
 	MessageParam(uint32 value) : _type(mptInteger), _integer(value) {}
 	MessageParam(NPoint value) : _type(mptPoint), _point(value) {}
 	MessageParam(Entity *entity) : _type(mptEntity), _entity(entity) {}
-	uint32 asInteger() const { 
-		assert(_type == mptInteger); 
-		return _integer; 
-	}
-	NPoint asPoint() const { 
-		assert(_type == mptInteger || _type == mptPoint);
-		if (_type == mptInteger) {
-			NPoint pt;
-			pt.x = _integer & 0xFFFF;
-			pt.y = (_integer >> 16) & 0xFFFF; 
-			return pt;
-		} 
-		return _point; 
-	}
-	Entity *asEntity() const {
-		assert(_type == mptEntity); 
-		return _entity; 
-	}
+	uint32 asInteger() const;
+	NPoint asPoint() const;
+	Entity *asEntity() const;
 protected:
 	union {
 		uint32 _integer;
@@ -75,66 +60,41 @@ protected:
 
 // TODO: Disable heavy debug stuff in release mode
 
-#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler
-#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
+#define SetUpdateHandler(handler)												\
+	_updateHandlerCb = static_cast <void (Entity::*)(void)> (handler);			\
+	debug(2, "SetUpdateHandler(" #handler ")");									\
+	_updateHandlerCbName = #handler
+
+#define SetMessageHandler(handler)												\
+	_messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler);	\
+	debug(2, "SetMessageHandler(" #handler ")");								\
+	_messageHandlerCbName = #handler
 
 class Entity {
 public:
 	Common::String _name; // Entity name for debugging purposes
 	Common::String _updateHandlerCbName;
 	Common::String _messageHandlerCbName;
-	Entity(NeverhoodEngine *vm, int priority)
-		: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") {
-	}
-	virtual ~Entity() {
-	}
-	virtual void draw() {
-	}
-	void handleUpdate() {
-		//debug("Entity(%s).handleUpdate", _name.c_str());
-		debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str());
-		if (_updateHandlerCb)
-			(this->*_updateHandlerCb)();
-	}
-	bool hasMessageHandler() const { return _messageHandlerCb != NULL; } 
-	uint32 receiveMessage(int messageNum, const MessageParam &param, Entity *sender) {
-		debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
-		return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
-	}
+	Entity(NeverhoodEngine *vm, int priority);
+	virtual ~Entity();
+	virtual void draw();
+	void handleUpdate();
+	uint32 receiveMessage(int messageNum, const MessageParam &param, Entity *sender);
 	// NOTE: These were overloaded before for the various message parameter types
 	// it caused some problems so each type gets its own sendMessage variant now
-	uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam &param) {
-		return receiver ? receiver->receiveMessage(messageNum, param, this) : 0;
-	}
-	uint32 sendMessage(Entity *receiver, int messageNum, uint32 param) {
-		return sendMessage(receiver, messageNum, MessageParam(param));
-	}
-	uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint &param) {
-		return sendMessage(receiver, messageNum, MessageParam(param));
-	}
-	uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param) {
-		return sendMessage(receiver, messageNum, MessageParam((Entity*)param));
-	}
-	int getPriority() const { return _priority; }
+	uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam &param);
+	uint32 sendMessage(Entity *receiver, int messageNum, uint32 param);
+	uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint &param);
+	uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param);
 	// Shortcuts for game variable access
-	uint32 getGlobalVar(uint32 nameHash) {
-		return _vm->_gameVars->getGlobalVar(nameHash);
-	}
-	void setGlobalVar(uint32 nameHash, uint32 value) {
-		_vm->_gameVars->setGlobalVar(nameHash, value);
-	}
-	uint32 getSubVar(uint32 nameHash, uint32 subNameHash) {
-		return _vm->_gameVars->getSubVar(nameHash, subNameHash);
-	}
-	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
-		_vm->_gameVars->setSubVar(nameHash, subNameHash, value);
-	}
-	void incGlobalVar(uint32 nameHash, int incrValue) {
-		setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue);
-	}
-	void incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) {
-		setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue);
-	}
+	uint32 getGlobalVar(uint32 nameHash);
+	void setGlobalVar(uint32 nameHash, uint32 value);
+	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
+	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
+	void incGlobalVar(uint32 nameHash, int incrValue);
+	void incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue);
+	int getPriority() const { return _priority; }
+	bool hasMessageHandler() const { return _messageHandlerCb != NULL; } 
 protected:
 	void (Entity::*_updateHandlerCb)();
 	uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index f9f349b..2ee28d2 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS = \
 	collisionman.o \
 	detection.o \
 	diskplayerscene.o \
+	entity.o \
 	gamemodule.o \
 	gamevars.o \
 	graphics.o \


Commit: 0f04a013380c07f76ca68a14917cd6bce607184e
    https://github.com/scummvm/scummvm/commit/0f04a013380c07f76ca68a14917cd6bce607184e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound playing

Sounds can now be loaded/played by an entity without declaring/initializing a SoundResource which is a little nicer. I implemented this so far for Module1000 only, rest will follow.

Changed paths:
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index e837225..f78d4cf 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/entity.h"
+#include "neverhood/sound.h"
 
 namespace Neverhood {
 
@@ -51,10 +52,12 @@ Entity *MessageParam::asEntity() const {
 #define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
 
 Entity::Entity(NeverhoodEngine *vm, int priority)
-	: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") {
+	: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL),
+	_name("Entity") {
 }
 
 Entity::~Entity() {
+	deleteSoundResources();
 }
 
 void Entity::draw() {
@@ -112,4 +115,35 @@ void Entity::incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) {
 	setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue);
 }
 
+SoundResource *Entity::getSoundResource(uint index) {
+	assert(index < kMaxSoundResources);
+	if (!_soundResources) {
+		_soundResources = new SoundResource*[kMaxSoundResources];
+		for (uint i = 0; i < kMaxSoundResources; ++i)
+			_soundResources[i] = NULL;
+	}
+	if (!_soundResources[index])
+		_soundResources[index] = new SoundResource(_vm);
+	return _soundResources[index];
+}
+
+void Entity::loadSound(uint index, uint32 fileHash) {
+	getSoundResource(index)->load(fileHash);
+}
+
+void Entity::playSound(uint index, uint32 fileHash) {
+	if (fileHash)
+		getSoundResource(index)->play(fileHash);
+	else
+		getSoundResource(index)->play();
+}
+
+void Entity::deleteSoundResources() {
+	if (_soundResources) {
+		for (uint i = 0; i < kMaxSoundResources; ++i)
+			delete _soundResources[i];
+		delete[] _soundResources;
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 0f96eba..f222437 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -32,6 +32,7 @@
 namespace Neverhood {
 
 class Entity;
+class SoundResource;
 
 enum MessageParamType {
 	mptInteger,
@@ -70,6 +71,8 @@ protected:
 	debug(2, "SetMessageHandler(" #handler ")");								\
 	_messageHandlerCbName = #handler
 
+const uint kMaxSoundResources = 16;
+
 class Entity {
 public:
 	Common::String _name; // Entity name for debugging purposes
@@ -100,6 +103,12 @@ protected:
 	uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
 	NeverhoodEngine *_vm;
 	int _priority;
+	SoundResource **_soundResources;
+	SoundResource *getSoundResource(uint index);
+	// TODO Add other sound stuff
+	void loadSound(uint index, uint32 fileHash);
+	void playSound(uint index, uint32 fileHash = 0);
+	void deleteSoundResources();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 2db598b..f4932c0 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -115,13 +115,13 @@ void Module1000::updateScene() {
 // Scene1001			
 
 AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) {
+	: AnimatedSprite(vm, 1100) {
 	
 	createSurface(800, 137, 242);
 	_x = 726;
 	_y = 440;
 	stShowIdleDoor();
-	_soundResource2.load(0xED403E03);
+	loadSound(1, 0xED403E03);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1001Door::handleMessage);
 }
@@ -143,12 +143,12 @@ void AsScene1001Door::hammerHitsDoor() {
 	switch (getGlobalVar(0x52371C95)) {
 	case 0:
 	case 1:
-		_soundResource1.play(0x65482F03);
+		playSound(0, 0x65482F03);
 		startAnimation(0x624C0498, 1, 3);
 		NextState(&AsScene1001Door::stShowIdleDoor);		
 		break;
 	case 2:
-		_soundResource2.play();
+		playSound(1);
 		startAnimation(0x624C0498, 6, 6);
 		NextState(&AsScene1001Door::stBustedDoorMove);		
 		break;
@@ -188,13 +188,13 @@ void AsScene1001Door::stBustedDoorMove() {
 }
 
 void AsScene1001Door::stBustedDoorGone() {
-	_soundResource1.play();
+	playSound(0);
 	stopAnimation();
 	setVisible(false);	
 }
 	
 AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _asDoor(asDoor) {
+	: AnimatedSprite(vm, 1100), _asDoor(asDoor) {
 
 	_x = 547;
 	_y = 206;
@@ -212,12 +212,12 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 		if (param.asInteger() == 0x00352100) {
 			sendMessage(_asDoor, 0x2000, 0);
 		} else if (param.asInteger() == 0x0A1A0109) {
-			_soundResource.play(0x66410886);
+			playSound(0, 0x66410886);
 		}
 		break;
 	case 0x2000:
 		startAnimation(0x022C90D4, 1, -1);
-		_soundResource.play(0xE741020A);
+		playSound(0, 0xE741020A);
 		_newStickFrameIndex = -2;
 		break;
 	}
@@ -225,7 +225,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 }
 
 AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	: AnimatedSprite(vm, 1200) {
 
 	_x = 320;
 	_y = 240;
@@ -241,7 +241,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x0E0A1410) {
-			_soundResource.play(0x60803F10);
+			playSound(0, 0x60803F10);
 		}
 		break;
 	case 0x2001:
@@ -257,7 +257,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 }
 
 AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
 	createSurface(1010, 71, 73);
 	setDoDeltaX(deltaXType);
@@ -276,7 +276,7 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 		if (param.asInteger() == 0x00C0C444) {
 			sendMessage(_parentScene, 0x480F, 0);
 		} else if (param.asInteger() == 0xC41A02C0) {
-			_soundResource.play(0x40581882);
+			playSound(0, 0x40581882);
 		}
 		break;
 	case 0x1011:
@@ -301,7 +301,7 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 }
 	
 SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash)
-	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _soundResource(vm), _countdown(0) {
+	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _countdown(0) {
 
 	_priority = 1100;
 	_soundFileHash = soundFileHash ? soundFileHash : 0x44141000; 
@@ -323,7 +323,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 		sendMessage(_parentScene, 0x480B, 0);
 		setVisible(true);
 		_countdown = 8;
-		_soundResource.play(_soundFileHash);
+		playSound(0, _soundFileHash);
 		break;
 	}
 	return messageResult;
@@ -497,7 +497,7 @@ uint32 Class599::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _flag1(flag1) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _flag1(flag1) {
 
 	SetUpdateHandler(&AsScene1002Ring::update);
 	
@@ -628,7 +628,7 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x05410F72) {
-			_soundResource.play(0x21EE40A9);
+			playSound(0, 0x21EE40A9);
 		}
 		break;
 	case 0x3002:
@@ -742,8 +742,7 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess
 }
 
 AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect)
-	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect),
-	_soundResource(vm) {
+	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
@@ -751,7 +750,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce
 	createSurface(800, 136, 147);
 	setClipRect(clipRect);
 	suDoorSpy();
-	_soundResource.load(0xC0C40298);
+	loadSound(0, 0xC0C40298);
 	startAnimation(0x586C1D48, 0, 0);
 }
 
@@ -762,7 +761,7 @@ uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &par
 		if (param.asInteger() == 0xA61CA1C2) {
 			sendMessage(_asBoxingGloveHitEffect, 0x2004, 0);
 		} else if (param.asInteger() == 0x14CE0620) {
-			_soundResource.play();
+			playSound(0);
 		}
 		break;
 	case 0x2003:
@@ -803,7 +802,7 @@ void AsScene1002DoorSpy::stDoorSpyBoxingGlove() {
 }
 
 Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
-	: StaticSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm), _status(0) {
+	: StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) {
 
 	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000;
 
@@ -895,15 +894,14 @@ uint32 Class426::handleMessage(int messageNum, const MessageParam &param, Entity
 		_status = 1;
 		_countdown = 4;
 		setVisible(true);
-		_soundResource.play(_soundFileHash);
+		playSound(0, _soundFileHash);
 		break;
 	}
 	return messageResult;
 }
 
 AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _klayman(klayman),
-	_flag(flag), _countdown(0) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _flag(flag), _countdown(0) {
 
 	createSurface(995, 175, 195);
 
@@ -956,9 +954,9 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x000890C4) {
-			_soundResource.play(0xC21190D8);
+			playSound(0, 0xC21190D8);
 		} else if (param.asInteger() == 0x522200A0) {
-			_soundResource.play(0x931080C8);
+			playSound(0, 0x931080C8);
 		}
 		break;
 	case 0x1011:
@@ -1036,7 +1034,7 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x000890C4) {
-			_soundResource.play(0xC21190D8);
+			playSound(0, 0xC21190D8);
 		} else if (param.asInteger() == 0x41881801) {
 			if (_flag) {
 				if (_x > 330) {
@@ -1052,7 +1050,7 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara
 				sendMessage(_klayman, 0x4811, 0);
 			}
 		} else if (param.asInteger() == 0x522200A0) {
-			_soundResource.play(0x931080C8);
+			playSound(0, 0x931080C8);
 		}
 		break;
 	case 0x3002:
@@ -1309,8 +1307,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa
 }
 
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
-	_flag1B4(false), _flag1BE(false) {
+	: Scene(vm, parentModule, true), _flag1B4(false), _flag1BE(false) {
 
 	NRect tempClipRect;
 	Sprite *tempSprite;
@@ -1404,8 +1401,8 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 								  
 	setRectList(0x004B43A0);
 
-	_soundResource2.load(0x60755842);
-	_soundResource3.load(0x616D5821);
+	loadSound(1, 0x60755842);
+	loadSound(2, 0x616D5821);
 
 }
 
@@ -1517,26 +1514,26 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		_flag1BE = true;
 		if (sender == _asRing1) {
 			setGlobalVar(0x4DE80AC0, 0);
-			_soundResource1.play(0x665198C0);
+			playSound(0, 0x665198C0);
 		} else if (sender == _asRing2) {
 			setGlobalVar(0x4DE80AC0, 0);
-			_soundResource1.play(0xE2D389C0);
+			playSound(0, 0xE2D389C0);
 		} else if (sender == _asRing3) {
 			setGlobalVar(0x4DE80AC0, 0);
-			_soundResource2.play();
+			playSound(1);
 			sendMessage(_asDoor, 0x4808, 0);
 			sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		} else if (sender == _asRing4) {
 			setGlobalVar(0x4DE80AC0, 0);
-			_soundResource1.play(0xE0558848);
+			playSound(0, 0xE0558848);
 		} else if (sender == _asRing5) {
 			setGlobalVar(0x4DE80AC0, 1);
-			_soundResource1.play(0x44014282);
+			playSound(0, 0x44014282);
 		}
 		break;
 	case 0x4807:
 		if (sender == _asRing3) {
-			_soundResource3.play();
+			playSound(2);
 			sendMessage(_asDoor, 0x4809, 0);
 			sendMessage(_asOutsideDoorBackground, 0x4809, 0);
 		} else if (sender == _asVenusFlyTrap) {
@@ -1550,7 +1547,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;				
 	case 0x480F:
 		setGlobalVar(0x4DE80AC0, 0);
-		_soundResource2.play();
+		playSound(1);
 		sendMessage(_asDoor, 0x4808, 0);
 		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		break;				
@@ -1586,7 +1583,7 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity
 // Scene1004
 
 AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100), _soundResource(vm) {
+	: AnimatedSprite(vm, 1100) {
 
 	_x = 330;
 	_y = 327;
@@ -1601,7 +1598,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x225A8587) {
-			_soundResource.play(0x109AFC4C);
+			playSound(0, 0x109AFC4C);
 		}
 		break;
 	case 0x2002:
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index b8fa636..60eb2fb 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -47,8 +47,6 @@ class AsScene1001Door : public AnimatedSprite {
 public:
 	AsScene1001Door(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource1;	
-	SoundResource _soundResource2;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void hammerHitsDoor();
 	void stShowIdleDoor();
@@ -61,7 +59,6 @@ public:
 	AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor);
 protected:
 	Sprite *_asDoor;
-	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -69,7 +66,6 @@ class AsScene1001Window : public AnimatedSprite {
 public:
 	AsScene1001Window(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -78,7 +74,6 @@ public:
 	AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -87,7 +82,6 @@ public:
 	SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 _soundFileHash;
 	int16 _countdown;
 	void update();	
@@ -140,7 +134,6 @@ public:
 protected:
 	Scene *_parentScene;
 	bool _flag1;
-	SoundResource _soundResource;
 	void update();
 	uint32 hmRingIdle(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender);
@@ -173,7 +166,6 @@ protected:
 	Scene *_parentScene;
 	Sprite *_asDoor;
 	Sprite *_asBoxingGloveHitEffect;
-	SoundResource _soundResource;
 	NRect _clipRect;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmDoorSpyAnimation(int messageNum, const MessageParam &param, Entity *sender);
@@ -191,7 +183,6 @@ protected:
 	int _countdown;
 	uint32 _fileHashes[2];
 	int _status;
-	SoundResource _soundResource;
 	uint32 _soundFileHash;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -204,7 +195,6 @@ protected:
 	Scene *_parentScene;
 	Sprite *_klayman;
 	int _countdown;
-	SoundResource _soundResource;
 	bool _flag;
 	void update();
 	void upIdle();
@@ -279,9 +269,6 @@ protected:
 	Sprite *_asKlaymanPeekHand;
 	Sprite *_asOutsideDoorBackground;
 	Sprite *_class426;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	bool _flag1B4;
 	bool _flag1BE;
 	bool _flag;
@@ -295,7 +282,6 @@ class AsScene1004TrashCan : public AnimatedSprite {
 public:
 	AsScene1004TrashCan(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 


Commit: 7adc1d312e5d09c0566345d5264db7f4b2322f98
    https://github.com/scummvm/scummvm/commit/7adc1d312e5d09c0566345d5264db7f4b2322f98
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1100

- Implement Entity::isSoundPlaying

Changed paths:
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/module1100.cpp
    engines/neverhood/module1100.h



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index f78d4cf..d7d7896 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -138,6 +138,10 @@ void Entity::playSound(uint index, uint32 fileHash) {
 		getSoundResource(index)->play();
 }
 
+bool Entity::isSoundPlaying(uint index) {
+	return getSoundResource(index)->isPlaying();
+}
+
 void Entity::deleteSoundResources() {
 	if (_soundResources) {
 		for (uint i = 0; i < kMaxSoundResources; ++i)
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index f222437..eafc467 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -108,6 +108,7 @@ protected:
 	// TODO Add other sound stuff
 	void loadSound(uint index, uint32 fileHash);
 	void playSound(uint index, uint32 fileHash = 0);
+	bool isSoundPlaying(uint index);
 	void deleteSoundResources();
 };
 
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index e5cca26..257ee27 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -272,8 +272,7 @@ static const uint32 kSsScene1105SymbolDieFileHashes[] = {
 };
 
 SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect)
-	: StaticSprite(vm, fileHash, 200), _soundResource(vm), _parentScene(parentScene),
-	_countdown(0) {
+	: StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) {
 	
 	_rect = rect;
 	SetMessageHandler(&SsScene1105Button::handleMessage);
@@ -300,7 +299,7 @@ uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam &para
 	case 0x480B:
 		_countdown = 8;
 		setVisible(true);
-		_soundResource.play(0x44141000);
+		playSound(0, 0x44141000);
 		break;
 	}
 	return messageResult;
@@ -356,8 +355,7 @@ void SsScene1105SymbolDie::hide() {
 }
 
 AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm),
-	_parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
 	// TODO createSurface3(100, dword_4AF4C0);
 	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
@@ -370,8 +368,8 @@ AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentSce
 	setVisible(false);
 	_needRefresh = true;
 	updatePosition();
-	_soundResource1.load(0xCE840261);
-	_soundResource2.load(0xCCA41A62);
+	loadSound(0, 0xCE840261);
+	loadSound(1, 0xCCA41A62);
 }
 
 uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -380,10 +378,10 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p
 	case 0x2002:
 		if (getGlobalVar(0x610210B7)) {
 			startAnimation(0x6B0C0432, 0, -1);
-			_soundResource1.play();
+			playSound(0);
 		} else {
 			startAnimation(0x65084002, 0, -1);
-			_soundResource2.play();
+			playSound(1);
 		}
 		break;
 	case 0x3002:
@@ -407,8 +405,7 @@ void AsScene1105TeddyBear::hide() {
 }
 
 SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 900), _soundResource(vm), _parentScene(parentScene),
-	_countdown(0), _flag1(false) {
+	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) {
 	
 	_spriteResource.load2(0x8228A46C);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -422,7 +419,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS
 	_needRefresh = true;
 	processDelta();
 	setVisible(false);
-	_soundResource.load(0x44045140);
+	loadSound(0, 0x44045140);
 	SetUpdateHandler(&SsScene1105OpenButton::update);
 	SetMessageHandler(&SsScene1105OpenButton::handleMessage);
 }
@@ -441,7 +438,7 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &
 	switch (messageNum) {
 	case 0x1011:
 		if (_countdown == 0 && !_flag1) {
-			_soundResource.play();
+			playSound(0);
 			setVisible(true);
 			_flag1 = true;
 			_countdown = 4;
@@ -453,8 +450,7 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &
 }
 
 Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _countdown(0), _flag1(false), _flag2(false), _flag3(false),
+	: Scene(vm, parentModule, true), _countdown(0), _flag1(false), _flag2(false), _flag3(false),
 	_flag4(false), _flag5(false), _backgroundIndex(0) {
 	
 	Sprite *ssOpenButton;
@@ -473,9 +469,9 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(ssOpenButton);
 	insertMouse435(0x10006208, 20, 620);
 	
-	_soundResource1.load(0x48442057);
-	_soundResource2.load(0xC025014F);
-	_soundResource3.load(0x68E25540);
+	loadSound(0, 0x48442057);
+	loadSound(1, 0xC025014F);
+	loadSound(2, 0x68E25540);
 	
 }
 
@@ -514,7 +510,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 				getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) &&
 				getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) {
 				setGlobalVar(0x610210B7, 1);
-				_soundResource3.play();
+				playSound(2);
 				_flag3 = true;
 			} else {
 				sendMessage(_asTeddyBear, 0x2002, 0);
@@ -617,7 +613,7 @@ void Scene1105::upOpenPanel() {
 			_palette->addPalette(backgroundFileHash, 0, 256, 0);
 		}
 		if (_backgroundIndex == 10) {
-			_soundResource1.play();
+			playSound(0);
 		}
 		if (_backgroundIndex == 0) {
 			SetUpdateHandler(&Scene1105::update);
@@ -642,7 +638,7 @@ void Scene1105::upClosePanel() {
 		if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) {
 			uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME
 			if (_backgroundIndex == 4) {
-				_soundResource2.play();
+				playSound(1);
 				_asTeddyBear->hide();
 			}
 			changeBackground(backgroundFileHash);
@@ -667,10 +663,10 @@ void Scene1105::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		createObjects();
 	}
-	if (_flag4 && !_soundResource2.isPlaying()) {
+	if (_flag4 && !isSoundPlaying(1)) {
 		leaveScene(_flag5);
 	}
-	if (_flag3 && !_soundResource3.isPlaying()) {
+	if (_flag3 && !isSoundPlaying(2)) {
 		sendMessage(_asTeddyBear, 0x2002, 0);
 		_flag3 = false;
 	}
diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h
index c46c1df..98d1ae6 100644
--- a/engines/neverhood/module1100.h
+++ b/engines/neverhood/module1100.h
@@ -46,7 +46,6 @@ public:
 	SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -75,8 +74,6 @@ public:
 	void hide();
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -85,7 +82,6 @@ public:
 	SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	int _countdown;
 	bool _flag1;
 	void update();
@@ -96,9 +92,6 @@ class Scene1105 : public Scene {
 public:
 	Scene1105(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	int _countdown;
 	int _backgroundIndex;
 	bool _flag1;


Commit: fc359abd08c2553201f6965c23e9ee972a2514fc
    https://github.com/scummvm/scummvm/commit/fc359abd08c2553201f6965c23e9ee972a2514fc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1200

Changed paths:
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h



diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 33b791a..d6ca51b 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -220,7 +220,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
 }
 
 Class466::Class466(NeverhoodEngine *vm, bool flag)
-	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	: AnimatedSprite(vm, 1200) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class466::handleMessage);
@@ -239,7 +239,7 @@ uint32 Class466::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02060018) {
-			_soundResource.play(0x47900E06);
+			playSound(0, 0x47900E06);
 		}
 		break;
 	case 0x2006:
@@ -265,7 +265,7 @@ void Class466::sub40D380() {
 }
 
 AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) {
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) {
 
 	createSurface1(0xD088AC30, 100);
 	_x = 320;
@@ -307,14 +307,14 @@ void AsScene1201RightDoor::sub40D7E0() {
 	startAnimation(0xD088AC30, 0, -1);
 	_newStickFrameIndex = -2;
 	setVisible(true);
-	_soundResource.play(calcHash("fxDoorOpen20"));
+	playSound(0, calcHash("fxDoorOpen20"));
 }
 
 void AsScene1201RightDoor::sub40D830() {
 	startAnimation(0xD088AC30, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
-	_soundResource.play(calcHash("fxDoorClose20"));
+	playSound(0, calcHash("fxDoorClose20"));
 	NextState(&AsScene1201RightDoor::sub40D880);
 }
 
@@ -352,7 +352,7 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _class466(class466),
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _class466(class466),
 	_flag(false) {
 
 	flag = false;
@@ -381,7 +381,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
 		if (param.asInteger() == 0x092870C0) {
 			sendMessage(_class466, 0x2006, 0);
 		} else if (param.asInteger() == 0x11CA0144) {
-			_soundResource.play(0x51800A04);
+			playSound(0, 0x51800A04);
 		}
 		break;
 	case 0x1011:
@@ -466,7 +466,7 @@ void Class465::spriteUpdate40D150() {
 }
 
 AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
 	createSurface(1100, 57, 60);
 	SetUpdateHandler(&AsScene1201Match::update);
@@ -485,7 +485,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
 		_y = 112;
 		_status = 2;
 		sub40C470();
-		_soundResource.load(0xD00230CD);
+		loadSound(0, 0xD00230CD);
 		break;
 	case 2:
 		setDoDeltaX(1);
@@ -511,7 +511,7 @@ uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x86668011) {
-			_soundResource.play();
+			playSound(0);
 		}
 		break;
 	}
@@ -589,8 +589,7 @@ void AsScene1201Match::sub40C4F0() {
 }
 
 AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman)
-	: AnimatedSprite(vm, 900), _soundResource(vm), _parentScene(parentScene), _klayman(klayman),
-	_flag(false) {
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _flag(false) {
 	
 	createSurface(1100, 203, 199);
 	SetUpdateHandler(&AsScene1201Creature::update);
@@ -619,7 +618,7 @@ uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessagePar
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02060018) {
-			_soundResource.play(0xCD298116);
+			playSound(0, 0xCD298116);
 		}
 		break;
 	case 0x2004:
@@ -654,7 +653,7 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02060018) {
-			_soundResource.play(0xCD298116);
+			playSound(0, 0xCD298116);
 			sendMessage(_parentScene, 0x4814, 0);
 			sendMessage(_klayman, 0x4814, 0);
 		}
@@ -709,7 +708,7 @@ void AsScene1201Creature::sub40C9E0() {
 }
 
 AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman) {
+	: AnimatedSprite(vm, 1100), _klayman(klayman) {
 
 	_x = 320;
 	_y = 240;
@@ -717,7 +716,7 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
 	if (_klayman->getX() < 100) {
 		startAnimation(0x508A111B, 0, -1);
 		_newStickFrameIndex = -2;
-		_soundResource.play(calcHash("fxDoorOpen03"));
+		playSound(0, calcHash("fxDoorOpen03"));
 	} else {
 		startAnimation(0x508A111B, -1, -1);
 		_newStickFrameIndex = -2;
@@ -1109,8 +1108,7 @@ void AsScene1202TntItem::sub454160() {
 }
 
 Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _paletteResource(vm), _soundResource1(vm), 
-	_soundResource2(vm), _soundResource3(vm), _soundResource4(vm),
+	: Scene(vm, parentModule, true), _paletteResource(vm),  
 	_flag(true), _soundFlag(false), _counter(0), _index(-1) {
 
 	SetMessageHandler(&Scene1202::handleMessage453C10);
@@ -1139,10 +1137,10 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 		SetMessageHandler(&Scene1202::handleMessage453D90);
 	}
 
-	_soundResource1.play(0x40106542);
-	_soundResource2.load(0x40005446);
-	_soundResource2.load(0x40005446);
-	_soundResource2.load(0x68E25540);
+	playSound(0, 0x40106542);
+	loadSound(1, 0x40005446);
+	loadSound(2, 0x40005446);
+	loadSound(3, 0x68E25540);
 
 }
 
@@ -1155,13 +1153,13 @@ Scene1202::~Scene1202() {
 void Scene1202::update() {
 	Scene::update();
 	if (_soundFlag) {
-		if (!_soundResource4.isPlaying())
+		if (!isSoundPlaying(3))
 			leaveScene(0);
 	} else if (_counter == 0 && isSolved()) {
 		SetMessageHandler(&Scene1202::handleMessage453D90);
 		setGlobalVar(0x000CF819, 1);
 		doPaletteEffect();
-		_soundResource4.play();
+		playSound(3);
 		_soundFlag = true;
 	} else if (_index >= 0 && _counter == 0) {
 		int index2 = kScene1202Table[_index];
@@ -1173,9 +1171,9 @@ void Scene1202::update() {
 		_counter = 2;
 		_index = -1;
 		if (_flag) {
-			_soundResource2.play();
+			playSound(1);
 		} else {
-			_soundResource3.play();
+			playSound(2);
 		}
 		_flag = !_flag;
 	}
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index dc8e903..1733fb4 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -55,7 +55,6 @@ class Class466 : public AnimatedSprite {
 public:
 	Class466(NeverhoodEngine *vm, bool flag);
 protected:
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub40D340();
 	void sub40D360();
@@ -66,7 +65,6 @@ class AsScene1201RightDoor : public AnimatedSprite {
 public:
 	AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag);
 protected:
-	SoundResource _soundResource;
 	Sprite *_klayman;
 	int _countdown;
 	void update();
@@ -91,7 +89,6 @@ protected:
 	Scene *_parentScene;
 	Sprite *_class466;
 	Sprite *_sprite;
-	SoundResource _soundResource;
 	bool _flag;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender);
@@ -116,7 +113,6 @@ public:
 	AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	int _countdown;
 	int _status;
 	void update();
@@ -136,7 +132,6 @@ public:
 protected:
 	Scene *_parentScene;
 	Sprite *_klayman;
-	SoundResource _soundResource;
 	int _countdown1;
 	int _countdown2;
 	int _countdown3;
@@ -158,7 +153,6 @@ public:
 	AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman);
 protected:
 	Sprite *_klayman;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub40D590();
 };
@@ -176,8 +170,6 @@ public:
 	Scene1201(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Scene1201();
 protected:
-	// TODO ResourceTable _resourceTable1;
-	// TODO ResourceTable _resourceTable2;
 	Sprite *_asMatch;
 	AsScene1201TntMan *_asTntMan;
 	Sprite *_asCreature;
@@ -211,10 +203,6 @@ public:
 	Scene1202(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Scene1202();
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	PaletteResource _paletteResource;
 	Sprite *_asTntItems[18];
 	int _counter;


Commit: 5ab4eb6555bea4d2716720eff03b832de16ab87a
    https://github.com/scummvm/scummvm/commit/5ab4eb6555bea4d2716720eff03b832de16ab87a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1300

- Also fix a very stupid bug in AsScene1307Key which messed up the key moving animation

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 56812ba..09299de 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -298,9 +298,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule(1500, 0); // Logos and intro video //Real
-#if 0
-	_vm->gameState().sceneNum = 0;
-	createModule(1200, -1);
+#if 1
+	_vm->gameState().sceneNum = 6;
+	createModule(1300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -314,7 +314,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 1;
 	createModule(1000, -1);
 #endif
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 45c6842..1c980b0 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -298,7 +298,7 @@ void Module1300::updateScene() {
 }
 
 AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 
 	_x = 320;
 	_y = 240;
@@ -312,8 +312,8 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 		startAnimation(0x88148150, -1, -1);
 		_newStickFrameIndex = -2;
 	}
-	_soundResource1.load(0x68895082);
-	_soundResource2.load(0x689BD0C1);
+	loadSound(0, 0x68895082);
+	loadSound(1, 0x689BD0C1);
 }
 
 uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -335,14 +335,14 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &para
 void AsScene1302Bridge::stLowerBridge() {
 	startAnimation(0x88148150, 0, -1);
 	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
-	_soundResource2.play();
+	playSound(1);
 }
 
 void AsScene1302Bridge::stRaiseBridge() {
 	startAnimation(0x88148150, 7, -1);
 	_playBackwards = true;
 	_newStickFrameIndex = 0;
-	_soundResource1.play();
+	playSound(0);
 }
 
 void AsScene1302Bridge::cbLowerBridgeEvent() {
@@ -352,7 +352,7 @@ void AsScene1302Bridge::cbLowerBridgeEvent() {
 }
 
 SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
-	: StaticSprite(vm, 0x11122122, 200), _soundResource1(vm), _soundResource2(vm) {
+	: StaticSprite(vm, 0x11122122, 200) {
 	
 	SetUpdateHandler(&SsScene1302Fence::update);
 	SetMessageHandler(&SsScene1302Fence::handleMessage);
@@ -360,8 +360,8 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
 	_firstY = _y;
 	if (getGlobalVar(0x80101B1E))
 		_y += 152;
-	_soundResource1.load(0x7A00400C);
-	_soundResource2.load(0x78184098);
+	loadSound(0, 0x7A00400C);
+	loadSound(1, 0x78184098);
 }
 
 void SsScene1302Fence::update() {
@@ -373,12 +373,12 @@ uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4808:
-		_soundResource1.play();
+		playSound(0);
 		SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
 		SetMessageHandler(NULL);
 		break;
 	case 0x4809:
-		_soundResource2.play();
+		playSound(1);
 		SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
 		SetMessageHandler(NULL);
 		break;
@@ -424,7 +424,7 @@ uint32 Class595::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm) {
+	: Scene(vm, parentModule, true) {
 
 	SetMessageHandler(&Scene1302::handleMessage);
 	setHitRects(0x004B0858);
@@ -541,17 +541,17 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x4806:
 		sendMessage(_parentModule, 0x1024, 2);
 		if (sender == _asRing1) {
-			_soundResource.play(0x665198C0);
+			playSound(0, 0x665198C0);
 		} else if (sender == _asRing2) {
 			sendMessage(_asBridge, 0x4808, 0);
 			setGlobalVar(0x13206309, 1);
 		} else if (sender == _asRing3) {
-			_soundResource.play(0xE2D389C0);
+			playSound(0, 0xE2D389C0);
 		} else if (sender == _asRing4) {
 			sendMessage(_ssFence, 0x4808, 0);
 			setGlobalVar(0x80101B1E, 1);
 		} else if (sender == _asRing5) {
-			_soundResource.play(0x40428A09);
+			playSound(0, 0x40428A09);
 		}
 		break;
 	case 0x4807:
@@ -572,11 +572,11 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480F:
 		if (sender == _asRing2) {
-			_soundResource.play(0x60755842);
+			playSound(0, 0x60755842);
 			sendMessage(_asBridge, 0x4808, 0);
 			setGlobalVar(0x13206309, 1);
 		} else if (sender == _asRing4) {
-			_soundResource.play(0x60755842);
+			playSound(0, 0x60755842);
 			sendMessage(_ssFence, 0x4808, 0);
 			setGlobalVar(0x80101B1E, 1);
 		}
@@ -592,7 +592,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
 	// TODO createSurface3(200, dword_4AF9F8);
 	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
@@ -623,11 +623,11 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x020B0003) {
-			_soundResource.play(0x742B0055);
+			playSound(0, 0x742B0055);
 		} 
 		break;
 	case 0x3002:
-		_soundResource.play(0x470007EE);
+		playSound(0, 0x470007EE);
 		stopAnimation();
 		SetMessageHandler(NULL);
 		setVisible(false);
@@ -802,8 +802,7 @@ uint32 Scene1305::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), 
-	_parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true),
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true),
 	_countdown(0) {
 
 	_x = 320;
@@ -812,9 +811,9 @@ AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene
 	startAnimation(0x043B0270, 0, -1);
 	_newStickFrameIndex = 0;
 	SetMessageHandler(&AsScene1306Elevator::handleMessage);
-	_soundResource1.load(0x1C100E83);
-	_soundResource2.load(0x1C08CEC5);
-	_soundResource3.load(0x5D011E87);
+	loadSound(0, 0x1C100E83);
+	loadSound(1, 0x1C08CEC5);
+	loadSound(2, 0x5D011E87);
 }
 
 void AsScene1306Elevator::update() {
@@ -823,7 +822,7 @@ void AsScene1306Elevator::update() {
 	}
 	AnimatedSprite::update();
 	if (_currFrameIndex == 7) {
-		_soundResource3.play();
+		playSound(1);
 		_asElevatorDoor->setVisible(false);
 	}
 }
@@ -860,7 +859,7 @@ void AsScene1306Elevator::stGoingUp() {
 	SetUpdateHandler(&AsScene1306Elevator::update);
 	startAnimation(0x043B0270, 0, -1);
 	NextState(&AsScene1306Elevator::cbGoingUpEvent);
-	_soundResource1.play();
+	playSound(0);
 }
 
 void AsScene1306Elevator::cbGoingUpEvent() {
@@ -879,7 +878,7 @@ void AsScene1306Elevator::stGoingDown() {
 	startAnimation(0x043B0270, -1, -1);
 	_playBackwards = true;
 	NextState(&AsScene1306Elevator::cbGoingDownEvent);
-	_soundResource2.play();
+	playSound(1);
 }
 
 void AsScene1306Elevator::cbGoingDownEvent() {
@@ -1124,8 +1123,7 @@ const int16 kAsScene1307KeyXDelta = 70;
 const int16 kAsScene1307KeyYDelta = -12;
 
 AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
-	_soundResource4(vm), _parentScene(parentScene), _index(index), _clipRects(clipRects),
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _clipRects(clipRects),
 	_isClickable(true) {
 	
 	NPoint pt;
@@ -1146,10 +1144,10 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind
 	
 	startAnimation(fileHashes[0], 0, -1);
 	
-	_soundResource1.load(0xDC4A1280);
-	_soundResource2.load(0xCC021233);
-	_soundResource3.load(0xC4C23844);
-	_soundResource3.load(0xC4523208);
+	loadSound(0, 0xDC4A1280);
+	loadSound(1, 0xCC021233);
+	loadSound(2, 0xC4C23844);
+	loadSound(3, 0xC4523208);
 
 }
 
@@ -1171,11 +1169,11 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param,
 		stMoveKey();
 		break;
 	case 0x2003:
-		_soundResource4.play();
+		playSound(3);
 		stUnlock();
 		break;
 	case 0x2004:
-		_soundResource3.play();
+		playSound(2);
 		stInsert();
 		break;
 	}
@@ -1200,7 +1198,7 @@ void AsScene1307Key::suInsertKey() {
 		processDelta();
 		_pointIndex++;
 		if (_pointIndex == 7)
-			_soundResource1.play();
+			playSound(0);
 	} else {
 		SetSpriteUpdate(NULL);
 		sendMessage(_parentScene, 0x2002, 0);
@@ -1209,9 +1207,9 @@ void AsScene1307Key::suInsertKey() {
 
 void AsScene1307Key::suMoveKey() {
 	if (_pointIndex < kAsScene1307KeyFrameIndicesCount) {
-		_currFrameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
-		_x = _prevX + (_deltaX * _currFrameIndex) / kAsScene1307KeyDivValue;
-		_y = _prevY + (_deltaY * _currFrameIndex) / kAsScene1307KeyDivValue;
+		_frameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
+		_x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue;
+		_y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue;
 		processDelta();
 		_pointIndex++;
 	} else {
@@ -1227,7 +1225,7 @@ void AsScene1307Key::stRemoveKey() {
 	_pointIndex = 0;
 	SetSpriteUpdate(&AsScene1307Key::suRemoveKey);
 	startAnimation(fileHashes[0], 0, -1);
-	_soundResource2.play();
+	playSound(1);
 }
 
 void AsScene1307Key::stInsertKey() {
@@ -1251,7 +1249,7 @@ void AsScene1307Key::stMoveKey() {
 	} else {
 		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
 		_pointIndex = 0;
-		_currFrameIndex = 0;
+		_frameIndex = 0;
 		_deltaX = newX - _x;
 		_deltaY = newY - _y;
 		SetSpriteUpdate(&AsScene1307Key::suMoveKey);
@@ -1272,8 +1270,8 @@ void AsScene1307Key::stInsert() {
 }
 
 Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm), _countdown(0),
-	_asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
+	: Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL),
+	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
 
 	//DEBUG
 	setSubVar(0x08D0AB11, 0, 1);
@@ -1325,7 +1323,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 
-	_soundResource.load(0x68E25540);
+	loadSound(0, 0x68E25540);
 
 }
 
@@ -1336,7 +1334,7 @@ void Scene1307::update() {
 	} else if (_countdown == 20) {
 		_palette->startFadeToWhite(40);
 	}
-	if (_doLeaveScene && !_soundResource.isPlaying()) {
+	if (_doLeaveScene && !isSoundPlaying(0)) {
 		leaveScene(1);
 		setGlobalVar(0x80455A41, 1);
 	} 
@@ -1392,7 +1390,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 				if (_asKeys[keyIndex])
 					sendMessage(_asKeys[keyIndex], 0x2003, 1);
 			}
-			_soundResource.play();
+			playSound(0);
 			_isPuzzleSolved = true;
 			_countdown = 47;
 		} else {
@@ -1438,8 +1436,7 @@ static const uint32 kScene1308FileHashes[] = {
 };
 
 Class549::Class549(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _soundResource(vm), 
-	_parentScene(parentScene) {
+	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) {
 	
 	SetMessageHandler(&Class549::handleMessage);
 	setVisible(false);
@@ -1466,7 +1463,7 @@ void Class549::sub455470() {
 	startAnimation(0xBA0AE050, 0, -1);
 	setVisible(true);
 	NextState(&Class549::hide);
-	_soundResource.play(calcHash("fxDoorOpen38"));
+	playSound(0, calcHash("fxDoorOpen38"));
 }
 
 void Class549::hide() {
@@ -1480,7 +1477,7 @@ void Class549::sub4554F0() {
 	_playBackwards = true;
 	setVisible(true);
 	NextState(&Class549::sub455550);
-	_soundResource.play(calcHash("fxDoorClose38"));
+	playSound(0, calcHash("fxDoorClose38"));
 }
 
 void Class549::sub455550() {
@@ -1489,12 +1486,11 @@ void Class549::sub455550() {
 }
 
 Class592::Class592(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _soundResource(vm), 
-	_parentScene(parentScene) {
+	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) {
 	
 	SetMessageHandler(&Class592::handleMessage);
 	NextState(&Class592::sub455710);
-	_soundResource.play(0x51456049);
+	playSound(0, 0x51456049);
 }
  
 uint32 Class592::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1571,7 +1567,7 @@ Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index)
 }
 
 Class513::Class513(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100), _soundResource(vm) {
+	: AnimatedSprite(vm, 1100) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Class513::handleMessage);
@@ -1586,11 +1582,11 @@ uint32 Class513::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x66382026) {
-			_soundResource.play(0x0CD84468);
+			playSound(0, 0x0CD84468);
 		} else if (param.asInteger() == 0x6E28061C) {
-			_soundResource.play(0x78C8402C);
+			playSound(0, 0x78C8402C);
 		} else if (param.asInteger() == 0x462F0410) {
-			_soundResource.play(0x60984E28);
+			playSound(0, 0x60984E28);
 		}
 		break;
 	}
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index e404127..b6761dd 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -47,8 +47,6 @@ public:
 	AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stLowerBridge();
 	void stRaiseBridge();
@@ -59,8 +57,6 @@ class SsScene1302Fence : public StaticSprite {
 public:
 	SsScene1302Fence(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	int16 _firstY;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -80,7 +76,6 @@ class Scene1302 : public Scene {
 public:
 	Scene1302(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource;
 	Sprite *_asVenusFlyTrap;
 	Sprite *_asBridge;
 	Sprite *_ssFence;
@@ -101,7 +96,6 @@ public:
 	AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmBalloonPopped(int messageNum, const MessageParam &param, Entity *sender);
 	void stPopBalloon();
@@ -147,9 +141,6 @@ public:
 protected:
 	Scene *_parentScene;
 	AnimatedSprite *_asElevatorDoor;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	bool _isUp;
 	bool _isDown;
 	int _countdown;
@@ -182,10 +173,6 @@ public:
 	AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	NPointArray *_pointList;
 	uint _pointIndex;
 	int _frameIndex;
@@ -209,7 +196,6 @@ class Scene1307 : public Scene {
 public:
 	Scene1307(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource;
 	NPointArray *_keyHolePoints;
 	NRect _keyHoleRects[16];
 	NRect _clipRects[4];
@@ -228,7 +214,6 @@ public:
 	Class549(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub455470();
 	void hide();
@@ -241,7 +226,6 @@ public:
 	Class592(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub455710();
 	void sub455740();
@@ -267,7 +251,6 @@ class Class513 : public AnimatedSprite {
 public:
 	Class513(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 


Commit: b119efd5ed8e210fdaedcdd5e9cda58f59d63148
    https://github.com/scummvm/scummvm/commit/b119efd5ed8e210fdaedcdd5e9cda58f59d63148
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1400

Changed paths:
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h



diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 8d40c34..a8c8b3c 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -135,8 +135,7 @@ void Module1400::updateScene() {
 // Scene1401
 
 Class525::Class525(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm),
-	_countdown1(0), _countdown2(0) {
+	: AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) {
 	
 	// TODO createSurface3(900, dword_4B6768);
 	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
@@ -174,7 +173,7 @@ uint32 Class525::handleMessage466320(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x0A8A1490) {
-			_soundResource2.play(0x6AB6666F);
+			playSound(1, 0x6AB6666F);
 		}
 		break;
 	case 0x2000:
@@ -207,12 +206,12 @@ uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam &param,
 
 void Class525::sub466420() {
 	startAnimation(0x4C240100, 0, -1);
-	_soundResource1.play(0x4A30063F);
+	playSound(0, 0x4A30063F);
 }
 
 void Class525::sub466460() {
 	_vm->_soundMan->deleteSound(0x4A116437);
-	_soundResource1.play(0x4A120435);
+	playSound(0, 0x4A120435);
 	startAnimation(0x4C210500, 0, -1);
 }
 
@@ -223,7 +222,7 @@ void Class525::sub4664B0() {
 }
 
 Class526::Class526(NeverhoodEngine *vm, Sprite *class525)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _class525(class525) {
+	: AnimatedSprite(vm, 1100), _class525(class525) {
 	
 	// TODO createSurface3(100, dword_4B6778);
 	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
@@ -239,11 +238,11 @@ uint32 Class526::handleMessage(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x66382026) {
-			_soundResource.play(0x0CD84468);
+			playSound(0, 0x0CD84468);
 		} else if (param.asInteger() == 0x6E28061C) {
-			_soundResource.play(0x78C8402C);
+			playSound(0, 0x78C8402C);
 		} else if (param.asInteger() == 0x462F0410) {
-			_soundResource.play(0x60984E28);
+			playSound(0, 0x60984E28);
 		}
 		break;
 	case 0x4839:
@@ -256,7 +255,7 @@ uint32 Class526::handleMessage(int messageNum, const MessageParam &param, Entity
 void Class526::spriteUpdate466720() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
-		_soundResource.play(0x0E32247F);
+		playSound(0, 0x0E32247F);
 		stopAnimation();
 		SetSpriteUpdate(NULL);
 		SetMessageHandler(NULL);
@@ -270,7 +269,7 @@ void Class526::sub466770() {
 }
 
 Class527::Class527(NeverhoodEngine *vm, Sprite *class526)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _class526(class526) {
+	: AnimatedSprite(vm, 1100), _class526(class526) {
 
 	// TODO createSurface3(200, dword_4B6768);
 	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
@@ -294,7 +293,7 @@ uint32 Class527::handleMessage(int messageNum, const MessageParam &param, Entity
 void Class527::spriteUpdate466920() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
-		_soundResource.play(0x18020439);
+		playSound(0, 0x18020439);
 		stopAnimation();
 		SetSpriteUpdate(NULL);
 		SetMessageHandler(NULL);
@@ -308,7 +307,7 @@ void Class527::sub466970() {
 }
 
 Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) {
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) {
 
 	_x = 320;
 	_y = 240;
@@ -360,14 +359,14 @@ void Class528::sub466BF0() {
 	setVisible(true);
 	startAnimation(0x04551900, 0, -1);
 	_newStickFrameIndex = -2;
-	_soundResource.play(calcHash("fxDoorOpen24"));
+	playSound(0, calcHash("fxDoorOpen24"));
 }
 
 void Class528::sub466C50() {
 	_flag = false;
 	setVisible(true);
 	startAnimation(0x04551900, -1, -1);
-	_soundResource.play(calcHash("fxDoorClose24"));
+	playSound(0, calcHash("fxDoorClose24"));
 	_playBackwards = true;
 	NextState(&Class528::sub466CB0);
 }
@@ -386,8 +385,7 @@ static const Class489Item kClass489Items[] = {
 };
 
 Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525),
-	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525) {
 
 	_class489Item = &kClass489Items[getGlobalVar(0x04A105B3)];
 	// TODO createSurface3(990, dword_4B26D8);
@@ -402,7 +400,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr
 	if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) {
 		sub434E90();
 	}
-	_soundResource3.load(0xC8C2507C);
+	loadSound(2, 0xC8C2507C);
 }
 
 Class489::~Class489() {
@@ -565,7 +563,7 @@ void Class489::sub434C80() {
 			_flag = false;
 		}
 	} else if (soundFlag) {
-		_soundResource2.play(0x5440E474);
+		playSound(1, 0x5440E474);
 		_flag = true;
 	}
 	
@@ -593,7 +591,7 @@ void Class489::sub434DF0() {
 	startAnimation(0x14A10137, 0, -1);
 	SetSpriteUpdate(&Class489::spriteUpdate434B60);
 	SetMessageHandler(&Class489::handleMessage);
-	_soundResource2.play(0xEC008474);
+	playSound(1, 0xEC008474);
 }
 
 void Class489::sub434E60() {
@@ -615,7 +613,7 @@ void Class489::sub434EC0() {
 	SetSpriteUpdate(NULL);
 	NextState(&Class489::sub434F40);
 	setGlobalVar(0x12A10DB3, 1);
-	_soundResource1.play(0xCC4A8456);
+	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
 	_vm->_soundMan->playSoundLooping(0xCE428854);
 }
@@ -633,7 +631,7 @@ void Class489::sub434F80() {
 	SetMessageHandler(&Class489::handleMessage434B20);
 	NextState(&Class489::sub434E90);
 	setGlobalVar(0x12A10DB3, 0);
-	_soundResource1.play(0xCC4A8456);
+	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->deleteSound(0xCE428854);
 }
 
@@ -651,7 +649,7 @@ void Class489::sub435040() {
 	SetSpriteUpdate(&Class489::sub434D80);
 	SetMessageHandler(&Sprite::handleMessage);
 	startAnimation(0x708D4712, 0, -1);
-	_soundResource3.play();
+	playSound(2);
 }
 
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -813,8 +811,7 @@ Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
 }
 
 Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource1(vm),
-	_soundResource2(vm) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 
 	// TODO createSurface3(900, dword_4B6768);
 	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
@@ -826,14 +823,14 @@ Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which)
 	_y = 270;
 	if (which == 2) {
 		startAnimation(0x20060259, 0, -1);
-		_soundResource1.play(0x419014AC);
-		_soundResource2.load(0x61901C29);
+		playSound(0, 0x419014AC);
+		loadSound(1, 0x61901C29);
 	} else if (which == 1) {
 		startAnimation(0x210A0213, 0, -1);
-		_soundResource1.play(0x41809C6C);
+		playSound(0, 0x41809C6C);
 	} else {
 		startAnimation(0x20060259, 0, -1);
-		_soundResource2.load(0x61901C29);
+		loadSound(1, 0x61901C29);
 		_newStickFrameIndex = -2;
 	}
 }
@@ -842,7 +839,7 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2002:
-		_soundResource2.play();
+		playSound(1);
 		startAnimation(0x20060259, -1, -1);
 		_playBackwards = true;
 		NextState(&Class482::sub428530);
@@ -1257,8 +1254,7 @@ void AsScene1407Mouse::stArriveAtHole() {
 }
 
 Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm), _puzzleSolvedCountdown(0),
-	_resetButtonCountdown(0) {
+	: Scene(vm, parentModule, true), _puzzleSolvedCountdown(0),	_resetButtonCountdown(0) {
 
 	_surfaceFlag = true;
 
@@ -1298,7 +1294,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 				// The reset button was clicked
 				sendMessage(_asMouse, 0x2001, 0);
 				_ssResetButton->setVisible(true);
-				_soundResource.play(0x44045000);
+				playSound(0, 0x44045000);
 				_resetButtonCountdown = 12;
 			} else {
 				// Handle the mouse
@@ -1312,7 +1308,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		// The mouse got the cheese (nomnom)
 		setGlobalVar(0x70A1189C, 1);
-		_soundResource.play(0x68E25540);
+		playSound(0, 0x68E25540);
 		showMouse(false);
 		_puzzleSolvedCountdown = 72;
 		break;
@@ -1587,10 +1583,9 @@ static const NPoint kAsScene1405TileItemPositions[] = {
 };
 
 AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm),
-	_index(index), _countdown(0), _flag(false) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _countdown(0), _flag(false) {
 
-	_soundResource.load(0x05308101);
+	loadSound(0, 0x05308101);
 	// TODO _soundResource.setPan
 	_x = kAsScene1405TileItemPositions[_index].x;
 	_y = kAsScene1405TileItemPositions[_index].y;
@@ -1632,7 +1627,7 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param,
 void AsScene1405Tile::show() {
 	if (!_flag) {
 		_flag = true;
-		_soundResource.play();
+		playSound(0);
 		setVisible(true);
 	}
 }
@@ -1640,14 +1635,13 @@ void AsScene1405Tile::show() {
 void AsScene1405Tile::hide() {
 	if (_flag) {
 		_flag = false;
-		_soundResource.play();
+		playSound(0);
 		setVisible(false);
 	}
 }
 
 Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm), _selectFirstTile(true),
-	_tilesLeft(48), _countdown(0) {
+	: Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
 
 	_vm->gameModule()->initScene1405Vars();
 	_surfaceFlag = true;
@@ -1675,7 +1669,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 			_tilesLeft--;
 	}
 	
-	_soundResource.load(0x68E25540);
+	loadSound(0, 0x68E25540);
 	
 	SetMessageHandler(&Scene1405::handleMessage);
 	SetUpdateHandler(&Scene1405::update);
@@ -1722,7 +1716,7 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 					setSubVar(0xCCE0280F, _secondTileIndex, 1);
 					_tilesLeft -= 2;
 					if (_tilesLeft == 0) {
-						_soundResource.play();
+						playSound(0);
 					}
 				} else {
 					_countdown = 10;
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index d256b82..aed7ba9 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -48,8 +48,6 @@ public:
 protected:
 	int _countdown1;
 	int _countdown2;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	void update4662A0();
 	void update466300();
 	uint32 handleMessage466320(int messageNum, const MessageParam &param, Entity *sender);
@@ -64,7 +62,6 @@ public:
 	Class526(NeverhoodEngine *vm, Sprite *class525);
 protected:
 	Sprite *_class525;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void spriteUpdate466720();
 	void sub466770();
@@ -75,7 +72,6 @@ public:
 	Class527(NeverhoodEngine *vm, Sprite *class526);
 protected:
 	Sprite *_class526;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void spriteUpdate466920();
 	void sub466970();
@@ -86,7 +82,6 @@ public:
 	Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag);
 protected:
 	Sprite *_klayman;
-	SoundResource _soundResource;
 	int _countdown;
 	bool _flag;
 	void update();
@@ -115,9 +110,6 @@ protected:
 	Sprite *_klayman;
 	Sprite *_class525;
 	const Class489Item *_class489Item;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	int16 _remX;
 	bool _flag;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -168,8 +160,6 @@ public:
 	Class482(NeverhoodEngine *vm, Scene *parentScene, int which);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub428500();
 	void sub428530();
@@ -217,7 +207,6 @@ class Scene1407 : public Scene {
 public:
 	Scene1407(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource;
 	Sprite *_asMouse;
 	Sprite *_ssResetButton;
 	int _puzzleSolvedCountdown;
@@ -267,7 +256,6 @@ public:
 	void hide();
 protected:
 	Scene1405 *_parentScene;
-	SoundResource _soundResource;
 	bool _flag;
 	uint32 _index;
 	int _countdown;
@@ -280,7 +268,6 @@ public:
 	Scene1405(NeverhoodEngine *vm, Module *parentModule, int which);
 	int getCountdown() const { return _countdown; }
 protected:
-	SoundResource _soundResource;
 	bool _selectFirstTile;
 	int _firstTileIndex;
 	int _secondTileIndex;


Commit: 2df0a0a2e18049da5c1b6822ebc5c98f521ac3bd
    https://github.com/scummvm/scummvm/commit/2df0a0a2e18049da5c1b6822ebc5c98f521ac3bd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1500

Changed paths:
    engines/neverhood/module1500.cpp
    engines/neverhood/module1500.h



diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 76afb95..88b7e73 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -83,8 +83,7 @@ void Module1500::updateScene() {
 // Scene1501
 
 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3)
-	: Scene(vm, parentModule, true), _soundResource(vm), 
-	_countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) {
+	: Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) {
 
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
@@ -98,13 +97,8 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 	_palette->addBasePalette(backgroundFileHash, 0, 256, 0);
 	_palette->startFadeToPalette(12);
 
-	/*	
-	if (soundFileHash != 0) {
-		_soundResource.set(soundFileHash);
-		_soundResource.load();
-		_soundResource.play();
-	}
-	*/
+	if (soundFileHash != 0)
+		playSound(0, soundFileHash);
 
 }
 
@@ -121,7 +115,7 @@ void Scene1501::update() {
 			_vm->_screen->clear();
 			leaveScene(0);
 		}
-	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) {
+	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !isSoundPlaying(0)) {
 		_countdown1 = 12;
 		_palette->startFadeToBlack(11);
 	}
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
index eeabec0..c562a24 100644
--- a/engines/neverhood/module1500.h
+++ b/engines/neverhood/module1500.h
@@ -45,7 +45,6 @@ class Scene1501 : public Scene {
 public:
 	Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3);
 protected:
-	SoundResource _soundResource;
 	int _countdown1;
 	int _countdown2;
 	int _countdown3;


Commit: 0c272631df66fc574e2d1bb67d4aa22f434dd178
    https://github.com/scummvm/scummvm/commit/0c272631df66fc574e2d1bb67d4aa22f434dd178
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1600

Changed paths:
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h



diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 864e4a6..8b35942 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -983,8 +983,7 @@ void Class521::sub45E0A0() {
 }
 
 Class546::Class546(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _soundResource(vm),
-	_parentScene(parentScene) {
+	: AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _parentScene(parentScene) {
 
 	setVisible(false);
 	SetMessageHandler(&Class546::handleMessage);
@@ -1011,7 +1010,7 @@ void Class546::sub44D710() {
 	startAnimation(0x08C80144, 0, -1);
 	setVisible(true);
 	NextState(&Class546::sub44D760);
-	_soundResource.play(calcHash("fxDoorOpen23"));
+	playSound(0, calcHash("fxDoorOpen23"));
 }
 
 void Class546::sub44D760() {
@@ -1024,7 +1023,7 @@ void Class546::sub44D790() {
 	startAnimation(0x08C80144, -1, -1);
 	setVisible(true);
 	NextState(&Class546::sub44D7F0);
-	_soundResource.play(calcHash("fxDoorClose23"));
+	playSound(0, calcHash("fxDoorClose23"));
 }
 
 void Class546::sub44D7F0() {
@@ -1388,8 +1387,7 @@ uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam &param,
 }
 	
 Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm), _countdown1(1),
-	_index1(0), _index3(0), _flag5(true), _flag6(false) {
+	: Scene(vm, parentModule, true), _countdown1(1), _index1(0), _index3(0), _flag5(true), _flag6(false) {
 
 	// TODO _vm->gameModule()->initScene3011Vars();
 	_index2 = getGlobalVar(0x2414C2F2);
@@ -1409,7 +1407,7 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse435(0x24A10929, 20, 620);
 
-	_soundResource.load(0x68E25540);
+	loadSound(0, 0x68E25540);
 
 }
 
@@ -1428,7 +1426,7 @@ void Scene1609::update() {
 			_countdown1 = 12;
 		}
 	}
-	if (_flag6 && !_soundResource.isPlaying()) {
+	if (_flag6 && !isSoundPlaying(0)) {
 		leaveScene(1);
 	}
 	Scene::update();
@@ -1451,7 +1449,7 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 			_index3++;
 			if (_index3 >= 12) {
 				if (testVars()) {
-					_soundResource.play();
+					playSound(0);
 					setGlobalVar(0x2C531AF8, 1);
 					_flag6 = true;
 				} else {
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index efb2b94..b5b8e6b 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -110,7 +110,6 @@ public:
 	Class546(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub44D710();
 	void sub44D760();
@@ -175,7 +174,6 @@ class Scene1609 : public Scene {
 public:
 	Scene1609(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource;
 	Sprite *_ssButton;
 	AsScene3011Symbol *_asSymbols[12];
 	int _index1;


Commit: 0a1a228a883b3c13915a9e83886464b85ed2c81e
    https://github.com/scummvm/scummvm/commit/0a1a228a883b3c13915a9e83886464b85ed2c81e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1700

- Add Entity::setSoundVolume

Changed paths:
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/module1700.cpp
    engines/neverhood/module1700.h



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index d7d7896..0cb906a 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -142,6 +142,10 @@ bool Entity::isSoundPlaying(uint index) {
 	return getSoundResource(index)->isPlaying();
 }
 
+void Entity::setSoundVolume(uint index, int volume) {
+	getSoundResource(index)->setVolume(volume);
+}
+
 void Entity::deleteSoundResources() {
 	if (_soundResources) {
 		for (uint i = 0; i < kMaxSoundResources; ++i)
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index eafc467..b0348ea 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -109,6 +109,7 @@ protected:
 	void loadSound(uint index, uint32 fileHash);
 	void playSound(uint index, uint32 fileHash = 0);
 	bool isSoundPlaying(uint index);
+	void setSoundVolume(uint index, int volume);
 	void deleteSoundResources();
 };
 
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 13d0f35..f914fa9 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -34,7 +34,7 @@ static const uint32 kModule1700SoundList[] = {
 };
 
 Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _soundResource(vm) {
+	: Module(vm, parentModule) {
 	
 	_vm->_soundMan->addMusic(0x04212331, 0x31114225);
 	_vm->_soundMan->addSoundList(0x04212331, kModule1700SoundList);
@@ -105,9 +105,9 @@ void Module1700::updateScene() {
 			} else if (_moduleResult == 1) {
 				createScene(1, 1);
 			} else if (_moduleResult == 2) {
-				if (!_soundResource.isPlaying()) {
-					_soundResource.setVolume(60);
-					_soundResource.play(0x58B45E58);
+				if (!isSoundPlaying(0)) {
+					setSoundVolume(0, 60);
+					playSound(0, 0x58B45E58);
 				}
 				createScene(2, 2);
 			}
diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h
index f738848..2488c46 100644
--- a/engines/neverhood/module1700.h
+++ b/engines/neverhood/module1700.h
@@ -35,7 +35,6 @@ public:
 	Module1700(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1700();
 protected:
-	SoundResource _soundResource;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };


Commit: a8dda6c5b69657023b6b3c472c083af86a74cb0c
    https://github.com/scummvm/scummvm/commit/a8dda6c5b69657023b6b3c472c083af86a74cb0c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:44-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module1900

Changed paths:
    engines/neverhood/module1900.cpp
    engines/neverhood/module1900.h



diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index c6ce15c..77f031b 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -190,8 +190,7 @@ int AsScene1907Symbol::_symbolFlag1 = 0;
 int AsScene1907Symbol::_symbolFlag2 = 0;
 
 AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex)
-	: AnimatedSprite(vm, 1000 - positionIndex), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
-	_parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) {
+	: AnimatedSprite(vm, 1000 - positionIndex), _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) {
 
 	_symbolFlag1 = 0;
 	_symbolFlag2 = 0;
@@ -212,9 +211,9 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 	} else {
 		_isPluggedIn = false;
 		_currPositionIndex = positionIndex;
-		_soundResource1.load(0x74231924);
-		_soundResource2.load(0x36691914);
-		_soundResource3.load(0x5421D806);
+		loadSound(0, 0x74231924);
+		loadSound(1, 0x36691914);
+		loadSound(2, 0x5421D806);
 		_parentScene->setPositionFree(_currPositionIndex, false);
 		_x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x;
 		_y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y;
@@ -389,7 +388,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
 }
 
 void AsScene1907Symbol::stFallOffHitGround() {
-	_soundResource2.play();
+	playSound(1);
 	sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex);
 	// TODO: Meh...
 	Entity::_priority = 1000 - _newPositionIndex;
@@ -418,11 +417,11 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() {
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteUpdate(NULL);
 	processDelta();
-	_soundResource3.play();
+	playSound(2);
 }
 
 void AsScene1907Symbol::stPlugIn() {
-	_soundResource1.play();
+	playSound(0);
 	_currPositionIndex = _newPositionIndex;
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
@@ -456,7 +455,7 @@ void AsScene1907Symbol::moveDown() {
 }
 
 SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol)
-	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol),
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol),
 	_countdown1(0) {
 	
 	_spriteResource.load2(0x64516424);
@@ -468,7 +467,7 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
 	_y = _spriteResource.getPosition().y;
 	processDelta();
 	_needRefresh = true;
-	_soundResource.load(0x44061000);
+	loadSound(0, 0x44061000);
 	SetUpdateHandler(&SsScene1907UpDownButton::update);
 	SetMessageHandler(&SsScene1907UpDownButton::handleMessage);
 	if (getGlobalVar(0xA9035F60)) {
@@ -495,7 +494,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
 			setVisible(true);
 			_countdown1 = 4;
 			StaticSprite::update();
-			_soundResource.play();
+			playSound(0);
 		}
 		messageResult = 1;
 	}
@@ -558,8 +557,7 @@ void AsScene1907WaterHint::hide() {
 }
 
 Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)	
-	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _soundResource4(vm), _currMovingSymbolIndex(0), _pluggedInCount(0), 
+	: Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), 
 	_moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) {
 	
 	_surfaceFlag = true;
@@ -590,10 +588,10 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0xA9035F60))
 		_pluggedInCount = 9;
 		
-	_soundResource1.load(0x72004A10);
-	_soundResource2.load(0x22082A12);
-	_soundResource3.load(0x21100A10);
-	_soundResource4.load(0x68E25540);
+	loadSound(0, 0x72004A10);
+	loadSound(1, 0x22082A12);
+	loadSound(2, 0x21100A10);
+	loadSound(3, 0x68E25540);
 
 }
 
@@ -646,17 +644,17 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entit
 	// TODO Debug stuff
 	case 0x2000:
 		if (getGlobalVar(0x09221A62)) {
-			_soundResource1.play();
+			playSound(0);
 			for (int i = 0; i < 9; i++)
 				_asSymbols[i]->moveUp();
 			_ssUpDownButton->setToUpPosition();
 			setGlobalVar(0x09221A62, 0);
 		} else {
 			if (!getGlobalVar(0x10938830)) {
-				_soundResource3.play();
+				playSound(2);
 				_countdown3 = 5;
 			} else {
-				_soundResource2.play();
+				playSound(1);
 				_ssUpDownButton->setToDownPosition();
 				setGlobalVar(0x09221A62, 1);
 			}
@@ -665,7 +663,7 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2001:
-		_soundResource4.play();
+		playSound(3);
 		setGlobalVar(0xA9035F60, 1);
 		break;
 	}	
diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h
index 2eadd06..386d1c9 100644
--- a/engines/neverhood/module1900.h
+++ b/engines/neverhood/module1900.h
@@ -60,9 +60,6 @@ public:
 	bool isPluggedIn() { return _isPluggedIn; }
 	bool isMoving() { return _isMoving; }
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	Scene1907 *_parentScene;
 	int _elementIndex;
 	int _currPositionIndex;
@@ -111,7 +108,6 @@ public:
 	void setToUpPosition();
 	void setToDownPosition();
 protected:
-	SoundResource _soundResource;
 	Scene1907 *_parentScene;
 	AsScene1907Symbol *_asScene1907Symbol;
 	int _countdown1;
@@ -126,10 +122,6 @@ public:
 	void setPositionFree(int index, bool value) { _positionFree[index] = value; }
 	int getNextPosition() { return _pluggedInCount++; }
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	AsScene1907Symbol *_asSymbols[9];
 	SsScene1907UpDownButton *_ssUpDownButton;
 	AsScene1907WaterHint *_asWaterHint;


Commit: 78df19c6486612ad57f0625099355b69c41badb8
    https://github.com/scummvm/scummvm/commit/78df19c6486612ad57f0625099355b69c41badb8
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2100

Changed paths:
    engines/neverhood/module2100.cpp
    engines/neverhood/module2100.h



diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index fd2a793..98b6e03 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -78,7 +78,7 @@ void Module2100::updateScene() {
 // Scene2101
 
 Class538::Class538(NeverhoodEngine *vm, bool flag)
-	: AnimatedSprite(vm, 1100), _soundResource(vm) {
+	: AnimatedSprite(vm, 1100) {
 
 	// TODO createSurface3(100, dword_4B9018);
 	createSurface(100, 640, 480); //TODO: Remove once the line above is done
@@ -114,7 +114,7 @@ void Class538::openDoor() {
 	startAnimation(0x0C202B9C, 0, -1);
 	_newStickFrameIndex = -2;
 	setVisible(true);
-	_soundResource.play(calcHash("fxDoorOpen32"));
+	playSound(0, calcHash("fxDoorOpen32"));
 }
 
 void Class538::closeDoor() {
@@ -122,7 +122,7 @@ void Class538::closeDoor() {
 	_newStickFrameIndex = -2;
 	setVisible(true);
 	NextState(&Class538::hide);
-	_soundResource.play(calcHash("fxDoorClose32"));
+	playSound(0, calcHash("fxDoorClose32"));
 }
 
 void Class538::hide() {
@@ -157,7 +157,7 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash)
-	: StaticSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _countdown(0),
+	: StaticSprite(vm, 1100), _parentScene(parentScene), _countdown(0),
 	_fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) {
 
 	SetUpdateHandler(&Class427::update);
@@ -193,7 +193,7 @@ uint32 Class427::handleMessage(int messageNum, const MessageParam &param, Entity
 		load(_fileHash2, true, true);
 		StaticSprite::update();
 		_countdown = 16;
-		_soundResource.play(_soundFileHash);
+		playSound(0, _soundFileHash);
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h
index 65846d7..ff6898c 100644
--- a/engines/neverhood/module2100.h
+++ b/engines/neverhood/module2100.h
@@ -45,7 +45,6 @@ class Class538 : public AnimatedSprite {
 public:
 	Class538(NeverhoodEngine *vm, bool flag);
 protected:
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void openDoor();
 	void closeDoor();
@@ -65,7 +64,6 @@ public:
 	Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 _soundFileHash;
 	uint32 _fileHash1, _fileHash2;
 	int16 _countdown;


Commit: 3651d982c4229fb77d371836cdc3ddbca156d980
    https://github.com/scummvm/scummvm/commit/3651d982c4229fb77d371836cdc3ddbca156d980
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2200

- Add Entity::stopSound

Changed paths:
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index 0cb906a..f66d129 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -138,6 +138,10 @@ void Entity::playSound(uint index, uint32 fileHash) {
 		getSoundResource(index)->play();
 }
 
+void Entity::stopSound(uint index) {
+	getSoundResource(index)->stop();
+}
+
 bool Entity::isSoundPlaying(uint index) {
 	return getSoundResource(index)->isPlaying();
 }
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index b0348ea..4bcd0c4 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -108,6 +108,7 @@ protected:
 	// TODO Add other sound stuff
 	void loadSound(uint index, uint32 fileHash);
 	void playSound(uint index, uint32 fileHash = 0);
+	void stopSound(uint index);
 	bool isSoundPlaying(uint index);
 	void setSoundVolume(uint index, int volume);
 	void deleteSoundResources();
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index bb2f59b..f703971 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -412,8 +412,7 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
 }
 
 AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _doorLightSprite(doorLightSprite), 
-	_countdown(0), _doorOpen(flag1) {
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _doorLightSprite(doorLightSprite), _countdown(0), _doorOpen(flag1) {
 
 	_x = 408;
 	_y = 290;	
@@ -471,7 +470,7 @@ void AsScene2201Door::stOpenDoor() {
 	_doorOpen = true;
 	startAnimation(0xE2CB0412, 0, -1);
 	_newStickFrameIndex = -2;
-	_soundResource.play(calcHash("fxDoorOpen33"));
+	playSound(0, calcHash("fxDoorOpen33"));
 }
 
 void AsScene2201Door::stCloseDoor() {
@@ -479,7 +478,7 @@ void AsScene2201Door::stCloseDoor() {
 	startAnimation(0xE2CB0412, -1, -1);
 	_playBackwards = true;
 	_newStickFrameIndex = 0;
-	_soundResource.play(calcHash("fxDoorClose33"));
+	playSound(0, calcHash("fxDoorClose33"));
 }
 
 Class444::Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex)
@@ -671,8 +670,7 @@ static const uint32 kSsScene2202PuzzleTileFileHashes2[] = {
 };
 
 SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value)
-	: StaticSprite(vm, 900), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene),
-	_value(value), _tileIndex(tileIndex), _isMoving(false) {
+	: StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) {
 	
 	SetUpdateHandler(&SsScene2202PuzzleTile::update);
 	SetMessageHandler(&SsScene2202PuzzleTile::handleMessage);
@@ -694,8 +692,8 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS
 	processDelta();
 	_needRefresh = true;
 	StaticSprite::update();
-	_soundResource1.load(0x40958621);
-	_soundResource2.load(0x51108241);
+	loadSound(0, 0x40958621);
+	loadSound(1, 0x51108241);
 }
 
 void SsScene2202PuzzleTile::update() {
@@ -853,7 +851,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 			else
 				_xFlagPos = _x / 2 + _newX;
 		}
-		_soundResource1.play();
+		playSound(0);
 	} else {
 		SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileY);
 		if (_yIncr > 0) {
@@ -867,7 +865,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 			else
 				_xFlagPos = _y / 2 + _newY;
 		}
-		_soundResource2.play();
+		playSound(1);
 	}
 	
 }
@@ -885,8 +883,8 @@ void SsScene2202PuzzleTile::stopMoving() {
 }
 
 Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
-	_isSolved(false), _leaveScene(false), _isTileMoving(false), _movingTileSprite(NULL), _doneMovingTileSprite(NULL) {
+	: Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isTileMoving(false),
+	_movingTileSprite(NULL), _doneMovingTileSprite(NULL) {
 
 	// TODO initScene2201Vars();
 	SetMessageHandler(&Scene2202::handleMessage);
@@ -915,8 +913,8 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x85500158, 400);
 	insertStaticSprite(0x25547028, 600);
 
-	_soundResource1.load(0x68E25540);
-	_soundResource2.load(0x40400457);
+	loadSound(0, 0x68E25540);
+	loadSound(1, 0x40400457);
 
 	_vm->_soundMan->addSound(0x60400854, 0x8101A241);
 	_vm->_soundMan->playSoundLooping(0x8101A241);
@@ -930,12 +928,12 @@ Scene2202::~Scene2202() {
 void Scene2202::update() {
 	Scene::update();
 
-	if (_leaveScene && !_soundResource2.isPlaying()) {
+	if (_leaveScene && !isSoundPlaying(1)) {
 		leaveScene(0);
 	}
 
-	if (_isSolved && !_soundResource1.isPlaying()) {
-		_soundResource2.play();
+	if (_isSolved && !isSoundPlaying(0)) {
+		playSound(1);
 		_isSolved = false;
 		_leaveScene = true;
 	}
@@ -954,7 +952,7 @@ void Scene2202::update() {
 		setSurfacePriority(_doneMovingTileSprite->getSurface(), _surfacePriority);
 		_doneMovingTileSprite = NULL;
 		if (testIsSolved()) {
-			_soundResource1.play();
+			playSound(0);
 			setGlobalVar(0x404290D5, 1);
 			_isSolved = true;
 		}
@@ -1055,8 +1053,7 @@ static const uint32 kAsScene2203DoorFileHashes[] = {
 };
 
 AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene),
-	_index(index) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2203Door::handleMessage);
@@ -1104,7 +1101,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 }
 
 void AsScene2203Door::openDoor() {
-	_soundResource.play(0x341014C4);
+	playSound(0, 0x341014C4);
 	startAnimation(kAsScene2203DoorFileHashes[_index], 1, -1);
 }
 
@@ -1407,7 +1404,7 @@ static const int16 kClass603XDeltas2[] = {
 };
 
 Class603::Class603(NeverhoodEngine *vm, uint32 fileHash)
-	: StaticSprite(vm, fileHash, 200), _soundResource(vm) {
+	: StaticSprite(vm, fileHash, 200) {
 	
 	if (getGlobalVar(0x18890C91))
 		_x -= 63;
@@ -1428,13 +1425,13 @@ uint32 Class603::handleMessage(int messageNum, const MessageParam &param, Entity
 		_index = 0;
 		SetMessageHandler(NULL);
 		SetSpriteUpdate(&Class603::spriteUpdate481E60);
-		_soundResource.play(0x032746E0);
+		playSound(0, 0x032746E0);
 		break;
 	case 0x4809:
 		_index = 0;
 		SetMessageHandler(NULL);
 		SetSpriteUpdate(&Class603::spriteUpdate481E90);
-		_soundResource.play(0x002642C0);
+		playSound(0, 0x002642C0);
 		break;
 	}
 	return messageResult;
@@ -1520,7 +1517,7 @@ uint32 Class607::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm) {
+	: Scene(vm, parentModule, true) {
 
 	uint32 fileHash;
 	
@@ -1580,7 +1577,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B88C8);
 		_palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
 		sub4819D0();
-		_soundResource.play(0x53B8284A);
+		playSound(0, 0x53B8284A);
 	} else if (which == 3) {
 		insertKlayman<KmScene2206>(kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
 		if (getGlobalVar(0xC0418A02))
@@ -1695,8 +1692,7 @@ static const uint32 kScene2207FileHashes[] = {
 };
 
 AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 900), _parentScene(parentScene), _soundResource(vm),
-	_pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) {
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) {
 
 	NPoint pt;
 
@@ -1728,7 +1724,7 @@ void AsScene2207Elevator::update() {
 				_destPointIndexDelta = 0;
 			} else {
 				_vm->_soundMan->deleteSound(0xD3B02847);
-				_soundResource.play(0x53B8284A);
+				playSound(0, 0x53B8284A);
 			}
 		}
 	}
@@ -1744,7 +1740,7 @@ void AsScene2207Elevator::update() {
 				_destPointIndexDelta = 0;
 			} else {
 				_vm->_soundMan->deleteSound(0xD3B02847);
-				_soundResource.play(0x53B8284A);
+				playSound(0, 0x53B8284A);
 			}
 		}
 	}
@@ -1811,7 +1807,7 @@ void AsScene2207Elevator::moveToY(int16 y) {
 }
 
 AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX)
-	: AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2207Lever::handleMessage);
@@ -1853,7 +1849,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 void AsScene2207Lever::stLeverDown() {
 	startAnimation(0x80880090, 1, -1);
 	FinalizeState(&AsScene2207Lever::stLeverDownEvent);
-	_soundResource.play(0x40581882);
+	playSound(0, 0x40581882);
 }
 
 void AsScene2207Lever::stLeverDownEvent() {
@@ -1864,7 +1860,7 @@ void AsScene2207Lever::stLeverUp() {
 	startAnimation(0x80880090, 6, -1);
 	FinalizeState(&AsScene2207Lever::stLeverUpEvent);
 	_playBackwards = true;
-	_soundResource.play(0x40581882);
+	playSound(0, 0x40581882);
 }
 
 void AsScene2207Lever::stLeverUpEvent() {
@@ -1872,8 +1868,7 @@ void AsScene2207Lever::stLeverUpEvent() {
 }
 
 AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _soundResource4(vm), _idle(true) {
+	: AnimatedSprite(vm, 1200), _idle(true) {
 	
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage);
@@ -1882,9 +1877,9 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm
 	_y = 320;
 	startAnimation(0xCCFD6090, 0, -1);
 	_newStickFrameIndex = 0;
-	_soundResource2.load(0x40330872);
-	_soundResource3.load(0x72A2914A);
-	_soundResource4.load(0xD4226080);
+	loadSound(1, 0x40330872);
+	loadSound(2, 0x72A2914A);
+	loadSound(3, 0xD4226080);
 }
 
 AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
@@ -1900,19 +1895,19 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
 				_vm->_soundMan->addSound(0x80D00820, 0x12121943);
 				_vm->_soundMan->playSoundLooping(0x12121943);
 			} else if (param.asInteger() == 0x834AB011) {
-				_soundResource1.stop();
-				_soundResource2.stop();
-				_soundResource3.stop();
-				_soundResource4.stop();
+				stopSound(0);
+				stopSound(1);
+				stopSound(2);
+				stopSound(3);
 				_vm->_soundMan->deleteSound(0x12121943);
 			} else if (param.asInteger() == 0x3A980501) {
-				_soundResource2.play();
+				playSound(1);
 			} else if (param.asInteger() == 0x2A2AD498) {
-				_soundResource3.play();
+				playSound(2);
 			} else if (param.asInteger() == 0xC4980008) {
-				_soundResource4.play();
+				playSound(3);
 			} else if (param.asInteger() == 0x06B84228) {
-				_soundResource1.play(0xE0702146);
+				playSound(0, 0xE0702146);
 			}
 		}
 		break;
@@ -1945,10 +1940,10 @@ void AsScene2207WallRobotAnimation::stStopAnimation() {
 
 void AsScene2207WallRobotAnimation::cbStopAnimation() {
 	stopAnimation();
-	_soundResource1.stop();
-	_soundResource2.stop();
-	_soundResource3.stop();
-	_soundResource4.stop();
+	stopSound(0);
+	stopSound(1);
+	stopSound(2);
+	stopSound(3);
 	_vm->_soundMan->deleteSound(0x12121943);
 	_idle = true;
 	setVisible(false);
@@ -2011,8 +2006,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
 }
 
 Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm),
-	_klaymanAtElevator(true), _elevatorSurfacePriority(0) {
+	: Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
 	//DEBUG
 	setGlobalVar(0x4D080E54, 1);
@@ -2094,7 +2088,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	sendMessage(_klayman, 0x2001, 0);
 	sendMessage(_asElevator, 0x2000, 480);
 
-	_soundResource2.load(calcHash("fxFogHornSoft"));
+	loadSound(1, calcHash("fxFogHornSoft"));
 
 }
 
@@ -2166,10 +2160,10 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _ssButton) {
 			if (getSubVar(0x14800353, 0x40119852)) {
 				setSubVar(0x14800353, 0x40119852, 0);
-				_soundResource1.play(calcHash("fx3LocksDisable"));
+				playSound(0, calcHash("fx3LocksDisable"));
 			} else {
 				setSubVar(0x14800353, 0x40119852, 1);
-				_soundResource2.play();
+				playSound(1);
 			}
 		}
 		break;
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 76a5950..3767b7b 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -76,7 +76,6 @@ class AsScene2201Door : public AnimatedSprite {
 public:
 	AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1);
 protected:
-	SoundResource _soundResource;
 	Klayman *_klayman;
 	Sprite *_doorLightSprite;
 	bool _doorOpen;
@@ -124,8 +123,6 @@ protected:
 	int16 _xFlagPos;
 	bool _counterDirection;
 	bool _isMoving;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void suMoveTileX();
@@ -139,8 +136,6 @@ public:
 	Scene2202(NeverhoodEngine *vm, Module *parentModule, int which);
 	~Scene2202();
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	Sprite *_movingTileSprite;
 	Sprite *_doneMovingTileSprite;
 	bool _isTileMoving;
@@ -168,7 +163,6 @@ public:
 	AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	Sprite *_otherDoor;
 	uint _index;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -216,7 +210,6 @@ public:
 	Class603(NeverhoodEngine *vm, uint32 fileHash);
 protected:
 	int _index;
-	SoundResource _soundResource;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void spriteUpdate481E60();
@@ -253,7 +246,6 @@ protected:
 	Sprite *_sprite5;
 	Sprite *_class604;
 	Sprite *_class607;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void sub481950();
 	void sub4819D0();
@@ -266,7 +258,6 @@ public:
 	~AsScene2207Elevator();
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	NPointArray *_pointArray;
 	int16 _pointIndex;
 	int16 _destPointIndex, _destPointIndexDelta;
@@ -282,7 +273,6 @@ public:
 	AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stLeverDown();
 	void stLeverDownEvent();
@@ -295,10 +285,6 @@ public:
 	AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene);
 	~AsScene2207WallRobotAnimation();
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	bool _idle;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stStartAnimation();
@@ -326,8 +312,6 @@ class Scene2207 : public Scene {
 public:
 	Scene2207(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	Sprite *_asElevator;
 	Sprite *_ssMaskPart1;
 	Sprite *_ssMaskPart2;


Commit: 0c5a5b3c62826904166847b2626fe37b62023547
    https://github.com/scummvm/scummvm/commit/0c5a5b3c62826904166847b2626fe37b62023547
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2400

Changed paths:
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index f1f9f04..6c12006 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -201,7 +201,7 @@ static const uint32 kAsScene2401WaterSpitFileHashes1[] = {
 };
 
 AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	: AnimatedSprite(vm, 1200) {
 	
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2401WaterSpit::handleMessage);
@@ -217,13 +217,13 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x120A0013)
-			_soundResource.play(kAsScene2401WaterSpitFileHashes1[_soundIndex]);
+			playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]);
 		break;
 	case 0x2000:
 		_x = 240;
 		_y = 447;
 		_soundIndex = getSubVar(0x0800547C, param.asInteger());
-		_soundResource.play(0x48640244);
+		playSound(0, 0x48640244);
 		startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1);
 		setVisible(true);
 		break;
@@ -323,7 +323,7 @@ uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessagePara
 }
 
 AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
-	: AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen), _soundResource(vm) {
+	: AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) {
 	
 	createSurface1(0x44687810, 100);
 	_x = 320;
@@ -348,7 +348,7 @@ void AsScene2401Door::update() {
 		startAnimation(0x44687810, -1, -1);
 		_newStickFrameIndex = 0;
 		_playBackwards = true;
-		_soundResource.play(calcHash("fxDoorClose38"));
+		playSound(0, calcHash("fxDoorClose38"));
 	}
 	AnimatedSprite::update();
 }
@@ -370,7 +370,7 @@ uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam &param,
 			_isOpen = true;
 			setVisible(true);
 			startAnimation(0x44687810, 0, -1);
-			_soundResource.play(calcHash("fxDoorOpen38"));
+			playSound(0, calcHash("fxDoorOpen38"));
 			NextState(&AsScene2401Door::stDoorOpenFinished);
 		}
 		break;
@@ -385,7 +385,7 @@ void AsScene2401Door::stDoorOpenFinished() {
 
 Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false),
-	_soundToggle(false), _asWaterSpitIndex(0), _soundResource1(vm), _soundResource2(vm) {
+	_soundToggle(false), _asWaterSpitIndex(0) {
 
 	_vm->gameModule()->initScene2401Vars();
 
@@ -545,7 +545,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (sender == _ssFloorButton && getGlobalVar(0x4E0BE910)) {
 			_countdown2 = 144;
 			sendMessage(_asFlowingWater, 0x2002, 0);
-			_soundResource1.play(0xE1130324);
+			playSound(0, 0xE1130324);
 		}
 		break;
 	case 0x482A:
@@ -562,9 +562,9 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 
 void Scene2401::playPipeSound(uint32 fileHash) {
 	if (_soundToggle)
-		_soundResource1.play(fileHash);
+		playSound(0, fileHash);
 	else
-		_soundResource2.play(fileHash);
+		playSound(1, fileHash);
 	_soundToggle = !_soundToggle;
 }
 
@@ -577,7 +577,7 @@ static const uint32 kScene2402FileHashes[] = {
 };
 
 AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _soundResource(vm) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen) {
 
 	SetUpdateHandler(&AsScene2402Door::update);
 	SetMessageHandler(&AsScene2402Door::handleMessage);
@@ -600,7 +600,7 @@ void AsScene2402Door::update() {
 		setVisible(true);
 		startAnimation(0x80495831, -1, -1);
 		_playBackwards = true;
-		_soundResource.play(calcHash("fxDoorClose38"));
+		playSound(0, calcHash("fxDoorClose38"));
 		NextState(&AsScene2402Door::stDoorClosingFinished);
 	}
 	AnimatedSprite::update();
@@ -623,7 +623,7 @@ uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam &param,
 		setVisible(true);
 		startAnimation(0x80495831, 0, -1);
 		_newStickFrameIndex = -2;
-		_soundResource.play(calcHash("fxDoorOpen38"));
+		playSound(0, calcHash("fxDoorOpen38"));
 		break;
 	}
 	return messageResult;
@@ -635,8 +635,7 @@ void AsScene2402Door::stDoorClosingFinished() {
 }
 
 AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
-	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0),
-	_soundResource(vm) {
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) {
 
 	createSurface(100, 640, 480); // TODO Use correct size	from the two hashes
 	SetMessageHandler(&Sprite::handleMessage);
@@ -645,7 +644,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 	setDoDeltaX(1);
 
 	if (!getGlobalVar(0x92603A79)) {
-		_soundResource.load(0x58208810);
+		loadSound(0, 0x58208810);
 		_countdown1 = 48;
 		startAnimation(0x4919397A, 0, -1);
 		_newStickFrameIndex = 0;
@@ -709,7 +708,7 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x431EA0B0) {
-			_soundResource.play();
+			playSound(0);
 		}
 		break;
 	case 0x3002:
@@ -720,8 +719,7 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *
 }
 
 Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _soundToggle(false),
-	_soundResource1(vm), _soundResource2(vm) {
+	: Scene(vm, parentModule, true), _countdown(0), _soundToggle(false) {
 	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2402::handleMessage);
@@ -816,14 +814,14 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entit
 		
 void Scene2402::playPipeSound(uint32 fileHash) {
 	if (_soundToggle)
-		_soundResource1.play(fileHash);
+		playSound(0, fileHash);
 	else
-		_soundResource2.play(fileHash);
+		playSound(1, fileHash);
 	_soundToggle = !_soundToggle;
 }
 
 Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm) {
+	: Scene(vm, parentModule, true) {
 	
 	Sprite *tempSprite;
 
@@ -868,7 +866,7 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2());
 	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2());	
 
-	_soundResource2.load(calcHash("fxFogHornSoft"));
+	loadSound(1, calcHash("fxFogHornSoft"));
 
 }
 
@@ -894,10 +892,10 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _ssButton) {
 			if (getSubVar(0x14800353, 0x304008D2)) {
 				setSubVar(0x14800353, 0x304008D2, 0);
-				_soundResource1.play(calcHash("fx3LocksDisable"));
+				playSound(0, calcHash("fx3LocksDisable"));
 			} else {
 				setSubVar(0x14800353, 0x304008D2, 1);
-				_soundResource2.play();
+				playSound(1);
 			}
 		}
 		break;
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index e29f03d..bbfa47d 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -54,7 +54,6 @@ public:
 	AsScene2401WaterSpit(NeverhoodEngine *vm);
 protected:
 	int _soundIndex;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -83,7 +82,6 @@ public:
 protected:
 	int _countdown;
 	bool _isOpen;
-	SoundResource _soundResource;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stDoorOpenFinished();
@@ -107,8 +105,6 @@ protected:
 	int _countdown2;
 	int _pipeStatus;
 	int _asWaterSpitIndex;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void playPipeSound(uint32 fileHash);
@@ -121,7 +117,6 @@ protected:
 	Scene *_parentScene;
 	int _countdown;
 	bool _isOpen;
-	SoundResource _soundResource;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stDoorClosingFinished();
@@ -135,7 +130,6 @@ protected:
 	Klayman *_klayman;
 	int _countdown1;
 	int _countdown2;
-	SoundResource _soundResource;
 	void upWait();
 	void upFocusKlayman();
 	void stJokeFinished();
@@ -155,8 +149,6 @@ protected:
 	int _pipeStatus;
 	int _countdown;
 	bool _soundToggle;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void playPipeSound(uint32 fileHash);
@@ -173,8 +165,6 @@ protected:
 	Sprite *_class545;
 	Sprite *_asLightCord;
 	bool _flag1;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 


Commit: fb9d9c30e6a35de21c128abc09e40e1997d882b6
    https://github.com/scummvm/scummvm/commit/fb9d9c30e6a35de21c128abc09e40e1997d882b6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2500

Changed paths:
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h



diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index a12c516..1efcb25 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -56,8 +56,7 @@ static const uint32 kScene2508StaticSprites2[] = {
 static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448);
 
 Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _soundResource4(vm), _soundIndex(0) {
+	: Module(vm, parentModule), _soundIndex(0) {
 	
 	_vm->_soundMan->addMusic(0x29220120, 0x05343184);
 	_vm->_soundMan->startMusic(0x05343184, 0, 0);
@@ -69,10 +68,10 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	_soundResource1.load(0x00880CCC);
-	_soundResource2.load(0x00880CC0);
-	_soundResource3.load(0x00880CCC);
-	_soundResource4.load(0x00880CC0);
+	loadSound(0, 0x00880CCC);
+	loadSound(1, 0x00880CC0);
+	loadSound(2, 0x00880CCC);
+	loadSound(3, 0x00880CC0);
 
 }
 
@@ -203,20 +202,7 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam &param, Enti
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x200D:
-		switch (_soundIndex) {
-		case 0:
-			_soundResource1.play();
-			break;
-		case 1:
-			_soundResource2.play();
-			break;
-		case 2:
-			_soundResource3.play();
-			break;
-		case 3:
-			_soundResource4.play();
-			break;
-		}
+		playSound(_soundIndex);
 		_soundIndex++;
 		if (_soundIndex >= 4)
 			_soundIndex = 0;
@@ -513,8 +499,7 @@ void Scene2501::updateKlaymanCliprect() {
 }
 
 Class450::Class450(NeverhoodEngine *vm)
-	: StaticSprite(vm, 1400), _countdown(0), _flag1(false), _soundResource1(vm),
-	_soundResource2(vm), _soundResource3(vm), _soundResource4(vm) {
+	: StaticSprite(vm, 1400), _countdown(0), _flag1(false) {
 	
 	_spriteResource.load2(0x070220D9);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -528,26 +513,26 @@ Class450::Class450(NeverhoodEngine *vm)
 	processDelta();
 	_needRefresh = true;
 	setVisible(false);
-	_soundResource3.load(0x44043000);
-	_soundResource4.load(0x44045000);
-	_soundResource1.load(0x4600204C);
-	_soundResource2.load(0x408C0034);
+	loadSound(0, 0x4600204C);
+	loadSound(1, 0x408C0034);
+	loadSound(2, 0x44043000);
+	loadSound(3, 0x44045000);
 	SetMessageHandler(&Class450::handleMessage);
 	SetUpdateHandler(&Class450::update);
 }
 
 void Class450::update() {
 	StaticSprite::update();
-	if (_flag1 && !_soundResource1.isPlaying() && !_soundResource2.isPlaying()) {
-		_soundResource4.play();
+	if (_flag1 && !isSoundPlaying(0) && !isSoundPlaying(1)) {
+		playSound(3);
 		setVisible(false);
 		_flag1 = false;
 	}
 	if (_countdown != 0 && (--_countdown) == 0) {
 		if (getSubVar(0x14800353, 0x01180951)) {
-			_soundResource1.play();
+			playSound(0);
 		} else {
-			_soundResource2.play();
+			playSound(1);
 		}
 		_flag1 = true;
 	}
@@ -565,7 +550,7 @@ uint32 Class450::handleMessage(int messageNum, const MessageParam &param, Entity
 			} else {
 				setSubVar(0x14800353, 0x01180951, 1);
 			}
-			_soundResource3.play();
+			playSound(2);
 		}
 		messageResult = 1;
 		break;
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index 756c75e..fb61ba5 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -39,10 +39,6 @@ public:
 	Module2500(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2500();
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	int _soundIndex;
 	void createScene(int sceneNum, int which);
 	void updateScene();
@@ -99,10 +95,6 @@ public:
 protected:
 	int _countdown;
 	bool _flag1;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: 26188a3a695d47feea6240695eb87488d67c969a
    https://github.com/scummvm/scummvm/commit/26188a3a695d47feea6240695eb87488d67c969a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2600

Changed paths:
    engines/neverhood/module2600.cpp
    engines/neverhood/module2600.h



diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 43c55ea..435c38c 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -206,9 +206,7 @@ void Module2600::updateScene() {
 }
 			
 SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _soundResource4(vm), _parentScene(parentScene),
-	_countdown(0) {
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
 	
 	_spriteResource.load2(0x825A6923);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -222,10 +220,10 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 	processDelta();
 	_needRefresh = true;
 
-	_soundResource1.load(0x10267160);
-	_soundResource2.load(0x7027FD64);
-	_soundResource3.load(0x44043000);
-	_soundResource4.load(0x44045000);
+	loadSound(0, 0x10267160);
+	loadSound(1, 0x7027FD64);
+	loadSound(2, 0x44043000);
+	loadSound(3, 0x44045000);
 
 	SetUpdateHandler(&SsScene2609Button::update);
 	SetMessageHandler(&SsScene2609Button::handleMessage);
@@ -253,13 +251,13 @@ uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam &para
 			sendMessage(_parentScene, 0x2000, 0);
 			if (getGlobalVar(0x4E0BE910)) {
 				setVisible(false);
-				_soundResource4.play();
-				_soundResource2.play();
+				playSound(3);
+				playSound(1);
 				_countdown = 12;
 			} else {
 				setVisible(true);
-				_soundResource3.play();
-				_soundResource1.play();
+				playSound(2);
+				playSound(0);
 				_countdown = 96;
 			}
 		}
diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h
index 04c7800..107ee91 100644
--- a/engines/neverhood/module2600.h
+++ b/engines/neverhood/module2600.h
@@ -45,10 +45,6 @@ public:
 	SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);


Commit: 73f4e4bcac93cb96b2a6b5cde5b3c0342819fe13
    https://github.com/scummvm/scummvm/commit/73f4e4bcac93cb96b2a6b5cde5b3c0342819fe13
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2700

Changed paths:
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index aa5c98e..0a59abf 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -83,8 +83,7 @@ static const uint32 kScene2725StaticSprites[] = {
 };
 
 Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm),
-	_soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) {
+	: Module(vm, parentModule), _soundIndex(0), _flag1(false) {
 	
 	_vm->_soundMan->addMusic(0x42212411, 0x04020210);
 	_vm->_soundMan->startMusic(0x04020210, 24, 2);
@@ -99,10 +98,10 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 		createScene(0, 0);
 	}
 
-	_soundResource1.load(0x00880CCC);
-	_soundResource2.load(0x00880CC0);
-	_soundResource3.load(0x00880CCC);
-	_soundResource4.load(0x00880CC0);
+	loadSound(0, 0x00880CCC);
+	loadSound(1, 0x00880CC0);
+	loadSound(2, 0x00880CCC);
+	loadSound(3, 0x00880CC0);
 
 }
 
@@ -482,20 +481,7 @@ uint32 Module2700::handleMessage(int messageNum, const MessageParam &param, Enti
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x200D:
-		switch (_soundIndex) {
-		case 0:
-			_soundResource1.play();
-			break;
-		case 1:
-			_soundResource2.play();
-			break;
-		case 2:
-			_soundResource3.play();
-			break;
-		case 3:
-			_soundResource4.play();
-			break;
-		}
+		playSound(_soundIndex);
 		_soundIndex++;
 		if (_soundIndex >= 4)
 			_soundIndex = 0;
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index bed9a7d..70c1a80 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -37,10 +37,6 @@ public:
 	Module2700(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2700();
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
 	int _soundIndex;
 	bool _flag1;
 	uint32 _scene2711StaticSprites[6];


Commit: eca881bd3ece18de6cc24087d66052632d9a7170
    https://github.com/scummvm/scummvm/commit/eca881bd3ece18de6cc24087d66052632d9a7170
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module2800

Changed paths:
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 597227c..6d7e49f 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -477,7 +477,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 
 AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2),
-	_flag1(false), _flag2(false), _soundResource(vm) {
+	_flag1(false), _flag2(false) {
 
 	createSurface(1010, 640, 480); // TODO Use correct size	from the two hashes
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -493,7 +493,7 @@ uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &p
 	case 0x100D:
 		if (!_flag2 && param.asInteger() == calcHash("ClickSwitch")) {
 			sendMessage(_parentScene, 0x480F, 0);
-			_soundResource.play(0x4E1CA4A0);
+			playSound(0, 0x4E1CA4A0);
 		}
 		break;
 	case 0x480F:
@@ -1184,8 +1184,7 @@ void Scene2803b::sub4601F0(bool flag) {
 }
 
 SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene)
-	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene),
-	_soundResource(vm) {
+	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) {
 	
 	if (getGlobalVar(0x190A1D18))
 		_spriteResource.load2(0x51A10202);
@@ -1204,7 +1203,7 @@ SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *paren
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene2804RedButton::update);
 	SetMessageHandler(&SsScene2804RedButton::handleMessage);
-	_soundResource.load(0x44241240);
+	loadSound(0, 0x44241240);
 }
 
 void SsScene2804RedButton::update() {
@@ -1219,7 +1218,7 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x1011:
 		if (_countdown == 0 && !_parentScene->isWorking()) {
-			_soundResource.play();
+			playSound(0);
 			setVisible(true);
 			_countdown = 4;
 			sendMessage(_parentScene, 0x2000, 0);
@@ -1299,7 +1298,7 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam
 }
 
 SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
-	: StaticSprite(vm, 900), _soundResource(vm) {
+	: StaticSprite(vm, 900) {
 	
 	_spriteResource.load2(0x211003A0);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -1312,13 +1311,13 @@ SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
 	setVisible(false);
 	_needRefresh = true;
 	StaticSprite::update();
-	_soundResource.load(0xCB36BA54);
+	loadSound(0, 0xCB36BA54);
 }
 
 void SsScene2804Flash::show() {
 	setVisible(true);
 	StaticSprite::update();
-	_soundResource.play();
+	playSound(0);
 }
 
 SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm)
@@ -1381,8 +1380,7 @@ static const uint32 kAsScene2804CrystalFileHashes[] = {
 };
 
 AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex)
-	: AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex),
-	_isShowing(false), _soundResource(vm) {
+	: AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex), _isShowing(false) {
 
 	static const NPoint kAsScene2804CrystalPoints[] = {
 		{204, 196},
@@ -1410,7 +1408,7 @@ AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWa
 		_needRefresh = true;
 		_newStickFrameIndex = _colorNum;
 	}
-	_soundResource.load(0x725294D4);
+	loadSound(0, 0x725294D4);
 	SetUpdateHandler(&AnimatedSprite::update);
 }
 
@@ -1420,7 +1418,7 @@ void AsScene2804Crystal::show() {
 		_isShowing = true;
 		if (_asCrystalWaves)
 			_asCrystalWaves->show();
-		_soundResource.play();
+		playSound(0);
 	}
 }
 
@@ -1452,8 +1450,7 @@ void AsScene2804Crystal::activate() {
 }
 
 SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex)
-	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal),
-	_crystalIndex(crystalIndex), _soundResource(vm) {
+	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal), _crystalIndex(crystalIndex) {
 
 	static const uint32 kSsScene2804CrystalButtonFileHashes1[] = {
 		0x911101B0,
@@ -1486,7 +1483,7 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280
 	_deltaRect = _drawRect;
 	processDelta();
 	setVisible(false);
-	_soundResource.load(0x44045140);
+	loadSound(0, 0x44045140);
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene2804CrystalButton::update);
 	SetMessageHandler(&SsScene2804CrystalButton::handleMessage);
@@ -1504,7 +1501,7 @@ uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessagePara
 	switch (messageNum) {
 	case 0x1011:
 		if (_countdown == 0 && !_parentScene->isWorking()) {
-			_soundResource.play();
+			playSound(0);
 			setVisible(true);
 			_countdown = 4;
 			_asCrystal->activate();
@@ -1516,8 +1513,7 @@ uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessagePara
 }
 
 AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody)
-	: AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody),
-	_countdown(0), _soundResource(vm) {
+	: AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), _countdown(0) {
 	
 	createSurface1(0x00494891, 1000);
 	_x = 125;
@@ -1525,7 +1521,7 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene
 	setVisible(false);
 	_needRefresh = true;
 	AnimatedSprite::updatePosition();
-	_soundResource.load(0x6352F051);
+	loadSound(0, 0x6352F051);
 	_vm->_soundMan->addSound(0xC5EA0B28, 0xEF56B094);
 	SetUpdateHandler(&AsScene2804BeamCoil::update);
 	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
@@ -1564,7 +1560,7 @@ void AsScene2804BeamCoil::show() {
 	// TODO _ssBeamCoilBody->update(); -> show()
 	setVisible(true);
 	startAnimation(0x00494891, 0, -1);
-	_soundResource.play();
+	playSound(0);
 	SetMessageHandler(&AsScene2804BeamCoil::hmBeaming);
 	NextState(&AsScene2804BeamCoil::stBeaming);
 }
@@ -1842,7 +1838,7 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	: AnimatedSprite(vm, 1200) {
 	
 	createSurface1(0x04211490, 1200);
 	_x = 378;
@@ -1857,7 +1853,7 @@ uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
-		_soundResource.play(0x48640244);
+		playSound(0, 0x48640244);
 		startAnimation(0x04211490, 0, -1);
 		setVisible(true);
 		break;
@@ -2137,10 +2133,7 @@ void SsScene2808Dispenser::startCountdown(int index) {
 }
 
 AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser)
-	: AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser),
-	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
-	_soundResource4(vm), _soundResource5(vm), _soundResource6(vm),
-	_soundResource7(vm), _soundResource8(vm), _soundResource9(vm), _fillLevel(0) {
+	: AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser), _fillLevel(0) {
 
 	if (testTubeSetNum == 0) {
 		_x = 504;
@@ -2154,16 +2147,16 @@ AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum
 	createSurface1(kClass490FileHashes[testTubeIndex], 1100);
 
 	if (testTubeSetNum == 0) {
-		_soundResource1.load(0x30809E2D);
-		_soundResource2.load(0x72811E2D);
-		_soundResource3.load(0x78B01625);
+		loadSound(0, 0x30809E2D);
+		loadSound(1, 0x72811E2D);
+		loadSound(2, 0x78B01625);
 	} else {
-		_soundResource4.load(0x70A41E0C);
-		_soundResource5.load(0x50205E2D);
-		_soundResource6.load(0xF8621E2D);
-		_soundResource7.load(0xF1A03C2D);
-		_soundResource8.load(0x70A43D2D);
-		_soundResource9.load(0xF0601E2D);
+		loadSound(3, 0x70A41E0C);
+		loadSound(4, 0x50205E2D);
+		loadSound(5, 0xF8621E2D);
+		loadSound(6, 0xF1A03C2D);
+		loadSound(7, 0x70A43D2D);
+		loadSound(8, 0xF0601E2D);
 	}
 	
 	startAnimation(kClass490FileHashes[testTubeIndex], 0, -1);
@@ -2194,16 +2187,18 @@ void AsScene2808TestTube::fill() {
 	if ((int)_fillLevel >= _testTubeSetNum * 3 + 3)
 		return;
 		
+	// TODO Remove the two switches
+
 	if (_testTubeSetNum == 0) {
 		switch (_fillLevel) {
 		case 0:
-			_soundResource1.play();
+			playSound(0);
 			break;
 		case 1:
-			_soundResource2.play();
+			playSound(1);
 			break;
 		case 2:
-			_soundResource3.play();
+			playSound(2);
 			break;
 		}
 		setVisible(true);
@@ -2212,22 +2207,22 @@ void AsScene2808TestTube::fill() {
 	} else {
 		switch (_fillLevel) {
 		case 0:
-			_soundResource4.play();
+			playSound(3);
 			break;
 		case 1:
-			_soundResource5.play();
+			playSound(4);
 			break;
 		case 2:
-			_soundResource6.play();
+			playSound(5);
 			break;
 		case 3:
-			_soundResource7.play();
+			playSound(6);
 			break;
 		case 4:
-			_soundResource8.play();
+			playSound(7);
 			break;
 		case 5:
-			_soundResource9.play();
+			playSound(8);
 			break;
 		}
 		setVisible(true);
@@ -2252,10 +2247,9 @@ void AsScene2808TestTube::flush() {
 }
 
 AsScene2808Handle::AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum)
-	: AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false),
-	_soundResource(vm) {
+	: AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false) {
 	
-	_soundResource.load(0xE18D1F30);
+	loadSound(0, 0xE18D1F30);
 	_x = 320;
 	_y = 240;
 	if (_testTubeSetNum == 1)
@@ -2275,7 +2269,7 @@ uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam &para
 	case 0x1011:
 		if (!_isActivated) {
 			sendMessage(_parentScene, 0x2001, 0);
-			_soundResource.play();
+			playSound(0);
 			activate();
 		}
 		messageResult = 1;
@@ -2308,8 +2302,7 @@ void AsScene2808Handle::stActivated() {
 }
 
 AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum),
-	_soundResource(vm) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum) {
 
 	if (testTubeSetNum == 0) {
 		_x = 312;
@@ -2323,7 +2316,7 @@ AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int te
 	setVisible(false);
 	_newStickFrameIndex = 0;
 	_needRefresh = true;
-	_soundResource.load(0x6389B652);
+	loadSound(0, 0x6389B652);
 	SetUpdateHandler(&AnimatedSprite::update);
 	AnimatedSprite::updatePosition();
 }
@@ -2343,7 +2336,7 @@ void AsScene2808Flow::start() {
 	setVisible(true);
 	SetMessageHandler(&AsScene2808Flow::hmFlowing);
 	NextState(&AsScene2808Flow::stKeepFlowing);
-	_soundResource.play();
+	playSound(0);
 }
 
 void AsScene2808Flow::stKeepFlowing() {
@@ -2481,7 +2474,7 @@ bool Scene2808::isAnyTestTubeFilled() {
 }
 
 AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _soundResource(vm) {
+	: AnimatedSprite(vm, 1200) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2809Spew::handleMessage);
@@ -2496,7 +2489,7 @@ uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
-		_soundResource.play(0x48640244);
+		playSound(0, 0x48640244);
 		startAnimation(0x04211490, 0, -1);
 		setVisible(true);
 		break;
@@ -2955,7 +2948,7 @@ void AsScene2812Rope::sub413E00() {
 }
 
 AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 0x805D0029, 100, 320, 240), _soundResource(vm) {
+	: AnimatedSprite(vm, 0x805D0029, 100, 320, 240) {
 	
 	SetMessageHandler(&AsScene2812TrapDoor::handleMessage);
 	_newStickFrameIndex = 0;
@@ -2966,7 +2959,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa
 	switch (messageNum) {
 	case 0x2000:
 		startAnimation(0x805D0029, 0, -1);
-		_soundResource.play(0xEA005F40);
+		playSound(0, 0xEA005F40);
 		_newStickFrameIndex = -2;
 		break;
 	}
@@ -3133,8 +3126,7 @@ void Scene2812::setPalStatus(int fadeTime) {
 }
 
 Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0),
-	_soundResource1(vm), _soundResource2(vm), _soundResource3(vm) {
+	: Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0) {
 
 	SetMessageHandler(&Scene2822::handleMessage);
 	SetUpdateHandler(&Scene2822::update);
@@ -3145,7 +3137,7 @@ Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse435(0x0028D089, 20, 620);
 	_ssButton = insertStaticSprite(0x1A4D4120, 1100);
 	_ssButton->setVisible(false);
-	_soundResource3.load(0x19044E72);
+	loadSound(2, 0x19044E72);
 }
 
 void Scene2822::update() {
@@ -3163,7 +3155,7 @@ void Scene2822::update() {
 				_countdownStatus = 1;
 				_countdown = 48;
 			} else if (_countdownStatus == 1) {
-				_soundResource1.play(0x1384CB60);
+				playSound(0, 0x1384CB60);
 				_countdownStatus = 2;
 				_countdown = 12;
 			} else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) {
@@ -3192,12 +3184,12 @@ uint32 Scene2822::handleMessage(int messageNum, const MessageParam &param, Entit
 			_ssButton->setVisible(true);
 			_countdownStatus = 0;
 			_countdown = 12;
-			_soundResource2.play(0x44061000);
+			playSound(1, 0x44061000);
 			if (getGlobalVar(0x0018CA22) == 0) {
 				setGlobalVar(0x0018CA22, 1);
 				setGlobalVar(0x00188211, 1);
 				SetMessageHandler(NULL);
-				_soundResource3.play();
+				playSound(2);
 				_mouseCursor->setVisible(false);
 			}
 		}
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 89e4d71..b5827bf 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -62,7 +62,6 @@ public:
 	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	uint32 _fileHash1, _fileHash2;
 	bool _flag1, _flag2;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -149,7 +148,6 @@ class SsScene2804RedButton : public StaticSprite {
 public:
 	SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene);
 protected:
-	SoundResource _soundResource;
 	Scene2804 *_parentScene;
 	int _countdown;
 	void update();
@@ -179,8 +177,6 @@ class SsScene2804Flash : public StaticSprite {
 public:
 	SsScene2804Flash(NeverhoodEngine *vm);
 	void show();
-protected:
-	SoundResource _soundResource;
 };
 
 class AsScene2804CrystalWaves : public AnimatedSprite {
@@ -205,14 +201,12 @@ protected:
 	int16 _colorNum;
 	bool _isLightOn;
 	bool _isShowing;
-	SoundResource _soundResource;
 };
 
 class SsScene2804CrystalButton : public StaticSprite {
 public:
 	SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex);
 protected:
-	SoundResource _soundResource;
 	Scene2804 *_parentScene;
 	AsScene2804Crystal *_asCrystal;
 	uint _crystalIndex;
@@ -226,7 +220,6 @@ public:
 	AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody);
 	virtual ~AsScene2804BeamCoil();
 protected:
-	SoundResource _soundResource;
 	Scene *_parentScene;
 	SsScene2804BeamCoilBody *_ssBeamCoilBody;
 	int _countdown;
@@ -280,7 +273,6 @@ class AsScene2806Spew : public AnimatedSprite {
 public:
 	AsScene2806Spew(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -332,15 +324,6 @@ protected:
 	int _testTubeSetNum;
 	uint32 _fillLevel;
 	int _testTubeIndex;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
-	SoundResource _soundResource4;
-	SoundResource _soundResource5;
-	SoundResource _soundResource6;
-	SoundResource _soundResource7;
-	SoundResource _soundResource8;
-	SoundResource _soundResource9;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -353,7 +336,6 @@ protected:
 	Scene *_parentScene;
 	int _testTubeSetNum;
 	bool _isActivated;
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmActivating(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -366,7 +348,6 @@ public:
 protected:
 	Scene *_parentScene;
 	int _testTubeSetNum;
-	SoundResource _soundResource;
 	uint32 hmFlowing(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -398,7 +379,6 @@ class AsScene2809Spew : public AnimatedSprite {
 public:
 	AsScene2809Spew(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -468,7 +448,6 @@ class AsScene2812TrapDoor : public AnimatedSprite {
 public:
 	AsScene2812TrapDoor(NeverhoodEngine *vm);
 protected:
-	SoundResource _soundResource;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -503,9 +482,6 @@ protected:
 	int _scrollIndex;
 	int _countdown;
 	int _countdownStatus;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: 45da15adce31f2f46d52ab8a9f81f367bcbc9e2e
    https://github.com/scummvm/scummvm/commit/45da15adce31f2f46d52ab8a9f81f367bcbc9e2e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Module3000 (dirty, TODO)

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



diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 3a6209e..9ccda91 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -456,8 +456,7 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = {
 };
 
 SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene)
-	: StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene),
-	_flag1(false) {
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _flag1(false) {
 	
 	_spriteResource.load2(0x120B24B0);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -476,12 +475,12 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3009FireCannonButton::update);
 	SetMessageHandler(&SsScene3009FireCannonButton::handleMessage);
-	_soundResource.load(0x3901B44F);
+	loadSound(0, 0x3901B44F);
 }
 
 void SsScene3009FireCannonButton::update() {
 	StaticSprite::update();
-	if (_flag1 && !_soundResource.isPlaying()) {
+	if (_flag1 && !isSoundPlaying(0)) {
 		sendMessage(_parentScene, 0x2000, 0);
 		setVisible(false);
 	}
@@ -494,7 +493,7 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP
 		if (!_flag1 && !_parentScene->sub462E90()) {
 			_flag1 = true;
 			setVisible(true);
-			_soundResource.play();
+			playSound(0);
 		}
 		messageResult = 1;
 		break;
@@ -575,8 +574,7 @@ void SsScene3009TargetLine::show() {
 }
 
 SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index)
-	: StaticSprite(vm, 1400), _soundResource(vm), _asSymbol(asSymbol), 
-	_index(index), _enabled(true), _countdown(0) {
+	: StaticSprite(vm, 1400), _asSymbol(asSymbol), _index(index), _enabled(true), _countdown(0) {
 
 	_incrDecr = _index % 2;
 
@@ -593,7 +591,7 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3009SymbolArrow::update);
 	SetMessageHandler(&SsScene3009SymbolArrow::handleMessage);
-	_soundResource.load(0x2C852206);
+	loadSound(0, 0x2C852206);
 }
 
 void SsScene3009SymbolArrow::hide() {
@@ -625,7 +623,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
 			_drawRect.y = 0;
 			_drawRect.width = _spriteResource.getDimensions().width;
 			_drawRect.height = _spriteResource.getDimensions().height;
-			_soundResource.play();
+			playSound(0);
 			sendMessage(_asSymbol, 0x2005, _incrDecr);
 		}
 		messageResult = 1;
@@ -1072,9 +1070,7 @@ static const uint32 kAsScene3010DeadBoltFileHashes1[] = {
 };
 
 SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled)
-	: StaticSprite(vm, 900), _parentScene(parentScene), _soundResource1(vm),
-	_soundResource2(vm), _soundResource3(vm), _buttonLocked(false), _countdown1(0), 
-	_countdown2(0), _buttonIndex(buttonIndex) {
+	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) {
 
 	NDimensions dimensions1, dimensions2;
 	 
@@ -1092,9 +1088,9 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene
 	} else if (_buttonEnabled) {
 		_countdown1 = initCountdown * 12 + 1;
 	}
-	_soundResource1.load(0xF4217243);
-	_soundResource2.load(0x44049000);
-	_soundResource3.load(0x6408107E);
+	loadSound(0, 0xF4217243);
+	loadSound(1, 0x44049000);
+	loadSound(2, 0x6408107E);
 	SetUpdateHandler(&SsScene3010DeadBoltButton::update);
 	SetMessageHandler(&SsScene3010DeadBoltButton::handleMessage);
 }
@@ -1102,7 +1098,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene
 void SsScene3010DeadBoltButton::update() {
 
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
-		_soundResource1.play();
+		playSound(0);
 		setVisible(false);
 		setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
 	}
@@ -1120,8 +1116,8 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
 	case 0x1011:
 		if (!_buttonLocked && _countdown1 == 0) {
 			if (_buttonEnabled) {
-				_soundResource2.play();
-				_soundResource3.play();
+				playSound(1);
+				playSound(2);
 				setVisible(true);
 				_buttonLocked = true;
 				sendMessage(_parentScene, 0x2000, _buttonIndex);
@@ -1162,9 +1158,8 @@ void SsScene3010DeadBoltButton::setCountdown(int count) {
 }
 
 AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked)
-	: AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
-	_parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false),
-	_countdown(0) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true),
+	_unlocked(false), _locked(false), _countdown(0) {
 
 	_x = kAsScene3010DeadBoltPoints[_boltIndex].x;
 	_y = kAsScene3010DeadBoltPoints[_boltIndex].y;
@@ -1172,12 +1167,12 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene
 	if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) {
 		createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200);
 		startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
-		_soundResource1.load(0x46005BC4);
+		loadSound(0, 0x46005BC4);
 	} else {
 		createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200);
 		startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1);
-		_soundResource1.load(0x420073DC);
-		_soundResource2.load(0x420073DC);
+		loadSound(0, 0x420073DC);
+		loadSound(1, 0x420073DC);
 	}
 	
 	setVisible(false);
@@ -1226,10 +1221,10 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) {
 			SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
 			FinalizeState(&AsScene3010DeadBolt::stIdleMessage);
 			NextState(&AsScene3010DeadBolt::stIdle);
-			_soundResource1.play();
+			playSound(0);
 		}
 		_unlocked = true;
-		_soundResource3.load(0x4010C345);
+		loadSound(2, 0x4010C345);
 	}
 }
 
@@ -1248,9 +1243,9 @@ void AsScene3010DeadBolt::lock() {
 		FinalizeState(&AsScene3010DeadBolt::stDisabledMessage);
 		NextState(&AsScene3010DeadBolt::stIdle);
 		if (_soundToggle) {
-			_soundResource1.play();
+			playSound(0);
 		} else {
-			_soundResource2.play();
+			playSound(1);
 		}
 		_soundToggle = !_soundToggle;
 	}
@@ -1267,7 +1262,7 @@ void AsScene3010DeadBolt::stDisabled() {
 	FinalizeState(&AsScene3010DeadBolt::stDisabledMessage);
 	NextState(&AsScene3010DeadBolt::stIdle);
 	_playBackwards = true;
-	_soundResource3.play();
+	playSound(2);
 }
 
 void AsScene3010DeadBolt::stDisabledMessage() {
@@ -1276,8 +1271,7 @@ void AsScene3010DeadBolt::stDisabledMessage() {
 }
 
 Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundResource(vm), _countdown(0),
-	_doorUnlocked(false), _checkUnlocked(false) {
+	: Scene(vm, parentModule, true), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) {
 	
 	int initCountdown = 0;
 
@@ -1305,7 +1299,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertMouse435(0x02622800, 20, 620);
 	}
 
-	_soundResource.load(0x68E25540);
+	loadSound(0, 0x68E25540);
 
 	SetMessageHandler(&Scene3010::handleMessage);
 	SetUpdateHandler(&Scene3010::update);
@@ -1369,7 +1363,7 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) {
 			if (!getGlobalVar(0x00040153)) {
 				setGlobalVar(0x00040153, 1);
-				_soundResource.play();
+				playSound(0);
 				_countdown = 60;
 			} else {
 				_countdown = 48;
@@ -1419,15 +1413,14 @@ static const uint32 kAsScene3011SymbolFileHashes[] = {
 };
 
 SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag)
-	: StaticSprite(vm, 1400), _parentScene(parentScene), _soundResource(vm),
-	_countdown(0) {
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
 	
 	if (flag) {
 		_spriteResource.load2(0x11282020);
 	} else {
 		_spriteResource.load2(0x994D0433);
 	}
-	_soundResource.load(0x44061000);
+	loadSound(0, 0x44061000);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
@@ -1459,7 +1452,7 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam &para
 			setVisible(true);
 			_countdown = 4;
 			sendMessage(_parentScene, 0x2000, 0);
-			_soundResource.play();
+			playSound(0);
 		}
 		messageResult = 1;
 		break;
@@ -1468,22 +1461,21 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam &para
 }
 
 AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
-	: AnimatedSprite(vm, 1000), _soundResource1(vm), _soundResource2(vm),
-	_index(index), _flag1(flag), _flag2(false) {
+	: AnimatedSprite(vm, 1000), _index(index), _flag1(flag), _flag2(false) {
 
 	if (flag) {
 		_x = 310;
 		_y = 200;
 		createSurface1(kAsScene3011SymbolFileHashes[_index], 1200);
-		_soundResource1.load(0x6052C60F);
-		_soundResource2.load(0x6890433B);
+		loadSound(0, 0x6052C60F);
+		loadSound(1, 0x6890433B);
 	} else {
 		_index = 12;
 		_x = index * 39 + 96;
 		_y = 225;
 		createSurface(1200, 41, 48);
-		_soundResource1.load(0x64428609);
-		_soundResource2.load(0x7080023B);
+		loadSound(0, 0x64428609);
+		loadSound(1, 0x7080023B);
 	}
 	setVisible(false);
 	_needRefresh = true;
@@ -1495,9 +1487,9 @@ void AsScene3011Symbol::show(bool flag) {
 	startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1);
 	setVisible(true);
 	if (flag) {
-		_soundResource2.play();
+		playSound(1);
 	} else {
-		_soundResource1.play();
+		playSound(0);
 	}
 }
 
@@ -1508,9 +1500,10 @@ void AsScene3011Symbol::hide() {
 
 void AsScene3011Symbol::stopSound() {
 	if (_flag2) {
-		_soundResource2.stop();
+		Entity::stopSound(1);
 	} else {
-		_soundResource2.stop();
+	// CHECKME this is wrong
+		//_soundResource2.stop();
 	}
 }
 
@@ -1520,9 +1513,9 @@ void AsScene3011Symbol::change(int index, bool flag) {
 	startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1);
 	setVisible(true);
 	if (flag) {
-		_soundResource2.play();
+		playSound(1);
 	} else {
-		_soundResource1.play();
+		playSound(0);
 	}
 }
 
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 2e25a0d..0c1df86 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -50,7 +50,6 @@ public:
 	SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene);
 protected:
 	Scene3009 *_parentScene;
-	SoundResource _soundResource;
 	bool _flag1;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -80,7 +79,6 @@ public:
 	SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index);
 	void hide();
 protected:
-	SoundResource _soundResource;
 	Sprite *_asSymbol;
 	int _index;
 	int _incrDecr;
@@ -162,9 +160,6 @@ public:
 	void setCountdown(int count);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	int _buttonIndex;
 	bool _buttonEnabled;
 	bool _buttonLocked;
@@ -184,9 +179,6 @@ public:
 	void unlock(bool skipAnim);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	int _boltIndex;
 	int _countdown;
 	bool _soundToggle;
@@ -204,7 +196,6 @@ class Scene3010 : public Scene {
 public:
 	Scene3010(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	SoundResource _soundResource;
 	int _countdown;
 	bool _doorUnlocked;
 	bool _checkUnlocked;
@@ -223,7 +214,6 @@ public:
 	SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag);
 protected:
 	Scene *_parentScene;
-	SoundResource _soundResource;
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -239,8 +229,6 @@ public:
 	bool getFlag1() { return _flag1; }
 	int getIndex() { return _index; }
 protected:
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	bool _flag1;
 	bool _flag2;
 	int _index;


Commit: 1b3a686cac9e6c7afab2bec7545ddb18938f1447
    https://github.com/scummvm/scummvm/commit/1b3a686cac9e6c7afab2bec7545ddb18938f1447
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Fix AsScene3011Symbol

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



diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 8b35942..5c890e0 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1445,7 +1445,7 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (!_flag6) {
 			if (_flag5)
 				_asSymbols[_index3]->change(_index1 + 12, false);
-			_asSymbols[_index3]->stopSound();
+			_asSymbols[_index3]->stopSymbolSound();
 			_index3++;
 			if (_index3 >= 12) {
 				if (testVars()) {
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 9ccda91..78ab74d 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1498,12 +1498,11 @@ void AsScene3011Symbol::hide() {
 	setVisible(false);
 }
 
-void AsScene3011Symbol::stopSound() {
+void AsScene3011Symbol::stopSymbolSound() {
 	if (_flag2) {
-		Entity::stopSound(1);
+		stopSound(1);
 	} else {
-	// CHECKME this is wrong
-		//_soundResource2.stop();
+		stopSound(0);
 	}
 }
 
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 0c1df86..2f7c21f 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -224,7 +224,7 @@ public:
 	AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag);
 	void show(bool flag);
 	void hide();
-	void stopSound();
+	void stopSymbolSound();
 	void change(int index, bool flag);
 	bool getFlag1() { return _flag1; }
 	int getIndex() { return _index; }


Commit: acdc0256bb6081cc82e4453c79e37b4a651b4feb
    https://github.com/scummvm/scummvm/commit/acdc0256bb6081cc82e4453c79e37b4a651b4feb
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:45-07:00

Commit Message:
NEVERHOOD: Change sound stuff in DiskplayerScene

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/diskplayerscene.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 94a5323..cb37a24 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -194,8 +194,7 @@ void Class494::sub43BE20() {
 }
 
 DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene)
-	: StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm),
-	_diskplayerScene(diskplayerScene), _isPlaying(false) {
+	: StaticSprite(vm, 1400), _diskplayerScene(diskplayerScene), _isPlaying(false) {
 	
 	_spriteResource.load2(0x24A4A664);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -213,8 +212,8 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene
 	processDelta();
 	_needRefresh = true;
 	StaticSprite::update();
-	_soundResource1.load(0x44043000);
-	_soundResource2.load(0x44045000);
+	loadSound(0, 0x44043000);
+	loadSound(1, 0x44045000);
 	SetMessageHandler(&DiskplayerPlayButton::handleMessage);
 }
 
@@ -243,7 +242,7 @@ void DiskplayerPlayButton::press() {
 	if (!_isPlaying) {
 		_surface->setVisible(true);
 		StaticSprite::update();
-		_soundResource1.play();
+		playSound(0);
 		_isPlaying = true;
 	}
 }
@@ -252,24 +251,23 @@ void DiskplayerPlayButton::release() {
 	if (_isPlaying) {
 		_surface->setVisible(false);
 		StaticSprite::update();
-		_soundResource2.play();
+		playSound(1);
 		_isPlaying = false;
 	}
 }
 
 DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value)
-	: Entity(vm, 0), _diskplayerScene(diskplayerScene), _soundResource(vm), _elementIndex(elementIndex),
-	_value(value), _flag2(false), _flag(false), _countdown(0), _initialCountdown(2),
-	_inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
+	: Entity(vm, 0), _diskplayerScene(diskplayerScene), _elementIndex(elementIndex), _value(value),
+	_flag2(false), _flag(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
 
 	if (value != 0 && elementIndex < 20) {
 		_inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100));
 		_appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[_elementIndex], 1000));
 		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[_elementIndex], 1100));
-		_inactiveSlot->getSurface()->setVisible(false);
-		_appearSlot->getSurface()->setVisible(false);
-		_activeSlot->getSurface()->setVisible(false);
-		_soundResource.load(0x46210074);
+		_inactiveSlot->setVisible(false);
+		_appearSlot->setVisible(false);
+		_activeSlot->setVisible(false);
+		loadSound(0, 0x46210074);
 		// TODO sound panning stuff
 	} else if (elementIndex != 20) {
 		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100));
@@ -281,20 +279,16 @@ DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerS
 void DiskplayerSlot::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		if (_flag) {
-			if (_inactiveSlot) {
+			if (_inactiveSlot)
 				_inactiveSlot->getSurface()->setVisible(true);
-			}
-			if (_activeSlot) {
+			if (_activeSlot)
 				_activeSlot->getSurface()->setVisible(false);
-			}
 			_countdown = _initialCountdown / 2;
 		} else {
-			if (_inactiveSlot) {
+			if (_inactiveSlot)
 				_inactiveSlot->getSurface()->setVisible(false);
-			}
-			if (_activeSlot) {
+			if (_activeSlot)
 				_activeSlot->getSurface()->setVisible(true);
-			}
 			_countdown = _initialCountdown;
 		}
 		_flag = !_flag;
@@ -302,44 +296,36 @@ void DiskplayerSlot::update() {
 }
 
 void DiskplayerSlot::appear() {
-	if (_inactiveSlot) {
+	if (_inactiveSlot)
 		_inactiveSlot->getSurface()->setVisible(true);
-	}
-	if (_appearSlot) {
+	if (_appearSlot)
 		_appearSlot->getSurface()->setVisible(true);
-	}
-	if (_inactiveSlot) {
-		_soundResource.play();
-	}
+	if (_inactiveSlot)
+		playSound(0);
 }
 
 void DiskplayerSlot::play() {
 	if (!_flag2) {
-		if (_inactiveSlot) {
+		if (_inactiveSlot)
 			_inactiveSlot->getSurface()->setVisible(false);
-		}
-		if (_activeSlot) {
+		if (_activeSlot)
 			_activeSlot->getSurface()->setVisible(true);
-		}
 		_flag = true;
 		_countdown = 0;
 	}
 }
 
 void DiskplayerSlot::activate() {
-	if (!_flag2) {
+	if (!_flag2)
 		_countdown = _initialCountdown;
-	}
 }
 
 void DiskplayerSlot::stop() {
 	if (!_flag2) {
-		if (_inactiveSlot) {
+		if (_inactiveSlot)
 			_inactiveSlot->getSurface()->setVisible(true);
-		}
-		if (_activeSlot) {
+		if (_activeSlot)
 			_activeSlot->getSurface()->setVisible(false);
-		}
 		_flag = false;
 		_countdown = 0;
 	}
diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h
index 7969a7a..d005f79 100644
--- a/engines/neverhood/diskplayerscene.h
+++ b/engines/neverhood/diskplayerscene.h
@@ -48,8 +48,6 @@ public:
 	void release();
 protected:
 	DiskplayerScene *_diskplayerScene;	
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
 	bool _isPlaying;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -64,7 +62,6 @@ public:
 	void setFlag2(bool value) { _flag2 = value; }
 protected:
 	DiskplayerScene *_diskplayerScene;
-	SoundResource _soundResource;
 	Sprite *_inactiveSlot;
 	Sprite *_appearSlot;
 	Sprite *_activeSlot;


Commit: e97bd306824dfbe47f08060b383fd79c163ab7fd
    https://github.com/scummvm/scummvm/commit/e97bd306824dfbe47f08060b383fd79c163ab7fd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: Change sound stuff in Klayman

- Also merge some more code into the Klayman class
- Rename hmInsertDiskSide to hmInsertKey (also related code)

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index da3004d..06e6a43 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -56,11 +56,10 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
 // Klayman
 
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
-	: AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
-	_idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0),
-	_tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false),
-	_status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false),
-	_isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) {
+	: AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
+	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
+	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
+	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
@@ -139,7 +138,7 @@ uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x04DBC02C) {
-			_soundResource1.play(0x44528AA1);
+			playSound(0, 0x44528AA1);
 		}
 		break;
 	}
@@ -147,7 +146,7 @@ uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam &param, Entity
 }
 
 void Klayman::evIdlePickEarDone() {
-	_soundResource1.stop();
+	stopSound(0);
 }
 
 void Klayman::stDoIdleSpinHead() {
@@ -169,7 +168,7 @@ uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x808A0008) {
-			_soundResource1.play(0xD948A340);
+			playSound(0, 0xD948A340);
 		}
 		break;
 	}
@@ -192,7 +191,7 @@ void Klayman::stIdleArms() {
 }
 
 void Klayman::evIdleArmsDone() {
-	_soundResource1.stop();
+	stopSound(0);
 }
 
 uint32 Klayman::hmIdleArms(int messageNum, const MessageParam &param, Entity *sender) {
@@ -200,11 +199,11 @@ uint32 Klayman::hmIdleArms(int messageNum, const MessageParam &param, Entity *se
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x5A0F0104) {
-			_soundResource1.play(0x7970A100);
+			playSound(0, 0x7970A100);
 		} else if (param.asInteger() == 0x9A9A0109) {
-			_soundResource1.play(0xD170CF04);
+			playSound(0, 0xD170CF04);
 		} else if (param.asInteger() == 0x989A2169) {
-			_soundResource1.play(0xD073CF14);
+			playSound(0, 0xD073CF14);
 		}
 		break;
 	}
@@ -230,7 +229,7 @@ uint32 Klayman::hmIdleChest(int messageNum, const MessageParam &param, Entity *s
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x0D2A0288) {
-			_soundResource1.play(0xD192A368);
+			playSound(0, 0xD192A368);
 		}
 		break;
 	}
@@ -256,13 +255,13 @@ uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xC006000C) {
-			_soundResource1.play(0x9D406340);
+			playSound(0, 0x9D406340);
 		} else if (param.asInteger() == 0x2E4A2940) {
-			_soundResource1.play(0x53A4A1D4);
+			playSound(0, 0x53A4A1D4);
 		} else if (param.asInteger() == 0xAA0A0860) {
-			_soundResource1.play(0x5BE0A3C6);
+			playSound(0, 0x5BE0A3C6);
 		} else if (param.asInteger() == 0xC0180260) {
-			_soundResource1.play(0x5D418366);
+			playSound(0, 0x5D418366);
 		}
 		break;
 	}
@@ -355,16 +354,16 @@ uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam &param, E
 		if (param.asInteger() == 0xC1380080) {
 			if (_attachedSprite) {
 				sendMessage(_attachedSprite, 0x4806, 0);
-				_soundResource1.play(0xC8004340);
+				playSound(0, 0xC8004340);
 			}
 		} else if (param.asInteger() == 0x02B20220) {
-			_soundResource1.play(0xC5408620);
+			playSound(0, 0xC5408620);
 		} else if (param.asInteger() == 0x03020231) {
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		} else if (param.asInteger() == 0x67221A03) {
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		} else if (param.asInteger() == 0x925A0C1E) {
-			_soundResource1.play(0x40E5884D);
+			playSound(0, 0x40E5884D);
 		}
 		break;
 	}
@@ -416,7 +415,7 @@ uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam &param, Ent
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x001A2832) {
-			_soundResource1.play(0xC0E4884C);
+			playSound(0, 0xC0E4884C);
 		}
 		break;
 	}
@@ -600,9 +599,9 @@ uint32 Klayman::hmStartAction(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x271AA210) {
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x2B22AA81) {
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		}
 		break;
 	}
@@ -663,7 +662,7 @@ uint32 Klayman::hmSleeping(int messageNum, const MessageParam &param, Entity *se
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x03060012) {
-			_soundResource1.play(0xC0238244);
+			playSound(0, 0xC0238244);
 		}
 		break;
 	}
@@ -785,13 +784,13 @@ uint32 Klayman::hmSneaking(int messageNum, const MessageParam &param, Entity *se
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		} else if (param.asInteger() == 0x32188010) {
-			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x02A2909C) {
-			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	case 0x3002:
@@ -826,9 +825,9 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	}
@@ -857,9 +856,9 @@ uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sen
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	}
@@ -977,17 +976,17 @@ uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam &param, Entit
 			if (_attachedSprite) {
 				sendMessage(_attachedSprite, 0x4806, 0);
 			}
-			_soundResource1.play(0x40208200);
+			playSound(0, 0x40208200);
 		} else if (param.asInteger() == 0x02B20220) {
-			_soundResource1.play(0xC5408620);
+			playSound(0, 0xC5408620);
 		} else if (param.asInteger() == 0x03020231) {
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		} else if (param.asInteger() == 0x67221A03) {
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		} else if (param.asInteger() == 0x2EAE0303) {
-			_soundResource1.play(0x03630300);
+			playSound(0, 0x03630300);
 		} else if (param.asInteger() == 0x61CE4467) {
-			_soundResource1.play(0x03630300);
+			playSound(0, 0x03630300);
 		}
 		break;
 	}
@@ -1015,9 +1014,9 @@ uint32 Klayman::hmPressButton(int messageNum, const MessageParam &param, Entity
 				sendMessage(_attachedSprite, 0x480B, 0);
 			}
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		}
 		break;
 	}
@@ -1107,9 +1106,9 @@ uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam &param, Entity
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101)
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		else if (param.asInteger() == 0x0A2A9098)
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 	}
 	return messageResult;
 }
@@ -1168,9 +1167,9 @@ uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam &param,
 		else if (param.asInteger() == 0x110010D1)
 			sendMessage(_parentScene, 0x482B, 0);
 		else if (param.asInteger() == 0x32180101)
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		else if (param.asInteger() == 0x0A2A9098)
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		break;
 	}
 	return messageResult;
@@ -1272,21 +1271,21 @@ uint32 Klayman::hmUseTube(int messageNum, const MessageParam &param, Entity *sen
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02B20220)
-			_soundResource1.play(0xC5408620);
+			playSound(0, 0xC5408620);
 		else if (param.asInteger() == 0x0A720138)
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		else if (param.asInteger() == 0x03020231)
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		else if (param.asInteger() == 0xB613A180)
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		else if (param.asInteger() == 0x67221A03)
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		else if (param.asInteger() == 0x038A010B)
-			_soundResource1.play(0x00018040);
+			playSound(0, 0x00018040);
 		else if (param.asInteger() == 0x422B0280)
-			_soundResource1.play(0x166FC6E0);
+			playSound(0, 0x166FC6E0);
 		else if (param.asInteger() == 0x925A0C1E)
-			_soundResource1.play(0x40E5884D);
+			playSound(0, 0x40E5884D);
 		break;
 	}
 	return messageResult;
@@ -1428,9 +1427,9 @@ uint32 Klayman::hmLargeStep(int messageNum, const MessageParam &param, Entity *s
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		}
 		break;
 	case 0x3002:
@@ -1473,9 +1472,9 @@ uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam &param, Entity *s
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		}
 		break;
 	}
@@ -1519,9 +1518,9 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *se
 		return 0;
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x405002D8);
+			playSound(0, 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0460E2FA);
+			playSound(0, 0x0460E2FA);
 		}
 		break;
 	}
@@ -1555,7 +1554,7 @@ uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam &param, Entity *
 			}
 			_acceptInput = true;
 		} else if (param.asInteger() == 0x320AC306) {
-			_soundResource1.play(0x5860C640);
+			playSound(0, 0x5860C640);
 		} else if (param.asInteger() == 0x4AB28209) {
 			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
@@ -1610,7 +1609,7 @@ uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam &param, Entity
 				sendMessage(_attachedSprite, 0x4806, 0);
 			}
 		} else if (param.asInteger() == 0x320AC306) {
-			_soundResource1.play(0x5860C640);
+			playSound(0, 0x5860C640);
 		} else if (param.asInteger() == 0x4AB28209) {
 			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
@@ -1733,13 +1732,13 @@ uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x489B025C) {
-			_soundResource1.play(0x52C4C2D7);
+			playSound(0, 0x52C4C2D7);
 		} else if (param.asInteger() == 0x400A0E64) {
-			_soundResource1.play(0x50E081D9);
+			playSound(0, 0x50E081D9);
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x405002D8);
+			playSound(0, 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0460E2FA);
+			playSound(0, 0x0460E2FA);
 		}
 		break;
 	}
@@ -1753,9 +1752,9 @@ uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam &param, E
 		if (param.asInteger() == 0x01084280) {
 			_acceptInput = true;
 		} else if (param.asInteger() == 0x489B025C) {
-			_soundResource1.play(0x52C4C2D7);
+			playSound(0, 0x52C4C2D7);
 		} else if (param.asInteger() == 0x400A0E64) {
-			_soundResource1.play(0x50E081D9);
+			playSound(0, 0x50E081D9);
 		} else if (param.asInteger() == 0x02421405) {
 			if (_ladderStatus == 1) {
 				startAnimationByHash(0x3A292504, 0x01084280, 0);
@@ -1817,9 +1816,9 @@ uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity
 		} else if (param.asInteger() == 0x110010D1) {
 			sendMessage(_parentScene, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8);
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA);
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
 		}
 		break;
 	}
@@ -1873,7 +1872,7 @@ uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x320AC306) {
-			_soundResource1.play(0x5860C640);
+			playSound(0, 0x5860C640);
 		}
 		break;
 	}
@@ -1896,11 +1895,11 @@ uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam &param, Ent
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xC61A0119) {
-			_soundResource1.play(0x402338C2);
+			playSound(0, 0x402338C2);
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x4924AAC4);
+			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0A2AA8E0);
+			playSound(0, 0x0A2AA8E0);
 		}
 		break;
 	}
@@ -1997,9 +1996,9 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
 				SetMessageHandler(&Klayman::handleMessage41D480);
 			}
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x405002D8);
+			playSound(0, 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0460E2FA);
+			playSound(0, 0x0460E2FA);
 		}
 		break;
 	case 0x480A:
@@ -2125,29 +2124,27 @@ void Klayman::stInsertDisk() {
 }
 
 uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x06040580) {
-			if (_tapesToInsert == 0) {
-				// TODO: Calc calcHash value somewhere else
-				nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
-			}
+		if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) {
+			nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
 		} else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
 			_tapesToInsert--;
 			startAnimationByHash(0xD8C8D100, 0x01084280, 0);
 		} else if (param.asInteger() == 0x062A1510) {
-			_soundResource1.play(0x41688704);
+			playSound(0, 0x41688704);
 		} else if (param.asInteger() == 0x02B20220) {
-			_soundResource1.play(0xC5408620);
+			playSound(0, 0xC5408620);
 		} else if (param.asInteger() == 0x0A720138) {
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		} else if (param.asInteger() == 0xB613A180) {
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		} else if (param.asInteger() == 0x0E040501) {
-			_soundResource1.play(0xC6A129C1);
+			playSound(1, 0xC6A129C1);
 		}
 	}
-	return handleMessage41D480(messageNum, param, sender);
+	return messageResult;
 }
 
 void Klayman::walkAlongPathPoints() {
@@ -2232,7 +2229,7 @@ uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x040C4C01)
-			_soundResource1.play(0x01E11140);
+			playSound(0, 0x01E11140);
 		break;
 	}
 	return messageResult;
@@ -2276,7 +2273,7 @@ uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam &param, E
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x320AC306)
-			_soundResource1.play(0x5860C640);
+			playSound(0, 0x5860C640);
 		break;
 	}
 	return messageResult;
@@ -2333,9 +2330,9 @@ uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam &
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4E0A2C24) {
-			_soundResource1.play(0x85B10BB8);
+			playSound(0, 0x85B10BB8);
 		} else if (param.asInteger() == 0x4E6A0CA0) {
-			_soundResource1.play(0xC5B709B0);
+			playSound(0, 0xC5B709B0);
 		}
 		break;
 	}
@@ -2349,7 +2346,7 @@ uint32 Klayman::hmShrink(int messageNum, const MessageParam &param, Entity *send
 		if (param.asInteger() == 0x80C110B5)
 			sendMessage(_parentScene, 0x482A, 0);
 		else if (param.asInteger() == 0x33288344)
-			_soundResource3.play(0x10688664);
+			playSound(2, 0x10688664);
 		break;
 	}
 	return messageResult;
@@ -2359,7 +2356,7 @@ void Klayman::stShrink() {
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x1AE88904, 0, -1);
-	_soundResource1.play(0x4C69EA53);
+	playSound(0, 0x4C69EA53);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&Klayman::hmShrink);
@@ -2377,6 +2374,172 @@ void Klayman::stStandWonderAbout() {
 	SetSpriteUpdate(NULL);
 }
 
+uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1008:
+		if (_potionFlag1) {
+			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+			messageResult = 0;
+		} else
+			_potionFlag2 = true;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x0002418E)
+			sendMessage(_parentScene, 0x2000, 0);
+		else if (param.asInteger() == 0x924090C2) {
+			_potionFlag1 = true;
+			if (_potionFlag2) {
+				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+				messageResult = 0;
+			}
+		} else if (param.asInteger() == 0x004A2148)
+			_potionFlag1 = false;
+		else if (param.asInteger() == 0x02B20220)
+			playSound(0, 0xC5408620);
+		else if (param.asInteger() == 0x0A720138)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0x03020231)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0xB613A180)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x67221A03)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x038A010B)
+			playSound(0, 0x00018040);
+		else if (param.asInteger() == 0x422B0280)
+			playSound(0, 0x166FC6E0);
+		else if (param.asInteger() == 0x925A0C1E)
+			playSound(0, 0x40E5884D);
+		else if (param.asInteger() == 0x000F0082)
+			playSound(0, 0x546CDCC1);
+		else if (param.asInteger() == 0x00020814)
+			playSound(0, 0x786CC6D0);
+		else if (param.asInteger() == 0x06020500)
+			playSound(0, 0x1069C0E1);
+		else if (param.asInteger() == 0x02128C00)
+			playSound(0, 0x5068C4C3);
+		else if (param.asInteger() == 0x82022030)
+			playSound(0, 0x5C48C0E8);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klayman::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101)
+			playSound(0, 0x405002D8);
+		else if (param.asInteger() == 0x0A2A9098)
+			playSound(0, 0x0460E2FA);
+		else if (param.asInteger() == 0xD00A0C0C)
+			playSound(3);
+		else if (param.asInteger() == 0x04121920)
+			playSound(4);
+		else if (param.asInteger() == 0x030B4480)
+			playSound(5);
+		else if (param.asInteger() == 0x422B0280)
+			playSound(6);
+		else if (param.asInteger() == 0x038A010B)
+			playSound(7);
+		else if (param.asInteger() == 0x67221A03)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x02B20220)
+			playSound(0, 0xC5408620);
+		else if (param.asInteger() == 0x925A0C1E)
+			playSound(0, 0x40E5884D);
+		else if (param.asInteger() == 0x03020231)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0x08040840)
+			setDoDeltaX(2);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stGrow() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2838C010, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmGrow);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+void Klayman::stDrinkPotion() {
+	_status2 = 1;
+	_acceptInput = false;
+	_potionFlag1 = false;
+	_potionFlag2 = false;
+	startAnimation(0x1C388C04, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmDrinkPotion);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+uint32 Klayman::hmInsertKey(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_keysToInsert == 0 && param.asInteger() == 0x06040580) {
+			nextAnimationByHash(0xDC409440, 0x46431401, 0);
+		} else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) {
+			_keysToInsert--;
+			startAnimationByHash(0xDC409440, 0x01084280, 0);
+		} else if (param.asInteger() == 0x062A1510) {
+			playSound(0, 0x41688704);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			playSound(0, 0x44051000);
+		} else if (param.asInteger() == 0x0E4C8141) {
+			playSound(0, 0xDC4A1280);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stInsertKey() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertKey))) {
+		_status2 = 2;
+		_keysToInsert = 0;
+		for (uint32 i = 0; i < 3; i++) {
+			if (getSubVar(0x0090EA95, i)) {
+				bool more;
+				setSubVar(0x08D0AB11, i, 1);
+				setSubVar(0x0090EA95, i, 0);
+				do {
+					more = false;
+					setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1));
+					for (uint j = 0; j < i && !more; j++) {
+						if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i))
+							more = true;
+					}
+					if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i))
+						more = true;
+				} while (more);
+				_keysToInsert++;
+			} 
+		}
+		if (_keysToInsert == 0) {
+			GotoState(NULL);
+			gotoNextStateExt();
+		} else {
+			_acceptInput = false;
+			startAnimation(0xDC409440, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
+			SetMessageHandler(&Klayman::hmInsertKey);
+			_keysToInsert--;
+		}
+	}
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -2641,7 +2804,7 @@ uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam
 uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x4811:
-		_soundResource1.play(0x5252A0E4);
+		playSound(0, 0x5252A0E4);
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
 		if (_doDeltaX) {
 			_x = ((Sprite*)sender)->getX() - 75;
@@ -2697,9 +2860,9 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
 		} else if (param.asInteger() == 0x88001184) {
 			sendMessage(_attachedSprite, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x405002D8);
+			playSound(0, 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0460E2FA);
+			playSound(0, 0x0460E2FA);
 		}
 		break;
 	case 0x480A:
@@ -2718,9 +2881,9 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &
 		} else if (param.asInteger() == 0x88001184) {
 			sendMessage(_attachedSprite, 0x482B, 0);
 		} else if (param.asInteger() == 0x32180101) {
-			_soundResource1.play(0x405002D8);
+			playSound(0, 0x405002D8);
 		} else if (param.asInteger() == 0x0A2A9098) {
-			_soundResource1.play(0x0460E2FA);
+			playSound(0, 0x0460E2FA);
 		}
 		break;
 	}
@@ -2741,9 +2904,9 @@ uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam &param
 		break;
 	case 0x100D:
 		if (param.asInteger() == 0x1A1A0785) {
-			_soundResource1.play(0x40F0A342);
+			playSound(0, 0x40F0A342);
 		} else if (param.asInteger() == 0x60428026) {
-			_soundResource1.play(0x40608A59);
+			playSound(0, 0x40608A59);
 		}
 		break;
 	}
@@ -2755,7 +2918,7 @@ uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam &param, Ent
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x1307050A) {
-			_soundResource1.play(0x40428A09);
+			playSound(0, 0x40428A09);
 		}
 		break;
 	}
@@ -2787,7 +2950,7 @@ void KmScene1002::stJumpToRingVenusFlyTrap() {
 }
 
 void KmScene1002::stStandIdleSpecial() {
-	_soundResource1.play(0x56548280);
+	playSound(0, 0x56548280);
 	_status2 = 0;
 	_acceptInput = false;
 	_surface->setVisible(false);
@@ -2812,7 +2975,7 @@ void KmScene1002::stSpitOutFall0() {
 
 void KmScene1002::stFalling() {
 	sendMessage(_parentScene, 0x1024, 1);
-	_soundResource1.play(0x41648271);
+	playSound(0, 0x41648271);
 	_status2 = 1;
 	_acceptInput = false;
 	_isWalking = false;
@@ -3166,13 +3329,13 @@ uint32 KmScene1201::hmMatch(int messageNum, const MessageParam &param, Entity *s
 		if (param.asInteger() == 0x51281850) {
 			setGlobalVar(0x20A0C516, 1);
 		} else if (param.asInteger() == 0x43000538) {
-			_soundResource1.play(0x21043059);
+			playSound(0, 0x21043059);
 		} else if (param.asInteger() == 0x02B20220) {
-			_soundResource1.play(0xC5408620);
+			playSound(0, 0xC5408620);
 		} else if (param.asInteger() == 0x0A720138) {
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		} else if (param.asInteger() == 0xB613A180) {
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		}
 		break;
 	}
@@ -3206,7 +3369,7 @@ uint32 KmScene1201::hmMoveObject(int messageNum, const MessageParam &param, Enti
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
-			_soundResource1.play(0x405002D8);
+			playSound(0, 0x405002D8);
 			if (_attachedSprite) {
 				sendMessage(_attachedSprite, 0x480B, 0);
 			}
@@ -3228,7 +3391,7 @@ uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x000F0082) {
-			_soundResource1.play(0x74E2810F);
+			playSound(0, 0x74E2810F);
 		}
 		break;
 	}
@@ -3267,7 +3430,7 @@ void KmScene1201::stTumbleHeadless() {
 		SetMessageHandler(&KmScene1201::hmTumbleHeadless);
 		NextState(&Klayman::stTryStandIdle);
 		sendMessage(_class464, 0x2006, 0);
-		_soundResource1.play(0x62E0A356);
+		playSound(0, 0x62E0A356);
 	}
 }
 
@@ -3310,11 +3473,11 @@ uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam &param,
 		if (param.asInteger() == calcHash("PopBalloon")) {
 			sendMessage(_parentScene, 0x2000, 0);
 		} else if (param.asInteger() == 0x02B20220) {
-			_soundResource1.play(0xC5408620);
+			playSound(0, 0xC5408620);
 		} else if (param.asInteger() == 0x0A720138) {
-			_soundResource1.play(0xD4C08010);
+			playSound(0, 0xD4C08010);
 		} else if (param.asInteger() == 0xB613A180) {
-			_soundResource1.play(0x44051000);
+			playSound(0, 0x44051000);
 		}
 		break;
 	}
@@ -3449,17 +3612,17 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene1305::stCrashDown() {
-	_soundResource1.play(0x41648271);
+	playSound(0, 0x41648271);
 	_status2 = 1;
 	_acceptInput = false;
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::handleMessage41D480);
-	NextState(&KmScene1305::cbCrashDownEvent);
+	NextState(&KmScene1305::stCrashDownFinished);
 }
 
-void KmScene1305::cbCrashDownEvent() {
+void KmScene1305::stCrashDownFinished() {
 	setDoDeltaX(2);
 	stTryStandIdle();
 }
@@ -3590,7 +3753,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
 }
@@ -3629,7 +3792,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case NM_KLAYMAN_INSERT_DISK:
 		if (param.asInteger() == 1) {
-			GotoState(&KmScene1308::stInsertDiskSide);		
+			GotoState(&Klayman::stInsertKey);		
 		} else {
 			GotoState(&Klayman::stInsertDisk);		
 		}
@@ -3663,67 +3826,6 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene1308::hmInsertDiskSide(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (!_flag1 && param.asInteger() == 0x06040580) {
-			nextAnimationByHash(0xDC409440, 0x46431401, 0);
-		} else if (_flag1 && param.asInteger() == 0x46431401) {
-			_flag1 = false;
-			startAnimationByHash(0xDC409440, 0x01084280, 0);
-		} else if (param.asInteger() == 0x062A1510) {
-			_soundResource1.play(0x41688704);
-		} else if (param.asInteger() == 0x02B20220) {
-			_soundResource1.play(0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			_soundResource1.play(0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			_soundResource1.play(0x44051000);
-		} else if (param.asInteger() == 0x0E4C8141) {
-			_soundResource1.play(0xDC4A1280);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene1308::stInsertDiskSide() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::stInsertDiskSide))) {
-		_status2 = 2;
-		_flag1 = false;
-		for (uint i = 0; i < 3; i++) {
-			if (getSubVar(0x0090EA95, i)) {
-				bool more;
-				setSubVar(0x08D0AB11, i, 1);
-				setSubVar(0x0090EA95, i, 0);
-				do {
-					more = false;
-					setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1));
-					for (uint j = 0; j < i && !more; j++) {
-						if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i))
-							more = true;
-					}
-					if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i))
-						more = true;
-				} while (more);
-				_flag1 = true;
-			} 
-		}
-		if (!_flag1) {
-			gotoState(NULL);
-			gotoNextStateExt();
-		} else {
-			_acceptInput = false;
-			startAnimation(0xDC409440, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
-			SetMessageHandler(&KmScene1308::hmInsertDiskSide);
-			_flag1 = false;
-		}
-	}
-}
-
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4389,9 +4491,9 @@ uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x100D:
 		if (param.asInteger() == 0x1A1A0785) {
-			_soundResource1.play(0x40F0A342);
+			playSound(0, 0x40F0A342);
 		} else if (param.asInteger() == 0x60428026) {
-			_soundResource1.play(0x40608A59);
+			playSound(0, 0x40608A59);
 		}
 		break;
 	}
@@ -4405,7 +4507,7 @@ void KmScene2101::stHitByDoor() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&KmScene2101::hmHitByDoor);
-	_soundResource1.play(0x402E82D4);
+	playSound(0, 0x402E82D4);
 }
 
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
@@ -5790,17 +5892,16 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000),
-	_soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 
 	if (flag) {
 		// TODO Maybe? Don't know. Set Klayman clip rects
-		_soundRes1.load(0x58E0C341);
-		_soundRes2.load(0x40A00342);
-		_soundRes3.load(0xD0A1C348);
-		_soundRes4.load(0x166FC6E0);
-		_soundRes5.load(0x00018040);
+		loadSound(3, 0x58E0C341);
+		loadSound(4, 0x40A00342);
+		loadSound(5, 0xD0A1C348);
+		loadSound(6, 0x166FC6E0);
+		loadSound(7, 0x00018040);
 	}
 	
 	_dataResource.load(0x98182003);
@@ -5839,7 +5940,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4832:
 		if (param.asInteger() == 1) {
-			GotoState(&KmScene2806::stDrinkPotion);
+			GotoState(&Klayman::stDrinkPotion);
 		} else {
 			GotoState(&Klayman::stUseTube);
 		}
@@ -5848,121 +5949,17 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene2806::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1008:
-		if (_potionFlag1) {
-			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
-			messageResult = 0;
-		} else
-			_potionFlag2 = true;
-		break;
-	case 0x100D:
-		if (param.asInteger() == 0x0002418E)
-			sendMessage(_parentScene, 0x2000, 0);
-		else if (param.asInteger() == 0x924090C2) {
-			_potionFlag1 = true;
-			if (_potionFlag2) {
-				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
-				messageResult = 0;
-			}
-		} else if (param.asInteger() == 0x004A2148)
-			_potionFlag1 = false;
-		else if (param.asInteger() == 0x02B20220)
-			_soundResource1.play(0xC5408620);
-		else if (param.asInteger() == 0x0A720138)
-			_soundResource1.play(0xD4C08010);
-		else if (param.asInteger() == 0x03020231)
-			_soundResource1.play(0xD4C08010);
-		else if (param.asInteger() == 0xB613A180)
-			_soundResource1.play(0x44051000);
-		else if (param.asInteger() == 0x67221A03)
-			_soundResource1.play(0x44051000);
-		else if (param.asInteger() == 0x038A010B)
-			_soundResource1.play(0x00018040);
-		else if (param.asInteger() == 0x422B0280)
-			_soundResource1.play(0x166FC6E0);
-		else if (param.asInteger() == 0x925A0C1E)
-			_soundResource1.play(0x40E5884D);
-		else if (param.asInteger() == 0x00020814)
-			_soundResource1.play(0x786CC6D0);
-		else if (param.asInteger() == 0x06020500)
-			_soundResource1.play(0x1069C0E1);
-		else if (param.asInteger() == 0x02128C00)
-			_soundResource1.play(0x5068C4C3);
-		else if (param.asInteger() == 0x82022030)
-			_soundResource1.play(0x5C48C0E8);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 KmScene2806::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101)
-			_soundResource1.play(0x405002D8);
-		else if (param.asInteger() == 0x0A2A9098)
-			_soundResource1.play(0x0460E2FA);
-		else if (param.asInteger() == 0xD00A0C0C)
-			_soundRes1.play();
-		else if (param.asInteger() == 0x04121920)
-			_soundRes2.play();
-		else if (param.asInteger() == 0x030B4480)
-			_soundRes3.play();
-		else if (param.asInteger() == 0x422B0280)
-			_soundRes4.play();
-		else if (param.asInteger() == 0x038A010B)
-			_soundRes5.play();
-		else if (param.asInteger() == 0x67221A03)
-			_soundResource1.play(0x44051000);
-		else if (param.asInteger() == 0x02B20220)
-			_soundResource1.play(0xC5408620);
-		else if (param.asInteger() == 0x925A0C1E)
-			_soundResource1.play(0x40E5884D);
-		else if (param.asInteger() == 0x03020231)
-			_soundResource1.play(0xD4C08010);
-		else if (param.asInteger() == 0x08040840)
-			setDoDeltaX(2);
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2806::stGrow() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2838C010, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2806::hmGrow);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-void KmScene2806::stDrinkPotion() {
-	_status2 = 1;
-	_acceptInput = false;
-	_potionFlag1 = false;
-	_potionFlag2 = false;
-	startAnimation(0x1C388C04, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2806::hmDrinkPotion);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
 KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000),
-	_soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	if (flag) {
-    	// TODO Maybe? Don't know. Set Klayman clip rects
-		_soundRes1.load(0x58E0C341);
-		_soundRes2.load(0x40A00342);
-		_soundRes3.load(0xD0A1C348);
-		_soundRes4.load(0x166FC6E0);
-		_soundRes5.load(0x00018040);
+		// TODO Maybe? Don't know. Set Klayman clip rects
+		loadSound(3, 0x58E0C341);
+		loadSound(4, 0x40A00342);
+		loadSound(5, 0xD0A1C348);
+		loadSound(6, 0x166FC6E0);
+		loadSound(7, 0x00018040);
 	}
 
 	_dataResource.load(0x1830009A);
@@ -6001,7 +5998,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4832:
 		if (param.asInteger() == 1) {
-			GotoState(&KmScene2809::stDrinkPotion);
+			GotoState(&Klayman::stDrinkPotion);
 		} else {
 			GotoState(&Klayman::stUseTube);
 		}
@@ -6010,111 +6007,6 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene2809::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1008:
-		if (_potionFlag1) {
-			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
-			messageResult = 0;
-		} else
-			_potionFlag2 = true;
-		break;
-	case 0x100D:
-		if (param.asInteger() == 0x0002418E)
-			sendMessage(_parentScene, 0x2000, 0);
-		else if (param.asInteger() == 0x924090C2) {
-			_potionFlag1 = true;
-			if (_potionFlag2) {
-				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
-				messageResult = 0;
-			}
-		} else if (param.asInteger() == 0x004A2148)
-			_potionFlag1 = false;
-		else if (param.asInteger() == 0x02B20220)
-			_soundResource1.play(0xC5408620);
-		else if (param.asInteger() == 0x0A720138)
-			_soundResource1.play(0xD4C08010);
-		else if (param.asInteger() == 0x03020231)
-			_soundResource1.play(0xD4C08010);
-		else if (param.asInteger() == 0xB613A180)
-			_soundResource1.play(0x44051000);
-		else if (param.asInteger() == 0x67221A03)
-			_soundResource1.play(0x44051000);
-		else if (param.asInteger() == 0x038A010B)
-			_soundResource1.play(0x00018040);
-		else if (param.asInteger() == 0x422B0280)
-			_soundResource1.play(0x166FC6E0);
-		else if (param.asInteger() == 0x925A0C1E)
-			_soundResource1.play(0x40E5884D);
-		else if (param.asInteger() == 0x000F0082)
-			_soundResource1.play(0x546CDCC1);
-		else if (param.asInteger() == 0x00020814)
-			_soundResource1.play(0x786CC6D0);
-		else if (param.asInteger() == 0x06020500)
-			_soundResource1.play(0x1069C0E1);
-		else if (param.asInteger() == 0x02128C00)
-			_soundResource1.play(0x5068C4C3);
-		else if (param.asInteger() == 0x82022030)
-			_soundResource1.play(0x5C48C0E8);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 KmScene2809::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101)
-			_soundResource1.play(0x405002D8);
-		else if (param.asInteger() == 0x0A2A9098)
-			_soundResource1.play(0x0460E2FA);
-		else if (param.asInteger() == 0xD00A0C0C)
-			_soundRes1.play();
-		else if (param.asInteger() == 0x04121920)
-			_soundRes2.play();
-		else if (param.asInteger() == 0x030B4480)
-			_soundRes3.play();
-		else if (param.asInteger() == 0x422B0280)
-			_soundRes4.play();
-		else if (param.asInteger() == 0x038A010B)
-			_soundRes5.play();
-		else if (param.asInteger() == 0x67221A03)
-			_soundResource1.play(0x44051000);
-		else if (param.asInteger() == 0x02B20220)
-			_soundResource1.play(0xC5408620);
-		else if (param.asInteger() == 0x925A0C1E)
-			_soundResource1.play(0x40E5884D);
-		else if (param.asInteger() == 0x03020231)
-			_soundResource1.play(0xD4C08010);
-		else if (param.asInteger() == 0x08040840)
-			setDoDeltaX(2);
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2809::stGrow() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2838C010, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2809::hmGrow);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-void KmScene2809::stDrinkPotion() {
-	_status2 = 1;
-	_acceptInput = false;
-	_potionFlag1 = false;
-	_potionFlag2 = false;
-	startAnimation(0x1C388C04, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2809::hmDrinkPotion);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
 KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) 
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index b32143d..a52e7f6 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -187,6 +187,14 @@ public:
 
 	void stStandWonderAbout();
 
+	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
+	void stGrow();
+	void stDrinkPotion();
+
+	uint32 hmInsertKey(int messageNum, const MessageParam &param, Entity *sender);
+	void stInsertKey();
+
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
@@ -200,15 +208,12 @@ protected:
 	int16 _idleCounter, _idleCounterMax;
 	int16 _blinkCounter, _blinkCounterMax;
 	int16 _countdown1;
-	int16 _tapesToInsert;
+	int16 _tapesToInsert, _keysToInsert;
 	bool _flagF6;
 	bool _isLeverDown;
 	bool _isWalkingOpenDoorNotified;
 	int _status2;
 	bool _flagFA;
-	SoundResource _soundResource1;
-	SoundResource _soundResource2;
-	SoundResource _soundResource3;
 	int _status3;
 	const KlaymanIdleTableItem *_idleTable;
 	int _idleTableCount;
@@ -218,6 +223,9 @@ protected:
 	
 	bool _isSittingInTeleporter;
 
+	bool _potionFlag1;
+	bool _potionFlag2;
+
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
@@ -410,7 +418,7 @@ public:
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	void stCrashDown();
-	void cbCrashDownEvent();
+	void stCrashDownFinished();
 };
 
 class KmScene1306 : public Klayman {
@@ -424,10 +432,7 @@ class KmScene1308 : public Klayman {
 public:
 	KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _flag1;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmInsertDiskSide(int messageNum, const MessageParam &param, Entity *sender);
-	void stInsertDiskSide();
 };
 
 class KmScene1401 : public Klayman {
@@ -651,18 +656,7 @@ public:
 	KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
 		bool flag, NRect *clipRects, uint clipRectsCount);
 protected:
-	SoundResource _soundRes1;
-	SoundResource _soundRes2;
-	SoundResource _soundRes3;
-	SoundResource _soundRes4;
-	SoundResource _soundRes5;
-	bool _potionFlag1;
-	bool _potionFlag2;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
-	void stGrow();
-	void stDrinkPotion();
 };
 
 class KmScene2809 : public Klayman {
@@ -670,18 +664,7 @@ public:
 	KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
 		bool flag, NRect *clipRects, uint clipRectsCount);
 protected:
-	SoundResource _soundRes1;
-	SoundResource _soundRes2;
-	SoundResource _soundRes3;
-	SoundResource _soundRes4;
-	SoundResource _soundRes5;
-	bool _potionFlag1;
-	bool _potionFlag2;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
-	void stGrow();
-	void stDrinkPotion();
 };
 
 class KmScene2810Small : public Klayman {


Commit: 7e4faf3505c8124838f7e89b873aa6e5844b3e43
    https://github.com/scummvm/scummvm/commit/7e4faf3505c8124838f7e89b873aa6e5844b3e43
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: More Klayman merging

- Also clean up parameter list of two Klayman subclass constructors and send a message to the parent class instead of operating on the entities inside the Klayman class

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/module1300.cpp



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 06e6a43..1155c57 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2540,6 +2540,185 @@ void Klayman::stInsertKey() {
 	}
 }
 
+uint32 Klayman::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x04684052) {
+			_acceptInput = true;
+			sendMessage(_parentScene, 0x2002, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stReadNote() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimation(0x123E9C9F, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmReadNote);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+uint32 Klayman::hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	int16 speedUpFrameIndex;
+	switch (messageNum) {
+	case 0x1008:
+		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
+		if (_currFrameIndex < speedUpFrameIndex) {
+			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
+			_y = 438;
+		}
+		messageResult = 0;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x1A1A0785) {
+			playSound(0, 0x40F0A342);
+		} else if (param.asInteger() == 0x60428026) {
+			playSound(0, 0x40608A59);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stHitByDoor() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimation(0x35AA8059, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&Klayman::hmHitByDoor);
+	playSound(0, 0x402E82D4);
+}
+
+uint32 Klayman::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == calcHash("PopBalloon")) {
+			sendMessage(_parentScene, 0x2000, 0);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			playSound(0, 0x44051000);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::upPeekWallBlink() {
+	Klayman::update();
+	_blinkCounter++;
+	if (_blinkCounter >= _blinkCounterMax)
+		stPeekWallBlink();
+}
+
+void Klayman::stPeekWall1() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 8, 37);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+	NextState(&Klayman::stPeekWallBlink);
+}
+
+void Klayman::stPeekWall2() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimation(0xAC20C012, 43, 49);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D480);
+}
+
+void Klayman::stPeekWallBlink() {
+	_blinkCounter = 0;
+	_status2 = 0;
+	_acceptInput = true;
+	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
+	startAnimation(0xAC20C012, 38, 42);
+	SetUpdateHandler(&Klayman::upPeekWallBlink);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::handleMessage41D360);
+	_newStickFrameIndex = 42;
+}
+
+void Klayman::stPeekWallReturn() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2426932E, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::hmPeekWallReturn);
+}
+
+void Klayman::stPullHammerLever() {
+	if (!stStartAction(AnimationCallback(&Klayman::stPullHammerLever))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x00648953, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::hmPullHammerLever);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	}
+}
+
+uint32 Klayman::hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209)
+			sendMessage(_attachedSprite, 0x480F, 0);
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::suRidePlatformDown() {
+	_platformDeltaY++;
+	_y += _platformDeltaY;
+	if (_y > 600)
+		sendMessage(this, 0x1019, 0);
+}
+
+void Klayman::stRidePlatformDown() {
+	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) {
+		_status2 = 1;
+		sendMessage(_parentScene, 0x4803, 0);
+		_acceptInput = false;
+		_platformDeltaY = 0;
+		startAnimation(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::handleMessage41D360);
+		SetSpriteUpdate(&Klayman::suRidePlatformDown);
+		_vm->_soundMan->playSoundLooping(0xD3B02847);
+	}
+}
+
+void Klayman::startWalkingResume(int16 frameIncr) {
+	// TODO Make the parameter a field and change this method back to a callback (or similar)
+	int16 frameIndex = getGlobalVar(0x18288913) + frameIncr;
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_isWalking = true;
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmWalking);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
+	NextState(&Klayman::stUpdateWalking);
+	FinalizeState(&Klayman::stStartWalkingDone);
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -2562,7 +2741,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stSleeping);
 		break;
 	case 0x480D:
-		GotoState(&KmScene1001::stPullLever);
+		GotoState(&Klayman::stPullHammerLever);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
@@ -2621,34 +2800,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1001::stPullLever() {
-	if (!stStartAction(AnimationCallback(&KmScene1001::stPullLever))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x00648953, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1001::hmPullLever);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	}
-}
-
-uint32 KmScene1001::hmPullLever(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x480F, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
 // KmScene1002
 
-KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _class599(class599), _ssLadderArch(ssLadderArch),
-	_status(0) {
+KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _idleTableNum(0) {
 	
 	setKlaymanIdleTable1();
 	
@@ -2656,13 +2811,13 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 
 void KmScene1002::xUpdate() {
 	if (_x >= 250 && _x <= 435 && _y >= 420) {
-		if (_status == 0) {
+		if (_idleTableNum == 0) {
 			// TODO setKlaymanIdleTable(stru_4B44C8);
-			_status = 1;
+			_idleTableNum = 1;
 		}
-	} else if (_status == 1) {
+	} else if (_idleTableNum == 1) {
 		setKlaymanIdleTable1();
-		_status = 0;
+		_idleTableNum = 0;
 	}
 }
 	
@@ -2780,21 +2935,17 @@ uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
-			if (_attachedSprite) {
+			if (_attachedSprite)
 				sendMessage(_attachedSprite, 0x480F, 0);
-			}
 		} else if (param.asInteger() == 0x586B0300) {
-			if (_otherSprite) {
+			if (_otherSprite)
 				sendMessage(_otherSprite, 0x480E, 1);
-			}
 		} else if (param.asInteger() == 0x4AB28209) {
-			if (_attachedSprite) {
+			if (_attachedSprite)
 				sendMessage(_attachedSprite, 0x482A, 0);
-			}
 		} else if (param.asInteger() == 0x88001184) {
-			if (_attachedSprite) {
+			if (_attachedSprite)
 				sendMessage(_attachedSprite, 0x482B, 0);
-			}
 		}
 		break;
 	}
@@ -2969,8 +3120,7 @@ void KmScene1002::stSpitOutFall0() {
 	SetMessageHandler(&Klayman::handleMessage41D360);
 	SetSpriteUpdate(&KmScene1002::suFallDown);
 	NextState(&KmScene1002::stFalling);
-	sendMessage(_class599, 0x482A, 0);
-	sendMessage(_ssLadderArch, 0x482A, 0);
+	sendMessage(_parentScene, 0x8000, 0);
 }
 
 void KmScene1002::stFalling() {
@@ -2987,8 +3137,7 @@ void KmScene1002::stFalling() {
 	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
-	sendMessage(_class599, 0x482B, 0);
-	sendMessage(_ssLadderArch, 0x482B, 0);
+	sendMessage(_parentScene, 0x8001, 0);
 }
 
 void KmScene1002::stSpitOutFall2() {
@@ -3000,8 +3149,7 @@ void KmScene1002::stSpitOutFall2() {
 	SetMessageHandler(&Klayman::handleMessage41D480);
 	SetSpriteUpdate(&KmScene1002::suFallDown);
 	NextState(&KmScene1002::stFalling);
-	sendMessage(_class599, 0x482A, 0);
-	sendMessage(_ssLadderArch, 0x482A, 0);
+	sendMessage(_parentScene, 0x8000, 0);
 }
 
 void KmScene1002::stFallTouchdown() {
@@ -3114,7 +3262,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x481E:
-		GotoState(&KmScene1004::stReadNote);
+		GotoState(&Klayman::stReadNote);
 		break;
 	case 0x4820:
 		sendMessage(_parentScene, 0x2000, 0);
@@ -3157,28 +3305,6 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x04684052) {
-			_acceptInput = true;
-			sendMessage(_parentScene, 0x2002, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene1004::stReadNote() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimation(0x123E9C9F, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1004::hmReadNote);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
 KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
@@ -3245,8 +3371,8 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1201
 
-KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) {
+KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) {
 	
 	// TODO setKlaymanIdleTable(dword_4AEF10, 3);
 	_flagF6 = true;
@@ -3429,7 +3555,7 @@ void KmScene1201::stTumbleHeadless() {
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&KmScene1201::hmTumbleHeadless);
 		NextState(&Klayman::stTryStandIdle);
-		sendMessage(_class464, 0x2006, 0);
+		sendMessage(_parentScene, 0x8000, 0);
 		playSound(0, 0x62E0A356);
 	}
 }
@@ -3454,83 +3580,18 @@ KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4804:
-		GotoState(&KmScene1303::stPeekWall1);
+		GotoState(&Klayman::stPeekWall1);
 		break;
 	case 0x483B:
-		GotoState(&KmScene1303::stPeekWallReturn);
+		GotoState(&Klayman::stPeekWallReturn);
 		break;
 	case 0x483C:
-		GotoState(&KmScene1303::stPeekWall2);
+		GotoState(&Klayman::stPeekWall2);
 		break;
 	}
 	return 0;
 }
 
-uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == calcHash("PopBalloon")) {
-			sendMessage(_parentScene, 0x2000, 0);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			playSound(0, 0x44051000);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene1303::upPeekWallBlink() {
-	Klayman::update();
-	_blinkCounter++;
-	if (_blinkCounter >= _blinkCounterMax)
-		stPeekWallBlink();
-}
-
-void KmScene1303::stPeekWall1() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xAC20C012, 8, 37);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D480);
-	NextState(&KmScene1303::stPeekWallBlink);
-}
-
-void KmScene1303::stPeekWall2() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0xAC20C012, 43, 49);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D480);
-}
-
-void KmScene1303::stPeekWallBlink() {
-	_blinkCounter = 0;
-	_status2 = 0;
-	_acceptInput = true;
-	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
-	startAnimation(0xAC20C012, 38, 42);
-	SetUpdateHandler(&KmScene1303::upPeekWallBlink);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D360);
-	_newStickFrameIndex = 42;
-}
-
-void KmScene1303::stPeekWallReturn() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2426932E, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1303::hmPeekWallReturn);
-}
-
 KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
@@ -4415,7 +4476,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4811:
-		GotoState(&KmScene2101::stHitByDoor);
+		GotoState(&Klayman::stHitByDoor);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
@@ -4477,39 +4538,6 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;	
 }
 
-uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
-	int16 speedUpFrameIndex;
-	switch (messageNum) {
-	case 0x1008:
-		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_currFrameIndex < speedUpFrameIndex) {
-			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
-			_y = 438;
-		}
-		messageResult = 0;
-		break;
-	case 0x100D:
-		if (param.asInteger() == 0x1A1A0785) {
-			playSound(0, 0x40F0A342);
-		} else if (param.asInteger() == 0x60428026) {
-			playSound(0, 0x40608A59);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2101::stHitByDoor() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0x35AA8059, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene2101::hmHitByDoor);
-	playSound(0, 0x402E82D4);
-}
-
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	// TODO: NRect *rect1, int16 unk in Klayman ctor
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
@@ -4704,18 +4732,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene2205::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(0x18288913);
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	startWalkingResume(0);
 }
 
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -4742,7 +4759,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4803:
-		GotoState(&KmScene2206::stRidePlatformDown);
+		GotoState(&Klayman::stRidePlatformDown);
 		break;
 	case 0x4804:
 		if (param.asInteger() != 0) {
@@ -4823,40 +4840,8 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2206::suRidePlatformDown() {
-	_yDelta++;
-	_y += _yDelta;
-	if (_y > 600)
-		sendMessage(this, 0x1019, 0);
-}
-
-void KmScene2206::stRidePlatformDown() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) {
-		_status2 = 1;
-		sendMessage(_parentScene, 0x4803, 0);
-		_acceptInput = false;
-		_yDelta = 0;
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41D360);
-		SetSpriteUpdate(&KmScene2206::suRidePlatformDown);
-		_vm->_soundMan->playSoundLooping(0xD3B02847);
-	}
-}
-
 void KmScene2206::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(0x18288913) + 1;
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	startWalkingResume(1);
 }
 
 KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -5051,18 +5036,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 void KmScene2242::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(0x18288913);
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	startWalkingResume(0);
 }
 
 KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -5120,18 +5094,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 }
 
 void KmHallOfRecords::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(0x18288913);
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	startWalkingResume(0);
 }
 
 KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -5189,18 +5152,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 }
   
 void KmScene2247::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(0x18288913);
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	startWalkingResume(0);
 }
 
 KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a52e7f6..a84ef96 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -195,6 +195,27 @@ public:
 	uint32 hmInsertKey(int messageNum, const MessageParam &param, Entity *sender);
 	void stInsertKey();
 
+	uint32 hmReadNote(int messageNum, const MessageParam &param, Entity *sender);
+	void stReadNote();
+
+	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
+	void stHitByDoor();
+
+	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
+	void upPeekWallBlink();
+	void stPeekWall1();
+	void stPeekWall2();
+	void stPeekWallBlink();
+	void stPeekWallReturn();
+
+	void stPullHammerLever();
+	uint32 hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender);
+
+	void suRidePlatformDown();
+	void stRidePlatformDown();
+
+	void startWalkingResume(int16 frameIncr);
+
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
@@ -226,6 +247,8 @@ protected:
 	bool _potionFlag1;
 	bool _potionFlag2;
 
+	int16 _platformDeltaY;
+
 	virtual void xUpdate();
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
@@ -318,18 +341,14 @@ public:
 	KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stPullLever();
-	uint32 hmPullLever(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class KmScene1002 : public Klayman {
 public:
-	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch);
+	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	Sprite *_class599;
-	Sprite *_ssLadderArch;
 	Sprite *_otherSprite;
-	int _status;
+	int _idleTableNum;
 	void xUpdate();	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	void upSpitOutFall();
@@ -362,8 +381,6 @@ public:
 	KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmReadNote(int messageNum, const MessageParam &param, Entity *sender);
-	void stReadNote();
 };
 
 class KmScene1109 : public Klayman {
@@ -375,9 +392,8 @@ protected:
 
 class KmScene1201 : public Klayman {
 public:
-	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464);
+	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	Entity *_class464;
 	int _countdown;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 	void upMoveObject();
@@ -397,12 +413,6 @@ public:
 	KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
-	void upPeekWallBlink();
-	void stPeekWall1();
-	void stPeekWall2();
-	void stPeekWallBlink();
-	void stPeekWallReturn();
 };
 
 class KmScene1304 : public Klayman {
@@ -498,8 +508,6 @@ public:
 	KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
-	void stHitByDoor();
 };
 
 class KmScene2201 : public Klayman {
@@ -530,11 +538,8 @@ public:
 	KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 	~KmScene2206();
 protected:
-	int16 _yDelta;
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void suRidePlatformDown();
-	void stRidePlatformDown();
 	void stStartWalkingResume();
 };
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index f4932c0..1e844c7 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1336,28 +1336,28 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
-			insertKlayman<KmScene1002>(90, 226, _class599, _ssLadderArch);
+			insertKlayman<KmScene1002>(90, 226);
 			_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
 			_asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
-			insertKlayman<KmScene1002>(379, 435, _class599, _ssLadderArch);
+			insertKlayman<KmScene1002>(379, 435);
 			_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			setMessageList(0x004B4270);
 			_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 			_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		}
 	} else if (which == 1) {
-		insertKlayman<KmScene1002>(650, 435, _class599, _ssLadderArch);
+		insertKlayman<KmScene1002>(650, 435);
 		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4478);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		_vm->_gameState.field2 = 1;
 	} else if (which == 2) {
-		insertKlayman<KmScene1002>(68, 645, _class599, _ssLadderArch);
+		insertKlayman<KmScene1002>(68, 645);
 		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4298);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
@@ -1365,7 +1365,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_gameState.field2 = 1;
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
-		insertKlayman<KmScene1002>(90, 226, _class599, _ssLadderArch);
+		insertKlayman<KmScene1002>(90, 226);
 		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4470);
 		_klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
@@ -1550,7 +1550,15 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		playSound(1);
 		sendMessage(_asDoor, 0x4808, 0);
 		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
-		break;				
+		break;
+	case 0x8000:
+		sendMessage(_class599, 0x482A, 0);
+		sendMessage(_ssLadderArch, 0x482A, 0);
+		break;
+	case 0x8001:
+		sendMessage(_class599, 0x482B, 0);
+		sendMessage(_ssLadderArch, 0x482B, 0);
+		break;
 	}	
 	return messageResult;
 }
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index d6ca51b..a903759 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -747,7 +747,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	int16 topY1, topY2, topY3, topY4;
 	int16 x1, x2;
-	Sprite *tempSprite, *class464;
+	Sprite *tempSprite;
 
 	SetUpdateHandler(&Scene1201::update);
 	SetMessageHandler(&Scene1201::handleMessage);
@@ -791,34 +791,34 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0xA29223FA, 1200);
 	x2 = tempSprite->getX() + tempSprite->getDrawRect().width;
 
-	class464 = insertSprite<Class464>();
+	_class464 = insertSprite<Class464>();
 
 	debug("Scene1201: which = %d", which);
 
 	if (which < 0) {
-		insertKlayman<KmScene1201>(364, 333, class464);
+		insertKlayman<KmScene1201>(364, 333);
 		setMessageList(0x004AEC08);
 	} else if (which == 3) {
-		insertKlayman<KmScene1201>(400, 329, class464);
+		insertKlayman<KmScene1201>(400, 329);
 		setMessageList(0x004AEC08);
 	} else if (which == 2) {
 		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
-			insertKlayman<KmScene1201>(374, 333, class464);
+			insertKlayman<KmScene1201>(374, 333);
 			setMessageList(0x004AEC08);
 		} else {
-			insertKlayman<KmScene1201>(640, 329, class464);
+			insertKlayman<KmScene1201>(640, 329);
 			setMessageList(0x004AEC20);
 		}
 	} else if (which == 1) {
 		if (getGlobalVar(0xC0418A02)) {
-			insertKlayman<KmScene1201>(364, 333, class464);
+			insertKlayman<KmScene1201>(364, 333);
 			_klayman->setDoDeltaX(1);
 		} else {
-			insertKlayman<KmScene1201>(246, 333, class464);
+			insertKlayman<KmScene1201>(246, 333);
 		}
 		setMessageList(0x004AEC30);
 	} else {
-		insertKlayman<KmScene1201>(0, 336, class464);
+		insertKlayman<KmScene1201>(0, 336);
 		setMessageList(0x004AEC10);
 	}
 
@@ -989,6 +989,9 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4829:
 		sendMessage(_asRightDoor, 0x4829, 0);
+		break;
+	case 0x8000:
+		sendMessage(_class464, 0x2006, 0);
 		break;		
 	}
 	return messageResult;
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index 1733fb4..b92ff92 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -177,6 +177,7 @@ protected:
 	Sprite *_asLeftDoor;
 	Sprite *_asRightDoor;
 	Sprite *_asTape;
+	Sprite *_class464;
 	bool _flag;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 1c980b0..f3677a1 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -451,10 +451,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2());
 
 	if (which < 0) {
-		insertKlayman<KmScene1002>(380, 364, _class595, (Sprite*)NULL);
+		insertKlayman<KmScene1002>(380, 364);
 		setMessageList(0x004B0868);
 	} else {
-		insertKlayman<KmScene1002>(293, 330, _class595, (Sprite*)NULL);
+		insertKlayman<KmScene1002>(293, 330);
 		setMessageList(0x004B0870);
 	}
 
@@ -587,6 +587,12 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x482B:
 		sendMessage(_asVenusFlyTrap, 0x482A, 0);
 		break;
+	case 0x8000:
+		sendMessage(_class595, 0x482A, 0);
+		break;
+	case 0x8001:
+		sendMessage(_class595, 0x482B, 0);
+		break;
 	}
 	return messageResult;
 }


Commit: 22cfd04b1273beab28f09a9e7a852634aa2367a8
    https://github.com/scummvm/scummvm/commit/22cfd04b1273beab28f09a9e7a852634aa2367a8
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: Rename handleMessage41D640

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 1155c57..49f88aa 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -342,12 +342,12 @@ void Klayman::stPickUpTube() {
 		_acceptInput = false;
 		startAnimation(0x0018C032, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41D640);
+		SetMessageHandler(&Klayman::hmPickUpTube);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a84ef96..77001c3 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -318,7 +318,7 @@ protected:
 	uint32 hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41D640(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender);


Commit: 4fef1ac9f21ba3f86dc453d1b11d9233ecd11bc0
    https://github.com/scummvm/scummvm/commit/4fef1ac9f21ba3f86dc453d1b11d9233ecd11bc0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: Some more merging and renaming in the Klayman class

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 49f88aa..76a2ebf 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -59,7 +59,8 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	: AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
 	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
 	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
-	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) {
+	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
+	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
@@ -134,7 +135,7 @@ void Klayman::stIdlePickEar() {
 }
 
 uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x04DBC02C) {
@@ -164,7 +165,7 @@ void Klayman::stIdleSpinHead() {
 }
 
 uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x808A0008) {
@@ -195,7 +196,7 @@ void Klayman::evIdleArmsDone() {
 }
 
 uint32 Klayman::hmIdleArms(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x5A0F0104) {
@@ -225,7 +226,7 @@ void Klayman::stIdleChest() {
 }
 
 uint32 Klayman::hmIdleChest(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x0D2A0288) {
@@ -251,7 +252,7 @@ void Klayman::stIdleHeadOff() {
 }
 
 uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xC006000C) {
@@ -275,7 +276,7 @@ void Klayman::stSitIdleTeleporter() {
 	_idleCounter = 0;
 	SetSpriteUpdate(NULL);
 	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	_blinkCounter = 0;
 	_idleCounterMax = 8;
 	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
@@ -309,7 +310,7 @@ void Klayman::stIdleSitBlink() {
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stIdleSitBlinkSecond);
 }
@@ -319,7 +320,7 @@ void Klayman::stIdleSitBlinkSecond() {
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 }
 
@@ -348,14 +349,12 @@ void Klayman::stPickUpTube() {
 }
 
 uint32 Klayman::hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xC1380080) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x4806, 0);
-				playSound(0, 0xC8004340);
-			}
+			sendMessage(_attachedSprite, 0x4806, 0);
+			playSound(0, 0xC8004340);
 		} else if (param.asInteger() == 0x02B20220) {
 			playSound(0, 0xC5408620);
 		} else if (param.asInteger() == 0x03020231) {
@@ -375,7 +374,7 @@ void Klayman::stTurnToUseInTeleporter() {
 	_acceptInput = false;
 	startAnimation(0xD229823D, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -384,7 +383,7 @@ void Klayman::stReturnFromUseInTeleporter() {
 	_acceptInput = false;
 	startAnimation(0x9A2801E0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -411,7 +410,7 @@ void Klayman::stSitInTeleporter() {
 }
 
 uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x001A2832) {
@@ -427,7 +426,7 @@ void Klayman::stGetUpFromTeleporter() {
 	_acceptInput = false;
 	startAnimation(0x913AB120, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
@@ -504,7 +503,7 @@ void Klayman::stTryStandIdle() {
 		_blinkCounter = 0;
 		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 		SetUpdateHandler(&Klayman::upIdle);
-		SetMessageHandler(&Klayman::handleMessage41D360);
+		SetMessageHandler(&Klayman::hmLowLevel);
 		SetSpriteUpdate(NULL);
 	}
 }
@@ -530,7 +529,7 @@ void Klayman::upIdle() {
 	}
 }
 
-uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmLowLevel(int messageNum, const MessageParam &param, Entity *sender) {
 	Sprite::handleMessage(messageNum, param, sender);
 	uint32 messageResult = xHandleMessage(messageNum, param);
 	switch (messageNum) {
@@ -570,13 +569,13 @@ void Klayman::stIdleBlink() {
 	_acceptInput = true;
 	startAnimation(0x5900C41E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stStandAround);
 }
 
-uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+uint32 Klayman::hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		gotoNextStateExt();
@@ -590,12 +589,12 @@ void Klayman::stStandAround() {
 	_acceptInput = true;
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::upIdle);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmStartAction(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x271AA210) {
@@ -644,7 +643,7 @@ void Klayman::stWakeUp() {
 	_acceptInput = false;
 	startAnimation(0x527AC970, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -658,7 +657,7 @@ void Klayman::stSleeping() {
 }
 
 uint32 Klayman::hmSleeping(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x03060012) {
@@ -780,7 +779,7 @@ void Klayman::stWalkingDone() {
 }
 
 uint32 Klayman::hmSneaking(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -821,7 +820,7 @@ void Klayman::stStartWalkingDone() {
 }
 
 uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -852,7 +851,7 @@ void Klayman::spriteUpdate41F300() {
 }
 
 uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -942,8 +941,8 @@ void Klayman::suWalkingTestExit() {
 	
 }
 
-uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+uint32 Klayman::hmLever(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
@@ -969,13 +968,11 @@ void Klayman::stPickUpGeneric() {
 }
 
 uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xC1380080) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x4806, 0);
-			}
+			sendMessage(_attachedSprite, 0x4806, 0);
 			playSound(0, 0x40208200);
 		} else if (param.asInteger() == 0x02B20220) {
 			playSound(0, 0xC5408620);
@@ -1006,13 +1003,11 @@ void Klayman::stTurnPressButton() {
 }
 
 uint32 Klayman::hmPressButton(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x0D01B294) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x480B, 0);
-			}
+			sendMessage(_attachedSprite, 0x480B, 0);
 		} else if (param.asInteger() == 0x32180101) {
 			playSound(0, 0x4924AAC4);
 		} else if (param.asInteger() == 0x0A2A9098) {
@@ -1102,7 +1097,7 @@ void Klayman::stStartWalkingSmall() {
 }
 
 uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101)
@@ -1118,7 +1113,7 @@ void Klayman::stStandIdleSmall() {
 	_acceptInput = true;
 	startAnimation(0x90D0D1D0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1127,7 +1122,7 @@ void Klayman::stWonderAboutAfterSmall() {
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 30, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1136,7 +1131,7 @@ void Klayman::stWonderAboutHalfSmall() {
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 0, 10);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1145,7 +1140,7 @@ void Klayman::stWonderAboutSmall() {
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1159,7 +1154,7 @@ void Klayman::stWalkToFrontNoStepSmall() {
 }
 
 uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x80C110B5)
@@ -1241,7 +1236,7 @@ void Klayman::stReleaseCord() {
 }
 
 uint32 Klayman::hmPullCord(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
@@ -1267,7 +1262,7 @@ void Klayman::stUseTube() {
 }
 
 uint32 Klayman::hmUseTube(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02B20220)
@@ -1423,7 +1418,7 @@ void Klayman::suLargeStep() {
 }
 
 uint32 Klayman::hmLargeStep(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -1445,7 +1440,7 @@ void Klayman::stWonderAboutHalf() {
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, 10);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1454,7 +1449,7 @@ void Klayman::stWonderAboutAfter() {
 	_acceptInput = true;
 	startAnimation(0xD820A114, 30, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1468,7 +1463,7 @@ void Klayman::stTurnToUseHalf() {
 }
 
 uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101) {
@@ -1495,7 +1490,7 @@ void Klayman::stWonderAbout() {
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1524,7 +1519,7 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *se
 		}
 		break;
 	}
-	return handleMessage41D480(messageNum, param, sender);
+	return hmLowLevelAnimation(messageNum, param, sender);
 }
 
 void Klayman::stJumpToRing1() {
@@ -1545,13 +1540,11 @@ void Klayman::setupJumpToRing() {
 }
 
 uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x4806, 0);
-			}
+			sendMessage(_attachedSprite, 0x4806, 0);
 			_acceptInput = true;
 		} else if (param.asInteger() == 0x320AC306) {
 			playSound(0, 0x5860C640);
@@ -1575,7 +1568,7 @@ void Klayman::stHangOnRing() {
 	_acceptInput = true;
 	startAnimation(0x4829E0B8, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1601,13 +1594,11 @@ void Klayman::stJumpToRing3() {
 }
 
 uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x4806, 0);
-			}
+			sendMessage(_attachedSprite, 0x4806, 0);
 		} else if (param.asInteger() == 0x320AC306) {
 			playSound(0, 0x5860C640);
 		} else if (param.asInteger() == 0x4AB28209) {
@@ -1634,19 +1625,17 @@ uint32 Klayman::hmHoldRing(int messageNum, const MessageParam &param, Entity *se
 		stReleaseRing();
 		return 0;
 	}
-	return handleMessage41D360(messageNum, param, sender);
+	return hmLowLevel(messageNum, param, sender);
 }
 
 void Klayman::stReleaseRing() {
 	_status2 = 1;
 	_acceptInput = false;
-	if (_attachedSprite) {
-		sendMessage(_attachedSprite, 0x4807, 0);
-		_attachedSprite = NULL;
-	}
+	sendMessage(_attachedSprite, 0x4807, 0);
+	_attachedSprite = NULL;
 	startAnimation(0xB869A4B9, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 }
 
@@ -1669,7 +1658,7 @@ void Klayman::stContinueClimbLadderUp() {
 	startAnimationByHash(0x3A292504, 0x01084280, 0);
 	_newStickFrameHash = 0x01084280;
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 	gotoNextStateExt();
 }
@@ -1728,7 +1717,7 @@ void Klayman::stClimbLadderHalf() {
 }
 
 uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x489B025C) {
@@ -1746,7 +1735,7 @@ uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam &param, E
 }
 
 uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
@@ -1808,7 +1797,7 @@ void Klayman::stWalkToFrontNoStep() {
 }
 
 uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x80C110B5) {
@@ -1868,7 +1857,7 @@ void Klayman::stLandOnFeet() {
 }
 
 uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x320AC306) {
@@ -1891,7 +1880,7 @@ void Klayman::stTurnToBackToUse() {
 }
 
 uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0xC61A0119) {
@@ -1918,13 +1907,11 @@ void Klayman::stClayDoorOpen() {
 }
 
 uint32 Klayman::hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x040D4186) {
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x4808, 0);
-			}
+			sendMessage(_attachedSprite, 0x4808, 0);
 		}
 		break;
 	}
@@ -1986,14 +1973,13 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
-			if (_attachedSprite)
-				sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
+			sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
 		} else if (param.asInteger() == 0x02421405) {
 			if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
 				stMoveObjectSkipTurn();
 			} else {
 				FinalizeState(&Klayman::evMoveObjectTurnDone);
-				SetMessageHandler(&Klayman::handleMessage41D480);
+				SetMessageHandler(&Klayman::hmLowLevelAnimation);
 			}
 		} else if (param.asInteger() == 0x32180101) {
 			playSound(0, 0x405002D8);
@@ -2005,7 +1991,7 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Enti
 		_isMoveObjectRequested = true;
 		return 0;		
 	}
-	return handleMessage41D480(messageNum, param, sender);
+	return hmLowLevelAnimation(messageNum, param, sender);
 }
 
 void Klayman::stMoveObjectSkipTurn() {
@@ -2040,7 +2026,7 @@ void Klayman::stUseLever() {
 			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
 			SetSpriteUpdate(&Klayman::suUpdateDestX);
-			SetMessageHandler(&Klayman::handleMessage41E210);
+			SetMessageHandler(&Klayman::hmLever);
 			NextState(&Klayman::stPullLeverDown);
 			_acceptInput = false;
 		}
@@ -2058,7 +2044,7 @@ void Klayman::stHoldLeverDown() {
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	_isLeverDown = true;
 	_acceptInput = true;
 }
@@ -2067,7 +2053,7 @@ void Klayman::stUseLeverRelease() {
 	startAnimation(0x09018068, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	SetMessageHandler(&Klayman::handleMessage41E210);
+	SetMessageHandler(&Klayman::hmLever);
 	sendMessage(_attachedSprite, 0x4807, 0);
 	NextState(&Klayman::stPullLeverDown);
 	_acceptInput = false;
@@ -2079,7 +2065,7 @@ void Klayman::stReleaseLever() {
 		startAnimation(0x09018068, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteUpdate(&Klayman::suUpdateDestX);
-		SetMessageHandler(&Klayman::handleMessage41E210);
+		SetMessageHandler(&Klayman::hmLever);
 		sendMessage(_attachedSprite, 0x4807, 0);
 		NextState(&Klayman::stLetGoOfLever);
 		_acceptInput = false;
@@ -2124,7 +2110,7 @@ void Klayman::stInsertDisk() {
 }
 
 uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) {
@@ -2199,7 +2185,7 @@ void Klayman::suJumpToGrab() {
 }
 
 uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0)
@@ -2225,7 +2211,7 @@ void Klayman::sub421230() {//stGrow
 }
 
 uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x040C4C01)
@@ -2269,7 +2255,7 @@ void Klayman::stJumpToGrabRelease() {
 }
 
 uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x320AC306)
@@ -2288,7 +2274,7 @@ void Klayman::stIdleTeleporterHands() {
 	_acceptInput = true;
 	startAnimation(0x90EF8D38, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stIdleSitBlinkSecond);
 }
@@ -2302,7 +2288,7 @@ void Klayman::stIdleTeleporterHands2() {
 	_acceptInput = true;
 	startAnimation(0x900F0930, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stIdleSitBlinkSecond);
 }
@@ -2326,7 +2312,7 @@ void Klayman::teleporterDisappear(uint32 fileHash) {
 }
 
 uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4E0A2C24) {
@@ -2340,7 +2326,7 @@ uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam &
 }
 
 uint32 Klayman::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x80C110B5)
@@ -2370,12 +2356,12 @@ void Klayman::stStandWonderAbout() {
 	startAnimation(0xD820A114, 0, -1);
 	_newStickFrameIndex = 10;
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
 		if (_potionFlag1) {
@@ -2427,7 +2413,7 @@ uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam &param, Entity
 }
 
 uint32 Klayman::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x32180101)
@@ -2480,7 +2466,7 @@ void Klayman::stDrinkPotion() {
 }
 
 uint32 Klayman::hmInsertKey(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (_keysToInsert == 0 && param.asInteger() == 0x06040580) {
@@ -2541,7 +2527,7 @@ void Klayman::stInsertKey() {
 }
 
 uint32 Klayman::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x04684052) {
@@ -2563,7 +2549,7 @@ void Klayman::stReadNote() {
 }
 
 uint32 Klayman::hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	int16 speedUpFrameIndex;
 	switch (messageNum) {
 	case 0x1008:
@@ -2596,7 +2582,7 @@ void Klayman::stHitByDoor() {
 }
 
 uint32 Klayman::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == calcHash("PopBalloon")) {
@@ -2626,7 +2612,7 @@ void Klayman::stPeekWall1() {
 	startAnimation(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	NextState(&Klayman::stPeekWallBlink);
 }
 
@@ -2636,7 +2622,7 @@ void Klayman::stPeekWall2() {
 	startAnimation(0xAC20C012, 43, 49);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D480);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 }
 
 void Klayman::stPeekWallBlink() {
@@ -2647,7 +2633,7 @@ void Klayman::stPeekWallBlink() {
 	startAnimation(0xAC20C012, 38, 42);
 	SetUpdateHandler(&Klayman::upPeekWallBlink);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D360);
+	SetMessageHandler(&Klayman::hmLowLevel);
 	_newStickFrameIndex = 42;
 }
 
@@ -2672,7 +2658,7 @@ void Klayman::stPullHammerLever() {
 }
 
 uint32 Klayman::hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender);
+	uint32 messageResult = Klayman::hmLever(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209)
@@ -2697,232 +2683,29 @@ void Klayman::stRidePlatformDown() {
 		_platformDeltaY = 0;
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41D360);
+		SetMessageHandler(&Klayman::hmLowLevel);
 		SetSpriteUpdate(&Klayman::suRidePlatformDown);
 		_vm->_soundMan->playSoundLooping(0xD3B02847);
 	}
 }
 
-void Klayman::startWalkingResume(int16 frameIncr) {
-	// TODO Make the parameter a field and change this method back to a callback (or similar)
-	int16 frameIndex = getGlobalVar(0x18288913) + frameIncr;
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
+void Klayman::stCrashDown() {
+	playSound(0, 0x41648271);
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
-}
-
-//##############################################################################
-
-// KmScene1001
-
-KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-}
-
-uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;		
-	case 0x4804:
-		if (param.asInteger() == 2)
-			GotoState(&Klayman::stSleeping);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stPullHammerLever);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		// TODO: It's not really a point but an x1/x2 pair
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4836:
-		if (param.asInteger() == 1) {
-			sendMessage(_parentScene, 0x2002, 0);
-			GotoState(&Klayman::stWakeUp);
-		}
-		break;		
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-// KmScene1002
-
-KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _idleTableNum(0) {
-	
-	setKlaymanIdleTable1();
-	
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	NextState(&KmScene1305::stCrashDownFinished);
 }
 
-void KmScene1002::xUpdate() {
-	if (_x >= 250 && _x <= 435 && _y >= 420) {
-		if (_idleTableNum == 0) {
-			// TODO setKlaymanIdleTable(stru_4B44C8);
-			_idleTableNum = 1;
-		}
-	} else if (_idleTableNum == 1) {
-		setKlaymanIdleTable1();
-		_idleTableNum = 0;
-	}
-}
-	
-uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x2001:
-		GotoState(&KmScene1002::stStandIdleSpecial);
-		break;
-	case 0x2007:
-		_otherSprite = (Sprite*)param.asEntity();
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004: 
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4803:
-		if (param.asInteger() == 1) {
-			GotoState(&KmScene1002::stJumpAndFall);
-		} else if (param.asInteger() == 2) {
-			GotoState(&KmScene1002::stDropFromRing);
-		}
-		break;
-	case 0x4804:
-		GotoState(&Klayman::stPeekWall);
-		break;
-	case 0x4805:
-		switch (param.asInteger()) {
-		case 1:
-			GotoState(&Klayman::stJumpToRing1);
-			break;
-		case 2:
-			GotoState(&Klayman::stJumpToRing2);
-			break;
-		case 3:
-			GotoState(&Klayman::stJumpToRing3);
-			break;
-		case 4:
-			GotoState(&Klayman::stJumpToRing4);
-			break;
-		}
-		break;
-	case 0x480A:	  
-		GotoState(&KmScene1002::stMoveVenusFlyTrap);
-		break;
-	case 0x480D:			   
-		GotoState(&KmScene1002::stJumpToRingVenusFlyTrap);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:  
-		if (param.asInteger() == 0) {
-			GotoState(&KmScene1002::stPressDoorButton);
-		}
-		break;
-	case 0x4817:				  
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:				
-		sub41CCE0(param.asInteger());
-		break;
-	case 0x4820:  
-		sendMessage(_parentScene, 0x2005, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);	 
-		break;
-	case 0x4821:	
-		sendMessage(_parentScene, 0x2005, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);	 
-		break;
-	case 0x4822:  
-		sendMessage(_parentScene, 0x2005, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);	 
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2006, 0);
-		GotoState(&Klayman::stClimbLadderHalf);	 
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840: 
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
+void Klayman::stCrashDownFinished() {
+	setDoDeltaX(2);
+	stTryStandIdle();
 }
 
-void KmScene1002::upSpitOutFall() {
+void Klayman::upSpitOutFall() {
 	Klayman::update();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		_surface->setVisible(true);
@@ -2930,29 +2713,25 @@ void KmScene1002::upSpitOutFall() {
 	}
 }
 
-uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+uint32 Klayman::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x168050A0) {
-			if (_attachedSprite)
-				sendMessage(_attachedSprite, 0x480F, 0);
+			sendMessage(_attachedSprite, 0x480F, 0);
 		} else if (param.asInteger() == 0x586B0300) {
-			if (_otherSprite)
-				sendMessage(_otherSprite, 0x480E, 1);
+			sendMessage(_otherSprite, 0x480E, 1);
 		} else if (param.asInteger() == 0x4AB28209) {
-			if (_attachedSprite)
-				sendMessage(_attachedSprite, 0x482A, 0);
+			sendMessage(_attachedSprite, 0x482A, 0);
 		} else if (param.asInteger() == 0x88001184) {
-			if (_attachedSprite)
-				sendMessage(_attachedSprite, 0x482B, 0);
+			sendMessage(_attachedSprite, 0x482B, 0);
 		}
 		break;
 	}
 	return messageResult;
 }
 
-uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x4811:
 		playSound(0, 0x5252A0E4);
@@ -2976,8 +2755,8 @@ uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam &param
 	return 0;
 }
 
-uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+uint32 Klayman::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x942D2081) {
@@ -2994,7 +2773,7 @@ uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x01084280) {
@@ -3004,7 +2783,7 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
 				if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0)
 					stContinueMovingVenusFlyTrap();
 			} else {
-				SetMessageHandler(&KmScene1002::hmFirstMoveVenusFlyTrap);
+				SetMessageHandler(&Klayman::hmFirstMoveVenusFlyTrap);
 			}
 		} else if (param.asInteger() == 0x4AB28209) {
 			sendMessage(_attachedSprite, 0x482A, 0);
@@ -3020,11 +2799,11 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param
 		_isMoveObjectRequested = true;
 		return 0;
 	}
-	return handleMessage41D480(messageNum, param, sender);
+	return hmLowLevelAnimation(messageNum, param, sender);
 }
 
-uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+uint32 Klayman::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x4AB28209) {
@@ -3041,9 +2820,9 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
 	int16 speedUpFrameIndex;
-	uint32 messageResult = handleMessage41D480(messageNum, param, sender);
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1008:
 		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
@@ -3064,8 +2843,8 @@ uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam &param
 	return messageResult;
 }
 
-uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage41D360(messageNum, param, sender);
+uint32 Klayman::hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x1307050A) {
@@ -3076,7 +2855,7 @@ uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam &param, Ent
 	return messageResult;
 }
 
-void KmScene1002::suFallDown() {
+void Klayman::suFallDown() {
 	AnimatedSprite::updateDeltaXY();
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
@@ -3087,20 +2866,20 @@ void KmScene1002::suFallDown() {
 	_vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0);
 }
 
-void KmScene1002::stJumpToRingVenusFlyTrap() {
-	if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRingVenusFlyTrap))) {
+void Klayman::stJumpToRingVenusFlyTrap() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRingVenusFlyTrap))) {
 		_status2 = 2;
 		_acceptInput = false;
 		startAnimation(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1002::hmJumpToRingVenusFlyTrap);
+		SetMessageHandler(&Klayman::hmJumpToRingVenusFlyTrap);
 		NextState(&Klayman::stLandOnFeet);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
 
-void KmScene1002::stStandIdleSpecial() {
+void Klayman::stStandIdleSpecial() {
 	playSound(0, 0x56548280);
 	_status2 = 0;
 	_acceptInput = false;
@@ -3108,22 +2887,22 @@ void KmScene1002::stStandIdleSpecial() {
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1002::hmStandIdleSpecial);
+	SetMessageHandler(&Klayman::hmStandIdleSpecial);
 }
 
-void KmScene1002::stSpitOutFall0() {
+void Klayman::stSpitOutFall0() {
 	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x000BAB02, 0, -1);
-	SetUpdateHandler(&KmScene1002::upSpitOutFall);
-	SetMessageHandler(&Klayman::handleMessage41D360);
-	SetSpriteUpdate(&KmScene1002::suFallDown);
-	NextState(&KmScene1002::stFalling);
+	SetUpdateHandler(&Klayman::upSpitOutFall);
+	SetMessageHandler(&Klayman::hmLowLevel);
+	SetSpriteUpdate(&Klayman::suFallDown);
+	NextState(&Klayman::stFalling);
 	sendMessage(_parentScene, 0x8000, 0);
 }
 
-void KmScene1002::stFalling() {
+void Klayman::stFalling() {
 	sendMessage(_parentScene, 0x1024, 1);
 	playSound(0, 0x41648271);
 	_status2 = 1;
@@ -3132,45 +2911,45 @@ void KmScene1002::stFalling() {
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1002::handleMessage41D480);
-	NextState(&KmScene1002::stFallTouchdown);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	NextState(&Klayman::stFallTouchdown);
 	sendMessage(_parentScene, 0x2002, 0);
 	// TODO _callbackList = NULL;
 	_attachedSprite = NULL;
 	sendMessage(_parentScene, 0x8001, 0);
 }
 
-void KmScene1002::stSpitOutFall2() {
+void Klayman::stSpitOutFall2() {
 	_countdown1 = 1;
 	_status2 = 0;
 	_acceptInput = false;
 	startAnimation(0x9308C132, 0, -1);
-	SetUpdateHandler(&KmScene1002::upSpitOutFall);
-	SetMessageHandler(&Klayman::handleMessage41D480);
-	SetSpriteUpdate(&KmScene1002::suFallDown);
-	NextState(&KmScene1002::stFalling);
+	SetUpdateHandler(&Klayman::upSpitOutFall);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	SetSpriteUpdate(&Klayman::suFallDown);
+	NextState(&Klayman::stFalling);
 	sendMessage(_parentScene, 0x8000, 0);
 }
 
-void KmScene1002::stFallTouchdown() {
+void Klayman::stFallTouchdown() {
 	setDoDeltaX(2);
 	stTryStandIdle();
 }
 
-void KmScene1002::stJumpAndFall() {
-	if (!stStartAction(AnimationCallback(&KmScene1002::stJumpAndFall))) {
+void Klayman::stJumpAndFall() {
+	if (!stStartAction(AnimationCallback(&Klayman::stJumpAndFall))) {
 		sendMessage(_parentScene, 0x1024, 3);
 		_status2 = 2;
 		_acceptInput = false;
 		startAnimation(0xB93AB151, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1002::hmJumpAndFall);
-		SetSpriteUpdate(&KmScene1002::suFallDown);
+		SetMessageHandler(&Klayman::hmJumpAndFall);
+		SetSpriteUpdate(&Klayman::suFallDown);
 		NextState(&Klayman::stLandOnFeet);
 	}
 }
 
-void KmScene1002::stDropFromRing() {
+void Klayman::stDropFromRing() {
 	if (_attachedSprite) {
 		_x = _attachedSprite->getX();
 		sendMessage(_attachedSprite, 0x4807, 0);
@@ -3180,61 +2959,545 @@ void KmScene1002::stDropFromRing() {
 	_acceptInput = false;
 	startAnimation(0x586984B1, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::handleMessage41D360);
-	SetSpriteUpdate(&KmScene1002::suFallDown);
+	SetMessageHandler(&Klayman::hmLowLevel);
+	SetSpriteUpdate(&Klayman::suFallDown);
 	NextState(&Klayman::stLandOnFeet);
 }
 
-void KmScene1002::stPressDoorButton() {
+void Klayman::stPressDoorButton() {
 	_status2 = 2;
 	_acceptInput = true;
 	setDoDeltaX(0);
 	startAnimation(0x1CD89029, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::hmPressDoorButton);
+	SetMessageHandler(&Klayman::hmPressDoorButton);
 	SetSpriteUpdate(&Klayman::spriteUpdate41F250);
 }
 
-void KmScene1002::stHitByBoxingGlove() {
+void Klayman::stHitByBoxingGlove() {
 	_status2 = 1;
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::hmHitByBoxingGlove);
+	SetMessageHandler(&Klayman::hmHitByBoxingGlove);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	FinalizeState(&KmScene1002::stHitByBoxingGloveDone);
+	FinalizeState(&Klayman::stHitByBoxingGloveDone);
 }
 
-void KmScene1002::stHitByBoxingGloveDone() {
+void Klayman::stHitByBoxingGloveDone() {
 	sendMessage(_parentScene, 0x1024, 1);
 }
 
-void KmScene1002::stMoveVenusFlyTrap() {
-	if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) {
+void Klayman::stMoveVenusFlyTrap() {
+	if (!stStartAction(AnimationCallback(&Klayman::stMoveVenusFlyTrap))) {
 		_status2 = 2;
 		_isMoveObjectRequested = false;
 		_acceptInput = true;
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		startAnimation(0x5C01A870, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
+		SetMessageHandler(&Klayman::hmMoveVenusFlyTrap);
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone);
+		FinalizeState(&Klayman::stMoveVenusFlyTrapDone);
+	}
+}
+
+void Klayman::stContinueMovingVenusFlyTrap() {
+	_isMoveObjectRequested = false;
+	_acceptInput = true;
+	startAnimationByHash(0x5C01A870, 0x01084280, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmMoveVenusFlyTrap);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	FinalizeState(&Klayman::stMoveVenusFlyTrapDone);
+}
+
+void Klayman::stMoveVenusFlyTrapDone() {
+	sendMessage(_attachedSprite, 0x482A, 0);
+}
+
+void Klayman::suFallSkipJump() {
+	updateDeltaXY();
+	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
+	if (hitRect->type == 0x5001) {
+		_y = hitRect->rect.y1;
+		processDelta();
+		sendMessage(this, 0x1019, 0);
+	}
+}
+
+void Klayman::stFallSkipJump() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&Klayman::suFallSkipJump);
+	SetMessageHandler(&Klayman::hmLowLevel);
+	NextState(&Klayman::stLandOnFeet);
+}
+
+void Klayman::upMoveObject() {
+	if (_x >= 380)
+		gotoNextStateExt();
+	Klayman::update();		
+}
+
+uint32 Klayman::hmMatch(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x51281850) {
+			setGlobalVar(0x20A0C516, 1);
+		} else if (param.asInteger() == 0x43000538) {
+			playSound(0, 0x21043059);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			playSound(0, 0x44051000);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stFetchMatch() {
+	if (!stStartAction(AnimationCallback(&Klayman::stFetchMatch))) {
+		_status2 = 0;
+		_acceptInput = false;
+		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+		startAnimation(0x9CAA0218, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteUpdate(NULL);
+		SetMessageHandler(&Klayman::hmMatch);
+		NextState(&Klayman::stLightMatch);
+	}
+}
+
+void Klayman::stLightMatch() {
+	_status2 = 1;
+	_acceptInput = false;
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	startAnimation(0x1222A513, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klayman::hmMatch);
+}
+
+uint32 Klayman::hmMoveObject(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			playSound(0, 0x405002D8);
+			sendMessage(_attachedSprite, 0x480B, 0);
+		} else if (param.asInteger() == 0x02421405) {
+			if (_moveObjectCountdown != 0) {
+				_moveObjectCountdown--;
+				stContinueMoveObject();
+			} else {
+				SetMessageHandler(&Klayman::hmLowLevelAnimation);
+			}
+		}
+		break;
+	}
+	return Klayman::hmLowLevelAnimation(messageNum, param, sender);
+}
+
+uint32 Klayman::hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x000F0082) {
+			playSound(0, 0x74E2810F);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stMoveObject() {
+	if (!stStartAction(AnimationCallback(&Klayman::stMoveObject))) {
+		_status2 = 2;
+		_acceptInput = false;
+		_moveObjectCountdown = 8;
+		setDoDeltaX(0);
+		startAnimation(0x0C1CA072, 0, -1);
+		SetUpdateHandler(&Klayman::upMoveObject);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+		SetMessageHandler(&Klayman::hmMoveObject);
+	}
+}
+
+void Klayman::stContinueMoveObject() {
+	_acceptInput = false;
+	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
+	SetUpdateHandler(&Klayman::upMoveObject);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	SetMessageHandler(&Klayman::hmMoveObject);
+}
+
+void Klayman::stTumbleHeadless() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTumbleHeadless))) {
+		_status2 = 1;
+		_acceptInput = false;
+		setDoDeltaX(0);
+		startAnimation(0x2821C590, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+		SetMessageHandler(&Klayman::hmTumbleHeadless);
+		NextState(&Klayman::stTryStandIdle);
+		sendMessage(_parentScene, 0x8000, 0);
+		playSound(0, 0x62E0A356);
+	}
+}
+
+void Klayman::stCloseEyes() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stCloseEyes))) {
+		_status2 = 1;
+		_acceptInput = false;		
+		startAnimation(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteUpdate(NULL);
+		SetMessageHandler(&Klayman::hmLowLevel);
+	}
+}
+
+uint32 Klayman::hmSpit(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x16401CA6) {
+			_canSpitPipe = true;
+			if (_contSpitPipe)
+				spitIntoPipe();
+		} else if (param.asInteger() == 0xC11C0008) {
+			_canSpitPipe = false;
+			_acceptInput = false;
+			_readyToSpit = false;
+		} else if (param.asInteger() == 0x018A0001) {
+			sendMessage(_parentScene, 0x2001, _spitDestPipeIndex);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klayman::stTrySpitIntoPipe() {
+	if (_readyToSpit) {
+		_contSpitPipe = true;
+		_spitContDestPipeIndex = _spitPipeIndex;
+		if (_canSpitPipe)
+			spitIntoPipe();
+	} else if (!stStartAction(AnimationCallback(&Klayman::stTrySpitIntoPipe))) {
+		_status2 = 2;
+		_acceptInput = true;
+		_spitDestPipeIndex = _spitPipeIndex;
+		_readyToSpit = true;
+		_canSpitPipe = false;
+		_contSpitPipe = false;
+		startAnimation(0x1808B150, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetMessageHandler(&Klayman::hmSpit);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void Klayman::spitIntoPipe() {
+	_contSpitPipe = false;
+	_spitDestPipeIndex = _spitContDestPipeIndex;
+	_canSpitPipe = false;
+	_acceptInput = false;
+	startAnimation(0x1B08B553, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmSpit);
+	SetSpriteUpdate(NULL);
+	NextState(&Klayman::stContSpitIntoPipe);
+}
+
+void Klayman::stContSpitIntoPipe() {
+	_canSpitPipe = true;
+	_acceptInput = true;
+	startAnimationByHash(0x1808B150, 0x16401CA6, 0);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmSpit);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::suRidePlatform() {
+	_x = _attachedSprite->getX() - 20;
+	_y = _attachedSprite->getY() + 46;
+	processDelta();
+}
+
+void Klayman::stRidePlatform() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatform))) {
+		_status2 = 1;
+		_acceptInput = true;
+		startAnimation(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klayman::update);
+		SetSpriteUpdate(&Klayman::suRidePlatform);
+		SetMessageHandler(&Klayman::hmLowLevel);
+	}
+}
+
+void Klayman::stInteractLever() {
+	if (!stStartAction(AnimationCallback(&Klayman::stInteractLever))) {
+		_status2 = 0;
+		if (_isLeverDown) {
+			stUseLeverRelease();
+		} else {
+			_acceptInput = false;
+			startAnimation(0x0C303040, 0, -1);
+			SetUpdateHandler(&Klayman::update);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
+			SetMessageHandler(&Klayman::hmLever);
+			NextState(&Klayman::stPullLever);
+		}
+	}
+}
+
+void Klayman::stPullLever() {
+	startAnimation(0x0D318140, 0, -1);
+	sendMessage(_attachedSprite, 0x480F, 0);
+	NextState(&Klayman::stLookLeverDown);
+}
+
+void Klayman::stLookLeverDown() {
+	startAnimation(0x1564A2C0, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
+	NextState(&Klayman::stWaitLeverDown);
+	_acceptInput = true;
+	_isLeverDown = true;
+}
+
+void Klayman::stWaitLeverDown() {
+	startAnimation(0x4464A440, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
+	SetMessageHandler(&Klayman::hmLowLevel);
+	_acceptInput = true;
+	_isLeverDown = true;
+}
+
+void Klayman::startWalkingResume(int16 frameIncr) {
+	// TODO Make the parameter a field and change this method back to a callback (or similar)
+	int16 frameIndex = getGlobalVar(0x18288913) + frameIncr;
+	if (frameIndex < 0 || frameIndex > 13)
+		frameIndex = 0;
+	_status2 = 0;
+	_isWalking = true;
+	_acceptInput = true;
+	startAnimation(0x1A249001, frameIndex, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmWalking);
+	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
+	NextState(&Klayman::stUpdateWalking);
+	FinalizeState(&Klayman::stStartWalkingDone);
+}
+
+//##############################################################################
+
+// KmScene1001
+
+KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+}
+
+uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klayman::stTryStandIdle);
+		break;		
+	case 0x4804:
+		if (param.asInteger() == 2)
+			GotoState(&Klayman::stSleeping);
+		break;
+	case 0x480D:
+		GotoState(&Klayman::stPullHammerLever);
+		break;
+	case NM_KLAYMAN_PICKUP:
+		GotoState(&Klayman::stPickUpGeneric);
+		break;
+	case NM_KLAYMAN_PRESS_BUTTON:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnPressButton);
+		} else if (param.asInteger() == 2) {
+			GotoState(&Klayman::stStampFloorButton);
+		} else {
+			GotoState(&Klayman::stPressButtonSide);
+		} 
+		break;
+	case 0x4817:
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;		
+	case 0x481B:
+		// TODO: It's not really a point but an x1/x2 pair
+		if (param.asPoint().y != 0) {
+			sub41CC40(param.asPoint().y, param.asPoint().x);
+		} else {
+			sub41CCE0(param.asPoint().x);
+		}
+		break;
+	case 0x481F:
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stWonderAboutHalf);
+		} else if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWonderAboutAfter);
+		} else if (param.asInteger() == 3) {
+			GotoState(&Klayman::stTurnToUseHalf);
+		} else if (param.asInteger() == 4) {
+			GotoState(&Klayman::stTurnAwayFromUse);
+		} else {
+			GotoState(&Klayman::stWonderAbout);
+		}
+		break;
+	case 0x482D:
+		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
+		gotoNextStateExt();
+		break;
+	case 0x4836:
+		if (param.asInteger() == 1) {
+			sendMessage(_parentScene, 0x2002, 0);
+			GotoState(&Klayman::stWakeUp);
+		}
+		break;		
+	case 0x483F:
+		startSpecialWalkRight(param.asInteger());
+		break;		
+	case 0x4840:
+		startSpecialWalkLeft(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+// KmScene1002
+
+KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	
+	setKlaymanIdleTable1();
+	
+}
+
+void KmScene1002::xUpdate() {
+	if (_x >= 250 && _x <= 435 && _y >= 420) {
+		if (_idleTableNum == 0) {
+			// TODO setKlaymanIdleTable(stru_4B44C8);
+			_idleTableNum = 1;
+		}
+	} else if (_idleTableNum == 1) {
+		setKlaymanIdleTable1();
+		_idleTableNum = 0;
+	}
+}
+	
+uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x2001:
+		GotoState(&Klayman::stStandIdleSpecial);
+		break;
+	case 0x2007:
+		_otherSprite = (Sprite*)param.asEntity();
+		break;
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004: 
+		GotoState(&Klayman::stTryStandIdle);
+		break;
+	case 0x4803:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stJumpAndFall);
+		} else if (param.asInteger() == 2) {
+			GotoState(&Klayman::stDropFromRing);
+		}
+		break;
+	case 0x4804:
+		GotoState(&Klayman::stPeekWall);
+		break;
+	case 0x4805:
+		switch (param.asInteger()) {
+		case 1:
+			GotoState(&Klayman::stJumpToRing1);
+			break;
+		case 2:
+			GotoState(&Klayman::stJumpToRing2);
+			break;
+		case 3:
+			GotoState(&Klayman::stJumpToRing3);
+			break;
+		case 4:
+			GotoState(&Klayman::stJumpToRing4);
+			break;
+		}
+		break;
+	case 0x480A:	  
+		GotoState(&Klayman::stMoveVenusFlyTrap);
+		break;
+	case 0x480D:			   
+		GotoState(&Klayman::stJumpToRingVenusFlyTrap);
+		break;
+	case NM_KLAYMAN_PRESS_BUTTON:  
+		if (param.asInteger() == 0) {
+			GotoState(&Klayman::stPressDoorButton);
+		}
+		break;
+	case 0x4817:				  
+		setDoDeltaX(param.asInteger());
+		gotoNextStateExt();
+		break;
+	case 0x481B:				
+		sub41CCE0(param.asInteger());
+		break;
+	case 0x4820:  
+		sendMessage(_parentScene, 0x2005, 0);
+		GotoState(&Klayman::stContinueClimbLadderUp);	 
+		break;
+	case 0x4821:	
+		sendMessage(_parentScene, 0x2005, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderDown);	 
+		break;
+	case 0x4822:  
+		sendMessage(_parentScene, 0x2005, 0);
+		_destY = param.asInteger();
+		GotoState(&Klayman::stStartClimbLadderUp);	 
+		break;
+	case 0x4823:
+		sendMessage(_parentScene, 0x2006, 0);
+		GotoState(&Klayman::stClimbLadderHalf);	 
+		break;
+	case 0x482E:	 
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stWalkToFrontNoStep);
+		} else {
+			GotoState(&Klayman::stWalkToFront);
+		}
+		break;
+	case 0x482F:
+		if (param.asInteger() == 1) {
+			GotoState(&Klayman::stTurnToFront);
+		} else {
+			GotoState(&Klayman::stTurnToBack);
+		}
+		break;
+	case 0x483F:
+		startSpecialWalkRight(param.asInteger());
+		break;
+	case 0x4840: 
+		startSpecialWalkLeft(param.asInteger());
+		break;
 	}
-}
-
-void KmScene1002::stContinueMovingVenusFlyTrap() {
-	_isMoveObjectRequested = false;
-	_acceptInput = true;
-	startAnimationByHash(0x5C01A870, 0x01084280, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone);
-}
-
-void KmScene1002::stMoveVenusFlyTrapDone() {
-	sendMessage(_attachedSprite, 0x482A, 0);
+	return 0;
 }
 
 // KmScene1004
@@ -3372,7 +3635,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1201
 
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// TODO setKlaymanIdleTable(dword_4AEF10, 3);
 	_flagF6 = true;
@@ -3389,19 +3652,19 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480A:
-		GotoState(&KmScene1201::stMoveObject);
+		GotoState(&Klayman::stMoveObject);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4813:
-		GotoState(&KmScene1201::stFetchMatch);
+		GotoState(&Klayman::stFetchMatch);
 		break;
 	case 0x4814:
-		GotoState(&KmScene1201::stTumbleHeadless);
+		GotoState(&Klayman::stTumbleHeadless);
 		break;
 	case 0x4815:
-		GotoState(&KmScene1201::stCloseEyes);
+		GotoState(&Klayman::stCloseEyes);
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 0) {
@@ -3442,135 +3705,6 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1201::upMoveObject() {
-	if (_x >= 380)
-		gotoNextStateExt();
-	Klayman::update();		
-}
-
-uint32 KmScene1201::hmMatch(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x51281850) {
-			setGlobalVar(0x20A0C516, 1);
-		} else if (param.asInteger() == 0x43000538) {
-			playSound(0, 0x21043059);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			playSound(0, 0x44051000);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene1201::stFetchMatch() {
-	if (!stStartAction(AnimationCallback(&KmScene1201::stFetchMatch))) {
-		_status2 = 0;
-		_acceptInput = false;
-		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-		startAnimation(0x9CAA0218, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(NULL);
-		SetMessageHandler(&KmScene1201::hmMatch);
-		NextState(&KmScene1201::stLightMatch);
-	}
-}
-
-void KmScene1201::stLightMatch() {
-	_status2 = 1;
-	_acceptInput = false;
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	startAnimation(0x1222A513, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&KmScene1201::hmMatch);
-}
-
-uint32 KmScene1201::hmMoveObject(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x01084280) {
-			playSound(0, 0x405002D8);
-			if (_attachedSprite) {
-				sendMessage(_attachedSprite, 0x480B, 0);
-			}
-		} else if (param.asInteger() == 0x02421405) {
-			if (_countdown != 0) {
-				_countdown--;
-				stMoveObjectSkipTurn();
-			} else {
-				SetMessageHandler(&Klayman::handleMessage41D480);
-			}
-		}
-		break;
-	}
-	return Klayman::handleMessage41D480(messageNum, param, sender);
-}
-
-uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x000F0082) {
-			playSound(0, 0x74E2810F);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene1201::stMoveObject() {
-	if (!stStartAction(AnimationCallback(&KmScene1201::stMoveObject))) {
-		_status2 = 2;
-		_acceptInput = false;
-		_countdown = 8;
-		setDoDeltaX(0);
-		startAnimation(0x0C1CA072, 0, -1);
-		SetUpdateHandler(&KmScene1201::upMoveObject);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1201::hmMoveObject);
-	}
-}
-
-void KmScene1201::stMoveObjectSkipTurn() {
-	_acceptInput = false;
-	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
-	SetUpdateHandler(&KmScene1201::upMoveObject);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&KmScene1201::hmMoveObject);
-}
-
-void KmScene1201::stTumbleHeadless() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stTumbleHeadless))) {
-		_status2 = 1;
-		_acceptInput = false;
-		setDoDeltaX(0);
-		startAnimation(0x2821C590, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		SetMessageHandler(&KmScene1201::hmTumbleHeadless);
-		NextState(&Klayman::stTryStandIdle);
-		sendMessage(_parentScene, 0x8000, 0);
-		playSound(0, 0x62E0A356);
-	}
-}
-
-void KmScene1201::stCloseEyes() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stCloseEyes))) {
-		_status2 = 1;
-		_acceptInput = false;		
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(NULL);
-		SetMessageHandler(&Klayman::handleMessage41D360);
-	}
-}
-
 KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
@@ -3662,7 +3796,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;		
 	case 0x4804:
-		GotoState(&KmScene1305::stCrashDown);
+		GotoState(&Klayman::stCrashDown);
 		break;		
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3672,22 +3806,6 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene1305::stCrashDown() {
-	playSound(0, 0x41648271);
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimationByHash(0x000BAB02, 0x88003000, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41D480);
-	NextState(&KmScene1305::stCrashDownFinished);
-}
-
-void KmScene1305::stCrashDownFinished() {
-	setDoDeltaX(2);
-	stTryStandIdle();
-}
-
 KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
@@ -3836,7 +3954,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		}	
 		break;		
 	case 0x480D:
-		GotoState(&KmScene1001::stUseLever);
+		GotoState(&Klayman::stUseLever);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
@@ -4032,7 +4150,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;		
 	case 0x480D:
-		GotoState(&KmScene1001::stUseLever);
+		GotoState(&Klayman::stUseLever);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
@@ -4261,7 +4379,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x4803:
-		GotoState(&KmScene1705::stFallSkipJump);
+		GotoState(&Klayman::stFallSkipJump);
 		break;				
 	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2) {
@@ -4329,26 +4447,6 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-void KmScene1705::suFallSkipJump() {
-	updateDeltaXY();
-	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
-	if (hitRect->type == 0x5001) {
-		_y = hitRect->rect.y1;
-		processDelta();
-		sendMessage(this, 0x1019, 0);
-	}
-}
-
-void KmScene1705::stFallSkipJump() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&KmScene1705::suFallSkipJump);
-	SetMessageHandler(&Klayman::handleMessage41D360);
-	NextState(&Klayman::stLandOnFeet);
-}
-
 KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -4852,11 +4950,11 @@ KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2001:
-		GotoState(&KmScene2207::stRidePlatform);
+		GotoState(&Klayman::stRidePlatform);
 		break;
 	case 0x2005:
 		suRidePlatform();
-		GotoState(&KmScene2207::stTryStandIdle);
+		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x4001:
 	case 0x4800:
@@ -4866,7 +4964,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klayman::stTryStandIdle);
 		break;
 	case 0x480D:
-		GotoState(&KmScene2207::stInteractLever);
+		GotoState(&Klayman::stInteractLever);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
@@ -4908,63 +5006,6 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2207::suRidePlatform() {
-	_x = _attachedSprite->getX() - 20;
-	_y = _attachedSprite->getY() + 46;
-	processDelta();
-}
-
-void KmScene2207::stRidePlatform() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::stRidePlatform))) {
-		_status2 = 1;
-		_acceptInput = true;
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&KmScene2207::suRidePlatform);
-		SetMessageHandler(&Klayman::handleMessage41D360);
-	}
-}
-
-void KmScene2207::stInteractLever() {
-	if (!stStartAction(AnimationCallback(&KmScene2207::stInteractLever))) {
-		_status2 = 0;
-		if (_isLeverDown) {
-			stUseLeverRelease();
-		} else {
-			_acceptInput = false;
-			startAnimation(0x0C303040, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&KmScene2207::suUpdateDestX);
-			SetMessageHandler(&Klayman::handleMessage41E210);
-			NextState(&KmScene2207::stPullLever);
-		}
-	}
-}
-
-void KmScene2207::stPullLever() {
-	startAnimation(0x0D318140, 0, -1);
-	sendMessage(_attachedSprite, 0x480F, 0);
-	NextState(&KmScene2207::stLookLeverDown);
-}
-
-void KmScene2207::stLookLeverDown() {
-	startAnimation(0x1564A2C0, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	NextState(&KmScene2207::stWaitLeverDown);
-	_acceptInput = true;
-	_isLeverDown = true;
-}
-
-void KmScene2207::stWaitLeverDown() {
-	startAnimation(0x4464A440, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	SetMessageHandler(&Klayman::handleMessage41D360);
-	_acceptInput = true;
-	_isLeverDown = true;
-}
-
 KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
@@ -5156,7 +5197,7 @@ void KmScene2247::stStartWalkingResume() {
 }
 
 KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000), _readyToSpit(false) {
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
 	
@@ -5170,7 +5211,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klayman::stTryStandIdle);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5225,7 +5266,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stWonderAbout);
 		else {
 			_spitPipeIndex = sendMessage(_parentScene, 0x2000, 0);
-			GotoState(&KmScene2401::stTrySpitIntoPipe);
+			GotoState(&Klayman::stTrySpitIntoPipe);
 		}
 		break;
 	case 0x483F:
@@ -5238,67 +5279,6 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-uint32 KmScene2401::hmSpit(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x16401CA6) {
-			_canSpitPipe = true;
-			if (_contSpitPipe)
-				spitIntoPipe();
-		} else if (param.asInteger() == 0xC11C0008) {
-			_canSpitPipe = false;
-			_acceptInput = false;
-			_readyToSpit = false;
-		} else if (param.asInteger() == 0x018A0001) {
-			sendMessage(_parentScene, 0x2001, _spitDestPipeIndex);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void KmScene2401::stTrySpitIntoPipe() {
-	if (_readyToSpit) {
-		_contSpitPipe = true;
-		_spitContDestPipeIndex = _spitPipeIndex;
-		if (_canSpitPipe)
-			spitIntoPipe();
-	} else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) {
-		_status2 = 2;
-		_acceptInput = true;
-		_spitDestPipeIndex = _spitPipeIndex;
-		_readyToSpit = true;
-		_canSpitPipe = false;
-		_contSpitPipe = false;
-		startAnimation(0x1808B150, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&KmScene2401::hmSpit);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void KmScene2401::spitIntoPipe() {
-	_contSpitPipe = false;
-	_spitDestPipeIndex = _spitContDestPipeIndex;
-	_canSpitPipe = false;
-	_acceptInput = false;
-	startAnimation(0x1B08B553, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2401::hmSpit);
-	SetSpriteUpdate(NULL);
-	NextState(&KmScene2401::stContSpitIntoPipe);
-}
-
-void KmScene2401::stContSpitIntoPipe() {
-	_canSpitPipe = true;
-	_acceptInput = true;
-	startAnimationByHash(0x1808B150, 0x16401CA6, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&KmScene2401::hmSpit);
-	SetSpriteUpdate(NULL);
-}
-
 KmScene2402::KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
@@ -5325,10 +5305,10 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPeekWall);
 		}
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5389,10 +5369,10 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&Klayman::stPullCord);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
-	case 0x4816:
+	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
 			GotoState(&Klayman::stTurnPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5480,7 +5460,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klayman::stPeekWall);
 		}
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2)
 			GotoState(&Klayman::stPickUpNeedle);
 		else if (param.asInteger() == 1)
@@ -5888,7 +5868,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4831:
-		GotoState(&KmScene2806::stGrow);
+		GotoState(&Klayman::stGrow);
 		break;
 	case 0x4832:
 		if (param.asInteger() == 1) {
@@ -5946,7 +5926,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x4831:
-		GotoState(&KmScene2809::stGrow);
+		GotoState(&Klayman::stGrow);
 		break;
 	case 0x4832:
 		if (param.asInteger() == 1) {
@@ -6033,7 +6013,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 3)
 			GotoState(&Klayman::sub421230);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
 		break;
 	case 0x4817:
@@ -6122,7 +6102,7 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
 		_destY = param.asInteger();
 		GotoState(&Klayman::stJumpToGrabFall);
 		break;
-	case 0x4812:
+	case NM_KLAYMAN_PICKUP:
 		if (param.asInteger() == 2)
 			GotoState(&Klayman::stPickUpNeedle);
 		else if (param.asInteger() == 1)
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 77001c3..4d0c969 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -129,10 +129,10 @@ public:
 	void spriteUpdate41F300();
 	void suWalkingTestExit();
 
-	uint32 handleMessage41D360(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41D480(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLowLevel(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41E210(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLever(int messageNum, const MessageParam &param, Entity *sender);
 
 	void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount);
 	void setKlaymanIdleTable1();
@@ -214,6 +214,59 @@ public:
 	void suRidePlatformDown();
 	void stRidePlatformDown();
 
+	void stCrashDown();
+	void stCrashDownFinished();
+
+	void upSpitOutFall();
+	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
+	void suFallDown();
+	void stJumpToRingVenusFlyTrap();
+	void stStandIdleSpecial();
+	void stSpitOutFall0();
+	void stFalling();
+	void stSpitOutFall2();
+	void stFallTouchdown();
+	void stJumpAndFall();
+	void stDropFromRing();
+	void stPressDoorButton();
+	void stHitByBoxingGlove();
+	void stHitByBoxingGloveDone();
+	void stMoveVenusFlyTrap();
+	void stContinueMovingVenusFlyTrap();
+	void stMoveVenusFlyTrapDone();
+
+	void suFallSkipJump();
+	void stFallSkipJump();
+
+	void upMoveObject();
+	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
+	void stFetchMatch();
+	void stLightMatch();
+	uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
+	void stMoveObject();
+	void stContinueMoveObject();
+	void stTumbleHeadless();
+	void stCloseEyes();
+
+	uint32 hmSpit(int messageNum, const MessageParam &param, Entity *sender);
+	void stTrySpitIntoPipe();
+	void spitIntoPipe();
+	void stContSpitIntoPipe();
+
+	void suRidePlatform();
+	void stRidePlatform();
+	void stInteractLever();
+	void stPullLever();
+	void stLookLeverDown();
+	void stWaitLeverDown();
+
 	void startWalkingResume(int16 frameIncr);
 
 protected:
@@ -249,7 +302,20 @@ protected:
 
 	int16 _platformDeltaY;
 
+	Sprite *_otherSprite;
+	int _idleTableNum;
+
+	int _moveObjectCountdown;
+
+	bool _canSpitPipe;
+	bool _contSpitPipe;
+	bool _readyToSpit;
+	uint32 _spitPipeIndex;
+	uint32 _spitDestPipeIndex;
+	uint32 _spitContDestPipeIndex;
+
 	virtual void xUpdate();
+	// TODO Check if this can be turned into a void result
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
 	void stIdlePickEar();
@@ -347,33 +413,8 @@ class KmScene1002 : public Klayman {
 public:
 	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	Sprite *_otherSprite;
-	int _idleTableNum;
 	void xUpdate();	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void upSpitOutFall();
-	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
-	void suFallDown();
-	void stJumpToRingVenusFlyTrap();
-	void stStandIdleSpecial();
-	void stSpitOutFall0();
-	void stFalling();
-	void stSpitOutFall2();
-	void stFallTouchdown();
-	void stJumpAndFall();
-	void stDropFromRing();
-	void stPressDoorButton();
-	void stHitByBoxingGlove();
-	void stHitByBoxingGloveDone();
-	void stMoveVenusFlyTrap();
-	void stContinueMovingVenusFlyTrap();
-	void stMoveVenusFlyTrapDone();
 };
 
 class KmScene1004 : public Klayman {
@@ -394,18 +435,7 @@ class KmScene1201 : public Klayman {
 public:
 	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	int _countdown;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void upMoveObject();
-	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
-	void stFetchMatch();
-	void stLightMatch();
-	uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
-	void stMoveObject();
-	void stMoveObjectSkipTurn();
-	void stTumbleHeadless();
-	void stCloseEyes();
 };
 
 class KmScene1303 : public Klayman {
@@ -427,8 +457,6 @@ public:
 	KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stCrashDown();
-	void stCrashDownFinished();
 };
 
 class KmScene1306 : public Klayman {
@@ -485,8 +513,6 @@ public:
 	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void suFallSkipJump();
-	void stFallSkipJump();
 };
 
 class KmScene1901 : public Klayman {
@@ -548,12 +574,6 @@ public:
 	KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void suRidePlatform();
-	void stRidePlatform();
-	void stInteractLever();
-	void stPullLever();
-	void stLookLeverDown();
-	void stWaitLeverDown();
 };
 
 class KmScene2242 : public Klayman {
@@ -587,17 +607,7 @@ class KmScene2401 : public Klayman {
 public:
 	KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
-	bool _canSpitPipe;
-	bool _contSpitPipe;
-	bool _readyToSpit;
-	uint32 _spitPipeIndex;
-	uint32 _spitDestPipeIndex;
-	uint32 _spitContDestPipeIndex;
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	uint32 hmSpit(int messageNum, const MessageParam &param, Entity *sender);
-	void stTrySpitIntoPipe();
-	void spitIntoPipe();
-	void stContSpitIntoPipe();
 };
 
 class KmScene2402 : public Klayman {


Commit: 3ef691f1afe733e21371eca11e170b8d71783f5c
    https://github.com/scummvm/scummvm/commit/3ef691f1afe733e21371eca11e170b8d71783f5c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: Rename

- Also fix compilation (oops)

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 76a2ebf..1036478 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -502,13 +502,13 @@ void Klayman::stTryStandIdle() {
 		_idleCounter = 0;
 		_blinkCounter = 0;
 		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
-		SetUpdateHandler(&Klayman::upIdle);
+		SetUpdateHandler(&Klayman::upStandIdle);
 		SetMessageHandler(&Klayman::hmLowLevel);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-void Klayman::upIdle() {
+void Klayman::upStandIdle() {
 	update();
 	if (++_idleCounter >= 720) {
 		_idleCounter = 0;
@@ -588,7 +588,7 @@ void Klayman::stStandAround() {
 	_status2 = 1;
 	_acceptInput = true;
 	startAnimation(0x5420E254, 0, -1);
-	SetUpdateHandler(&Klayman::upIdle);
+	SetUpdateHandler(&Klayman::upStandIdle);
 	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
 }
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 4d0c969..a7ea670 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -318,6 +318,19 @@ protected:
 	// TODO Check if this can be turned into a void result
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
+	void startWalkToX(int16 x, bool flag);
+	void startWalkToXExt(int16 x);
+	void startWalkToXSmall(int16 x);
+	void startSpecialWalkLeft(int16 x);
+	void startSpecialWalkRight(int16 x);
+	void sub41CC40(int16 x1, int16 x2);
+	void sub41CCE0(int16 x);
+
+	bool stStartActionFromIdle(AnimationCb callback);
+	void gotoNextStateExt();
+	void sub41C770();
+	void sub41C790();
+	
 	void stIdlePickEar();
 	void evIdlePickEarDone();
 	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
@@ -338,20 +351,13 @@ protected:
 	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
 	void upIdleAnimation();
 
-	bool stStartActionFromIdle(AnimationCb callback);
-	void gotoNextStateExt();
-	void sub41C770();
-	void sub41C790();
-	
-	void upIdle();
+	void upStandIdle();
 
 	void stIdleBlink();
 	void stStandAround();
 	
 	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
 
-	void startWalkToX(int16 x, bool flag);
-
 	uint32 hmSleeping(int messageNum, const MessageParam &param, Entity *sender);
 	
 	bool stStartAction(AnimationCb callback3);
@@ -359,7 +365,6 @@ protected:
 	void stSneak();
 	void stWalkingDone();
 	uint32 hmSneaking(int messageNum, const MessageParam &param, Entity *sender);
-	void startSpecialWalkLeft(int16 x);
 	void stStartWalking();
 	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
 
@@ -367,10 +372,6 @@ protected:
 	
 	uint32 hmPressButton(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void startSpecialWalkRight(int16 x);
-	void sub41CC40(int16 x1, int16 x2);
-	void startWalkToXExt(int16 x);
-	void sub41CCE0(int16 x);
 	void stLargeStepDone();
 	
 	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
@@ -393,7 +394,6 @@ protected:
 	
 	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void startWalkToXSmall(int16 x);
 	void stStartWalkingSmall();
 	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender);


Commit: debc7e953d3cda85aefc2fae9325eb8ddf47d5c7
    https://github.com/scummvm/scummvm/commit/debc7e953d3cda85aefc2fae9325eb8ddf47d5c7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: More changes to the Klayman class:

- Rename some stuff
- Reorder methods (in the Klayman header only until I'm happy with it :)

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 1036478..ae08de9 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -60,7 +60,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
 	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
 	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
-	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false) {
+	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
 	
 	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
@@ -301,21 +301,21 @@ void Klayman::upSitIdleTeleporter() {
 	} else if (++_blinkCounter >= _blinkCounterMax) {
 		_blinkCounter = 0;
 		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-		stIdleSitBlink();
+		stSitIdleTeleporterBlink();
 	}
 }
 
-void Klayman::stIdleSitBlink() {
+void Klayman::stSitIdleTeleporterBlink() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stIdleSitBlinkSecond);
+	NextState(&Klayman::stSitIdleTeleporterBlinkSecond);
 }
 
-void Klayman::stIdleSitBlinkSecond() {
+void Klayman::stSitIdleTeleporterBlinkSecond() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
@@ -331,7 +331,7 @@ void Klayman::stPickUpNeedle() {
 		_acceptInput = false;
 		startAnimation(0x1449C169, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPickUpGeneric);
+		SetMessageHandler(&Klayman::hmPickUpObject);
 		SetSpriteUpdate(NULL);
 	}
 }
@@ -675,7 +675,7 @@ bool Klayman::stStartAction(AnimationCb callback3) {
 		startAnimation(0x5C7080D4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartAction);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F250);
+		SetSpriteUpdate(&Klayman::suAction);
 		NextState(callback3);
 		return true;
 	} else {
@@ -684,7 +684,7 @@ bool Klayman::stStartAction(AnimationCb callback3) {
 	}
 }
 
-void Klayman::spriteUpdate41F250() {
+void Klayman::suAction() {
 
 	int16 xdiff = _destX - _x;
 
@@ -715,7 +715,7 @@ void Klayman::spriteUpdate41F250() {
 	
 }
 
-void Klayman::suWalking() {
+void Klayman::suSneaking() {
 	
 	int16 xdiff = _destX - _x;
 	
@@ -770,11 +770,11 @@ void Klayman::stSneak() {
 	startAnimation(0x5C48C506, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmSneaking);
-	SetSpriteUpdate(&Klayman::suWalking);
-	FinalizeState(&Klayman::stWalkingDone);	
+	SetSpriteUpdate(&Klayman::suSneaking);
+	FinalizeState(&Klayman::evSneakingDone);	
 }
 
-void Klayman::stWalkingDone() {
+void Klayman::evSneakingDone() {
 	_isSneaking = false;
 }
 
@@ -810,12 +810,12 @@ void Klayman::stStartWalking() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		FinalizeState(&Klayman::stStartWalkingDone);	
-		NextState(&Klayman::stWalking);
+		FinalizeState(&Klayman::evStartWalkingDone);	
+		NextState(&Klayman::stWalkingFirst);
 	}
 }
 
-void Klayman::stStartWalkingDone() {
+void Klayman::evStartWalkingDone() {
 	_isWalking = false;
 }
 
@@ -833,19 +833,19 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Klayman::stWalking() {
+void Klayman::stWalkingFirst() {
 	_status2 = 0;
 	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	FinalizeState(&Klayman::stStartWalkingDone);	
-	NextState(&Klayman::stUpdateWalking);
+	SetSpriteUpdate(&Klayman::suWalkingFirst);
+	FinalizeState(&Klayman::evStartWalkingDone);	
+	NextState(&Klayman::stUpdateWalkingFirst);
 }
 
-void Klayman::spriteUpdate41F300() {
+void Klayman::suWalkingFirst() {
 	SetSpriteUpdate(&Klayman::suWalkingTestExit);
 	_deltaX = 0;
 }
@@ -864,7 +864,7 @@ uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sen
 	return messageResult;
 }
 
-void Klayman::stUpdateWalking() {
+void Klayman::stUpdateWalkingFirst() {
 	if (_status3 == 2) {
 		gotoNextStateExt();
 	} else if (_status3 == 3) {
@@ -891,8 +891,8 @@ void Klayman::stUpdateWalking() {
 		}
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmSneaking);
-		SetSpriteUpdate(&Klayman::suWalking);
-		FinalizeState(&Klayman::stWalkingDone);	
+		SetSpriteUpdate(&Klayman::suSneaking);
+		FinalizeState(&Klayman::evSneakingDone);	
 	}
 }
 
@@ -962,12 +962,12 @@ void Klayman::stPickUpGeneric() {
 		_acceptInput = false;
 		startAnimation(0x1C28C178, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPickUpGeneric);
+		SetMessageHandler(&Klayman::hmPickUpObject);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPickUpObject(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -991,8 +991,8 @@ uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam &param, Entit
 
 }
 
-void Klayman::stTurnPressButton() {
-	if (!stStartAction(AnimationCallback(&Klayman::stTurnPressButton))) {
+void Klayman::stPressButton() {
+	if (!stStartAction(AnimationCallback(&Klayman::stPressButton))) {
 		_status2 = 2;
 		_acceptInput = true;
 		startAnimation(0x1C02B03D, 0, -1);
@@ -1018,8 +1018,8 @@ uint32 Klayman::hmPressButton(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Klayman::stStampFloorButton() {
-	if (!stStartAction(AnimationCallback(&Klayman::stStampFloorButton))) {
+void Klayman::stPressFloorButton() {
+	if (!stStartAction(AnimationCallback(&Klayman::stPressFloorButton))) {
 		_status2 = 2;
 		_acceptInput = true;
 		startAnimation(0x1C16B033, 0, -1);
@@ -1036,7 +1036,7 @@ void Klayman::stPressButtonSide() {
 		startAnimation(0x1CD89029, 0, -1);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteUpdate(&Klayman::spriteUpdate41F250);
+		SetSpriteUpdate(&Klayman::suAction);
 	}
 }
 
@@ -1093,7 +1093,7 @@ void Klayman::stStartWalkingSmall() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalkingSmall);
 	SetSpriteUpdate(&Klayman::suWalkingTestExit);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	FinalizeState(&Klayman::evStartWalkingDone);
 }
 
 uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1221,7 +1221,7 @@ void Klayman::stPullCord() {
 		_acceptInput = false;
 		startAnimation(0x3F28E094, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPullCord);
+		SetMessageHandler(&Klayman::hmPullReleaseCord);
 		SetSpriteUpdate(NULL);
 		NextState(&Klayman::stReleaseCord);
 	}
@@ -1231,11 +1231,11 @@ void Klayman::stReleaseCord() {
 	_acceptInput = false;
 	startAnimation(0x3A28C094, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmPullCord);
+	SetMessageHandler(&Klayman::hmPullReleaseCord);
 	SetSpriteUpdate(NULL);
 }
 
-uint32 Klayman::hmPullCord(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmPullReleaseCord(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1286,16 +1286,16 @@ uint32 Klayman::hmUseTube(int messageNum, const MessageParam &param, Entity *sen
 	return messageResult;
 }
 
-void Klayman::stWalkingExt() {
+void Klayman::stWalkingFirstExt() {
 	_status2 = 0;
 	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x5A2CBC00, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	SetSpriteUpdate(&Klayman::suWalkingFirst);
+	NextState(&Klayman::stUpdateWalkingFirst);
+	FinalizeState(&Klayman::evStartWalkingDone);
 }
 
 void Klayman::stStartWalkingExt() {
@@ -1308,8 +1308,8 @@ void Klayman::stStartWalkingExt() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		FinalizeState(&Klayman::stStartWalkingDone);
-		NextState(&Klayman::stWalkingExt);
+		FinalizeState(&Klayman::evStartWalkingDone);
+		NextState(&Klayman::stWalkingFirstExt);
 	}
 }
 
@@ -1588,7 +1588,7 @@ void Klayman::stJumpToRing3() {
 		SetUpdateHandler(&Klayman::update);
 		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmJumpToRing3);
-		NextState(&Klayman::stHoldRing);
+		NextState(&Klayman::stHoldRing3);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
 }
@@ -1611,16 +1611,16 @@ uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Klayman::stHoldRing() {
+void Klayman::stHoldRing3() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x4A293FB0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmHoldRing);
+	SetMessageHandler(&Klayman::hmHoldRing3);
 	SetSpriteUpdate(NULL);
 }
 
-uint32 Klayman::hmHoldRing(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmHoldRing3(int messageNum, const MessageParam &param, Entity *sender) {
 	if (messageNum == 0x1008) {
 		stReleaseRing();
 		return 0;
@@ -1702,21 +1702,21 @@ void Klayman::stClimbLadderHalf() {
 		_acceptInput = false;
 		startAnimationByHash(0x3A292504, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41DFD0);
+		SetMessageHandler(&Klayman::hmClimbLadderHalf);
 		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	} else if (_ladderStatus == 2) {
 		_ladderStatus = 0;
 		_acceptInput = false;
 		startAnimationByHash(0x122D1505, 0x02421405, 0);
 		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::handleMessage41DFD0);
+		SetMessageHandler(&Klayman::hmClimbLadderHalf);
 		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	} else {
 		gotoNextStateExt();
 	}
 }
 
-uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmClimbLadderHalf(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -2077,10 +2077,10 @@ void Klayman::stReleaseLever() {
 
 void Klayman::stLetGoOfLever() {
 	startAnimation(0x0928C048, 0, -1);
-	FinalizeState(&Klayman::cbLeverReleasedEvent);
+	FinalizeState(&Klayman::evLeverReleasedEvent);
 }
 
-void Klayman::cbLeverReleasedEvent() {
+void Klayman::evLeverReleasedEvent() {
 	sendMessage(_attachedSprite, 0x482A, 0);
 }
 
@@ -2101,7 +2101,7 @@ void Klayman::stInsertDisk() {
 		} else {
 			startAnimation(0xD8C8D100, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
+			SetSpriteUpdate(&Klayman::suAction);
 			SetMessageHandler(&Klayman::hmInsertDisk);
 			_acceptInput = false;
 			_tapesToInsert--;
@@ -2249,8 +2249,8 @@ void Klayman::stJumpToGrabRelease() {
 	_acceptInput = false;
 	startAnimationByHash(0x00AB8C10, 0x320AC306, 0);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::hmJumpToGrabRelease);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stReleaseRing);
 }
 
@@ -2276,7 +2276,7 @@ void Klayman::stIdleTeleporterHands() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stIdleSitBlinkSecond);
+	NextState(&Klayman::stSitIdleTeleporterBlinkSecond);
 }
 
 void Klayman::stDoIdleTeleporterHands2() {
@@ -2290,7 +2290,7 @@ void Klayman::stIdleTeleporterHands2() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stIdleSitBlinkSecond);
+	NextState(&Klayman::stSitIdleTeleporterBlinkSecond);
 }
 
 void Klayman::teleporterAppear(uint32 fileHash) {
@@ -2519,7 +2519,7 @@ void Klayman::stInsertKey() {
 			_acceptInput = false;
 			startAnimation(0xDC409440, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::spriteUpdate41F250);
+			SetSpriteUpdate(&Klayman::suAction);
 			SetMessageHandler(&Klayman::hmInsertKey);
 			_keysToInsert--;
 		}
@@ -2676,7 +2676,7 @@ void Klayman::suRidePlatformDown() {
 }
 
 void Klayman::stRidePlatformDown() {
-	if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) {
+	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatformDown))) {
 		_status2 = 1;
 		sendMessage(_parentScene, 0x4803, 0);
 		_acceptInput = false;
@@ -2697,7 +2697,7 @@ void Klayman::stCrashDown() {
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	NextState(&KmScene1305::stCrashDownFinished);
+	NextState(&Klayman::stCrashDownFinished);
 }
 
 void Klayman::stCrashDownFinished() {
@@ -2902,6 +2902,18 @@ void Klayman::stSpitOutFall0() {
 	sendMessage(_parentScene, 0x8000, 0);
 }
 
+void Klayman::stSpitOutFall2() {
+	_countdown1 = 1;
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x9308C132, 0, -1);
+	SetUpdateHandler(&Klayman::upSpitOutFall);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	SetSpriteUpdate(&Klayman::suFallDown);
+	NextState(&Klayman::stFalling);
+	sendMessage(_parentScene, 0x8000, 0);
+}
+
 void Klayman::stFalling() {
 	sendMessage(_parentScene, 0x1024, 1);
 	playSound(0, 0x41648271);
@@ -2919,18 +2931,6 @@ void Klayman::stFalling() {
 	sendMessage(_parentScene, 0x8001, 0);
 }
 
-void Klayman::stSpitOutFall2() {
-	_countdown1 = 1;
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x9308C132, 0, -1);
-	SetUpdateHandler(&Klayman::upSpitOutFall);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(&Klayman::suFallDown);
-	NextState(&Klayman::stFalling);
-	sendMessage(_parentScene, 0x8000, 0);
-}
-
 void Klayman::stFallTouchdown() {
 	setDoDeltaX(2);
 	stTryStandIdle();
@@ -2971,7 +2971,7 @@ void Klayman::stPressDoorButton() {
 	startAnimation(0x1CD89029, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmPressDoorButton);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F250);
+	SetSpriteUpdate(&Klayman::suAction);
 }
 
 void Klayman::stHitByBoxingGlove() {
@@ -2981,10 +2981,10 @@ void Klayman::stHitByBoxingGlove() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmHitByBoxingGlove);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	FinalizeState(&Klayman::stHitByBoxingGloveDone);
+	FinalizeState(&Klayman::evHitByBoxingGloveDone);
 }
 
-void Klayman::stHitByBoxingGloveDone() {
+void Klayman::evHitByBoxingGloveDone() {
 	sendMessage(_parentScene, 0x1024, 1);
 }
 
@@ -2998,7 +2998,7 @@ void Klayman::stMoveVenusFlyTrap() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmMoveVenusFlyTrap);
 		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		FinalizeState(&Klayman::stMoveVenusFlyTrapDone);
+		FinalizeState(&Klayman::evMoveVenusFlyTrapDone);
 	}
 }
 
@@ -3009,10 +3009,10 @@ void Klayman::stContinueMovingVenusFlyTrap() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmMoveVenusFlyTrap);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	FinalizeState(&Klayman::stMoveVenusFlyTrapDone);
+	FinalizeState(&Klayman::evMoveVenusFlyTrapDone);
 }
 
-void Klayman::stMoveVenusFlyTrapDone() {
+void Klayman::evMoveVenusFlyTrapDone() {
 	sendMessage(_attachedSprite, 0x482A, 0);
 }
 
@@ -3292,9 +3292,9 @@ void Klayman::startWalkingResume(int16 frameIncr) {
 	startAnimation(0x1A249001, frameIndex, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::spriteUpdate41F300);
-	NextState(&Klayman::stUpdateWalking);
-	FinalizeState(&Klayman::stStartWalkingDone);
+	SetSpriteUpdate(&Klayman::suWalkingFirst);
+	NextState(&Klayman::stUpdateWalkingFirst);
+	FinalizeState(&Klayman::evStartWalkingDone);
 }
 
 //##############################################################################
@@ -3326,9 +3326,9 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -3592,7 +3592,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&Klayman::stWalking);
+			GotoState(&Klayman::stWalkingFirst);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -3838,9 +3838,9 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -4031,9 +4031,9 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		}
@@ -4510,7 +4510,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&Klayman::stWalking);
+			GotoState(&Klayman::stWalkingFirst);
 		} else
 			GotoState(&Klayman::stPeekWall);
 		break;
@@ -4587,9 +4587,9 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -4734,9 +4734,9 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -4836,6 +4836,7 @@ void KmScene2205::stStartWalkingResume() {
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
+    _walkResumeFrameIncr = 1;
 	_vm->_soundMan->addSound(0x80101800, 0xD3B02847);
 }
 
@@ -4876,9 +4877,9 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -4971,9 +4972,9 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -5213,9 +5214,9 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -5300,7 +5301,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&Klayman::stWalking);
+			GotoState(&Klayman::stWalkingFirst);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5310,9 +5311,9 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -5374,9 +5375,9 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case NM_KLAYMAN_PRESS_BUTTON:
 		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnPressButton);
+			GotoState(&Klayman::stPressButton);
 		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stStampFloorButton);
+			GotoState(&Klayman::stPressFloorButton);
 		} else {
 			GotoState(&Klayman::stPressButtonSide);
 		} 
@@ -5455,7 +5456,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&Klayman::stWalking);
+			GotoState(&Klayman::stWalkingFirst);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index a7ea670..89c59b6 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -52,223 +52,330 @@ public:
 
 	void update();
 
+	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
+	void upIdleAnimation();
+
 	void stDoIdlePickEar();
+	void stIdlePickEar();
+	void evIdlePickEarDone();
+	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
+
 	void stDoIdleSpinHead();
+	void stIdleSpinHead();
+	uint32 hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender);
+
 	void stDoIdleArms();
+	void stIdleArms();
+	void evIdleArmsDone();
+	uint32 hmIdleArms(int messageNum, const MessageParam &param, Entity *sender);
+	
 	void stDoIdleChest();
+	void stIdleChest();
+	uint32 hmIdleChest(int messageNum, const MessageParam &param, Entity *sender);
+	
 	void stDoIdleHeadOff();
+	void stIdleHeadOff();
+	uint32 hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stDoIdleTeleporterHands();
+	void stIdleTeleporterHands();
+	
+	void stDoIdleTeleporterHands2();
+	void stIdleTeleporterHands2();
+
 	void stTryStandIdle();
-	void stWakeUp();
-	void stSleeping();
-	void stPickUpGeneric();
-	void stTurnPressButton();
-	void stStampFloorButton();
-	void stPressButtonSide();
-	void stLargeStep();
-	void stWonderAboutHalf();
-	void stWonderAboutAfter();
-	void stTurnToUseHalf();
-	void stTurnAwayFromUse();
-	void stWonderAbout();
-	void stPeekWall();
-	void stJumpToRing1();
-	void setupJumpToRing();
-	void stHangOnRing();
-	void stJumpToRing2();
-	void stJumpToRing3();
-	void stHoldRing();
-	void stReleaseRing();
-	void stJumpToRing4();
-	void stContinueClimbLadderUp();
-	void stStartClimbLadderDown();
-	void stClimbLadderHalf();
-	void stStartClimbLadderUp();
+	void stStandAround();
+	void upStandIdle();
+	void stIdleBlink();
+	
+	bool stStartAction(AnimationCb callback3);
+	bool stStartActionFromIdle(AnimationCb callback);
+	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stSneak();
+	uint32 hmSneaking(int messageNum, const MessageParam &param, Entity *sender);
+	void suSneaking();
+	void evSneakingDone();
+
+	void stStartWalking();
+	void stStartWalkingExt();
+	void stWalkingOpenDoor();
+	void suWalkingOpenDoor();
+	void stStepOver();
+	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
+	void evStartWalkingDone();
+
+	void stWalkingFirst();
+	void stWalkingFirstExt();
+	void startWalkingResume(int16 frameIncr);
+	void stUpdateWalkingFirst();
+	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
+	void suWalkingFirst();
+
 	void stWalkToFrontNoStep();
 	void stWalkToFront();
 	void stTurnToFront();
 	void stTurnToBack();
-	void stLandOnFeet();
+	uint32 hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender);
+
 	void stTurnToBackToUse();
-	void stClayDoorOpen();
-	void stTurnToUse();
-	void stReturnFromUse();
-	void stWalkingOpenDoor();
-	void stSitIdleTeleporter();
-	void stIdleSitBlink();
-	void stIdleSitBlinkSecond();
+	uint32 hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPickUpGeneric();
 	void stPickUpNeedle();
-	void stPickUpTube();
-	void stTurnToUseInTeleporter();
-	void stReturnFromUseInTeleporter();
-	void stStepOver();
-	void stSitInTeleporter();
-	void stGetUpFromTeleporter();
-	void stMoveObjectSkipTurnFaceObject();
-	void evMoveObjectTurnDone();
-	void stMoveObjectSkipTurn();
-	void stMoveObjectFaceObject();
-	void stUseLever();
-	void stPullLeverDown();
-	void stHoldLeverDown();
-	void stUseLeverRelease();
-	void stReleaseLever();
-	void stLetGoOfLever();
-	void cbLeverReleasedEvent();
-	void stInsertDisk();
-	void stWalking();
-	void stUpdateWalking();
-	void stStartWalkingDone();
+	uint32 hmPickUpObject(int messageNum, const MessageParam &param, Entity *sender);
 
-	void stopWalking();
+	void stPickUpTube();
+	uint32 hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void spriteUpdate41F250();
-	void suWalking();
-	void suLargeStep();
-	void suUpdateDestX();
-	void suWalkingOpenDoor();
-	void spriteUpdate41F300();
-	void suWalkingTestExit();
+	void stTurnToUse();
+	void stTurnToUseHalf();
+	void stTurnAwayFromUse();
+	void stReturnFromUse();
+	void stTurnToUseExt();
+	uint32 hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender);
 
-	uint32 hmLowLevel(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmLever(int messageNum, const MessageParam &param, Entity *sender);
+	void stLargeStep();
+	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
 
-	void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount);
-	void setKlaymanIdleTable1();
-	void setKlaymanIdleTable2();
-	void setKlaymanIdleTable3();
-	
-	void setSoundFlag(bool value) { _soundFlag = value; }
+	void stInsertKey();
+	uint32 hmInsertKey(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stReadNote();
+	uint32 hmReadNote(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stHitByDoor();
+	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPeekWall();
+	uint32 hmPeekWall(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPeekWallReturn();
+	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPeekWallBlink();
+	void upPeekWallBlink();
+
+	void stPeekWall1();
+
+	void stPeekWall2();
+
+	void stPullHammerLever();
+	uint32 hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stRidePlatformDown();
+	void suRidePlatformDown();
+
+	void stCrashDown();
+	void stCrashDownFinished();
+
+	void stShrink();
+	uint32 hmShrink(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stGrow();
+	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stDrinkPotion();
+	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
 
-	void stStandIdleSmall();
-	void stWonderAboutAfterSmall();
-	void stWonderAboutHalfSmall();
-	void stWonderAboutSmall();
-	void stWalkToFrontNoStepSmall();
-	void stWalkToFront2Small();
-	void stWalkToFrontSmall();
-	void stTurnToBackHalfSmall();
-	void stTurnToBackWalkSmall();
-	void stTurnToBackSmall();
 	void stPullCord();
 	void stReleaseCord();
-	uint32 hmPullCord(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPullReleaseCord(int messageNum, const MessageParam &param, Entity *sender);
+
 	void stUseTube();
 	uint32 hmUseTube(int messageNum, const MessageParam &param, Entity *sender);
-	void stWalkingExt();
-	void stStartWalkingExt();
-	
+
+	void stUseLever();
+	void stUseLeverRelease();
+	void stReleaseLever();
+	void stInteractLever();
+	uint32 hmLever(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stLetGoOfLever();
+	void evLeverReleasedEvent();
+
+	void stWakeUp();
+
+	void stSleeping();
+	uint32 hmSleeping(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPressButton();
+	void stPressFloorButton();
+	void stPressButtonSide();
+	uint32 hmPressButton(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stWonderAbout();
+	void stWonderAboutHalf();
+	void stWonderAboutAfter();
+
+	void stStandWonderAbout();
+
+	void stStartClimbLadderUp();
+	void stStartClimbLadderDown();
+	uint32 hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stContinueClimbLadderUp();
+
+	void stClimbLadderHalf();
+	uint32 hmClimbLadderHalf(int messageNum, const MessageParam &param, Entity *sender);
+
+	void setupJumpToRing();
+	void stJumpToRing1();
+	void stJumpToRing2();
+	void stJumpToRing4();
+	uint32 hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stHangOnRing();
+
+	void stJumpToRing3();
+	uint32 hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stHoldRing3();
+	uint32 hmHoldRing3(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stReleaseRing();
+
+	void stLandOnFeet();
+	uint32 hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPullLeverDown();
+	void stHoldLeverDown();
+
+	void stInsertDisk();
+	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stMoveObjectSkipTurnFaceObject();
+	void stMoveObjectSkipTurn();
+	void stMoveObjectFaceObject();
+	uint32 hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender);
+	void evMoveObjectTurnDone();
+
 	void stJumpToGrab();
-	void suJumpToGrab();
-	uint32 hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void sub421230();//stGrow??
-	uint32 handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stTurnToUseExt();
 	void stJumpToGrabFall();
+	uint32 hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender);
+	void suJumpToGrab();
 	
 	void stJumpToGrabRelease();
 	uint32 hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void stDoIdleTeleporterHands();
-	void stIdleTeleporterHands();
-	
-	void stDoIdleTeleporterHands2();
-	void stIdleTeleporterHands2();
+	void stSitInTeleporter();
+	uint32 hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stSitIdleTeleporter();
+	void upSitIdleTeleporter();
+
+	void stSitIdleTeleporterBlink();
+
+	void stSitIdleTeleporterBlinkSecond();
+
+	void stTurnToUseInTeleporter();
+
+	void stReturnFromUseInTeleporter();
+
+	void stGetUpFromTeleporter();
 
 	void teleporterAppear(uint32 fileHash);
 	void teleporterDisappear(uint32 fileHash);
 	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
 
-	uint32 hmShrink(int messageNum, const MessageParam &param, Entity *sender);
-	void stShrink();
-
-	void stStandWonderAbout();
+	void stClayDoorOpen();
+	uint32 hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender);
 
-	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
-	void stGrow();
-	void stDrinkPotion();
+	void stFallSkipJump();
+	void suFallSkipJump();
 
-	uint32 hmInsertKey(int messageNum, const MessageParam &param, Entity *sender);
-	void stInsertKey();
+	void stMoveObject();
+	void stContinueMoveObject();
+	uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
+	void upMoveObject();
 
-	uint32 hmReadNote(int messageNum, const MessageParam &param, Entity *sender);
-	void stReadNote();
+	void stCloseEyes();
 
-	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
-	void stHitByDoor();
+	void stTumbleHeadless();
+	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
 
-	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
-	void upPeekWallBlink();
-	void stPeekWall1();
-	void stPeekWall2();
-	void stPeekWallBlink();
-	void stPeekWallReturn();
+	void stFetchMatch();
+	void stLightMatch();
+	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
 
-	void stPullHammerLever();
-	uint32 hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender);
+	void stHitByBoxingGlove();
+	uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
+	void evHitByBoxingGloveDone();
 
-	void suRidePlatformDown();
-	void stRidePlatformDown();
+	void stStandIdleSmall();
+	void stWonderAboutSmall();
+	void stWonderAboutHalfSmall();
+	void stWonderAboutAfterSmall();
 
-	void stCrashDown();
-	void stCrashDownFinished();
+	void stWalkToFrontNoStepSmall();
+	void stWalkToFrontSmall();
+	void stWalkToFront2Small();
+	void stTurnToBackHalfSmall();
+	void stTurnToBackWalkSmall();
+	void stTurnToBackSmall();
+	uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender);
 
-	void upSpitOutFall();
+	void sub421230();//stGrow??
+	uint32 handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender);
+	
+	void stJumpToRingVenusFlyTrap();
 	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stDropFromRing();
+
+	void stStandIdleSpecial();
 	uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stPressDoorButton();
 	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
-	void suFallDown();
-	void stJumpToRingVenusFlyTrap();
-	void stStandIdleSpecial();
+
 	void stSpitOutFall0();
-	void stFalling();
 	void stSpitOutFall2();
-	void stFallTouchdown();
+	void suFallDown();
+	void upSpitOutFall();
+
 	void stJumpAndFall();
-	void stDropFromRing();
-	void stPressDoorButton();
-	void stHitByBoxingGlove();
-	void stHitByBoxingGloveDone();
+	uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
+
+	void stFalling();
+	void stFallTouchdown();
+
 	void stMoveVenusFlyTrap();
 	void stContinueMovingVenusFlyTrap();
-	void stMoveVenusFlyTrapDone();
+	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
+	void evMoveVenusFlyTrapDone();
 
-	void suFallSkipJump();
-	void stFallSkipJump();
+	////////////////////////////////////////////////////////////////////////////
 
-	void upMoveObject();
-	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
-	void stFetchMatch();
-	void stLightMatch();
-	uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
-	void stMoveObject();
-	void stContinueMoveObject();
-	void stTumbleHeadless();
-	void stCloseEyes();
+	void stopWalking();
+	
+	void suAction();
+	void suLargeStep();
+	void suUpdateDestX();
+	void suWalkingTestExit();
+
+	uint32 hmLowLevel(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender);
+
+	void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount);
+	void setKlaymanIdleTable1();
+	void setKlaymanIdleTable2();
+	void setKlaymanIdleTable3();
+	
+	void setSoundFlag(bool value) { _soundFlag = value; }
 
-	uint32 hmSpit(int messageNum, const MessageParam &param, Entity *sender);
-	void stTrySpitIntoPipe();
 	void spitIntoPipe();
+	void stTrySpitIntoPipe();
 	void stContSpitIntoPipe();
+	uint32 hmSpit(int messageNum, const MessageParam &param, Entity *sender);
 
-	void suRidePlatform();
 	void stRidePlatform();
-	void stInteractLever();
+	void suRidePlatform();
 	void stPullLever();
 	void stLookLeverDown();
 	void stWaitLeverDown();
 
-	void startWalkingResume(int16 frameIncr);
-
 protected:
 	Entity *_parentScene;
 	Sprite *_attachedSprite;
@@ -305,6 +412,8 @@ protected:
 	Sprite *_otherSprite;
 	int _idleTableNum;
 
+    int16 _walkResumeFrameIncr;
+
 	int _moveObjectCountdown;
 
 	bool _canSpitPipe;
@@ -326,77 +435,14 @@ protected:
 	void sub41CC40(int16 x1, int16 x2);
 	void sub41CCE0(int16 x);
 
-	bool stStartActionFromIdle(AnimationCb callback);
 	void gotoNextStateExt();
 	void sub41C770();
 	void sub41C790();
-	
-	void stIdlePickEar();
-	void evIdlePickEarDone();
-	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stIdleSpinHead();
-	uint32 hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stIdleArms();
-	void evIdleArmsDone();
-	uint32 hmIdleArms(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stIdleChest();
-	uint32 hmIdleChest(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stIdleHeadOff();
-	uint32 hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender);
 
-	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
-	void upIdleAnimation();
-
-	void upStandIdle();
-
-	void stIdleBlink();
-	void stStandAround();
-	
-	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
-
-	uint32 hmSleeping(int messageNum, const MessageParam &param, Entity *sender);
-	
-	bool stStartAction(AnimationCb callback3);
-	
-	void stSneak();
-	void stWalkingDone();
-	uint32 hmSneaking(int messageNum, const MessageParam &param, Entity *sender);
-	void stStartWalking();
-	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
-
-	uint32 hmPickUpGeneric(int messageNum, const MessageParam &param, Entity *sender);
-	
-	uint32 hmPressButton(int messageNum, const MessageParam &param, Entity *sender);
-	
 	void stLargeStepDone();
 	
-	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmPeekWall(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmHoldRing(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage41DFD0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void upSitIdleTeleporter();
-	
-	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
-	
 	void stStartWalkingSmall();
 	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void walkAlongPathPoints();
 	


Commit: bb4bda740489193ee13b4b7f4bff9e839df3f63a
    https://github.com/scummvm/scummvm/commit/bb4bda740489193ee13b4b7f4bff9e839df3f63a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: More minor Klayman changes:

- Normalize the calling order of the Set... macros
- Actually use _walkResumeFrameIncr, change stStartWalkingResume

Changed paths:
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h



diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index ae08de9..93cc49e 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -273,10 +273,10 @@ void Klayman::stSitIdleTeleporter() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0x582EC138, 0, -1);
-	_idleCounter = 0;
-	SetSpriteUpdate(NULL);
 	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
 	SetMessageHandler(&Klayman::hmLowLevel);
+	SetSpriteUpdate(NULL);
+	_idleCounter = 0;
 	_blinkCounter = 0;
 	_idleCounterMax = 8;
 	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
@@ -475,7 +475,7 @@ void Klayman::gotoNextStateExt() {
 		AnimationCb cb = _nextStateCb;
 		_nextStateCb = NULL;
 		(this->*cb)();
-#if 0 // TODO		
+#if 0 // TODO (So far, with almost all Klayman subclasses implemented, _callbackList and related code seems unused)
 	} else if (_callbackList) {
 		removeCallbackList();
 #endif		
@@ -499,12 +499,12 @@ void Klayman::stTryStandIdle() {
 		_status2 = 1;
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
-		_idleCounter = 0;
-		_blinkCounter = 0;
-		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 		SetUpdateHandler(&Klayman::upStandIdle);
 		SetMessageHandler(&Klayman::hmLowLevel);
 		SetSpriteUpdate(NULL);
+		_idleCounter = 0;
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 	}
 }
 
@@ -810,8 +810,8 @@ void Klayman::stStartWalking() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		FinalizeState(&Klayman::evStartWalkingDone);	
 		NextState(&Klayman::stWalkingFirst);
+		FinalizeState(&Klayman::evStartWalkingDone);	
 	}
 }
 
@@ -841,8 +841,8 @@ void Klayman::stWalkingFirst() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmWalking);
 	SetSpriteUpdate(&Klayman::suWalkingFirst);
-	FinalizeState(&Klayman::evStartWalkingDone);	
 	NextState(&Klayman::stUpdateWalkingFirst);
+	FinalizeState(&Klayman::evStartWalkingDone);	
 }
 
 void Klayman::suWalkingFirst() {
@@ -1308,8 +1308,8 @@ void Klayman::stStartWalkingExt() {
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmStartWalking);
 		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		FinalizeState(&Klayman::evStartWalkingDone);
 		NextState(&Klayman::stWalkingFirstExt);
+		FinalizeState(&Klayman::evStartWalkingDone);
 	}
 }
 
@@ -1373,10 +1373,10 @@ void Klayman::stLargeStep() {
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLargeStep);
 	SetSpriteUpdate(&Klayman::suLargeStep);
-	FinalizeState(&Klayman::stLargeStepDone);	
+	FinalizeState(&Klayman::evLargeStepDone);	
 }
 
-void Klayman::stLargeStepDone() {
+void Klayman::evLargeStepDone() {
 	_isLargeStep = false;
 }
 
@@ -1901,8 +1901,8 @@ void Klayman::stClayDoorOpen() {
 		_acceptInput = false;
 		startAnimation(0x5CCCB330, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmClayDoorOpen);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -1934,8 +1934,8 @@ void Klayman::stReturnFromUse() {
 	_acceptInput = false;
 	startAnimation(0x98F88391, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmTurnToUse);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
 void Klayman::stWalkingOpenDoor() {
@@ -1943,8 +1943,8 @@ void Klayman::stWalkingOpenDoor() {
 	_acceptInput = false;
 	startAnimation(0x11A8E012, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suWalkingOpenDoor);
 	SetMessageHandler(&Klayman::hmStartWalking);
+	SetSpriteUpdate(&Klayman::suWalkingOpenDoor);
 }
 
 void Klayman::suWalkingOpenDoor() {
@@ -2011,8 +2011,8 @@ void Klayman::stMoveObjectFaceObject() {
 		_acceptInput = true;
 		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmMoveObjectTurn);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 	}
 }
 
@@ -2024,9 +2024,9 @@ void Klayman::stUseLever() {
 		} else {
 			sendMessage(_attachedSprite, 0x482B, 0);
 			startAnimation(0x0C303040, 0, -1);
-			SetUpdateHandler(&Klayman::update);
 			SetSpriteUpdate(&Klayman::suUpdateDestX);
 			SetMessageHandler(&Klayman::hmLever);
+			SetUpdateHandler(&Klayman::update);
 			NextState(&Klayman::stPullLeverDown);
 			_acceptInput = false;
 		}
@@ -2043,8 +2043,8 @@ void Klayman::stPullLeverDown() {
 void Klayman::stHoldLeverDown() {
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmLowLevel);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	_isLeverDown = true;
 	_acceptInput = true;
 }
@@ -2052,8 +2052,8 @@ void Klayman::stHoldLeverDown() {
 void Klayman::stUseLeverRelease() {
 	startAnimation(0x09018068, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmLever);
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	sendMessage(_attachedSprite, 0x4807, 0);
 	NextState(&Klayman::stPullLeverDown);
 	_acceptInput = false;
@@ -2064,8 +2064,8 @@ void Klayman::stReleaseLever() {
 		_status2 = 2;
 		startAnimation(0x09018068, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		SetMessageHandler(&Klayman::hmLever);
+		SetSpriteUpdate(&Klayman::suUpdateDestX);
 		sendMessage(_attachedSprite, 0x4807, 0);
 		NextState(&Klayman::stLetGoOfLever);
 		_acceptInput = false;
@@ -2101,8 +2101,8 @@ void Klayman::stInsertDisk() {
 		} else {
 			startAnimation(0xD8C8D100, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::suAction);
 			SetMessageHandler(&Klayman::hmInsertDisk);
+			SetSpriteUpdate(&Klayman::suAction);
 			_acceptInput = false;
 			_tapesToInsert--;
 		}
@@ -2341,11 +2341,11 @@ uint32 Klayman::hmShrink(int messageNum, const MessageParam &param, Entity *send
 void Klayman::stShrink() {
 	_status2 = 0;
 	_acceptInput = false;
-	startAnimation(0x1AE88904, 0, -1);
 	playSound(0, 0x4C69EA53);
+	startAnimation(0x1AE88904, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&Klayman::hmShrink);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
 void Klayman::stStandWonderAbout() {
@@ -2354,10 +2354,10 @@ void Klayman::stStandWonderAbout() {
 	_status2 = 0;
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, -1);
-	_newStickFrameIndex = 10;
 	SetUpdateHandler(&Klayman::update);
 	SetMessageHandler(&Klayman::hmLowLevel);
 	SetSpriteUpdate(NULL);
+	_newStickFrameIndex = 10;
 }
 
 uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2519,8 +2519,8 @@ void Klayman::stInsertKey() {
 			_acceptInput = false;
 			startAnimation(0xDC409440, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::suAction);
 			SetMessageHandler(&Klayman::hmInsertKey);
+			SetSpriteUpdate(&Klayman::suAction);
 			_keysToInsert--;
 		}
 	}
@@ -2576,8 +2576,8 @@ void Klayman::stHitByDoor() {
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&Klayman::hmHitByDoor);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	playSound(0, 0x402E82D4);
 }
 
@@ -2611,8 +2611,8 @@ void Klayman::stPeekWall1() {
 	_acceptInput = true;
 	startAnimation(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
 	NextState(&Klayman::stPeekWallBlink);
 }
 
@@ -2642,8 +2642,8 @@ void Klayman::stPeekWallReturn() {
 	_acceptInput = false;
 	startAnimation(0x2426932E, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::hmPeekWallReturn);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stPullHammerLever() {
@@ -2872,8 +2872,8 @@ void Klayman::stJumpToRingVenusFlyTrap() {
 		_acceptInput = false;
 		startAnimation(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&Klayman::hmJumpToRingVenusFlyTrap);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		NextState(&Klayman::stLandOnFeet);
 		sendMessage(_attachedSprite, 0x482B, 0);
 	}
@@ -2886,8 +2886,8 @@ void Klayman::stStandIdleSpecial() {
 	_surface->setVisible(false);
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::hmStandIdleSpecial);
+	SetSpriteUpdate(NULL);
 }
 
 void Klayman::stSpitOutFall0() {
@@ -2926,7 +2926,7 @@ void Klayman::stFalling() {
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	NextState(&Klayman::stFallTouchdown);
 	sendMessage(_parentScene, 0x2002, 0);
-	// TODO _callbackList = NULL;
+	// TODO _callbackList = NULL; (See comment above)
 	_attachedSprite = NULL;
 	sendMessage(_parentScene, 0x8001, 0);
 }
@@ -3069,8 +3069,8 @@ void Klayman::stFetchMatch() {
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		startAnimation(0x9CAA0218, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(NULL);
 		SetMessageHandler(&Klayman::hmMatch);
+		SetSpriteUpdate(NULL);
 		NextState(&Klayman::stLightMatch);
 	}
 }
@@ -3081,8 +3081,8 @@ void Klayman::stLightMatch() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	startAnimation(0x1222A513, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&Klayman::hmMatch);
+	SetSpriteUpdate(NULL);
 }
 
 uint32 Klayman::hmMoveObject(int messageNum, const MessageParam &param, Entity *sender) {
@@ -3124,8 +3124,8 @@ void Klayman::stMoveObject() {
 		setDoDeltaX(0);
 		startAnimation(0x0C1CA072, 0, -1);
 		SetUpdateHandler(&Klayman::upMoveObject);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&Klayman::hmMoveObject);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	}
 }
 
@@ -3144,8 +3144,8 @@ void Klayman::stTumbleHeadless() {
 		setDoDeltaX(0);
 		startAnimation(0x2821C590, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		SetMessageHandler(&Klayman::hmTumbleHeadless);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 		NextState(&Klayman::stTryStandIdle);
 		sendMessage(_parentScene, 0x8000, 0);
 		playSound(0, 0x62E0A356);
@@ -3158,8 +3158,8 @@ void Klayman::stCloseEyes() {
 		_acceptInput = false;		
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(NULL);
 		SetMessageHandler(&Klayman::hmLowLevel);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -3236,8 +3236,8 @@ void Klayman::stRidePlatform() {
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::suRidePlatform);
 		SetMessageHandler(&Klayman::hmLowLevel);
+		SetSpriteUpdate(&Klayman::suRidePlatform);
 	}
 }
 
@@ -3250,8 +3250,8 @@ void Klayman::stInteractLever() {
 			_acceptInput = false;
 			startAnimation(0x0C303040, 0, -1);
 			SetUpdateHandler(&Klayman::update);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
 			SetMessageHandler(&Klayman::hmLever);
+			SetSpriteUpdate(&Klayman::suUpdateDestX);
 			NextState(&Klayman::stPullLever);
 		}
 	}
@@ -3259,31 +3259,30 @@ void Klayman::stInteractLever() {
 
 void Klayman::stPullLever() {
 	startAnimation(0x0D318140, 0, -1);
-	sendMessage(_attachedSprite, 0x480F, 0);
 	NextState(&Klayman::stLookLeverDown);
+	sendMessage(_attachedSprite, 0x480F, 0);
 }
 
 void Klayman::stLookLeverDown() {
+	_acceptInput = true;
+	_isLeverDown = true;
 	startAnimation(0x1564A2C0, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	NextState(&Klayman::stWaitLeverDown);
-	_acceptInput = true;
-	_isLeverDown = true;
 }
 
 void Klayman::stWaitLeverDown() {
+	_acceptInput = true;
+	_isLeverDown = true;
 	startAnimation(0x4464A440, 0, -1);
 	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
 	SetMessageHandler(&Klayman::hmLowLevel);
-	_acceptInput = true;
-	_isLeverDown = true;
+	SetSpriteUpdate(&Klayman::suUpdateDestX);
 }
 
-void Klayman::startWalkingResume(int16 frameIncr) {
-	// TODO Make the parameter a field and change this method back to a callback (or similar)
-	int16 frameIndex = getGlobalVar(0x18288913) + frameIncr;
+void Klayman::stStartWalkingResume() {
+	int16 frameIndex = getGlobalVar(0x18288913) + _walkResumeFrameIncr;
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
@@ -4802,7 +4801,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2205::stStartWalkingResume);
+			GotoState(&Klayman::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -4829,10 +4828,6 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2205::stStartWalkingResume() {
-	startWalkingResume(0);
-}
-
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -4863,7 +4858,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2206::stStartWalkingResume);
+			GotoState(&Klayman::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -4939,10 +4934,6 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2206::stStartWalkingResume() {
-	startWalkingResume(1);
-}
-
 KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
@@ -5028,7 +5019,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2242::stStartWalkingResume);
+			GotoState(&Klayman::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5077,10 +5068,6 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-void KmScene2242::stStartWalkingResume() {
-	startWalkingResume(0);
-}
-
 KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
@@ -5102,7 +5089,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmHallOfRecords::stStartWalkingResume);
+			GotoState(&Klayman::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5135,10 +5122,6 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 	return 0;
 }
 
-void KmHallOfRecords::stStartWalkingResume() {
-	startWalkingResume(0);
-}
-
 KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
@@ -5160,7 +5143,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4804:
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
-			GotoState(&KmScene2247::stStartWalkingResume);
+			GotoState(&Klayman::stStartWalkingResume);
 		} else {
 			GotoState(&Klayman::stPeekWall);
 		}
@@ -5193,10 +5176,6 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
   
-void KmScene2247::stStartWalkingResume() {
-	startWalkingResume(0);
-}
-
 KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 89c59b6..b83eb14 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -107,7 +107,7 @@ public:
 
 	void stWalkingFirst();
 	void stWalkingFirstExt();
-	void startWalkingResume(int16 frameIncr);
+	void stStartWalkingResume();
 	void stUpdateWalkingFirst();
 	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
 	void suWalkingFirst();
@@ -137,6 +137,8 @@ public:
 
 	void stLargeStep();
 	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
+	void suLargeStep();
+	void evLargeStepDone();
 
 	void stInsertKey();
 	uint32 hmInsertKey(int messageNum, const MessageParam &param, Entity *sender);
@@ -351,7 +353,6 @@ public:
 	void stopWalking();
 	
 	void suAction();
-	void suLargeStep();
 	void suUpdateDestX();
 	void suWalkingTestExit();
 
@@ -439,8 +440,6 @@ protected:
 	void sub41C770();
 	void sub41C790();
 
-	void stLargeStepDone();
-	
 	void stStartWalkingSmall();
 	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
 	
@@ -599,7 +598,6 @@ protected:
 class KmScene2205 : public Klayman {
 public:
 	KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
-	void stStartWalkingResume();
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -612,7 +610,6 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stStartWalkingResume();
 };
 
 class KmScene2207 : public Klayman {
@@ -628,7 +625,6 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stStartWalkingResume();
 };
 
 class KmHallOfRecords : public Klayman {
@@ -637,7 +633,6 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stStartWalkingResume();
 };
 
 class KmScene2247 : public Klayman {
@@ -646,7 +641,6 @@ public:
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-	void stStartWalkingResume();
 };
 
 class KmScene2401 : public Klayman {


Commit: c88fdc34dd6ef0f26c65150ba35bff13854f7d93
    https://github.com/scummvm/scummvm/commit/c88fdc34dd6ef0f26c65150ba35bff13854f7d93
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: Rename Class152 to StaticScene

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 09299de..f281a17 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -300,7 +300,7 @@ void GameModule::startup() {
 //	createModule(1500, 0); // Logos and intro video //Real
 #if 1
 	_vm->gameState().sceneNum = 6;
-	createModule(1300, -1);
+	createModule(1000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 1e844c7..ab4c051 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -62,7 +62,7 @@ void Module1000::createScene(int sceneNum, int which) {
 		break;
 	case 2:
 		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
-		_childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00);
+		_childObject = new StaticScene(_vm, this, 0xC084110C, 0x41108C00);
 		break;
 	case 3:
 		_vm->_soundMan->stopMusic(0x061880C6, 0, 2);
@@ -1563,21 +1563,21 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-// Class152
+// StaticScene
 
-Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
+StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
 	: Scene(vm, parentModule, true) {
 
 	_surfaceFlag = false;
 
-	SetMessageHandler(&Class152::handleMessage);
+	SetMessageHandler(&StaticScene::handleMessage);
 	
 	setBackground(backgroundFileHash);
 	setPalette(backgroundFileHash);
 	insertMouse435(cursorFileHash, 20, 620);
 }
 
-uint32 Class152::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 StaticScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 60eb2fb..db8fdb6 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -103,9 +103,9 @@ protected:
 
 // TODO: Move this to some common file since it's used several times
 
-class Class152 : public Scene {
+class StaticScene : public Scene {
 public:
-	Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash);
+	StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index f703971..36be19a 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -202,14 +202,14 @@ void Module2200::createScene(int sceneNum, int which) {
 	case 47:
 		if (!getGlobalVar(0x98109F12)) {
 			if (getGlobalVar(0x4D080E54))
-				_childObject = new Class152(_vm, this, 0x83110287, 0x10283839);
+				_childObject = new StaticScene(_vm, this, 0x83110287, 0x10283839);
 			else
-				_childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C);
+				_childObject = new StaticScene(_vm, this, 0x83412B9D, 0x12B9983C);
 		} else {
 			if (getGlobalVar(0x4D080E54))
-				_childObject = new Class152(_vm, this, 0x48632087, 0x3208348E);
+				_childObject = new StaticScene(_vm, this, 0x48632087, 0x3208348E);
 			else
-				_childObject = new Class152(_vm, this, 0x08C74886, 0x74882084);
+				_childObject = new StaticScene(_vm, this, 0x08C74886, 0x74882084);
 		}
 		break;
 	}
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 6c12006..5dcfa8d 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -70,13 +70,13 @@ void Module2400::createScene(int sceneNum, int which) {
 		createSmackerScene(0x20D80001, true, true, false);
 		break;
 	case 7:
-		_childObject = new Class152(_vm, this, 0x81523218, 0x2321C81D);
+		_childObject = new StaticScene(_vm, this, 0x81523218, 0x2321C81D);
 		break;
 	case 8:
-		_childObject = new Class152(_vm, this, 0x08100210, 0x00214089);
+		_childObject = new StaticScene(_vm, this, 0x08100210, 0x00214089);
 		break;
 	case 9:
-		_childObject = new Class152(_vm, this, 0x8C020505, 0x205018C8);
+		_childObject = new StaticScene(_vm, this, 0x8C020505, 0x205018C8);
 		break;
 	}
 	SetUpdateHandler(&Module2400::updateScene);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 1efcb25..cc0dda9 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -126,9 +126,9 @@ void Module2500::createScene(int sceneNum, int which) {
 		break;
 	case 9:
 		if (getGlobalVar(0xD0A14D10))
-			_childObject = new Class152(_vm, this, 0xC62A0645, 0xA0641C6A);
+			_childObject = new StaticScene(_vm, this, 0xC62A0645, 0xA0641C6A);
 		else
-			_childObject = new Class152(_vm, this, 0x7A343546, 0x435427AB);
+			_childObject = new StaticScene(_vm, this, 0x7A343546, 0x435427AB);
 		break;
 	}
 	SetUpdateHandler(&Module2500::updateScene);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 0a59abf..f9a5c2a 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -267,7 +267,7 @@ void Module2700::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B1E60, 150);
 		break;
 	case 30:
-		_childObject = new Class152(_vm, this, 0x09507248, 0x0724C09D);
+		_childObject = new StaticScene(_vm, this, 0x09507248, 0x0724C09D);
 		break;
 	case 31:
 //TODO		_childObject = new Scene2732(_vm, this, which);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 6d7e49f..7a35ddd 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -70,7 +70,7 @@ void Module2800::createScene(int sceneNum, int which) {
 		if (_flag) {
 			_childObject = new Scene2802(_vm, this, which);
 		} else {
-			_childObject = new Class152(_vm, this, 0x000C6444, 0xC6440008);
+			_childObject = new StaticScene(_vm, this, 0x000C6444, 0xC6440008);
 		}
 #endif		
 		break;
@@ -119,39 +119,39 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 12:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008);
+		_childObject = new StaticScene(_vm, this, 0x0000A245, 0x0A241008);
 		break;
 	case 13:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x81C60635, 0x60631814);
+		_childObject = new StaticScene(_vm, this, 0x81C60635, 0x60631814);
 		break;
 	case 14:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0);
+		_childObject = new StaticScene(_vm, this, 0xCA811204, 0x11200CA0);
 		break;
 	case 15:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC);
+		_childObject = new StaticScene(_vm, this, 0x2D438A00, 0x38A042DC);
 		break;
 	case 16:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0);
+		_childObject = new StaticScene(_vm, this, 0x0A806204, 0x062000A0);
 		break;
 	case 17:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018);
+		_childObject = new StaticScene(_vm, this, 0x010F9284, 0xF9280018);
 		break;
 	case 18:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018);
+		_childObject = new StaticScene(_vm, this, 0x0100022B, 0x0022F018);
 		break;
 	case 19:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x10866205, 0x66201100);
+		_childObject = new StaticScene(_vm, this, 0x10866205, 0x66201100);
 		break;
 	case 20:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x01C58000, 0x58004014);
+		_childObject = new StaticScene(_vm, this, 0x01C58000, 0x58004014);
 		break;
 	case 21:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
@@ -159,22 +159,22 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 22:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948);
+		_childObject = new StaticScene(_vm, this, 0x9408121E, 0x8121A948);
 		break;
 	case 23:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040);
+		_childObject = new StaticScene(_vm, this, 0x048C0600, 0xC0604040);
 		break;
 	case 24:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A);
+		_childObject = new StaticScene(_vm, this, 0x04270A94, 0x70A9004A);
 		break;
 	case 25:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		if (getGlobalVar(0x190A1D18))
-			_childObject = new Class152(_vm, this, 0x01600204, 0x0020001E);
+			_childObject = new StaticScene(_vm, this, 0x01600204, 0x0020001E);
 		else
-			_childObject = new Class152(_vm, this, 0x08611204, 0x1120008E);
+			_childObject = new StaticScene(_vm, this, 0x08611204, 0x1120008E);
 		break;
 	case 26:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);


Commit: 81667d492a5513ebc390b2d563dca25db681729a
    https://github.com/scummvm/scummvm/commit/81667d492a5513ebc390b2d563dca25db681729a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:46-07:00

Commit Message:
NEVERHOOD: Remove SsScene1002LadderArch and Class599 and turn them into static sprites; the classes were only used to set the sprite surface priority with a message, which is now handled in the scene

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f281a17..e378775 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -299,7 +299,7 @@ void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule(1500, 0); // Logos and intro video //Real
 #if 1
-	_vm->gameState().sceneNum = 6;
+	_vm->gameState().sceneNum = 1;
 	createModule(1000, -1);
 #endif
 #if 0
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index ab4c051..4fdb3db 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -458,44 +458,6 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 
 // Scene1002
 
-SsScene1002LadderArch::SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 0x152C1313, 1015), _parentScene(parentScene) {
-
-	SetMessageHandler(&SsScene1002LadderArch::handleMessage);
-}
-
-uint32 SsScene1002LadderArch::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 995);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1015);
-		break;
-	}
-	return messageResult;
-}
-
-Class599::Class599(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 0x316C4BB4, 1015), _parentScene(parentScene) {
-
-	SetMessageHandler(&Class599::handleMessage);
-}
-
-uint32 Class599::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 995);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1015);
-		break;
-	}
-	return messageResult;
-}
-
 AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _flag1(flag1) {
 
@@ -1327,12 +1289,12 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x06149428, 1100);
 	insertStaticSprite(0x312C8774, 1100);
 
-	_ssLadderArch = insertSprite<SsScene1002LadderArch>(this);
+	_ssLadderArch = insertStaticSprite(0x152C1313, 1015);
 	_ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200);
 	_ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100);
 	_ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100);
 
-	_class599 = insertSprite<Class599>(this);
+	_class599 = insertStaticSprite(0x316C4BB4, 1015);
 
 	if (which < 0) {
 		if (_vm->_gameState.field2 == 0) {
@@ -1552,12 +1514,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		break;
 	case 0x8000:
-		sendMessage(_class599, 0x482A, 0);
-		sendMessage(_ssLadderArch, 0x482A, 0);
+		setSpriteSurfacePriority(_class599, 995);
+		setSpriteSurfacePriority(_ssLadderArch, 995);
 		break;
 	case 0x8001:
-		sendMessage(_class599, 0x482B, 0);
-		sendMessage(_ssLadderArch, 0x482B, 0);
+		setSpriteSurfacePriority(_class599, 1015);
+		setSpriteSurfacePriority(_ssLadderArch, 1015);
 		break;
 	}	
 	return messageResult;
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index db8fdb6..864b5cc 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -112,22 +112,6 @@ protected:
 
 // Scene1002
 
-class SsScene1002LadderArch : public StaticSprite {
-public:
-	SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Class599 : public StaticSprite {
-public:
-	Class599(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class AsScene1002Ring : public AnimatedSprite {
 public:
 	AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2);
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 8520d64..dde437d 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -169,6 +169,11 @@ void Scene::setSurfacePriority(BaseSurface *surface, int priority) {
 		addSurface(surface);
 }
 
+void Scene::setSpriteSurfacePriority(Sprite *sprite, int priority) {
+	if (sprite)
+		setSurfacePriority(sprite->getSurface(), priority);
+}
+
 void Scene::deleteSprite(Sprite **sprite) {
 	_vm->_collisionMan->removeSprite(*sprite);
 	removeSurface((*sprite)->getSurface());
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index f9e221a..35adb44 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -49,6 +49,7 @@ public:
 	Sprite *addSprite(Sprite *sprite);
 	void removeSprite(Sprite *sprite);
 	void setSurfacePriority(BaseSurface *surface, int priority);
+	void setSpriteSurfacePriority(Sprite *sprite, int priority);
 	void deleteSprite(Sprite **sprite);
 	Background *addBackground(Background *background);
 	void setBackground(uint32 fileHash, bool dirtyBackground = true);


Commit: 5e08ab3e3f3d02a55765c9c5f22934666578fddc
    https://github.com/scummvm/scummvm/commit/5e08ab3e3f3d02a55765c9c5f22934666578fddc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Rename Class426 to SsCommonPressButton

Changed paths:
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 4fdb3db..dce4b8c 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -763,7 +763,7 @@ void AsScene1002DoorSpy::stDoorSpyBoxingGlove() {
 	NextState(&AsScene1002DoorSpy::stDoorSpyIdle);
 }
 
-Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
+SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
 	: StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) {
 
 	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000;
@@ -784,12 +784,12 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui
 	setVisible(false);
 	_needRefresh = true;
 	
-	SetUpdateHandler(&Class426::update);
-	SetMessageHandler(&Class426::handleMessage);
+	SetUpdateHandler(&SsCommonPressButton::update);
+	SetMessageHandler(&SsCommonPressButton::handleMessage);
 
 }
 
-void Class426::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
+void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHashes[0] = fileHash1;
 	_fileHashes[1] = fileHash2;
 	if (_status == 2) {
@@ -815,7 +815,7 @@ void Class426::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	}
 }
 
-void Class426::update() {
+void SsCommonPressButton::update() {
 	if (_countdown != 0 && (--_countdown) == 0) {
 		if (_status == 1) {
 			_status = 2;
@@ -848,7 +848,7 @@ void Class426::update() {
 	}
 }
 
-uint32 Class426::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x480B:
@@ -1353,7 +1353,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asDoor = insertSprite<AsScene1002Door>(tempClipRect);
 	tempSprite = insertSprite<AsScene1002BoxingGloveHitEffect>();
 	_asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
-	_class426 = insertSprite<Class426>(this, 0x00412692, 0x140B60BE, 800, 0);
+	_ssPressButton = insertSprite<SsCommonPressButton>(this, 0x00412692, 0x140B60BE, 800, 0);
 	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, false);
 	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
 
@@ -1440,7 +1440,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x42845B19) {
 			sendEntityMessage(_klayman, 0x1014, _asRing5);
 		} else if (param.asInteger() == 0xC0A07458) {
-			sendEntityMessage(_klayman, 0x1014, _class426);
+			sendEntityMessage(_klayman, 0x1014, _ssPressButton);
 		}
 		break;
 	case 0x1024:
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 864b5cc..f63d1f0 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -158,9 +158,9 @@ protected:
 	void stDoorSpyBoxingGlove();
 };
 
-class Class426 : public StaticSprite {
+class SsCommonPressButton : public StaticSprite {
 public:
-	Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
+	SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
 	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
 protected:
 	Scene *_parentScene;
@@ -252,7 +252,7 @@ protected:
 	Sprite *_asKlaymanLadderHands;
 	Sprite *_asKlaymanPeekHand;
 	Sprite *_asOutsideDoorBackground;
-	Sprite *_class426;
+	Sprite *_ssPressButton;
 	bool _flag1B4;
 	bool _flag1BE;
 	bool _flag;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 36be19a..4460314 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -518,7 +518,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape = insertSprite<AsScene1201Tape>(this, 7, 1100, 459, 432, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape); 
 
-	_ssDoorButton = insertSprite<Class426>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
+	_ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
 	for (uint32 i = 0; i < 9; i++) {
 		if ((int16)getSubVar(0x484498D0, i) >= 0) {
@@ -1279,14 +1279,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		setPalette(0x0008028D);
 		addEntity(_palette);
 		insertMouse433(0x80289008);
-		_ssLightSwitch = insertSprite<Class426>(this, 0x2D339030, 0x2D309030, 100, 0);
+		_ssLightSwitch = insertSprite<SsCommonPressButton>(this, 0x2D339030, 0x2D309030, 100, 0);
 	} else {
 		_isLightOn = false;
 		setBackground(0xD00A028D);
 		setPalette(0xD00A028D);
 		addEntity(_palette);
 		insertMouse433(0xA0289D08);
-		_ssLightSwitch = insertSprite<Class426>(this, 0x2D339030, 0xDAC86E84, 100, 0);
+		_ssLightSwitch = insertSprite<SsCommonPressButton>(this, 0x2D339030, 0xDAC86E84, 100, 0);
 	}
 
 	_palette->addBasePalette(0xD00A028D, 0, 256, 0);
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 3767b7b..53b9469 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -197,7 +197,7 @@ class Scene2205 : public Scene {
 public:
 	Scene2205(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Class426 *_ssLightSwitch;
+	SsCommonPressButton *_ssLightSwitch;
 	Sprite *_ssDoorFrame;
 	bool _isKlaymanInLight;
 	bool _isLightOn;


Commit: f77b12cf96aaebb47a1ead1b7daf25e75dd5abf4
    https://github.com/scummvm/scummvm/commit/f77b12cf96aaebb47a1ead1b7daf25e75dd5abf4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Rename stuff in Module1200

- Fix Scene1201 (tnt man, match)

Changed paths:
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h



diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index a903759..efdb6de 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -219,22 +219,24 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-Class466::Class466(NeverhoodEngine *vm, bool flag)
+AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag)
 	: AnimatedSprite(vm, 1200) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class466::handleMessage);
+	SetMessageHandler(&AsScene1201TntManRope::handleMessage);
 	createSurface(10, 34, 149);
 	_x = 202;
 	_y = -32;
 	if (flag) {
-		sub40D380();
+		startAnimation(0x928F0C10, 15, -1);
+		_newStickFrameIndex = -2;
 	} else {
-		sub40D340();
+		startAnimation(0x928F0C10, 0, -1);
+		_newStickFrameIndex = 0;
 	}
 }
 
-uint32 Class466::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -243,27 +245,13 @@ uint32 Class466::handleMessage(int messageNum, const MessageParam &param, Entity
 		}
 		break;
 	case 0x2006:
-		sub40D360();
+		startAnimation(0x928F0C10, 1, -1);
+		_newStickFrameIndex = -2;
 		break;
 	}
 	return messageResult;
 }
 
-void Class466::sub40D340() {
-	startAnimation(0x928F0C10, 0, -1);
-	_newStickFrameIndex = 0;
-}
-
-void Class466::sub40D360() {
-	startAnimation(0x928F0C10, 1, -1);
-	_newStickFrameIndex = -2;
-}
-
-void Class466::sub40D380() {
-	startAnimation(0x928F0C10, 15, -1);
-	_newStickFrameIndex = -2;
-}
-
 AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag)
 	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) {
 
@@ -285,7 +273,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 
 void AsScene1201RightDoor::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		sub40D830();
+		stCloseDoor();
 	}
 	AnimatedSprite::update();
 }
@@ -297,43 +285,43 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p
 		gotoNextState();
 		break;
 	case 0x4829:
-		sub40D7E0();
+		stOpenDoor();
 		break;
 	}
 	return messageResult;
 }
 
-void AsScene1201RightDoor::sub40D7E0() {
+void AsScene1201RightDoor::stOpenDoor() {
 	startAnimation(0xD088AC30, 0, -1);
 	_newStickFrameIndex = -2;
 	setVisible(true);
 	playSound(0, calcHash("fxDoorOpen20"));
 }
 
-void AsScene1201RightDoor::sub40D830() {
+void AsScene1201RightDoor::stCloseDoor() {
 	startAnimation(0xD088AC30, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
 	playSound(0, calcHash("fxDoorClose20"));
-	NextState(&AsScene1201RightDoor::sub40D880);
+	NextState(&AsScene1201RightDoor::stCloseDoorDone);
 }
 
-void AsScene1201RightDoor::sub40D880() {
+void AsScene1201RightDoor::stCloseDoorDone() {
 	stopAnimation();
 	setVisible(false);
 }
 		
-Class464::Class464(NeverhoodEngine *vm)
+AsScene1201KlaymanHead::AsScene1201KlaymanHead(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1200) {
 	
 	createSurface(1200, 69, 98);
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class464::handleMessage);
+	SetMessageHandler(&AsScene1201KlaymanHead::handleMessage);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	setVisible(false);
 }
 
-uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201KlaymanHead::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2006:
@@ -351,22 +339,20 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _class466(class466),
-	_flag(false) {
+AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isComingDown)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _asTntManRope(asTntManRope),
+	_isMoving(false) {
 
-	flag = false;
-	
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	createSurface(990, 106, 181);
 	_x = 201;
-	if (flag) {
+	if (isComingDown) {
 		_y = 297;
-		sub40CD60();
+		stComingDown();
 	} else {
 		_y = 334;
-		sub40CD30();
+		stStanding();
 	}
 }
 
@@ -379,7 +365,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x092870C0) {
-			sendMessage(_class466, 0x2006, 0);
+			sendMessage(_asTntManRope, 0x2006, 0);
 		} else if (param.asInteger() == 0x11CA0144) {
 			playSound(0, 0x51800A04);
 		}
@@ -387,10 +373,11 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
 	case 0x1011:
 		sendMessage(_parentScene, 0x2002, 0);
 		messageResult = 1;
+		break;
 	case 0x480B:
-		if (!_flag) {
+		if (!_isMoving) {
 			_sprite = (Sprite*)sender;
-			sub40CD90();
+			stMoving();
 		}
 		break;
 	}
@@ -398,7 +385,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
 
 }
 
-uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -408,49 +395,49 @@ uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam
 	return messageResult;
 }
 
-void AsScene1201TntMan::spriteUpdate40CD10() {
+void AsScene1201TntMan::suMoving() {
 	_x = _sprite->getX() + 100;
 }
 
-void AsScene1201TntMan::sub40CD30() {
+void AsScene1201TntMan::stStanding() {
 	startAnimation(0x654913D0, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	SetSpriteUpdate(NULL);
 }
 
-void AsScene1201TntMan::sub40CD60() {
+void AsScene1201TntMan::stComingDown() {
 	startAnimation(0x356803D0, 0, -1);
-	SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0);
+	SetMessageHandler(&AsScene1201TntMan::hmComingDown);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	NextState(&AsScene1201TntMan::sub40CD30);
+	NextState(&AsScene1201TntMan::stStanding);
 }
 
-void AsScene1201TntMan::sub40CD90() {
+void AsScene1201TntMan::stMoving() {
 	_vm->_soundMan->addSound(0x01D00560, 0x4B044624);
 	_vm->_soundMan->playSoundLooping(0x4B044624);
-	_flag = true;
+	_isMoving = true;
 	startAnimation(0x85084190, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
-	SetSpriteUpdate(&AsScene1201TntMan::spriteUpdate40CD10);
+	SetSpriteUpdate(&AsScene1201TntMan::suMoving);
 	_newStickFrameIndex = -2;
 }
 
-Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan)
+AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan)
 	: AnimatedSprite(vm, 1200), _asTntMan(asTntMan) {
 
 	createSurface1(0x828C0411, 995);
-	SetUpdateHandler(&Class465::update);
+	SetUpdateHandler(&AsScene1201TntManFlame::update);
 	SetMessageHandler(&Sprite::handleMessage);
-	SetSpriteUpdate(&Class465::spriteUpdate40D150);
+	SetSpriteUpdate(&AsScene1201TntManFlame::suUpdate);
 	startAnimation(0x828C0411, 0, -1);
 	setVisible(false);
 }
 
-Class465::~Class465() {
+AsScene1201TntManFlame::~AsScene1201TntManFlame() {
 	_vm->_soundMan->deleteSoundGroup(0x041080A4);
 }
 
-void Class465::update() {
+void AsScene1201TntManFlame::update() {
 	AnimatedSprite::update();
 	if (getGlobalVar(0x20A0C516)) {
 		setVisible(true);
@@ -460,31 +447,30 @@ void Class465::update() {
 	}
 }
 
-void Class465::spriteUpdate40D150() {
+void AsScene1201TntManFlame::suUpdate() {
 	_x = _asTntMan->getX() - 18;
 	_y = _asTntMan->getY() - 158;
 }
 
 AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _countdown(0) {
 	
 	createSurface(1100, 57, 60);
 	SetUpdateHandler(&AsScene1201Match::update);
-	SetMessageHandler(&AsScene1201Match::handleMessage40C2D0);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	
 	switch (getGlobalVar(0x0112090A)) {
 	case 0:
 		_x = 521;
 		_y = 112;
 		_status = 0;
-		sub40C4C0();
+		stIdleOnDoorFrame();
 		break;
 	case 1:
 		_x = 521;
 		_y = 112;
 		_status = 2;
-		sub40C470();
+		stOnDoorFrameAboutToMove();
 		loadSound(0, 0xD00230CD);
 		break;
 	case 2:
@@ -492,21 +478,20 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
 		_x = 403;
 		_y = 337;
 		_status = 0;
-		sub40C4F0();
+		stIdleOnFloor();
 		break;
 	}
 }
 
 void AsScene1201Match::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		gotoNextState();
-	}
 	updateAnim();
 	handleSpriteUpdate();
 	updatePosition();
 }
 
-uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -518,8 +503,8 @@ uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam
 	return messageResult;
 }
 
-uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage40C2D0(messageNum, param, sender);
+uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		gotoNextState();
@@ -528,8 +513,8 @@ uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam
 	return messageResult;
 }
 
-uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage40C2D0(messageNum, param, sender);
+uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
 		sendMessage(_parentScene, 0x2001, 0);
@@ -543,48 +528,48 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam
 	return messageResult;
 }
 
-void AsScene1201Match::sub40C3E0() {
+void AsScene1201Match::stOnDoorFrameMoving() {
 	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving);
 	if (_status == 0) {
-		NextState(&AsScene1201Match::sub40C420);
+		NextState(&AsScene1201Match::stFallingFromDoorFrame);
 	} else {
-		NextState(&AsScene1201Match::sub40C470);
+		NextState(&AsScene1201Match::stOnDoorFrameAboutToMove);
 	}
 }
 
-void AsScene1201Match::sub40C420() {
+void AsScene1201Match::stFallingFromDoorFrame() {
 	setGlobalVar(0x0112090A, 2);
 	_x -= 199;
 	_y += 119;
 	startAnimation(0x018D0240, 0, -1);
-	SetMessageHandler(&AsScene1201Match::handleMessage40C320);
-	NextState(&AsScene1201Match::sub40C4F0);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving);
+	NextState(&AsScene1201Match::stIdleOnFloor);
 }
 
-void AsScene1201Match::sub40C470() {
+void AsScene1201Match::stOnDoorFrameAboutToMove() {
 	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::handleMessage40C2D0);
+	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
 	_newStickFrameIndex = 0;
 	if (_status != 0) {
 		_countdown = 36;
 		_status--;
-		NextState(&AsScene1201Match::sub40C3E0);
+		NextState(&AsScene1201Match::stOnDoorFrameMoving);
 	}
 }
 
-void AsScene1201Match::sub40C4C0() {
+void AsScene1201Match::stIdleOnDoorFrame() {
 	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::handleMessage40C360);
+	SetMessageHandler(&AsScene1201Match::hmIdle);
 	_newStickFrameIndex = 0;
 }
 
-void AsScene1201Match::sub40C4F0() {
+void AsScene1201Match::stIdleOnFloor() {
 	setDoDeltaX(1);
 	_x = 403;
 	_y = 337;
 	startAnimation(0x00842374, 0, -1);
-	SetMessageHandler(&AsScene1201Match::handleMessage40C360);
+	SetMessageHandler(&AsScene1201Match::hmIdle);
 	_newStickFrameIndex = 0;
 }
 
@@ -743,7 +728,7 @@ void AsScene1201LeftDoor::sub40D590() {
 
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _flag(false), _asMatch(NULL), _asTntMan(NULL),
-	_asCreature(NULL), _class466(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) {
+	_asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) {
 
 	int16 topY1, topY2, topY3, topY4;
 	int16 x1, x2;
@@ -780,8 +765,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x04063110, 500);
 	topY4 = tempSprite->getY() + 1; 
 
-	_class466 = insertSprite<Class466>(getGlobalVar(0x000CF819) && which != 1);
-	_class466->setClipRect(0, topY4, 640, 480);
+	_asTntManRope = insertSprite<AsScene1201TntManRope>(getGlobalVar(0x000CF819) && which != 1);
+	_asTntManRope->setClipRect(0, topY4, 640, 480);
 	
 	insertStaticSprite(0x400B04B0, 1200);
 
@@ -791,9 +776,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0xA29223FA, 1200);
 	x2 = tempSprite->getX() + tempSprite->getDrawRect().width;
 
-	_class464 = insertSprite<Class464>();
-
-	debug("Scene1201: which = %d", which);
+	_asKlaymanHead = insertSprite<AsScene1201KlaymanHead>();
 
 	if (which < 0) {
 		insertKlayman<KmScene1201>(364, 333);
@@ -838,11 +821,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(0x000CF819)) {
 		insertStaticSprite(0x10002ED8, 500);
 		if (!getGlobalVar(0x0A18CA33)) {
-			_asTntMan = insertSprite<AsScene1201TntMan>(this, _class466, which == 1);
+			_asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1);
 			_asTntMan->setClipRect(x1, 0, x2, 480);
 			_asTntMan->setRepl(64, 0);
 			_vm->_collisionMan->addSprite(_asTntMan);
-			tempSprite = insertSprite<Class465>(_asTntMan);
+			tempSprite = insertSprite<AsScene1201TntManFlame>(_asTntMan);
 			tempSprite->setClipRect(x1, 0, x2, 480);
 		}
 		
@@ -909,7 +892,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asLeftDoor = insertSprite<AsScene1201LeftDoor>(_klayman);
 	_asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480);
 
-	if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) {
+	if (getGlobalVar(0x0A310817) && getGlobalVar(0x0112090A) == 0) {
 		setGlobalVar(0x0112090A, 1);
 	}
 
@@ -920,7 +903,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asMatch);
 	}
 
-	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+	if (getGlobalVar(0x0A310817) && getGlobalVar(0x0A18CA33) == 0) {
 		_asCreature = insertSprite<AsScene1201Creature>(this, _klayman);
 		_asCreature->setClipRect(x1, 0, x2, 480);
 	}
@@ -932,9 +915,8 @@ Scene1201::~Scene1201() {
 
 void Scene1201::update() {
 	Scene::update();
-	if (_asMatch && getGlobalVar(0x0112090A)) {
+	if (_asMatch && getGlobalVar(0x0112090A) == 3)
 		deleteSprite(&_asMatch);
-	}
 }
 
 uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -967,9 +949,11 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2002:		
 		if (getGlobalVar(0x20A0C516)) {
+			// Move the TNT dummy
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			setMessageList2(0x004AECF0, false);
 		} else if (getGlobalVar(0x0112090A) == 3) {
+			// Light the TNT dummy
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			if (_klayman->getX() > _asTntMan->getX()) {
 				setMessageList(0x004AECD0);
@@ -991,7 +975,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asRightDoor, 0x4829, 0);
 		break;
 	case 0x8000:
-		sendMessage(_class464, 0x2006, 0);
+		sendMessage(_asKlaymanHead, 0x2006, 0);
 		break;		
 	}
 	return messageResult;
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index b92ff92..671d1d7 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -51,14 +51,11 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class466 : public AnimatedSprite {
+class AsScene1201TntManRope : public AnimatedSprite {
 public:
-	Class466(NeverhoodEngine *vm, bool flag);
+	AsScene1201TntManRope(NeverhoodEngine *vm, bool flag);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40D340();
-	void sub40D360();
-	void sub40D380();
 };
 
 class AsScene1201RightDoor : public AnimatedSprite {
@@ -69,43 +66,43 @@ protected:
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40D7E0();
-	void sub40D830();
-	void sub40D880();
+	void stOpenDoor();
+	void stCloseDoor();
+	void stCloseDoorDone();
 };
 
-class Class464 : public AnimatedSprite {
+class AsScene1201KlaymanHead : public AnimatedSprite {
 public:
-	Class464(NeverhoodEngine *vm);
+	AsScene1201KlaymanHead(NeverhoodEngine *vm);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene1201TntMan : public AnimatedSprite {
 public:
-	AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag);
+	AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isDown);
 	virtual ~AsScene1201TntMan();
 protected:
 	Scene *_parentScene;
-	Sprite *_class466;
+	Sprite *_asTntManRope;
 	Sprite *_sprite;
-	bool _flag;
+	bool _isMoving;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40CCD0(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate40CD10();
-	void sub40CD30();
-	void sub40CD60();
-	void sub40CD90();
+	uint32 hmComingDown(int messageNum, const MessageParam &param, Entity *sender);
+	void suMoving();
+	void stStanding();
+	void stComingDown();
+	void stMoving();
 };
 
-class Class465 : public AnimatedSprite {
+class AsScene1201TntManFlame : public AnimatedSprite {
 public:
-	Class465(NeverhoodEngine *vm, Sprite *asTntMan);
-	~Class465();
+	AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan);
+	~AsScene1201TntManFlame();
 protected:
 	Sprite *_asTntMan;
 	void update();
-	void spriteUpdate40D150();
+	void suUpdate();
 };
 
 class AsScene1201Match : public AnimatedSprite {
@@ -116,14 +113,14 @@ protected:
 	int _countdown;
 	int _status;
 	void update();
-	uint32 handleMessage40C2D0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40C320(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40C360(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40C3E0();
-	void sub40C420();
-	void sub40C470();
-	void sub40C4C0();
-	void sub40C4F0();
+	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 {
@@ -173,11 +170,11 @@ protected:
 	Sprite *_asMatch;
 	AsScene1201TntMan *_asTntMan;
 	Sprite *_asCreature;
-	Sprite *_class466;
+	Sprite *_asTntManRope;
 	Sprite *_asLeftDoor;
 	Sprite *_asRightDoor;
 	Sprite *_asTape;
-	Sprite *_class464;
+	Sprite *_asKlaymanHead;
 	bool _flag;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);


Commit: 7b0b3000a771e423deb840bf6789c7a73e90db6f
    https://github.com/scummvm/scummvm/commit/7b0b3000a771e423deb840bf6789c7a73e90db6f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Rename stuff in Module1200

- Remove unused countdowns/code in AsScene1201Creature
- Fix AudioResourceMan::isSoundPlaying

Changed paths:
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/sound.cpp



diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index efdb6de..191789d 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -574,22 +574,23 @@ void AsScene1201Match::stIdleOnFloor() {
 }
 
 AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman)
-	: AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _flag(false) {
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _klaymanTooClose(false) {
+
+	// NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed
 	
 	createSurface(1100, 203, 199);
 	SetUpdateHandler(&AsScene1201Creature::update);
-	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
 	_x = 540;
 	_y = 320;
-	sub40C8E0();
-	_countdown3 = 2;
+	stWaiting();
 }
 
 void AsScene1201Creature::update() {
-	bool oldFlag = _flag;
-	_flag = _x >= 385;
-	if (_flag != oldFlag)
-		sub40C8E0();
+	bool oldFlag = _klaymanTooClose;
+	_klaymanTooClose = _klayman->getX() >= 385;
+	if (_klaymanTooClose != oldFlag)
+		stWaiting();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		gotoNextState();
 	}
@@ -598,7 +599,7 @@ void AsScene1201Creature::update() {
 	updatePosition();
 }
 
-uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -607,25 +608,18 @@ uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessagePar
 		}
 		break;
 	case 0x2004:
-		GotoState(&AsScene1201Creature::sub40C960);
+		GotoState(&AsScene1201Creature::stStartReachForTntDummy);
 		break;
 	case 0x2006:
-		GotoState(&AsScene1201Creature::sub40C9B0);
+		GotoState(&AsScene1201Creature::stPincerSnapKlayman);
 		break;
 	}
 	return messageResult;
 }
 
-uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage40C710(messageNum, param, sender);
+uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmWaiting(messageNum, param, sender);
 	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x02421405) {
-			if (_countdown2 != 0 && (--_countdown2 == 0)) {
-				sub40C990();
-			}
-		}
-		break;
 	case 0x3002:
 		gotoNextState();
 		break;
@@ -633,7 +627,7 @@ uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessagePar
 	return messageResult;
 }
 
-uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1201Creature::hmPincerSnapKlayman(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -650,45 +644,38 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar
 	return messageResult;
 }
 
-void AsScene1201Creature::sub40C8E0() {
-	_countdown3--;
-	if (_countdown3 == 0)
-		_countdown3 = 3;
+void AsScene1201Creature::stWaiting() {
 	startAnimation(0x08081513, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
-	NextState(&AsScene1201Creature::sub40C930);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
+	NextState(&AsScene1201Creature::stPincerSnap);
 	_countdown1 = 36;
 }
 
-void AsScene1201Creature::sub40C930() {
-	if (!_flag) {
+void AsScene1201Creature::stPincerSnap() {
+	if (!_klaymanTooClose) {
 		startAnimation(0xCA287133, 0, -1);
-		SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0);
-		NextState(&AsScene1201Creature::sub40C8E0);
+		SetMessageHandler(&AsScene1201Creature::hmPincerSnap);
+		NextState(&AsScene1201Creature::stWaiting);
 	}
 }
 
-void AsScene1201Creature::sub40C960() {
+void AsScene1201Creature::stStartReachForTntDummy() {
 	startAnimation(0x08081513, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
-	NextState(&AsScene1201Creature::sub40C9E0);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
+	NextState(&AsScene1201Creature::stReachForTntDummy);
 	_countdown1 = 48;
 }
 
-void AsScene1201Creature::sub40C990() {
-	startAnimationByHash(0x0B6E13FB, 0x01084280, 0);
-}
-
-void AsScene1201Creature::sub40C9B0() {
-	startAnimation(0xCA287133, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::handleMessage40C830);
-	NextState(&AsScene1201Creature::sub40C8E0);
+void AsScene1201Creature::stReachForTntDummy() {
+	startAnimation(0x5A201453, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::hmWaiting);
 	_countdown1 = 0;
 }
 
-void AsScene1201Creature::sub40C9E0() {
-	startAnimation(0x5A201453, 0, -1);
-	SetMessageHandler(&AsScene1201Creature::handleMessage40C710);
+void AsScene1201Creature::stPincerSnapKlayman() {
+	startAnimation(0xCA287133, 0, -1);
+	SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlayman);
+	NextState(&AsScene1201Creature::stWaiting);
 	_countdown1 = 0;
 }
 
@@ -714,13 +701,13 @@ uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &pa
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4809:
-		sub40D590();
+		stCloseDoor();
 		break;
 	}
 	return messageResult;
 }
 
-void AsScene1201LeftDoor::sub40D590() {
+void AsScene1201LeftDoor::stCloseDoor() {
 	startAnimation(0x508A111B, -1, -1);
 	_playBackwards = true;
 	_newStickFrameIndex = 0;
@@ -1029,36 +1016,36 @@ static const uint32 kScene1202FileHashes[] = {
 	0x1AC14B8
 };
 
-AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index)
-	: AnimatedSprite(vm, 900), _parentScene(parentScene), _index(index) {
+AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex)
+	: AnimatedSprite(vm, 900), _parentScene(parentScene), _itemIndex(itemIndex) {
 
 	int positionIndex;
 
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0);
-	positionIndex = getSubVar(0x10055D14, _index);
+	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
+	positionIndex = getSubVar(0x10055D14, _itemIndex);
 	createSurface(900, 37, 67);
 	_x = kScene1202Points[positionIndex].x;
 	_y = kScene1202Points[positionIndex].y;
-	sub4540A0();
+	stShowIdle();
 }
 
-uint32 AsScene1202TntItem::handleMessage453FE0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		sendMessage(_parentScene, 0x2000, _index);
+		sendMessage(_parentScene, 0x2000, _itemIndex);
 		messageResult = 1;
 		break;
 	case 0x2001:
-		_index2 = (int)param.asInteger();
-		sub4540D0();
+		_newPosition = (int)param.asInteger();
+		stChangePositionFadeOut();
 		break;		
 	}
 	return messageResult;
 }
 
-uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -1068,37 +1055,37 @@ uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessagePara
 	return messageResult;
 }
 
-void AsScene1202TntItem::sub4540A0() {
-	startAnimation(kScene1202FileHashes[_index], 0, -1);
-	SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0);
+void AsScene1202TntItem::stShowIdle() {
+	startAnimation(kScene1202FileHashes[_itemIndex], 0, -1);
+	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
 	_newStickFrameIndex = 0;
 }
 
-void AsScene1202TntItem::sub4540D0() {
-	startAnimation(kScene1202FileHashes[_index], 0, -1);
-	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
-	NextState(&AsScene1202TntItem::sub454100);
+void AsScene1202TntItem::stChangePositionFadeOut() {
+	startAnimation(kScene1202FileHashes[_itemIndex], 0, -1);
+	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
+	NextState(&AsScene1202TntItem::stChangePositionFadeIn);
 }
 
-void AsScene1202TntItem::sub454100() {
-	_x = kScene1202Points[_index2].x;
-	_y = kScene1202Points[_index2].y;
-	startAnimation(kScene1202FileHashes[_index], 6, -1);
-	SetMessageHandler(&AsScene1202TntItem::handleMessage454060);
-	NextState(&AsScene1202TntItem::sub454160);
+void AsScene1202TntItem::stChangePositionFadeIn() {
+	_x = kScene1202Points[_newPosition].x;
+	_y = kScene1202Points[_newPosition].y;
+	startAnimation(kScene1202FileHashes[_itemIndex], 6, -1);
+	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
+	NextState(&AsScene1202TntItem::stChangePositionDone);
 	_playBackwards = true;
 }
 
-void AsScene1202TntItem::sub454160() {
-	sendMessage(_parentScene, 0x2002, _index);
-	sub4540A0();
+void AsScene1202TntItem::stChangePositionDone() {
+	sendMessage(_parentScene, 0x2002, _itemIndex);
+	stShowIdle();
 }
 
 Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _paletteResource(vm),  
-	_flag(true), _soundFlag(false), _counter(0), _index(-1) {
+	_flag(true), _soundFlag(false), _counter(0), _clickedIndex(-1) {
 
-	SetMessageHandler(&Scene1202::handleMessage453C10);
+	SetMessageHandler(&Scene1202::handleMessage);
 	SetUpdateHandler(&Scene1202::update);
 
 	_surfaceFlag = true;
@@ -1121,7 +1108,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x8E8419C1, 1100);
 
 	if (getGlobalVar(0x000CF819)) {
-		SetMessageHandler(&Scene1202::handleMessage453D90);
+		SetMessageHandler(&Scene1202::hmSolved);
 	}
 
 	playSound(0, 0x40106542);
@@ -1140,23 +1127,25 @@ Scene1202::~Scene1202() {
 void Scene1202::update() {
 	Scene::update();
 	if (_soundFlag) {
+		debug("CHECK SOLVED");
 		if (!isSoundPlaying(3))
 			leaveScene(0);
 	} else if (_counter == 0 && isSolved()) {
-		SetMessageHandler(&Scene1202::handleMessage453D90);
+		_clickedIndex = 0;
+		SetMessageHandler(&Scene1202::hmSolved);
 		setGlobalVar(0x000CF819, 1);
 		doPaletteEffect();
 		playSound(3);
 		_soundFlag = true;
-	} else if (_index >= 0 && _counter == 0) {
-		int index2 = kScene1202Table[_index];
-		sendMessage(_asTntItems[_index], 0x2001, getSubVar(0x10055D14, index2));
-		sendMessage(_asTntItems[index2], 0x2001, getSubVar(0x10055D14, _index));
-		int temp = getSubVar(0x10055D14, index2);
-		setSubVar(0x10055D14, index2, getSubVar(0x10055D14, _index));
-		setSubVar(0x10055D14, _index, temp);
+	} else if (_clickedIndex >= 0 && _counter == 0) {
+		int destIndex = kScene1202Table[_clickedIndex];
+		sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(0x10055D14, destIndex));
+		sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(0x10055D14, _clickedIndex));
+		int temp = getSubVar(0x10055D14, destIndex);
+		setSubVar(0x10055D14, destIndex, getSubVar(0x10055D14, _clickedIndex));
+		setSubVar(0x10055D14, _clickedIndex, temp);
 		_counter = 2;
-		_index = -1;
+		_clickedIndex = -1;
 		if (_flag) {
 			playSound(1);
 		} else {
@@ -1166,7 +1155,7 @@ void Scene1202::update() {
 	}
 }
 
-uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene1202::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -1183,7 +1172,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam &param,
 		}
 		break;
 	case 0x2000:
-		_index = (int)param.asInteger();
+		_clickedIndex = (int)param.asInteger();
 		break;
 	case 0x2002:
 		_counter--;
@@ -1192,7 +1181,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene1202::hmSolved(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
@@ -1205,6 +1194,12 @@ uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam &param,
 }
 
 bool Scene1202::isSolved() {
+
+	debug("isSolved() %d %d %d %d %d %d", 
+		getSubVar(0x10055D14,  0), getSubVar(0x10055D14,  3),
+		getSubVar(0x10055D14,  6), getSubVar(0x10055D14,  9),
+		getSubVar(0x10055D14,  12), getSubVar(0x10055D14,  15));
+
 	return 
 		getSubVar(0x10055D14,  0) ==  0 && getSubVar(0x10055D14,  3) ==  3 && 
 		getSubVar(0x10055D14,  6) ==  6 && getSubVar(0x10055D14,  9) ==  9 &&
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index 671d1d7..bc3281c 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -130,19 +130,16 @@ protected:
 	Scene *_parentScene;
 	Sprite *_klayman;
 	int _countdown1;
-	int _countdown2;
-	int _countdown3;
-	bool _flag;
+	bool _klaymanTooClose;
 	void update();
-	uint32 handleMessage40C710(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40C7B0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage40C830(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40C8E0();
-	void sub40C930();
-	void sub40C960();
-	void sub40C990();
-	void sub40C9B0();
-	void sub40C9E0();
+	uint32 hmWaiting(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPincerSnap(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPincerSnapKlayman(int messageNum, const MessageParam &param, Entity *sender);
+	void stWaiting();
+	void stPincerSnap();
+	void stStartReachForTntDummy();
+	void stReachForTntDummy();
+	void stPincerSnapKlayman();
 };
 
 class AsScene1201LeftDoor : public AnimatedSprite {
@@ -151,7 +148,7 @@ public:
 protected:
 	Sprite *_klayman;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub40D590();
+	void stCloseDoor();
 };
 
 class SsScene1201Tnt : public StaticSprite {
@@ -187,13 +184,13 @@ public:
 	AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index);
 protected:
 	Scene *_parentScene;
-	int _index, _index2;
-	uint32 handleMessage453FE0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage454060(int messageNum, const MessageParam &param, Entity *sender);
-	void sub4540A0();
-	void sub4540D0();
-	void sub454100();
-	void sub454160();
+	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 {
@@ -204,13 +201,13 @@ protected:
 	PaletteResource _paletteResource;
 	Sprite *_asTntItems[18];
 	int _counter;
-	int _index;
+	int _clickedIndex;
 	byte _paletteData[1024];
 	bool _soundFlag;
 	bool _flag;
 	void update();
-	uint32 handleMessage453C10(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage453D90(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmSolved(int messageNum, const MessageParam &param, Entity *sender);
 	bool isSolved();
 	void doPaletteEffect();
 };
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index c1db48c..18f40dc 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -616,7 +616,7 @@ void AudioResourceMan::stopSound(int16 soundIndex) {
 
 bool AudioResourceMan::isSoundPlaying(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	return soundItem->_isPlaying;
+	return _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle);
 }
 
 int16 AudioResourceMan::loadMusic(uint32 fileHash) {


Commit: 106ec42124de3fd68a2584ba1ae14f15ad4832d9
    https://github.com/scummvm/scummvm/commit/106ec42124de3fd68a2584ba1ae14f15ad4832d9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Work on Module1300:

- Remove Class595, only used for setting the surface priority via a message
- Rename stuff and fix some errors

Changed paths:
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index f3677a1..42e8a73 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -404,25 +404,6 @@ void SsScene1302Fence::suMoveUp() {
 	}
 }
 
-Class595::Class595(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 0xB0420130, 1015), _parentScene(parentScene) {
-
-	SetMessageHandler(&Class595::handleMessage);
-}
-
-uint32 Class595::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 995);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1015);
-		break;
-	}
-	return messageResult;
-}
-
 Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
@@ -434,7 +415,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x420643C4);
 	insertMouse433(0x643C0428);
 
-	_class595 = insertSprite<Class595>(this);
+	_class595 = insertStaticSprite(0xB0420130, 1015);
 	_sprite1 = insertStaticSprite(0x942FC224, 300);
 	_sprite2 = insertStaticSprite(0x70430830, 1200);
 	_sprite2->setVisible(false);
@@ -588,10 +569,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asVenusFlyTrap, 0x482A, 0);
 		break;
 	case 0x8000:
-		sendMessage(_class595, 0x482A, 0);
+		setSpriteSurfacePriority(_class595, 995);
 		break;
 	case 0x8001:
-		sendMessage(_class595, 0x482B, 0);
+		setSpriteSurfacePriority(_class595, 1015);
 		break;
 	}
 	return messageResult;
@@ -688,18 +669,14 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y)
+AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) {
-	
-	if (getGlobalVar(0x31C63C51)) {
-		setVisible(false);
-		SetMessageHandler(NULL);
-	} else {
-		SetMessageHandler(&Class544::handleMessage);
-	}
+
+	// NOTE: Skipped check if Klayman already has the needle since that's done in the scene itself	
+	SetMessageHandler(&AsScene1304Needle::handleMessage);
 }
 
-uint32 Class544::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -735,10 +712,10 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (!getGlobalVar(0x31C63C51)) {
-		_class544 = insertSprite<Class544>(this, 1100, 278, 347);
-		_vm->_collisionMan->addSprite(_class544);
+		_asNeedle = insertSprite<AsScene1304Needle>(this, 1100, 278, 347);
+		_vm->_collisionMan->addSprite(_asNeedle);
 	} else {
-		_class544 = NULL;
+		_asNeedle = NULL;
 	}
 
 	_sprite1 = insertStaticSprite(0x0562E621, 1100);
@@ -770,8 +747,8 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4826:
-		if (sender == _class544) {
-			sendEntityMessage(_klayman, 0x1014, _class544);
+		if (sender == _asNeedle) {
+			sendEntityMessage(_klayman, 0x1014, _asNeedle);
 			setMessageList(0x004B9130);
 		} else if (sender == _class545) {
 			sendEntityMessage(_klayman, 0x1014, _class545);
@@ -1021,7 +998,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 		} else if (sender == _asTape) {
 			if (_klayman->getX() >= 249) {
-				sendEntityMessage(_klayman, 0x1014, _class545);
+				sendEntityMessage(_klayman, 0x1014, _asTape);
 				setMessageList(0x004AFC68);
 			}
 		}
@@ -1279,10 +1256,11 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL),
 	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
 
-	//DEBUG
+	//DEBUG>>>
 	setSubVar(0x08D0AB11, 0, 1);
 	setSubVar(0x08D0AB11, 1, 1);
 	setSubVar(0x08D0AB11, 2, 1);
+	//DEBUG<<<
 
 	Sprite *tempSprite;
 	
@@ -1422,7 +1400,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-static const uint32 kScene1308FileHashes[] = {
+static const uint32 kScene1308NumberFileHashes[] = {
 	0x08006320,
 	0x10006320,
 	0x20006320,
@@ -1441,65 +1419,65 @@ static const uint32 kScene1308FileHashes[] = {
 	0x00306322
 };
 
-Class549::Class549(NeverhoodEngine *vm, Scene *parentScene)
+AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) {
 	
-	SetMessageHandler(&Class549::handleMessage);
+	SetMessageHandler(&AsScene1308JaggyDoor::handleMessage);
 	setVisible(false);
 	stopAnimation();
 }
 
-uint32 Class549::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+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:
-		sub455470();
+		stOpenDoor();
 		break;
 	case 0x4809:
-		sub4554F0();
+		stCloseDoor();
 		break;
 	}
 	return messageResult;
 }
 
-void Class549::sub455470() {
+void AsScene1308JaggyDoor::stOpenDoor() {
 	startAnimation(0xBA0AE050, 0, -1);
 	setVisible(true);
-	NextState(&Class549::hide);
+	NextState(&AsScene1308JaggyDoor::stOpenDoorDone);
 	playSound(0, calcHash("fxDoorOpen38"));
 }
 
-void Class549::hide() {
+void AsScene1308JaggyDoor::stOpenDoorDone() {
 	sendMessage(_parentScene, 0x2000, 0);
 	stopAnimation();
 	setVisible(false);
 }
 
-void Class549::sub4554F0() {
+void AsScene1308JaggyDoor::stCloseDoor() {
 	startAnimation(0xBA0AE050, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
-	NextState(&Class549::sub455550);
+	NextState(&AsScene1308JaggyDoor::stCloseDoorDone);
 	playSound(0, calcHash("fxDoorClose38"));
 }
 
-void Class549::sub455550() {
+void AsScene1308JaggyDoor::stCloseDoorDone() {
 	sendMessage(_parentScene, 0x2001, 0);
 	stopAnimation();
 }
 
-Class592::Class592(NeverhoodEngine *vm, Scene *parentScene)
+AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) {
 	
-	SetMessageHandler(&Class592::handleMessage);
-	NextState(&Class592::sub455710);
+	SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage);
+	NextState(&AsScene1308KeyboardDoor::stFallingKeys);
 	playSound(0, 0x51456049);
 }
  
-uint32 Class592::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -1509,36 +1487,37 @@ uint32 Class592::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class592::sub455710() {
+void AsScene1308KeyboardDoor::stFallingKeys() {
 	startAnimation(0x6238B191, 0, -1);
-	NextState(&Class592::sub455740);
+	NextState(&AsScene1308KeyboardDoor::stFallingKeysDone);
 	_x = 580;
 	_y = 383;
 }
 
-void Class592::sub455740() {
+void AsScene1308KeyboardDoor::stFallingKeysDone() {
 	sendMessage(_parentScene, 0x2004, 0);
 	stopAnimation();
 	setVisible(false);
 }
 
-Class593::Class593(NeverhoodEngine *vm, Scene *parentScene)
+AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) {
 	
-	SetMessageHandler(&Class593::handleMessage);
+	SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage);
 	setVisible(false);
 	stopAnimation();
 	Entity::_priority = 1200;
 }
 
-uint32 Class593::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2002:
-		sub4558F0();
+		stFadeIn();
 		break;
 	case 0x2003:
-		sub455920();
+		stFadeOut();
+		break;
 	case 0x3002:
 		gotoNextState();
 		break;
@@ -1546,25 +1525,25 @@ uint32 Class593::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class593::sub4558F0() {
+void AsScene1308LightWallSymbols::stFadeIn() {
 	startAnimation(0x80180A10, 0, -1);
-	setVisible(false);
+	setVisible(true);
 	_newStickFrameIndex = -2;
 }
 
-void Class593::sub455920() {
+void AsScene1308LightWallSymbols::stFadeOut() {
 	startAnimation(0x80180A10, -1, -1);
 	_playBackwards = true;
-	NextState(&Class593::sub455950);
+	NextState(&AsScene1308LightWallSymbols::stFadeOutDone);
 }
 
-void Class593::sub455950() {
+void AsScene1308LightWallSymbols::stFadeOutDone() {
 	sendMessage(_parentScene, 0x2003, 0);
 	stopAnimation();
 	setVisible(false);
 }
 
-Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index)
+SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index)
 	: StaticSprite(vm, fileHash, 100) {
 	
 	setVisible(false);
@@ -1572,18 +1551,18 @@ Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index)
 	StaticSprite::update();
 }
 
-Class513::Class513(NeverhoodEngine *vm)
+AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class513::handleMessage);
+	SetMessageHandler(&AsScene1308Mouse::handleMessage);
 	_x = 286;
 	_y = 429;
 	createSurface1(0xA282C472, 100);
 	startAnimation(0xA282C472, 0, -1);
 }
 
-uint32 Class513::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1615,22 +1594,22 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape);
 
 	if (getGlobalVar(0x01023818)) {
-		insertSprite<Class513>();
+		insertSprite<AsScene1308Mouse>();
 		insertSprite<AnimatedSprite>(0x461A1490, 200, 235, 429);
 	}
 	
 	_sprite1 = insertStaticSprite(0x0A042060, 1100);
-	_class549 = insertSprite<Class549>(this);
-	_class593 = insertSprite<Class593>(this);
+	_asJaggyDoor = insertSprite<AsScene1308JaggyDoor>(this);
+	_asLightWallSymbols = insertSprite<AsScene1308LightWallSymbols>(this);
 
-	_class601_1 = insertSprite<Class601>(kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0);
-	_class601_2 = insertSprite<Class601>(kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1);
-	_class601_2 = insertSprite<Class601>(kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2);
+	_ssNumber1 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 1)], 0);
+	_ssNumber2 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 0)], 1);
+	_ssNumber3 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 2)], 2);
 
 	_sprite2 = insertStaticSprite(0x40043120, 995);
 	_sprite3 = insertStaticSprite(0x43003100, 995);
 	_sprite4 = NULL;
-
+	
 	if (which < 0) {
 		insertKlayman<KmScene1308>(380, 440);
 		setMessageList(0x004B57C0);
@@ -1655,7 +1634,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1308>(475, 440);
 		setMessageList(0x004B58B0);
 		if (getGlobalVar(0x80455A41)) {
-			_sprite5 = insertSprite<Class592>(this);
+			_sprite5 = insertSprite<AsScene1308KeyboardDoor>(this);
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			_sprite4->setVisible(false);
 		} else {
@@ -1665,7 +1644,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else {
 		insertKlayman<KmScene1308>(41, 440);
 		setMessageList(0x004B57D0);
-		sendMessage(_class549, 0x4808, 0);
+		sendMessage(_asJaggyDoor, 0x4808, 0);
 		_sprite1->setVisible(false);
 		if (getGlobalVar(0x80455A41)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
@@ -1710,7 +1689,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			_flag1 = false;
 		} else if (param.asInteger() == 0x4AC68808) {
 			clearRectList();
-			sendMessage(_class549, 0x4809, 0);
+			sendMessage(_asJaggyDoor, 0x4809, 0);
 			_sprite1->setVisible(false);
 			_klayman->setVisible(false);
 		}
@@ -1737,22 +1716,22 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		leaveScene(0);
 		break;
 	case 0x2003:
-		_class601_1->setVisible(false);
-		_class601_2->setVisible(false);
-		_class601_3->setVisible(false);
+		_ssNumber1->setVisible(false);
+		_ssNumber2->setVisible(false);
+		_ssNumber3->setVisible(false);
 		break;
 	case 0x2004:
 		_sprite4->setVisible(true);
 		setRectList(0x004B5990);
 		break;
 	case 0x4807:
-		sendMessage(_class593, 0x2003, 0);
+		sendMessage(_asLightWallSymbols, 0x2003, 0);
 		break;
 	case 0x480F:
-		sendMessage(_class593, 0x2002, 0);
-		_class601_1->setVisible(true);
-		_class601_2->setVisible(true);
-		_class601_3->setVisible(true);
+		sendMessage(_asLightWallSymbols, 0x2002, 0);
+		_ssNumber1->setVisible(true);
+		_ssNumber2->setVisible(true);
+		_ssNumber3->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _class489) {
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index b6761dd..70d6f3a 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -64,14 +64,6 @@ protected:
 	void suMoveUp();
 };
 
-class Class595 : public StaticSprite {
-public:
-	Class595(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
 class Scene1302 : public Scene {
 public:
 	Scene1302(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -110,9 +102,9 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class544 : public AnimatedSprite {
+class AsScene1304Needle : public AnimatedSprite {
 public:
-	Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y);
+	AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -124,7 +116,7 @@ public:
 protected:
 	Sprite *_sprite1;
 	Sprite *_class545;
-	Sprite *_class544;
+	Sprite *_asNeedle;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -209,47 +201,47 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class549 : public AnimatedSprite {
+class AsScene1308JaggyDoor : public AnimatedSprite {
 public:
-	Class549(NeverhoodEngine *vm, Scene *parentScene);
+	AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub455470();
-	void hide();
-	void sub4554F0();
-	void sub455550();
+	void stOpenDoor();
+	void stOpenDoorDone();
+	void stCloseDoor();
+	void stCloseDoorDone();
 };
 
-class Class592 : public AnimatedSprite {
+class AsScene1308KeyboardDoor : public AnimatedSprite {
 public:
-	Class592(NeverhoodEngine *vm, Scene *parentScene);
+	AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub455710();
-	void sub455740();
+	void stFallingKeys();
+	void stFallingKeysDone();
 };
 
-class Class593 : public AnimatedSprite {
+class AsScene1308LightWallSymbols : public AnimatedSprite {
 public:
-	Class593(NeverhoodEngine *vm, Scene *parentScene);
+	AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub4558F0();
-	void sub455920();
-	void sub455950();
+	void stFadeIn();
+	void stFadeOut();
+	void stFadeOutDone();
 };
 
-class Class601 : public StaticSprite {
+class SsScene1308Number : public StaticSprite {
 public:
-	Class601(NeverhoodEngine *vm, uint32 fileHash, int index);
+	SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index);
 };
 
-class Class513 : public AnimatedSprite {
+class AsScene1308Mouse : public AnimatedSprite {
 public:
-	Class513(NeverhoodEngine *vm);
+	AsScene1308Mouse(NeverhoodEngine *vm);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -259,11 +251,11 @@ public:
 	Scene1308(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	Sprite *_asTape;
-	Sprite *_class549;
-	Sprite *_class593;
-	Sprite *_class601_1;
-	Sprite *_class601_2;
-	Sprite *_class601_3;
+	Sprite *_asJaggyDoor;
+	Sprite *_asLightWallSymbols;
+	Sprite *_ssNumber1;
+	Sprite *_ssNumber2;
+	Sprite *_ssNumber3;
 	AnimatedSprite *_class489;
 	Sprite *_sprite1;
 	Sprite *_sprite2;


Commit: eefa175a2fb4ea0ccb6ed4f5fbc7477bc088278c
    https://github.com/scummvm/scummvm/commit/eefa175a2fb4ea0ccb6ed4f5fbc7477bc088278c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Update todo.txt

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/todo.txt



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e378775..e6564f3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -298,9 +298,18 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
 //	createModule(1500, 0); // Logos and intro video //Real
+
+	// DEBUG>>>
+	setGlobalVar(0x0A310817, 1);
+	setGlobalVar(0x0A18CA33, 0);
+	setGlobalVar(0x0112090A, 0);
+	//setGlobalVar(0x000CF819, 1);
+	// <<<DEBUG
+
+
 #if 1
-	_vm->gameState().sceneNum = 1;
-	createModule(1000, -1);
+	_vm->gameState().sceneNum = 7;
+	createModule(1300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt
index abf8f27..5561ead 100644
--- a/engines/neverhood/todo.txt
+++ b/engines/neverhood/todo.txt
@@ -18,20 +18,24 @@ TODOs which can be done any time:
 TODOs which should be done only after the game logic is finished:
 -------------------------------------------------------------------
 - Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary
-- Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors)
-	- Should be just a handle object which initializes itself
-	- Play routine should fill the handle so it can be stopped/queried later
-	- Basically like ScummVM own sound handles
 - Rework the resource system
 	- The current system can be simplified a lot
 	- Also resource purging needs to be implemented
-- RE and implement yet unknown music/sound stuff
 - Implement game menus
 - Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes)
 	- This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included
 	- The move special scenes (SmackerScene) into the scenes file
 - Maybe merge CollisionMan with Scene (since it's so far never used independently)
 
+DONE:
+-------
+- Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors)
+	- Should be just a handle object which initializes itself
+	- Play routine should fill the handle so it can be stopped/queried later
+	- Basically like ScummVM own sound handles
+- RE and implement yet unknown music/sound stuff
+
+
 TODOs which are experimental:
 -------------------------------
 NOTE: Since they affect the whole game, they really should be only implemented once the full game logic is implemented.


Commit: 39d1982e47e2785346832e0e3c6898447b07672b
    https://github.com/scummvm/scummvm/commit/39d1982e47e2785346832e0e3c6898447b07672b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Work on Module1400:

- Rename stuff
- Fix some bugs (mistyped message numbers...)
- More to come

Changed paths:
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h



diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 42e8a73..35132b6 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1662,12 +1662,12 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x04A105B3) == 4) {
-		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_class489);
-		_class489->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
-		_class489->setRepl(64, 0);
+		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
+		_vm->_collisionMan->addSprite(_asProjector);
+		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
+		_asProjector->setRepl(64, 0);
 	} else {
-		_class489 = NULL;
+		_asProjector = NULL;
 	}
 
 }
@@ -1680,7 +1680,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			setRectList(0x004B59A0);
 			_flag1 = true;
 		} else if (param.asInteger() == 0x08821382) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			if (getGlobalVar(0x80455A41)) {
 				setRectList(0x004B5990);
 			} else {
@@ -1695,7 +1695,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x1022:
-		if (sender == _class489) {
+		if (sender == _asProjector) {
 			if (param.asInteger() >= 1000)
 				setSurfacePriority(_sprite3->getSurface(), 1100);
 			else
@@ -1734,15 +1734,15 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		_ssNumber3->setVisible(true);
 		break;
 	case 0x4826:
-		if (sender == _class489) {
+		if (sender == _asProjector) {
 			if (_flag1) {
 				setMessageList2(0x004B5868);
 			} else {
 				if (param.asInteger() == 1) {
-					sendEntityMessage(_klayman, 0x1014, _class489);
+					sendEntityMessage(_klayman, 0x1014, _asProjector);
 					setMessageList2(0x004B5848);
-				} else if (sendMessage(_class489, 0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1) != 0) {
-					sendEntityMessage(_klayman, 0x1014, _class489);
+				} else if (sendMessage(_asProjector, 0x480C, _klayman->getX() <= _asProjector->getX() ? 0 : 1) != 0) {
+					sendEntityMessage(_klayman, 0x1014, _asProjector);
 					setMessageList2(0x004B5830);
 				} else {
 					setMessageList2(0x004B5800);
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index 70d6f3a..b458602 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -256,7 +256,7 @@ protected:
 	Sprite *_ssNumber1;
 	Sprite *_ssNumber2;
 	Sprite *_ssNumber3;
-	AnimatedSprite *_class489;
+	AnimatedSprite *_asProjector;
 	Sprite *_sprite1;
 	Sprite *_sprite2;
 	Sprite *_sprite3;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index a8c8b3c..33ec0fc 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -134,23 +134,23 @@ void Module1400::updateScene() {
 
 // Scene1401
 
-Class525::Class525(NeverhoodEngine *vm)
+AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) {
 	
 	// TODO createSurface3(900, dword_4B6768);
 	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
 	_x = 454;
 	_y = 217;
-	SetUpdateHandler(&Class525::update4662A0);
-	SetMessageHandler(&Class525::handleMessage466320);
+	SetMessageHandler(&AsScene1401Pipe::handleMessage466320);
+	SetUpdateHandler(&AsScene1401Pipe::update4662A0);
 	startAnimation(0x4C210500, 0, -1);
 }
 
-Class525::~Class525() {
+AsScene1401Pipe::~AsScene1401Pipe() {
 	_vm->_soundMan->deleteSoundGroup(0x01104C08);
 }
 
-void Class525::update4662A0() {
+void AsScene1401Pipe::update4662A0() {
 	AnimatedSprite::update();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		sub466460();
@@ -161,14 +161,14 @@ void Class525::update4662A0() {
 	}
 }
 
-void Class525::update466300() {
+void AsScene1401Pipe::update466300() {
 	AnimatedSprite::update();
 	if (_countdown1 != 0) {
 		_countdown1--;
 	}
 }
 
-uint32 Class525::handleMessage466320(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401Pipe::handleMessage466320(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -188,7 +188,7 @@ uint32 Class525::handleMessage466320(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401Pipe::handleMessage4663C0(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -197,43 +197,43 @@ uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam &param,
 		} else {
 			sub466460();
 		}
-		SetMessageHandler(&Class525::handleMessage466320);
-		SetUpdateHandler(&Class525::update4662A0);
+		SetMessageHandler(&AsScene1401Pipe::handleMessage466320);
+		SetUpdateHandler(&AsScene1401Pipe::update4662A0);
 		break;
 	}
 	return messageResult;
 }
 
-void Class525::sub466420() {
+void AsScene1401Pipe::sub466420() {
 	startAnimation(0x4C240100, 0, -1);
 	playSound(0, 0x4A30063F);
 }
 
-void Class525::sub466460() {
+void AsScene1401Pipe::sub466460() {
 	_vm->_soundMan->deleteSound(0x4A116437);
 	playSound(0, 0x4A120435);
 	startAnimation(0x4C210500, 0, -1);
 }
 
-void Class525::sub4664B0() {
+void AsScene1401Pipe::sub4664B0() {
 	startAnimation(0x6C210810, 0, -1);
-		SetMessageHandler(&Class525::handleMessage4663C0);
-		SetUpdateHandler(&Class525::update466300);
+	SetMessageHandler(&AsScene1401Pipe::handleMessage4663C0);
+	SetUpdateHandler(&AsScene1401Pipe::update466300);
 }
 
-Class526::Class526(NeverhoodEngine *vm, Sprite *class525)
-	: AnimatedSprite(vm, 1100), _class525(class525) {
+AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
 	
 	// TODO createSurface3(100, dword_4B6778);
 	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
 	_x = 478;
 	_y = 433;
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class526::handleMessage);
+	SetMessageHandler(&AsScene1401Mouse::handleMessage);
 	startAnimation(0xA282C472, 0, -1);
 }
 
-uint32 Class526::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -246,13 +246,13 @@ uint32 Class526::handleMessage(int messageNum, const MessageParam &param, Entity
 		}
 		break;
 	case 0x4839:
-		sub466770();
+		stSuckedIn();
 		break;		
 	}
 	return messageResult;
 }
 
-void Class526::spriteUpdate466720() {
+void AsScene1401Mouse::suSuckedIn() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
 		playSound(0, 0x0E32247F);
@@ -263,34 +263,34 @@ void Class526::spriteUpdate466720() {
 	}
 }
 
-void Class526::sub466770() {
+void AsScene1401Mouse::stSuckedIn() {
 	startAnimation(0x34880040, 0, -1);
-	SetSpriteUpdate(&Class526::spriteUpdate466720);
+	SetSpriteUpdate(&AsScene1401Mouse::suSuckedIn);
 }
 
-Class527::Class527(NeverhoodEngine *vm, Sprite *class526)
-	: AnimatedSprite(vm, 1100), _class526(class526) {
+AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm)
+	: AnimatedSprite(vm, 1100) {
 
 	// TODO createSurface3(200, dword_4B6768);
 	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
 	_x = 427;
 	_y = 433;
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class527::handleMessage);
+	SetMessageHandler(&AsScene1401Cheese::handleMessage);
 	startAnimation(0x461A1490, 0, -1);
 }
 
-uint32 Class527::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4839:
-		sub466970();
+		stSuckedIn();
 		break;		
 	}
 	return messageResult;
 }
 
-void Class527::spriteUpdate466920() {
+void AsScene1401Cheese::suSuckedIn() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
 		playSound(0, 0x18020439);
@@ -301,82 +301,82 @@ void Class527::spriteUpdate466920() {
 	}
 }
 
-void Class527::sub466970() {
+void AsScene1401Cheese::stSuckedIn() {
 	startAnimation(0x103B8020, 0, -1);
-	SetSpriteUpdate(&Class527::spriteUpdate466920);
+	SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn);
 }
 
-Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag)
+AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen)
 	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) {
 
 	_x = 320;
 	_y = 240;
 	createSurface1(0x04551900, 100);
-	SetUpdateHandler(&Class528::update);
-	SetMessageHandler(&Class528::handleMessage);
+	SetUpdateHandler(&AsScene1401BackDoor::update);
+	SetMessageHandler(&AsScene1401BackDoor::handleMessage);
 	_newStickFrameIndex = -2;
-	if (flag) {
-		_flag = true;
+	if (isOpen) {
+		_isOpen = true;
 		startAnimation(0x04551900, -1,- 1);
 		_countdown = 48;
 	} else {
-		_flag = false;
+		_isOpen = false;
 		stopAnimation();
 		setVisible(false);
 	}
 }
 
-void Class528::update() {
+void AsScene1401BackDoor::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		sub466C50();
+		stCloseDoor();
 	}
 	AnimatedSprite::update();
 }
 
 
-uint32 Class528::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2001:
-		if (_flag)
+		if (_isOpen)
 			_countdown = 168;
-		messageResult = _flag ? 1 : 0;			
+		messageResult = _isOpen ? 1 : 0;			
 		break;
 	case 0x3002:
 		gotoNextState();
 		break;
 	case 0x4808:
 		_countdown = 168;
-		if (_flag)
-			sub466BF0();
+		if (_isOpen)
+			stOpenDoor();
 		break;						
 	}
 	return messageResult;
 }
 
-void Class528::sub466BF0() {
-	_flag = true;
+void AsScene1401BackDoor::stOpenDoor() {
+	_isOpen = true;
 	setVisible(true);
 	startAnimation(0x04551900, 0, -1);
 	_newStickFrameIndex = -2;
 	playSound(0, calcHash("fxDoorOpen24"));
 }
 
-void Class528::sub466C50() {
-	_flag = false;
+void AsScene1401BackDoor::stCloseDoor() {
+	_isOpen = false;
 	setVisible(true);
 	startAnimation(0x04551900, -1, -1);
 	playSound(0, calcHash("fxDoorClose24"));
 	_playBackwards = true;
-	NextState(&Class528::sub466CB0);
+	NextState(&AsScene1401BackDoor::stCloseDoorDone);
 }
 
-void Class528::sub466CB0() {
+void AsScene1401BackDoor::stCloseDoorDone() {
 	stopAnimation();
 	setVisible(false);
 }
 
-static const Class489Item kClass489Items[] = {
+static const AsCommonProjectorItem kAsCommonProjectorItems[] = {
 	{{154, 453}, 4,  2,  0, -1, 0, 1},
 	{{104, 391}, 4, -1, -1, -1, 1, 1},
 	{{ 22, 447}, 6, -1, -1, -1, 1, 1},
@@ -384,30 +384,30 @@ static const Class489Item kClass489Items[] = {
 	{{262, 433}, 1,  1,  0, -1, 0, 0}
 };
 
-Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525) {
+AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) {
 
-	_class489Item = &kClass489Items[getGlobalVar(0x04A105B3)];
+	_asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(0x04A105B3)];
 	// TODO createSurface3(990, dword_4B26D8);
 	createSurface(990, 640, 480); //TODO: Remeove once the line above is done
 	startAnimation(0x10E3042B, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class489::handleMessage);
-	_x = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
+	SetMessageHandler(&AsCommonProjector::handleMessage);
+	_x = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
 	_flag = true;
 	sub434C80();
 	setDoDeltaX(1);
-	if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) {
+	if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) {
 		sub434E90();
 	}
 	loadSound(2, 0xC8C2507C);
 }
 
-Class489::~Class489() {
+AsCommonProjector::~AsCommonProjector() {
 	_vm->_soundMan->deleteSoundGroup(0x05331081);
 }
 
-uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -415,8 +415,8 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity
 		messageResult = 1;
 		break;
 	case 0x4807:
-		setGlobalVar(0x04A10F33, (_x - _class489Item->point.x) / 108);
-		if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) {
+		setGlobalVar(0x04A10F33, (_x - _asProjectorItem->point.x) / 108);
+		if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) {
 			sub434E60();
 		} else {
 			sub434DD0();
@@ -424,7 +424,7 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) {
+			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) {
 				incGlobalVar(0x04A10F33, 1);
 			}
 		} else if (getGlobalVar(0x04A10F33) > 0) {
@@ -434,7 +434,7 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity
 		break;
 	case 0x480C:
 		if (param.asInteger() != 1) {
-			messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0;
+			messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0;
 		} else {
 			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
 		}
@@ -445,14 +445,14 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam &param, Entity
 	case 0x482B:
 		sendMessage(_parentScene, 0x1022, 1010);
 		break;
-	case 0x4828:
+	case 0x4839:
 		sub435040();
 		break;
 	}
 	return messageResult;
 }
 
-uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -470,7 +470,7 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam &param,
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) {
+			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) {
 				incGlobalVar(0x04A10F33, 1);
 			}
 		} else if (getGlobalVar(0x04A10F33) > 0) {
@@ -480,7 +480,7 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam &param,
 		break;
 	case 0x480C:
 		if (param.asInteger() != 1) {
-			messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0;
+			messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0;
 		} else {
 			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
 		}
@@ -498,7 +498,7 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 Class489::handleMessage434B20(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonProjector::handleMessage434B20(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -508,18 +508,18 @@ uint32 Class489::handleMessage434B20(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-void Class489::spriteUpdate434B60() {
+void AsCommonProjector::spriteUpdate434B60() {
 	if (_x <= _klayman->getX())
 		_x = _klayman->getX() - 100;
 	else
 		_x = _klayman->getX() + 100;
 	sub434C80();
 	if (_remX == _x) {
-		if (getGlobalVar(0x04A10F33) == 0 && _class489Item->flag4 != 0) {
+		if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->flag4 != 0) {
 			sendMessage(_parentScene, 0x1019, 0);
 			incGlobalVar(0x04A105B3, -1);
-			setGlobalVar(0x04A10F33, kClass489Items[getGlobalVar(0x04A105B3)].varIndex1);
-		} else if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex1 && _class489Item->flag != 0) {
+			setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].varIndex1);
+		} else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex1 && _asProjectorItem->flag != 0) {
 			sendMessage(_parentScene, 0x1019, 1);
 			incGlobalVar(0x04A105B3, +1);
 			setGlobalVar(0x04A10F33, 0);
@@ -528,33 +528,33 @@ void Class489::spriteUpdate434B60() {
 	Sprite::processDelta();
 }
 
-void Class489::sub434C80() {
+void AsCommonProjector::sub434C80() {
 
 	bool soundFlag = false;
 
-	_y = _class489Item->point.y;
+	_y = _asProjectorItem->point.y;
 
-	if (_class489Item->index1 != -1) {
-		int16 elX = _class489Item->index1 * 108 + _class489Item->point.x;
+	if (_asProjectorItem->index1 != -1) {
+		int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x;
 		if (elX - 20 < _x && elX + 20 > _x) {
 			soundFlag = true;
-			_y = _class489Item->point.y + 10;
+			_y = _asProjectorItem->point.y + 10;
 		}
 	}
 
-	if (_class489Item->flag2 != -1) {
-		int16 elX = _class489Item->index1 * 108 + _class489Item->point.x;
+	if (_asProjectorItem->flag2 != -1) {
+		int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x;
 		if (elX - 20 < _x && elX + 20 > _x) {
 			soundFlag = true;
-			_y = _class489Item->point.y + 10;
+			_y = _asProjectorItem->point.y + 10;
 		}
 	}
 
-	if (_class489Item->varIndex2 != -1) {
-		int16 elX = _class489Item->varIndex2 * 108 + _class489Item->point.x;
+	if (_asProjectorItem->varIndex2 != -1) {
+		int16 elX = _asProjectorItem->varIndex2 * 108 + _asProjectorItem->point.x;
 		if (elX - 20 < _x && elX + 20 > _x) {
 			soundFlag = true;
-			_y = _class489Item->point.y + 10;
+			_y = _asProjectorItem->point.y + 10;
 		}
 	}
 
@@ -569,10 +569,10 @@ void Class489::sub434C80() {
 	
 }
 
-void Class489::sub434D80() {
+void AsCommonProjector::sub434D80() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
-		sendMessage(_class525, 0x483A, 0);
+		sendMessage(_asPipe, 0x483A, 0);
 		stopAnimation();
 		SetMessageHandler(&Sprite::handleMessage);
 		SetSpriteUpdate(NULL);
@@ -580,81 +580,81 @@ void Class489::sub434D80() {
 	}
 }
 
-void Class489::sub434DD0() {
+void AsCommonProjector::sub434DD0() {
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Class489::handleMessage);
+	SetMessageHandler(&AsCommonProjector::handleMessage);
 	startAnimation(0x10E3042B, 0, -1);
 }
 
-void Class489::sub434DF0() {
-	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
+void AsCommonProjector::sub434DF0() {
+	_remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
 	startAnimation(0x14A10137, 0, -1);
-	SetSpriteUpdate(&Class489::spriteUpdate434B60);
-	SetMessageHandler(&Class489::handleMessage);
+	SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60);
+	SetMessageHandler(&AsCommonProjector::handleMessage);
 	playSound(1, 0xEC008474);
 }
 
-void Class489::sub434E60() {
+void AsCommonProjector::sub434E60() {
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Class489::handleMessage434B20);
+	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
 	startAnimation(0x80C32213, 0, -1);
-	NextState(&Class489::sub434E90);
+	NextState(&AsCommonProjector::sub434E90);
 }
 
-void Class489::sub434E90() {
+void AsCommonProjector::sub434E90() {
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Class489::handleMessage4348E0);
+	SetMessageHandler(&AsCommonProjector::handleMessage4348E0);
 	startAnimation(0xD23B207F, 0, -1);
 }
 
-void Class489::sub434EC0() {
+void AsCommonProjector::sub434EC0() {
 	startAnimation(0x50A80517, 0, -1);
-	SetMessageHandler(&Class489::handleMessage434B20);
+	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
 	SetSpriteUpdate(NULL);
-	NextState(&Class489::sub434F40);
+	NextState(&AsCommonProjector::sub434F40);
 	setGlobalVar(0x12A10DB3, 1);
 	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
 	_vm->_soundMan->playSoundLooping(0xCE428854);
 }
 
-void Class489::sub434F40() {
+void AsCommonProjector::sub434F40() {
 	sendMessage(_parentScene, 0x480F, 0);
 	startAnimation(0xD833207F, 0, -1);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Class489::handleMessage4348E0);
+	SetMessageHandler(&AsCommonProjector::handleMessage4348E0);
 }
 
-void Class489::sub434F80() {
+void AsCommonProjector::sub434F80() {
 	startAnimation(0x50A94417, 0, -1);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Class489::handleMessage434B20);
-	NextState(&Class489::sub434E90);
+	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
+	NextState(&AsCommonProjector::sub434E90);
 	setGlobalVar(0x12A10DB3, 0);
 	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->deleteSound(0xCE428854);
 }
 
-void Class489::sub434FF0() {
-	_remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x;
+void AsCommonProjector::sub434FF0() {
+	_remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
 	startAnimation(0x22CB4A33, 0, -1);
-	SetSpriteUpdate(&Class489::spriteUpdate434B60);
-	SetMessageHandler(&Class489::handleMessage434B20);
-	NextState(&Class489::sub434DF0);
+	SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60);
+	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
+	NextState(&AsCommonProjector::sub434DF0);
 }
 
-void Class489::sub435040() {
+void AsCommonProjector::sub435040() {
 	setGlobalVar(0x04A105B3, 4);
 	setGlobalVar(0x04A10F33, 0);
-	SetSpriteUpdate(&Class489::sub434D80);
+	SetSpriteUpdate(&AsCommonProjector::sub434D80);
 	SetMessageHandler(&Sprite::handleMessage);
 	startAnimation(0x708D4712, 0, -1);
 	playSound(2);
 }
 
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag(false), _class427(NULL), _class489(NULL), 
-	_class525(NULL), _class526(NULL), _class527(NULL), _class528(NULL), 
+	: Scene(vm, parentModule, true), _flag(false), _class427(NULL), _asProjector(NULL), 
+	_asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), 
 	_sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) {
 
 	SetMessageHandler(&Scene1401::handleMessage);
@@ -667,11 +667,11 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x21FA108A);
 	
 	_class427 = insertSprite<Class427>(this, 0x980F3124, 0x12192892, 100, 0);
-	_class525 = insertSprite<Class525>();
+	_asPipe = insertSprite<AsScene1401Pipe>();
 
 	if (!getGlobalVar(0x01023818)) {
-		_class526 = insertSprite<Class526>(_class525);
-		_class527 = insertSprite<Class527>(_class525);
+		_asMouse = insertSprite<AsScene1401Mouse>();
+		_asCheese = insertSprite<AsScene1401Cheese>();
 	}
 
 	_sprite3 = insertStaticSprite(0xA82BA811, 1100);
@@ -700,35 +700,35 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x04A105B3) == 2) {
-		_class489 = insertSprite<Class489>(this, _klayman, _class525);
-		_vm->_collisionMan->addSprite(_class489);
+		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, _asPipe);
+		_vm->_collisionMan->addSprite(_asProjector);
 		if (getGlobalVar(0x04A10F33) == 6) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
-			_klayman->setX(_class489->getX() + 100);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
+			_klayman->setX(_asProjector->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B6670);
 		} else if (getGlobalVar(0x04A10F33) == 0) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
-			_klayman->setX(_class489->getX() - 100);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
+			_klayman->setX(_asProjector->getX() - 100);
 			_klayman->processDelta();
 			setMessageList(0x004B6670);
 		}
-		_class489->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480);
+		_asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480);
 	}
 	
 	_klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480);
 
-	if (which == 0 && _class489) {
-		sendMessage(_class489, 0x482B, 0);
+	if (which == 0 && _asProjector) {
+		sendMessage(_asProjector, 0x482B, 0);
 	}
 
-	_class528 = insertSprite<Class528>(_klayman, which == 1);
+	_asBackDoor = insertSprite<AsScene1401BackDoor>(_klayman, which == 1);
 
 }
 
 void Scene1401::update() {
 	Scene::update();
-	if (_class489 && !_flag && _class489->getY() < 360) {
+	if (_asProjector && !_flag && _asProjector->getY() < 360) {
 		_sprite2->setVisible(true);
 		_flag = true;
 	} else {
@@ -745,7 +745,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x402064D8) {
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x01C66840) {
-			if (sendMessage(_class528, 0x2001, 0) != 0) {
+			if (sendMessage(_asBackDoor, 0x2001, 0) != 0) {
 				setMessageList(0x004B6690);
 			} else {
 				setMessageList(0x004B66B0);
@@ -761,23 +761,23 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (sender == _class427) {
-			sendMessage(_class525, 0x2000, 0);
+			sendMessage(_asPipe, 0x2000, 0);
 			if (!getGlobalVar(0x01023818)) {
-				sendMessage(_class526, 0x4839, 0);
-				sendMessage(_class527, 0x4839, 0);
+				sendMessage(_asMouse, 0x4839, 0);
+				sendMessage(_asCheese, 0x4839, 0);
 				setGlobalVar(0x01023818, 1);
 			}
-			if (_class489 && _class489->getX() > 404 && _class489->getX() < 504) {
-				sendMessage(_class489 , 0x4839, 0);
+			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) {
+				sendMessage(_asProjector , 0x4839, 0);
 			}
 		} else if (sender == _ssButton) {
 			sendMessage(_ssButton, 0x4808, 0);
 		}
 		break;
 	case 0x4826:
-		if (sender == _class489) {
-			if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klayman, 0x1014, _class489);
+		if (sender == _asProjector) {
+			if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B6658);
 			} else {
 				setMessageList2(0x004B65F0);
@@ -786,14 +786,14 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x482A:
 		_sprite1->setVisible(true);
-		if (_class489) {
-			sendMessage(_class489, 0x482B, 0);
+		if (_asProjector) {
+			sendMessage(_asProjector, 0x482B, 0);
 		}
 		break;
 	case 0x482B:
 		_sprite1->setVisible(false);
-		if (_class489) {
-			sendMessage(_class489, 0x482A, 0);
+		if (_asProjector) {
+			sendMessage(_asProjector, 0x482A, 0);
 		}
 		break;
 	}
@@ -869,7 +869,7 @@ void Class482::sub428560() {
 }
 
 Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag(false), _class482(NULL), _class489(NULL) {
+	: Scene(vm, parentModule, true), _flag(false), _class482(NULL), _asProjector(NULL) {
 
 	SetMessageHandler(&Scene1402::handleMessage);
 
@@ -924,20 +924,20 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x4A105B3) == 1) {
-		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_class489);
+		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
+		_vm->_collisionMan->addSprite(_asProjector);
 		if (getGlobalVar(0x4A10F33) == 4) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
-			_klayman->setX(_class489->getX() + 100);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
+			_klayman->setX(_asProjector->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
 		} else if (getGlobalVar(0x4A10F33) == 0) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
-			_klayman->setX(_class489->getX() - 100);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
+			_klayman->setX(_asProjector->getX() - 100);
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
 		}
-		_class489->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2());
+		_asProjector->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2());
 	}
 
 	_klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2());
@@ -996,9 +996,9 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		sub428230();
 		break;
 	case 0x4826:
-		if (sender == _class489) {
-			if (sendMessage(_class489, 0x408C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klayman, 0x1014, _class489);
+		if (sender == _asProjector) {
+			if (sendMessage(_asProjector, 0x408C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B0BB8);
 			} else {
 				setMessageList2(0x004B0B68);
@@ -1319,7 +1319,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 // Scene1403
 
 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _class489(NULL), _flag(false) {
+	: Scene(vm, parentModule, true), _asProjector(NULL), _flag(false) {
 	
 	SetMessageHandler(&Scene1403::handleMessage);
 	
@@ -1355,16 +1355,16 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setRepl(64, 0);
 
 	if (getGlobalVar(0x04A105B3) == 4) {
-		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_class489);
+		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
+		_vm->_collisionMan->addSprite(_asProjector);
 		if (getGlobalVar(0x04A10F33) == 4) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
-			_klayman->setX(_class489->getX() + 100);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
+			_klayman->setX(_asProjector->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B1F70);
 		}
-		_class489->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2());
-		_class489->setRepl(64, 0);
+		_asProjector->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2());
+		_asProjector->setRepl(64, 0);
 	}
 
 }
@@ -1377,7 +1377,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 			setRectList(0x004B2008);
 			_flag = true;
 		} else if (param.asInteger() == 0x08821382) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			setRectList(0x004B1FF8);
 			_flag = false;
 		}
@@ -1386,7 +1386,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 		leaveScene(0);
 		break;
 	case 0x1022:
-		if (sender == _class489) {
+		if (sender == _asProjector) {
 			if (param.asInteger() >= 1000) {
 				setSurfacePriority(_class401_3->getSurface(), 1100);
 			} else {
@@ -1401,14 +1401,14 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 		_class401_1->setVisible(true);
 		break;
 	case 0x4826:
-		if (sender == _class489) {
+		if (sender == _asProjector) {
 			if (_flag) {
 				setMessageList2(0x004B1FA8);
 			} else if (param.asInteger() == 1) {
-				sendEntityMessage(_klayman, 0x1014, _class489);
+				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B1F88);
-			} else if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klayman, 0x1014, _class489);
+			} else if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B1F58);
 			} else {
 				setMessageList2(0x004B1F28);
@@ -1429,7 +1429,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 // Scene1404
 
 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _class489(NULL), _class545(NULL) {
+	: Scene(vm, parentModule, true), _asProjector(NULL), _class545(NULL) {
 	
 	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) {
 		setGlobalVar(0x13382860, 5);
@@ -1475,15 +1475,15 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (getGlobalVar(0x04A105B3) == 3) {
-		_class489 = insertSprite<Class489>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_class489);
+		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
+		_vm->_collisionMan->addSprite(_asProjector);
 		if (getGlobalVar(0x04A10F33) == 0) {
-			sendEntityMessage(_klayman, 0x1014, _class489);
-			_klayman->setX(_class489->getX() - 100);
+			sendEntityMessage(_klayman, 0x1014, _asProjector);
+			_klayman->setX(_asProjector->getX() - 100);
 			_klayman->processDelta();
 			setMessageList(0x004B8CB8);
 		}
-		_class489->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
+		_asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 	}
 
 	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
@@ -1499,7 +1499,7 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x410650C2) {
-			if (_class489 && _class489->getX() == 220) {
+			if (_asProjector && _asProjector->getX() == 220) {
 				setMessageList(0x004B8C40);
 			} else {
 				setMessageList(0x004B8CE8);
@@ -1510,9 +1510,9 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 		leaveScene(0);
 		break;
 	case 0x4826:
-		if (sender == _class489) {
-			if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klayman, 0x1014, _class489);
+		if (sender == _asProjector) {
+			if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
+				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B8CA0);
 			} else {
 				setMessageList2(0x004B8C40);
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index aed7ba9..7cd5262 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -41,10 +41,10 @@ protected:
 
 // Scene1401
 
-class Class525 : public AnimatedSprite {
+class AsScene1401Pipe : public AnimatedSprite {
 public:
-	Class525(NeverhoodEngine *vm);
-	virtual ~Class525();
+	AsScene1401Pipe(NeverhoodEngine *vm);
+	virtual ~AsScene1401Pipe();
 protected:
 	int _countdown1;
 	int _countdown2;
@@ -57,41 +57,39 @@ protected:
 	void sub4664B0();
 };
 
-class Class526 : public AnimatedSprite {
+class AsScene1401Mouse : public AnimatedSprite {
 public:
-	Class526(NeverhoodEngine *vm, Sprite *class525);
+	AsScene1401Mouse(NeverhoodEngine *vm);
 protected:
-	Sprite *_class525;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate466720();
-	void sub466770();
+	void suSuckedIn();
+	void stSuckedIn();
 };
 
-class Class527 : public AnimatedSprite {
+class AsScene1401Cheese : public AnimatedSprite {
 public:
-	Class527(NeverhoodEngine *vm, Sprite *class526);
+	AsScene1401Cheese(NeverhoodEngine *vm);
 protected:
-	Sprite *_class526;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate466920();
-	void sub466970();
+	void suSuckedIn();
+	void stSuckedIn();
 };
 
-class Class528 : public AnimatedSprite {
+class AsScene1401BackDoor : public AnimatedSprite {
 public:
-	Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag);
+	AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen);
 protected:
 	Sprite *_klayman;
 	int _countdown;
-	bool _flag;
+	bool _isOpen;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub466BF0();
-	void sub466C50();
-	void sub466CB0();
+	void stOpenDoor();
+	void stCloseDoor();
+	void stCloseDoorDone();
 };
 
-struct Class489Item {
+struct AsCommonProjectorItem {
 	NPoint point;
 	int8 varIndex1;
 	int8 varIndex2;
@@ -101,15 +99,15 @@ struct Class489Item {
 	int8 flag;
 };
 
-class Class489 : public AnimatedSprite {
+class AsCommonProjector : public AnimatedSprite {
 public:
-	Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525);
-	virtual ~Class489();
+	AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe);
+	virtual ~AsCommonProjector();
 protected:
 	Scene *_parentScene;
 	Sprite *_klayman;
-	Sprite *_class525;
-	const Class489Item *_class489Item;
+	Sprite *_asPipe;
+	const AsCommonProjectorItem *_asProjectorItem;
 	int16 _remX;
 	bool _flag;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -135,11 +133,11 @@ public:
 protected:
 	bool _flag;
 	Sprite *_class427;
-	Class489 *_class489;
-	Sprite *_class525;
-	Sprite *_class526;
-	Sprite *_class527;
-	Sprite *_class528;
+	AsCommonProjector *_asProjector;
+	Sprite *_asPipe;
+	Sprite *_asMouse;
+	Sprite *_asCheese;
+	Sprite *_asBackDoor;
 	Sprite *_sprite1;
 	Sprite *_sprite2;
 	Sprite *_sprite3;
@@ -174,7 +172,7 @@ protected:
 	Sprite *_class454_2;
 	Sprite *_class454_3;
 	Sprite *_class482;
-	Class489 *_class489;
+	AsCommonProjector *_asProjector;
 	bool _flag;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -226,7 +224,7 @@ protected:
 	Sprite *_class401_3;
 	AsScene1201Tape *_asTape1;
 	AsScene1201Tape *_asTape2;
-	Class489 *_class489;
+	AsCommonProjector *_asProjector;
 	bool _flag;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -240,7 +238,7 @@ public:
 protected:
 	Sprite *_sprite1;
 	Sprite *_asTape;
-	Class489 *_class489;
+	AsCommonProjector *_asProjector;
 	Sprite *_class545;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: cb5ca835787a11d9ff99bcd8a35578586507a61c
    https://github.com/scummvm/scummvm/commit/cb5ca835787a11d9ff99bcd8a35578586507a61c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Rename more stuff in Module1400; also fix some bugs

- Update globalvars.txt

Changed paths:
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h



diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 33ec0fc..59ed0c4 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -141,8 +141,8 @@ AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm)
 	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
 	_x = 454;
 	_y = 217;
-	SetMessageHandler(&AsScene1401Pipe::handleMessage466320);
-	SetUpdateHandler(&AsScene1401Pipe::update4662A0);
+	SetMessageHandler(&AsScene1401Pipe::handleMessage);
+	SetUpdateHandler(&AsScene1401Pipe::update);
 	startAnimation(0x4C210500, 0, -1);
 }
 
@@ -150,10 +150,10 @@ AsScene1401Pipe::~AsScene1401Pipe() {
 	_vm->_soundMan->deleteSoundGroup(0x01104C08);
 }
 
-void AsScene1401Pipe::update4662A0() {
+void AsScene1401Pipe::update() {
 	AnimatedSprite::update();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
-		sub466460();
+		stDoneSucking();
 	}
 	if (_countdown2 != 0 && (--_countdown2 == 0)) {
 		_vm->_soundMan->addSound(0x01104C08, 0x4A116437);
@@ -161,14 +161,14 @@ void AsScene1401Pipe::update4662A0() {
 	}
 }
 
-void AsScene1401Pipe::update466300() {
+void AsScene1401Pipe::upSuckInProjector() {
 	AnimatedSprite::update();
 	if (_countdown1 != 0) {
 		_countdown1--;
 	}
 }
 
-uint32 AsScene1401Pipe::handleMessage466320(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -179,46 +179,46 @@ uint32 AsScene1401Pipe::handleMessage466320(int messageNum, const MessageParam &
 	case 0x2000:
 		_countdown1 = 70;
 		_countdown2 = 8;
-		sub466420();
+		stStartSucking();
 		break;		
 	case 0x483A:
-		sub4664B0();
+		stSuckInProjector();
 		break;		
 	}
 	return messageResult;
 }
 
-uint32 AsScene1401Pipe::handleMessage4663C0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		if (_countdown1 != 0) {
-			sub466420();
+			stStartSucking();
 		} else {
-			sub466460();
+			stDoneSucking();
 		}
-		SetMessageHandler(&AsScene1401Pipe::handleMessage466320);
-		SetUpdateHandler(&AsScene1401Pipe::update4662A0);
+		SetMessageHandler(&AsScene1401Pipe::handleMessage);
+		SetUpdateHandler(&AsScene1401Pipe::update);
 		break;
 	}
 	return messageResult;
 }
 
-void AsScene1401Pipe::sub466420() {
+void AsScene1401Pipe::stStartSucking() {
 	startAnimation(0x4C240100, 0, -1);
 	playSound(0, 0x4A30063F);
 }
 
-void AsScene1401Pipe::sub466460() {
+void AsScene1401Pipe::stDoneSucking() {
 	_vm->_soundMan->deleteSound(0x4A116437);
 	playSound(0, 0x4A120435);
 	startAnimation(0x4C210500, 0, -1);
 }
 
-void AsScene1401Pipe::sub4664B0() {
+void AsScene1401Pipe::stSuckInProjector() {
 	startAnimation(0x6C210810, 0, -1);
-	SetMessageHandler(&AsScene1401Pipe::handleMessage4663C0);
-	SetUpdateHandler(&AsScene1401Pipe::update466300);
+	SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector);
+	SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector);
 }
 
 AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
@@ -377,11 +377,11 @@ void AsScene1401BackDoor::stCloseDoorDone() {
 }
 
 static const AsCommonProjectorItem kAsCommonProjectorItems[] = {
-	{{154, 453}, 4,  2,  0, -1, 0, 1},
-	{{104, 391}, 4, -1, -1, -1, 1, 1},
-	{{ 22, 447}, 6, -1, -1, -1, 1, 1},
-	{{112, 406}, 2, -1, -1, -1, 1, 0},
-	{{262, 433}, 1,  1,  0, -1, 0, 0}
+	{{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 *klayman, Sprite *asPipe)
@@ -394,11 +394,11 @@ AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sp
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsCommonProjector::handleMessage);
 	_x = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
-	_flag = true;
-	sub434C80();
+	_lockedInSlot = true;
+	moveProjector();
 	setDoDeltaX(1);
-	if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) {
-		sub434E90();
+	if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) {
+		stStayLockedInSlot();
 	}
 	loadSound(2, 0xC8C2507C);
 }
@@ -416,25 +416,26 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
 		break;
 	case 0x4807:
 		setGlobalVar(0x04A10F33, (_x - _asProjectorItem->point.x) / 108);
-		if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) {
-			sub434E60();
+		if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) {
+			stStartLockedInSlot();
 		} else {
-			sub434DD0();
+			stIdle();
 		}
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) {
+			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) {
 				incGlobalVar(0x04A10F33, 1);
 			}
 		} else if (getGlobalVar(0x04A10F33) > 0) {
 			incGlobalVar(0x04A10F33, -1);
 		}
-		sub434DF0();
+		stMoving();
 		break;
 	case 0x480C:
+		// Check if the projector can be moved
 		if (param.asInteger() != 1) {
-			messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0;
+			messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0;
 		} else {
 			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
 		}
@@ -446,13 +447,13 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
 		sendMessage(_parentScene, 0x1022, 1010);
 		break;
 	case 0x4839:
-		sub435040();
+		stStartSuckedIn();
 		break;
 	}
 	return messageResult;
 }
 
-uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -466,27 +467,28 @@ uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam
 		break;
 	case 0x4807:
 		sendMessage(_parentScene, 0x4807, 0);
-		sub434F80();
+		stStopProjecting();
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) {
+			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) {
 				incGlobalVar(0x04A10F33, 1);
 			}
 		} else if (getGlobalVar(0x04A10F33) > 0) {
 			incGlobalVar(0x04A10F33, -1);
 		}
-		sub434FF0();
+		stTurnToFront();
 		break;
 	case 0x480C:
+		// Check if the projector can be moved
 		if (param.asInteger() != 1) {
-			messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0;
+			messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0;
 		} else {
 			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
 		}
 		break;
 	case 0x480F:
-		sub434EC0();
+		stStartProjecting();
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -498,7 +500,7 @@ uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam
 	return messageResult;
 }
 
-uint32 AsCommonProjector::handleMessage434B20(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -508,18 +510,18 @@ uint32 AsCommonProjector::handleMessage434B20(int messageNum, const MessageParam
 	return messageResult;
 }
 
-void AsCommonProjector::spriteUpdate434B60() {
+void AsCommonProjector::suMoving() {
 	if (_x <= _klayman->getX())
 		_x = _klayman->getX() - 100;
 	else
 		_x = _klayman->getX() + 100;
-	sub434C80();
-	if (_remX == _x) {
-		if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->flag4 != 0) {
+	moveProjector();
+	if (_beforeMoveX == _x) {
+		if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->leftBorderLeaves != 0) {
 			sendMessage(_parentScene, 0x1019, 0);
 			incGlobalVar(0x04A105B3, -1);
-			setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].varIndex1);
-		} else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex1 && _asProjectorItem->flag != 0) {
+			setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].maxSlotCount);
+		} else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) {
 			sendMessage(_parentScene, 0x1019, 1);
 			incGlobalVar(0x04A105B3, +1);
 			setGlobalVar(0x04A10F33, 0);
@@ -528,48 +530,38 @@ void AsCommonProjector::spriteUpdate434B60() {
 	Sprite::processDelta();
 }
 
-void AsCommonProjector::sub434C80() {
+void AsCommonProjector::moveProjector() {
 
-	bool soundFlag = false;
+	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) {
-			soundFlag = true;
+			nowLockedInSlot = true;
 			_y = _asProjectorItem->point.y + 10;
 		}
 	}
 
-	if (_asProjectorItem->flag2 != -1) {
-		int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x;
-		if (elX - 20 < _x && elX + 20 > _x) {
-			soundFlag = true;
-			_y = _asProjectorItem->point.y + 10;
-		}
-	}
-
-	if (_asProjectorItem->varIndex2 != -1) {
-		int16 elX = _asProjectorItem->varIndex2 * 108 + _asProjectorItem->point.x;
+	if (_asProjectorItem->lockSlotIndex != -1) {
+		int16 elX = _asProjectorItem->lockSlotIndex * 108 + _asProjectorItem->point.x;
 		if (elX - 20 < _x && elX + 20 > _x) {
-			soundFlag = true;
+			nowLockedInSlot = true;
 			_y = _asProjectorItem->point.y + 10;
 		}
 	}
 
-	if (_flag) {
-		if (!soundFlag) {
-			_flag = false;
-		}
-	} else if (soundFlag) {
+	if (_lockedInSlot && !nowLockedInSlot) {
+		_lockedInSlot = false;
+	} else if (!_lockedInSlot && nowLockedInSlot) {
 		playSound(1, 0x5440E474);
-		_flag = true;
+		_lockedInSlot = true;
 	}
 	
 }
 
-void AsCommonProjector::sub434D80() {
+void AsCommonProjector::stSuckedIn() {
 	AnimatedSprite::updateDeltaXY();
 	if (_rect.y1 <= 150) {
 		sendMessage(_asPipe, 0x483A, 0);
@@ -580,80 +572,80 @@ void AsCommonProjector::sub434D80() {
 	}
 }
 
-void AsCommonProjector::sub434DD0() {
+void AsCommonProjector::stIdle() {
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&AsCommonProjector::handleMessage);
 	startAnimation(0x10E3042B, 0, -1);
 }
 
-void AsCommonProjector::sub434DF0() {
-	_remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
+void AsCommonProjector::stMoving() {
+	_beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
 	startAnimation(0x14A10137, 0, -1);
-	SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60);
+	SetSpriteUpdate(&AsCommonProjector::suMoving);
 	SetMessageHandler(&AsCommonProjector::handleMessage);
 	playSound(1, 0xEC008474);
 }
 
-void AsCommonProjector::sub434E60() {
+void AsCommonProjector::stStartLockedInSlot() {
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
 	startAnimation(0x80C32213, 0, -1);
-	NextState(&AsCommonProjector::sub434E90);
+	NextState(&AsCommonProjector::stStayLockedInSlot);
 }
 
-void AsCommonProjector::sub434E90() {
+void AsCommonProjector::stStayLockedInSlot() {
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::handleMessage4348E0);
+	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
 	startAnimation(0xD23B207F, 0, -1);
 }
 
-void AsCommonProjector::sub434EC0() {
+void AsCommonProjector::stStartProjecting() {
 	startAnimation(0x50A80517, 0, -1);
-	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
 	SetSpriteUpdate(NULL);
-	NextState(&AsCommonProjector::sub434F40);
+	NextState(&AsCommonProjector::stLockedInSlot);
 	setGlobalVar(0x12A10DB3, 1);
 	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
 	_vm->_soundMan->playSoundLooping(0xCE428854);
 }
 
-void AsCommonProjector::sub434F40() {
+void AsCommonProjector::stLockedInSlot() {
 	sendMessage(_parentScene, 0x480F, 0);
 	startAnimation(0xD833207F, 0, -1);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::handleMessage4348E0);
+	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
 }
 
-void AsCommonProjector::sub434F80() {
+void AsCommonProjector::stStopProjecting() {
 	startAnimation(0x50A94417, 0, -1);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
-	NextState(&AsCommonProjector::sub434E90);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	NextState(&AsCommonProjector::stStayLockedInSlot);
 	setGlobalVar(0x12A10DB3, 0);
 	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->deleteSound(0xCE428854);
 }
 
-void AsCommonProjector::sub434FF0() {
-	_remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
+void AsCommonProjector::stTurnToFront() {
+	_beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
 	startAnimation(0x22CB4A33, 0, -1);
-	SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60);
-	SetMessageHandler(&AsCommonProjector::handleMessage434B20);
-	NextState(&AsCommonProjector::sub434DF0);
+	SetSpriteUpdate(&AsCommonProjector::suMoving);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	NextState(&AsCommonProjector::stMoving);
 }
 
-void AsCommonProjector::sub435040() {
+void AsCommonProjector::stStartSuckedIn() {
 	setGlobalVar(0x04A105B3, 4);
 	setGlobalVar(0x04A10F33, 0);
-	SetSpriteUpdate(&AsCommonProjector::sub434D80);
+	SetSpriteUpdate(&AsCommonProjector::stSuckedIn);
 	SetMessageHandler(&Sprite::handleMessage);
 	startAnimation(0x708D4712, 0, -1);
 	playSound(2);
 }
 
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag(false), _class427(NULL), _asProjector(NULL), 
+	: Scene(vm, parentModule, true), _projectorBorderFlag(false), _class427(NULL), _asProjector(NULL), 
 	_asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), 
 	_sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) {
 
@@ -728,9 +720,9 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene1401::update() {
 	Scene::update();
-	if (_asProjector && !_flag && _asProjector->getY() < 360) {
+	if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) {
 		_sprite2->setVisible(true);
-		_flag = true;
+		_projectorBorderFlag = true;
 	} else {
 		_sprite2->setVisible(false);
 	}
@@ -767,9 +759,8 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 				sendMessage(_asCheese, 0x4839, 0);
 				setGlobalVar(0x01023818, 1);
 			}
-			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) {
+			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504)
 				sendMessage(_asProjector , 0x4839, 0);
-			}
 		} else if (sender == _ssButton) {
 			sendMessage(_ssButton, 0x4808, 0);
 		}
@@ -802,7 +793,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 
 // Scene1402
 
-Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
+SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
 	: StaticSprite(vm, fileHash, surfacePriority) {
 	
 	SetFilterY(&Sprite::defFilterY);
@@ -810,7 +801,7 @@ Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority)
 	
 }
 
-Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which)
+AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 
 	// TODO createSurface3(900, dword_4B6768);
@@ -818,31 +809,36 @@ Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which)
 
 	SetFilterY(&Sprite::defFilterY);
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class482::handleMessage);
+	SetMessageHandler(&AsScene1402PuzzleBox::handleMessage);
 	_x = 279;
 	_y = 270;
 	if (which == 2) {
+		// Puzzle box after the puzzle was solved
 		startAnimation(0x20060259, 0, -1);
+		NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone);
 		playSound(0, 0x419014AC);
 		loadSound(1, 0x61901C29);
 	} else if (which == 1) {
+		// Puzzle box appears
 		startAnimation(0x210A0213, 0, -1);
+		NextState(&AsScene1402PuzzleBox::stMoveUpDone);
 		playSound(0, 0x41809C6C);
 	} else {
+		// Puzzle box is here
 		startAnimation(0x20060259, 0, -1);
 		loadSound(1, 0x61901C29);
 		_newStickFrameIndex = -2;
 	}
 }
 
-uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+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(&Class482::sub428530);
+		NextState(&AsScene1402PuzzleBox::stMoveDownDone);
 		break;
 	case 0x3002:
 		gotoNextState();
@@ -851,25 +847,25 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class482::sub428500() {
+void AsScene1402PuzzleBox::stMoveUpDone() {
 	sendMessage(_parentScene, 0x2000, 0);
 	stopAnimation();
 	setVisible(false);
 }
 
-void Class482::sub428530() {
+void AsScene1402PuzzleBox::stMoveDownDone() {
 	sendMessage(_parentScene, 0x2001, 0);
 	stopAnimation();
 	setVisible(false);
 }
 
-void Class482::sub428560() {
+void AsScene1402PuzzleBox::stMoveDownSolvedDone() {
 	sendMessage(_parentScene, 0x2003, 0);
 	stopAnimation();
 }
 
 Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag(false), _class482(NULL), _asProjector(NULL) {
+	: Scene(vm, parentModule, true), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) {
 
 	SetMessageHandler(&Scene1402::handleMessage);
 
@@ -880,9 +876,9 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
 	insertMouse433(0x482F4239);
 
-	_class454_1 = insertSprite<Class454>(0x15402D64, 1100);
-	_class454_2 = insertSprite<Class454>(0x10A02120, 1100);
-	_class454_3 = insertSprite<Class454>(0x60882BE0, 1100);
+	_ssBridgePart1 = insertSprite<SsScene1402BridgePart>(0x15402D64, 1100);
+	_ssBridgePart2 = insertSprite<SsScene1402BridgePart>(0x10A02120, 1100);
+	_ssBridgePart3 = insertSprite<SsScene1402BridgePart>(0x60882BE0, 1100);
 
 	if (getGlobalVar(0x70A1189C))
 		setRectList(0x004B0C48);
@@ -893,7 +889,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B48);
 		if (!getGlobalVar(0x70A1189C)) {
-			_class482 = insertSprite<Class482>(this, 0);
+			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
 		}
 	} else if (which == 1) {
 		insertKlayman<KmScene1402>(42, 391);
@@ -903,25 +899,24 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B0B60);
 		_klayman->setDoDeltaX(1);
 		if (getGlobalVar(0x70A1189C)) {
-			_class482 = insertSprite<Class482>(this, 1);
+			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 1);
 			clearRectList();
 			showMouse(false);
-			sub428220();
+			startShaking();
 		} else {
-			_class482 = insertSprite<Class482>(this, 0);
+			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
 		}
 	} else {
 		insertKlayman<KmScene1402>(513, 391);
 		setMessageList(0x004B0B58);
 		if (!getGlobalVar(0x70A1189C)) {
-			_class482 = insertSprite<Class482>(this, 2);
-			sub428220();
+			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 2);
+			startShaking();
 		}
 	}
 
-	if (_class482) {
-		_class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2());
-	}
+	if (_asPuzzleBox)
+		_asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2());
 
 	if (getGlobalVar(0x4A105B3) == 1) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
@@ -937,15 +932,15 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
 		}
-		_asProjector->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2());
+		_asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2());
 	}
 
-	_klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2());
+	_klayman->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2());
 	
 }
 
-void Scene1402::update() {
-	if (_flag) {
+void Scene1402::upShaking() {
+	if (_isShaking) {
 		setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10);
 		// TODO g_screen->field_26 = -10 - _background->getDrawRect().y;
 	} else {
@@ -954,10 +949,9 @@ void Scene1402::update() {
 		SetUpdateHandler(&Scene::update);
 	}
 	Scene::update();
-	if (_class482) {
-		_class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2());
-	}
-	_klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2());
+	if (_asPuzzleBox)
+		_asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2());
+	_klayman->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2());
 }
 
 uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -971,8 +965,8 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 				clearRectList();
 				_klayman->setVisible(false);
 				showMouse(false);
-				sendMessage(_class482, 0x2002, 0);
-				sub428220();
+				sendMessage(_asPuzzleBox, 0x2002, 0);
+				startShaking();
 			}
 		}
 		break;
@@ -984,16 +978,16 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		sub428230();
+		stopShaking();
 		showMouse(true);
 		setRectList(0x004B0C48);
 		break;
 	case 0x2001:
-		sub428230();
+		stopShaking();
 		leaveScene(0);
 		break;
 	case 0x2003:
-		sub428230();
+		stopShaking();
 		break;
 	case 0x4826:
 		if (sender == _asProjector) {
@@ -1008,13 +1002,13 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-void Scene1402::sub428220() {
-	_flag = true;
-	SetUpdateHandler(&Scene1402::update);
+void Scene1402::startShaking() {
+	_isShaking = true;
+	SetUpdateHandler(&Scene1402::upShaking);
 }
 
-void Scene1402::sub428230() {
-	_flag = false;
+void Scene1402::stopShaking() {
+	_isShaking = false;
 }
 
 // Scene1407
@@ -1532,74 +1526,38 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 // 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}
+	{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 index)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _countdown(0), _flag(false) {
+AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) {
 
 	loadSound(0, 0x05308101);
 	// TODO _soundResource.setPan
-	_x = kAsScene1405TileItemPositions[_index].x;
-	_y = kAsScene1405TileItemPositions[_index].y;
+	_x = kAsScene1405TileItemPositions[_tileIndex].x;
+	_y = kAsScene1405TileItemPositions[_tileIndex].y;
 	createSurface1(0x844B805C, 1100);
 	setVisible(false);
-	if (getSubVar(0xCCE0280F, _index))
+	if (getSubVar(0xCCE0280F, _tileIndex))
 		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
 	SetUpdateHandler(&AsScene1405Tile::update);
 	SetMessageHandler(&AsScene1405Tile::handleMessage);
 	
-	debug("getSubVar(0x0C65F80B, _index) = %d", getSubVar(0x0C65F80B, _index));
+	debug("getSubVar(0x0C65F80B, _tileIndex) = %d", getSubVar(0x0C65F80B, _tileIndex));
 	
-	startAnimation(0x844B805C, getSubVar(0x0C65F80B, _index), -1);
-	_newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _index);
+	startAnimation(0x844B805C, getSubVar(0x0C65F80B, _tileIndex), -1);
+	_newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _tileIndex);
 }
 
 void AsScene1405Tile::update() {
@@ -1614,9 +1572,9 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (getSubVar(0xCCE0280F, _index) == 0 && _parentScene->getCountdown() == 0) {
+		if (getSubVar(0xCCE0280F, _tileIndex) == 0 && _parentScene->getCountdown() == 0) {
 			show();
-			sendMessage(_parentScene, 0x2000, _index);
+			sendMessage(_parentScene, 0x2000, _tileIndex);
 		}
 		messageResult = 1;
 		break;
@@ -1625,16 +1583,16 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param,
 }
 
 void AsScene1405Tile::show() {
-	if (!_flag) {
-		_flag = true;
+	if (!_isShowing) {
+		_isShowing = true;
 		playSound(0);
 		setVisible(true);
 	}
 }
 
 void AsScene1405Tile::hide() {
-	if (_flag) {
-		_flag = false;
+	if (_isShowing) {
+		_isShowing = false;
 		playSound(0);
 		setVisible(false);
 	}
@@ -1662,10 +1620,10 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 	
-	for (uint32 index = 0; index < 48; index++) {
-		_tiles[index] = insertSprite<AsScene1405Tile>(this, index);
-		_vm->_collisionMan->addSprite(_tiles[index]);
-		if (getSubVar(0xCCE0280F, index))
+	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
+		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
+		_vm->_collisionMan->addSprite(_tiles[tileIndex]);
+		if (getSubVar(0xCCE0280F, tileIndex))
 			_tilesLeft--;
 	}
 	
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 7cd5262..8cabc99 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -48,13 +48,13 @@ public:
 protected:
 	int _countdown1;
 	int _countdown2;
-	void update4662A0();
-	void update466300();
-	uint32 handleMessage466320(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage4663C0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub466420();
-	void sub466460();
-	void sub4664B0();
+	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 {
@@ -91,12 +91,11 @@ protected:
 
 struct AsCommonProjectorItem {
 	NPoint point;
-	int8 varIndex1;
-	int8 varIndex2;
+	int8 maxSlotCount;
+	int8 lockSlotIndex;
 	int8 index1;
-	int8 flag2;
-	int8 flag4;
-	int8 flag;
+	int8 leftBorderLeaves;
+	int8 rightBorderLeaves;
 };
 
 class AsCommonProjector : public AnimatedSprite {
@@ -108,30 +107,30 @@ protected:
 	Sprite *_klayman;
 	Sprite *_asPipe;
 	const AsCommonProjectorItem *_asProjectorItem;
-	int16 _remX;
-	bool _flag;
+	int16 _beforeMoveX;
+	bool _lockedInSlot;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage4348E0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage434B20(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate434B60();
-	void sub434C80();
-	void sub434D80();
-	void sub434DD0();
-	void sub434DF0();
-	void sub434E60();
-	void sub434E90();
-	void sub434EC0();
-	void sub434F40();
-	void sub434F80();
-	void sub434FF0();
-	void sub435040();
+	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 Scene1401 : public Scene {
 public:
 	Scene1401(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	bool _flag;
+	bool _projectorBorderFlag;
 	Sprite *_class427;
 	AsCommonProjector *_asProjector;
 	Sprite *_asPipe;
@@ -148,36 +147,36 @@ protected:
 
 // Scene1402
 
-class Class454 : public StaticSprite {
+class SsScene1402BridgePart : public StaticSprite {
 public:
-	Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority);
+	SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority);
 };
 
-class Class482 : public AnimatedSprite {
+class AsScene1402PuzzleBox : public AnimatedSprite {
 public:
-	Class482(NeverhoodEngine *vm, Scene *parentScene, int which);
+	AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub428500();
-	void sub428530();
-	void sub428560();
+	void stMoveUpDone();
+	void stMoveDownDone();
+	void stMoveDownSolvedDone();
 };
 
 class Scene1402 : public Scene {
 public:
 	Scene1402(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_class454_1;
-	Sprite *_class454_2;
-	Sprite *_class454_3;
-	Sprite *_class482;
+	Sprite *_ssBridgePart1;
+	Sprite *_ssBridgePart2;
+	Sprite *_ssBridgePart3;
+	Sprite *_asPuzzleBox;
 	AsCommonProjector *_asProjector;
-	bool _flag;
-	void update();
+	bool _isShaking;
+	void upShaking();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub428220();
-	void sub428230();
+	void startShaking();
+	void stopShaking();
 };
 
 // Scene1407
@@ -249,13 +248,13 @@ class Scene1405;
 
 class AsScene1405Tile : public AnimatedSprite {
 public:
-	AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index);
+	AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex);
 	void show();
 	void hide();
 protected:
 	Scene1405 *_parentScene;
-	bool _flag;
-	uint32 _index;
+	bool _isShowing;
+	uint32 _tileIndex;
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);


Commit: b320c9f5a00c6009091cfd8121aa8deaa2624d8d
    https://github.com/scummvm/scummvm/commit/b320c9f5a00c6009091cfd8121aa8deaa2624d8d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Work on Module1600:

- Rename stuff (also in related files)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e6564f3..df001c4 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -304,12 +304,13 @@ void GameModule::startup() {
 	setGlobalVar(0x0A18CA33, 0);
 	setGlobalVar(0x0112090A, 0);
 	//setGlobalVar(0x000CF819, 1);
+	setGlobalVar(0x04A105B3, 2);
 	// <<<DEBUG
 
 
 #if 1
-	_vm->gameState().sceneNum = 7;
-	createModule(1300, -1);
+	_vm->gameState().sceneNum = 8;
+	createModule(1600, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 59ed0c4..88b576ac3 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1608,6 +1608,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x0C0C007D);
 	insertMouse435(0xC00790C8, 20, 620);
 	
+	// DEBUG>>>
 	// TODO: Some debug code: Leave two matching tiles open
 	for (int i = 0; i < 48; i++)
 		setSubVar(0xCCE0280F, i, 1);
@@ -1619,6 +1620,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 			break;
 		}
 	}
+	// <<<DEBUG
 	
 	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
 		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 88b7e73..a46b8fc 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -132,8 +132,10 @@ void Scene1501::update() {
 
 uint32 Scene1501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	if (messageNum == 0x0009) {
+	switch (messageNum) {
+	case 0x0009:
 		_flag = true;
+		break;
 	}
 	return messageResult;
 }
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 5c890e0..92c566e 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -179,11 +179,11 @@ void Module1600::updateScene() {
 	}
 }
 
-Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
+AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: AnimatedSprite(vm, 1000), _parentScene(parentScene) {
 	
-	SetUpdateHandler(&Class521::update);
-	SetMessageHandler(&Class521::handleMessage);
+	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::handleMessage);
 	SetSpriteUpdate(NULL);
 
 	// TODO createSurface2(200, dword_4AF4C0);
@@ -214,17 +214,17 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 
 }
 
-Class521::~Class521() {
-	if (_finalizeStateCb == AnimationCallback(&Class521::sub45D620)) {
+AsCommonCar::~AsCommonCar() {
+	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::sub45D620)) {
 		setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190));
 	}
 }
 
-void Class521::setPathPoints(NPointArray *pathPoints) {
+void AsCommonCar::setPathPoints(NPointArray *pathPoints) {
 	_pathPoints = pathPoints;
 }
 
-void Class521::update() {
+void AsCommonCar::update() {
 	if (_newDeltaXType >= 0) {
 		setDoDeltaX(_newDeltaXType);
 		_newDeltaXType = -1;
@@ -242,14 +242,14 @@ void Class521::update() {
 	sub45E0A0();
 }
 
-void Class521::update45C790() {
-	Class521::update();
+void AsCommonCar::update45C790() {
+	AsCommonCar::update();
 	if (++_idleCounter >= _idleCounterMax)
 		sub45D050();
 	sub45E0A0();
 }
 
-uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1019:
@@ -345,14 +345,14 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity
 		_moreY = param.asInteger();
 		_steps = 0;
 		_flag10E = 0;
-		SetSpriteUpdate(&Class521::suMoveToPrevPoint);
+		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 		_lastDistance = 640;
 		break;
 	case 0x2008:
 		_moreY = param.asInteger();
 		_steps = 0;
 		_flag10E = 0;
-		SetSpriteUpdate(&Class521::suMoveToNextPoint);
+		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 		_lastDistance = 640;
 		break;
 	case 0x2009:
@@ -376,8 +376,8 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Class521::handleMessage(messageNum, param, sender);
+uint32 AsCommonCar::handleMessage45CC30(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (_flag10F && param.asInteger() == 0x025424A2) {
@@ -391,20 +391,20 @@ uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 Class521::handleMessage45CCA0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonCar::handleMessage45CCA0(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x2009:
 		sub45CF80();
 		break;
 	case 0x3002:
 		sendMessage(_parentScene, 0x200A, 0);
-		SetMessageHandler(&Class521::handleMessage);
+		SetMessageHandler(&AsCommonCar::handleMessage);
 		break;
 	}
 	return 0;
 }
 
-void Class521::sub45CD00() {
+void AsCommonCar::sub45CD00() {
 	bool doDeltaX = _doDeltaX;
 	SetSpriteUpdate(NULL);
 	_againDestPtFlag = 0;
@@ -415,12 +415,12 @@ void Class521::sub45CD00() {
 	_flag114 = 0;
 	_flag11A = 0;
 	_rectList = NULL;
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	NextState(&Class521::sub45CFE0);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	NextState(&AsCommonCar::sub45CFE0);
 	startAnimation(0x35698F78, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update45C790);
-	FinalizeState(&Class521::sub45D040);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update45C790);
+	FinalizeState(&AsCommonCar::sub45D040);
 	setDoDeltaX(doDeltaX ? 1 : 0);
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
@@ -429,36 +429,36 @@ void Class521::sub45CD00() {
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void Class521::sub45CDC0() {
+void AsCommonCar::sub45CDC0() {
 	if (_value112 == 1) {
 		_lastDistance = 640;
 		_flag113 = 0;
 		_flag10E = 0;
-		SetSpriteUpdate(&Class521::suMoveToNextPoint);
+		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 	} else if (_value112 == 2) {
 		_lastDistance = 640;
 		_flag113 = 0;
 		_flag10E = 0;
-		SetSpriteUpdate(&Class521::suMoveToPrevPoint);
+		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 	}
 }
 
-void Class521::sub45CE10() {
+void AsCommonCar::sub45CE10() {
 	if (_flag10E && !_flag113 && !_flag10F) {
 		gotoNextState();
 		_flag114 = 0;
 		_flag113 = 1;
 		startAnimation(0x192ADD30, 0, -1);
-		SetMessageHandler(&Class521::handleMessage45CC30);
-		SetUpdateHandler(&Class521::update);
-		NextState(&Class521::sub45CFE0);
+		SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+		SetUpdateHandler(&AsCommonCar::update);
+		NextState(&AsCommonCar::sub45CFE0);
 	} else if (!_flag10E && _steps && _flag113) {
 		gotoNextState();
 		_flag113 = 0;
 		startAnimation(0x9966B138, 0, -1);
-		SetMessageHandler(&Class521::handleMessage45CC30);
-		SetUpdateHandler(&Class521::update);
-		NextState(&Class521::sub45D100);
+		SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+		SetUpdateHandler(&AsCommonCar::update);
+		NextState(&AsCommonCar::sub45D100);
 	} else {
 		bool flag = false;
 		uint index = 0;
@@ -483,25 +483,25 @@ void Class521::sub45CE10() {
 	}
 }
 
-void Class521::sub45CF80() {
+void AsCommonCar::sub45CF80() {
 	startAnimation(0xA86A9538, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	NextState(&Class521::sub45CFE0);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	NextState(&AsCommonCar::sub45CFE0);
 }
 
-void Class521::sub45CFB0() {
+void AsCommonCar::sub45CFB0() {
 	startAnimation(0xA86A9538, -1, -1);
 	_playBackwards = true;
-	SetMessageHandler(&Class521::handleMessage45CCA0);
-	SetUpdateHandler(&Class521::update);
+	SetMessageHandler(&AsCommonCar::handleMessage45CCA0);
+	SetUpdateHandler(&AsCommonCar::update);
 }
 
-void Class521::sub45CFE0() {
+void AsCommonCar::sub45CFE0() {
 	startAnimation(0x35698F78, 0, -1);
-	SetMessageHandler(&Class521::handleMessage);
-	SetUpdateHandler(&Class521::update45C790);
-	FinalizeState(&Class521::sub45D040);
+	SetMessageHandler(&AsCommonCar::handleMessage);
+	SetUpdateHandler(&AsCommonCar::update45C790);
+	FinalizeState(&AsCommonCar::sub45D040);
 	_idleCounter = 0;
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
@@ -509,35 +509,35 @@ void Class521::sub45CFE0() {
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void Class521::sub45D040() {
-	SetUpdateHandler(&Class521::update);
+void AsCommonCar::sub45D040() {
+	SetUpdateHandler(&AsCommonCar::update);
 }
 
-void Class521::sub45D050() {
+void AsCommonCar::sub45D050() {
 	startAnimation(0xB579A77C, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	NextState(&Class521::sub45CFE0);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	NextState(&AsCommonCar::sub45CFE0);
 	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void Class521::sub45D0A0() {
+void AsCommonCar::sub45D0A0() {
 	_flag10F = 1;
 	gotoNextState();
 	startAnimation(0x9C220DA4, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	FinalizeState(&Class521::sub45D0E0);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	FinalizeState(&AsCommonCar::sub45D0E0);
 }
 
-void Class521::sub45D0E0() {
+void AsCommonCar::sub45D0E0() {
 	_flag10F = 0;
 	_newMoveDirection = 0;
 	sub45D100();
 }
 
-void Class521::sub45D100() {
+void AsCommonCar::sub45D100() {
 	_flag114 = 1;
 	if (_currMoveDirection == 1) {
 		startAnimation(0xD4AA03A4, 0, -1);
@@ -551,18 +551,18 @@ void Class521::sub45D100() {
 	setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0);
 }
 
-void Class521::sub45D180() {
+void AsCommonCar::sub45D180() {
 	_flag10F = 1;
 	gotoNextState();
 	startAnimation(0xF46A0324, 0, -1);
 	_value112 = 0;
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	FinalizeState(&Class521::sub45D620);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	FinalizeState(&AsCommonCar::sub45D620);
 	sub45CDC0();
 }
 
-void Class521::moveToNextPoint() {
+void AsCommonCar::moveToNextPoint() {
 	if (_currPointIndex >= (int)_pathPoints->size() - 1) {
 		_moreY = 0;
 		sendMessage(this, 0x1019, 0);
@@ -585,39 +585,39 @@ void Class521::moveToNextPoint() {
 				gotoNextState();
 				_flag113 = 0;
 				startAnimation(0x9966B138, 0, -1);
-				SetMessageHandler(&Class521::handleMessage45CC30);
-				SetUpdateHandler(&Class521::update);
-				NextState(&Class521::sub45D100);
+				SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+				SetUpdateHandler(&AsCommonCar::update);
+				NextState(&AsCommonCar::sub45D100);
 			}
 			_flag10E = 0;
-			SetSpriteUpdate(&Class521::suMoveToNextPoint);
+			SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 			_lastDistance = 640;
 		}
 	}
 }
 
-void Class521::sub45D350() {
+void AsCommonCar::sub45D350() {
 	gotoNextState();
 	_flag10F = 1;
 	_flag10E = 1;
 	startAnimation(0x192ADD30, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	NextState(&Class521::sub45D390);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	NextState(&AsCommonCar::sub45D390);
 }
 
-void Class521::sub45D390() {
+void AsCommonCar::sub45D390() {
 	gotoNextState();
 	_flag10F = 1;
 	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	FinalizeState(&Class521::sub45D620);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	FinalizeState(&AsCommonCar::sub45D620);
 	_value112 = 1;
 	sub45CDC0();
 }
 
-void Class521::moveToPrevPoint() {
+void AsCommonCar::moveToPrevPoint() {
 	if (_currPointIndex == 0 && _stepError == 0) {
 		_moreY = 0;
 		sendMessage(this, 0x1019, 0);
@@ -647,46 +647,46 @@ void Class521::moveToPrevPoint() {
 				gotoNextState();
 				_flag113 = 0;
 				startAnimation(0x9966B138, 0, -1);
-				SetMessageHandler(&Class521::handleMessage45CC30);
-				SetUpdateHandler(&Class521::update);
-				NextState(&Class521::sub45D100);
+				SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+				SetUpdateHandler(&AsCommonCar::update);
+				NextState(&AsCommonCar::sub45D100);
 			}
 			_flag10E = 0;
-			SetSpriteUpdate(&Class521::suMoveToPrevPoint);
+			SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 			_lastDistance = 640;
 		}
 	}
 }
 
-void Class521::sub45D580() {
+void AsCommonCar::sub45D580() {
 	_flag10F = 1;
 	_flag10E = 1;
 	FinalizeState(NULL);
 	startAnimation(0x192ADD30, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	NextState(&Class521::sub45D5D0);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	NextState(&AsCommonCar::sub45D5D0);
 }
 
-void Class521::sub45D5D0() {
+void AsCommonCar::sub45D5D0() {
 	_flag10F = 1;
 	FinalizeState(NULL);
 	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&Class521::handleMessage45CC30);
-	SetUpdateHandler(&Class521::update);
-	FinalizeState(&Class521::sub45D620);
+	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetUpdateHandler(&AsCommonCar::update);
+	FinalizeState(&AsCommonCar::sub45D620);
 	_value112 = 2;
 	sub45CDC0();
 }
 
-void Class521::sub45D620() {
+void AsCommonCar::sub45D620() {
 	_flag10F = 0;
 	_newMoveDirection = 0;
 	setDoDeltaX(2);
 	sub45D100();
 }
 
-void Class521::suMoveToNextPoint() {
+void AsCommonCar::suMoveToNextPoint() {
 	int16 newX = _x, newY = _y;
 
 	if (_currPointIndex >= (int)_pathPoints->size()) {
@@ -831,7 +831,7 @@ void Class521::suMoveToNextPoint() {
 
 }
 
-void Class521::suMoveToPrevPoint() {
+void AsCommonCar::suMoveToPrevPoint() {
 	int16 newX = _x, newY = _y;
 
 	if (_currPointIndex == 0 && _stepError == 0) {
@@ -978,60 +978,60 @@ void Class521::suMoveToPrevPoint() {
 
 }
 
-void Class521::sub45E0A0() {
+void AsCommonCar::sub45E0A0() {
 	// TODO
 }
 
-Class546::Class546(NeverhoodEngine *vm, Scene *parentScene)
+AsScene1608Door::AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _parentScene(parentScene) {
 
 	setVisible(false);
-	SetMessageHandler(&Class546::handleMessage);
+	SetMessageHandler(&AsScene1608Door::handleMessage);
 	stopAnimation();
 }
 
-uint32 Class546::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1608Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		gotoNextState();
 		break;
 	case 0x4808:
-		sub44D710();
+		stOpenDoor();
 		break; 
 	case 0x4809:
-		sub44D790();
+		stCloseDoor();
 		break; 
 	}
 	return messageResult;
 }
 
-void Class546::sub44D710() {
+void AsScene1608Door::stOpenDoor() {
 	startAnimation(0x08C80144, 0, -1);
 	setVisible(true);
-	NextState(&Class546::sub44D760);
+	NextState(&AsScene1608Door::stOpenDoorDone);
 	playSound(0, calcHash("fxDoorOpen23"));
 }
 
-void Class546::sub44D760() {
+void AsScene1608Door::stOpenDoorDone() {
 	sendMessage(_parentScene, 0x2033, 0);
 	stopAnimation();
 	setVisible(false);
 }
 
-void Class546::sub44D790() {
+void AsScene1608Door::stCloseDoor() {
 	startAnimation(0x08C80144, -1, -1);
 	setVisible(true);
-	NextState(&Class546::sub44D7F0);
+	NextState(&AsScene1608Door::stCloseDoorDone);
 	playSound(0, calcHash("fxDoorClose23"));
 }
 
-void Class546::sub44D7F0() {
+void AsScene1608Door::stCloseDoorDone() {
 	sendMessage(_parentScene, 0x2034, 0);
 	stopAnimation();
 }
 
-Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y)
+AsScene1608IdleCarLower::AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
 
 	setDoDeltaX(1);
@@ -1039,35 +1039,39 @@ Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y)
 	_newStickFrameIndex = 1;
 }
 
-Class548::Class548(NeverhoodEngine *vm, int16 x, int16 y)
+AsScene1608IdleCarFull::AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
 
 	setDoDeltaX(1);
 	_newStickFrameIndex = 0;
 }
 
-Class518::Class518(NeverhoodEngine *vm, Class521 *class521)
-	: AnimatedSprite(vm, 1100), _class521(class521) {
+AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar)
+	: AnimatedSprite(vm, 1100), _asCar(asCar) {
 	
-	SetUpdateHandler(&Class518::update);
+	SetUpdateHandler(&AsCommonCarConnector::update);
 	createSurface1(0x60281C10, 150);
 	startAnimation(0x60281C10, -1, -1);
 	_newStickFrameIndex = -2;
 }
 
-void Class518::update() {
-	_x = _class521->getX();
-	_y = _class521->getY();
+void AsCommonCarConnector::update() {
+	_x = _asCar->getX();
+	_y = _asCar->getY();
 	AnimatedSprite::update();
 }
 
 Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _class521(NULL), _countdown1(0) {
+	: Scene(vm, parentModule, true), _asCar(NULL), _countdown1(0) {
+
+	/* TODO: Find out which of the message/update handlers are used for
+		the upper/lower floors and rename them accordingly.
+	*/
 	
 	setGlobalVar(0x21E60190, 1);
 	
 	_surfaceFlag = true;
-	SetMessageHandler(&Scene1608::handleMessage44D2A0);
+	SetMessageHandler(&Scene1608::hmLowerFloor);
 	
 	_class545 = insertSprite<Class545>(this, 1, 1100, 198, 220);
 	_vm->_collisionMan->addSprite(_class545);
@@ -1078,9 +1082,9 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		else {
 			setRectList(0x004B47D0);
 			insertKlayman<KmScene1608>(380, 438);
-			_klayman2 = _klayman;
-			_flag4 = false;
-			_class546 = insertSprite<Class546>(this);
+			_kmScene1608 = _klayman;
+			_klaymanInCar = false;
+			_asDoor = insertSprite<AsScene1608Door>(this);
 			_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
 			setMessageList(0x004B46A8);
 			setBackground(0x10080E01);
@@ -1088,7 +1092,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 			_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
 			_vm->_collisionMan->addSprite(_asTape);
 			_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-			SetUpdateHandler(&Scene1608::update44CE90);
+			SetUpdateHandler(&Scene1608::upLowerFloor);
 			insertMouse433(0x80E05108);
 			insertStaticSprite(0x4B18F868, 1200);
 		}
@@ -1096,8 +1100,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->gameState().which = 0;
 		setRectList(0x004B47D0);
 		insertKlayman<KmScene1608>(0, 438);
-		_klayman2 = _klayman;
-		_flag4 = false;
+		_kmScene1608 = _klayman;
+		_klaymanInCar = false;
 		setMessageList(0x004B46B0);
 		setBackground(0x10080E01);
 		setPalette(0x10080E01);
@@ -1105,10 +1109,10 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asTape);
 		insertMouse433(0x80E05108);
 		_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
-		_class546 = insertSprite<Class546>(this);
+		_asDoor = insertSprite<AsScene1608Door>(this);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-		SetUpdateHandler(&Scene1608::update44CE90);
-		sendMessage(_class546, 0x4808, 0);
+		SetUpdateHandler(&Scene1608::upLowerFloor);
+		sendMessage(_asDoor, 0x4808, 0);
 		insertStaticSprite(0x4B18F868, 1200);
 	} else if (which == 2) {
 		_vm->gameState().which = 1;
@@ -1119,38 +1123,38 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->addPalette("paPodRed", 65, 31, 65);
 		insertMouse433(0x01600988);
 		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
-		_class521 = createSprite<Class521>(this, 375, 227); // Create but don't add to the sprite list yet
-		_class547 = insertSprite<Class547>(375, 227);
-		_class548 = insertSprite<Class548>(375, 227);
-		_class521->setVisible(false);
+		_asCar = createSprite<AsCommonCar>(this, 375, 227); // Create but don't add to the sprite list yet
+		_asIdleCarLower = insertSprite<AsScene1608IdleCarLower>(375, 227);
+		_asIdleCarFull = insertSprite<AsScene1608IdleCarFull>(375, 227);
+		_asCar->setVisible(false);
 		if (getGlobalVar(0xC0418A02)) {
 			insertKlayman<KmScene1608>(373, 220);
 			_klayman->setDoDeltaX(1);
 		} else {
 			insertKlayman<KmScene1608>(283, 220);
 		}
-		_klayman2 = _klayman;
+		_kmScene1608 = _klayman;
 		setMessageList(0x004B47A8);
-		SetMessageHandler(&Scene1608::handleMessage44D3C0);
-		SetUpdateHandler(&Scene1608::update44CED0);
+		SetMessageHandler(&Scene1608::hmUpperFloor);
+		SetUpdateHandler(&Scene1608::upUpperFloor);
 		// NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original
-		_class521->setPathPoints(_roomPathPoints);
-		sendMessage(_class521, 0x2002, _roomPathPoints->size() - 1);
+		_asCar->setPathPoints(_roomPathPoints);
+		sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1);
 		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
 		_rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
 		_rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
 		_rect2 = _rect1;
 		_rect2.y2 = 215;
 		_klayman->setClipRect(_rect1);
-		_class521->setClipRect(_rect1);
-		_class547->setClipRect(_rect1);
-		_class548->setClipRect(_rect1);
+		_asCar->setClipRect(_rect1);
+		_asIdleCarLower->setClipRect(_rect1);
+		_asIdleCarFull->setClipRect(_rect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape);
-		insertSprite<Class518>(_class521)->setClipRect(_rect1);
-		_flag4 = false;
-		_flag2 = false;
-		_flag1 = 0;
+		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_rect1);
+		_klaymanInCar = false;
+		_carClipFlag = false;
+		_carStatus = 0;
 		setRectList(0x004B4810);
 	} 
 
@@ -1163,36 +1167,36 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		setPalette(0x98001604);
 		_palette->addPalette("paPodRed", 65, 31, 65);
 		insertMouse433(0x01600988);
-		_class521 = insertSprite<Class521>(this, 375, 227);
-		_class547 = insertSprite<Class547>(375, 227);
-		_class548 = insertSprite<Class548>(375, 227);
+		_asCar = insertSprite<AsCommonCar>(this, 375, 227);
+		_asIdleCarLower = insertSprite<AsScene1608IdleCarLower>(375, 227);
+		_asIdleCarFull = insertSprite<AsScene1608IdleCarFull>(375, 227);
 		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
-		_klayman2 = createSprite<KmScene1608>(this, 439, 220); // Special Klayman handling...
-		sendMessage(_klayman2, 0x2032, 1);
-		_klayman2->setDoDeltaX(1);
-		SetMessageHandler(&Scene1608::handleMessage44D470);
-		SetUpdateHandler(&Scene1608::update44D1E0);
-		_class547->setVisible(false);
-		_class548->setVisible(false);
+		_kmScene1608 = createSprite<KmScene1608>(this, 439, 220); // Special Klayman handling...
+		sendMessage(_kmScene1608, 0x2032, 1);
+		_kmScene1608->setDoDeltaX(1);
+		SetMessageHandler(&Scene1608::hmRidingCar);
+		SetUpdateHandler(&Scene1608::upRidingCar);
+		_asIdleCarLower->setVisible(false);
+		_asIdleCarFull->setVisible(false);
 		// NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original
-		_class521->setPathPoints(_roomPathPoints);
-		sendMessage(_class521, 0x2002, 0);
-		sendMessage(_class521, 0x2008, 90);
+		_asCar->setPathPoints(_roomPathPoints);
+		sendMessage(_asCar, 0x2002, 0);
+		sendMessage(_asCar, 0x2008, 90);
 		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
 		_rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
 		_rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
 		_rect2 = _rect1;
 		_rect2.y2 = 215;
-		_klayman2->setClipRect(_rect1);
-		_class521->setClipRect(_rect1);
-		_class547->setClipRect(_rect1);
-		_class548->setClipRect(_rect1);
+		_kmScene1608->setClipRect(_rect1);
+		_asCar->setClipRect(_rect1);
+		_asIdleCarLower->setClipRect(_rect1);
+		_asIdleCarFull->setClipRect(_rect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
 		// ... _vm->_collisionMan->addSprite(_asTape);
-		insertSprite<Class518>(_class521)->setClipRect(_rect1);
-		_flag4 = true;
-		_flag2 = true;
-		_flag1 = 0;
+		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_rect1);
+		_klaymanInCar = true;
+		_carClipFlag = true;
+		_carStatus = 0;
 	}
 	
 	_palette->addPalette("paKlayRed", 0, 64, 0);
@@ -1200,113 +1204,100 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1608::~Scene1608() {
-	setGlobalVar(0xC0418A02, _klayman2->isDoDeltaX() ? 1 : 0);
-	// Weird
-	if (_flag4) {
-		delete _klayman2;
+	setGlobalVar(0xC0418A02, _kmScene1608->isDoDeltaX() ? 1 : 0);
+	if (_klaymanInCar) {
+		delete _kmScene1608;
 	} else {
-		delete _class521;
+		delete _asCar;
 	}
 }
 
-void Scene1608::update44CE90() {
+void Scene1608::upLowerFloor() {
 	Scene::update();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		leaveScene(0);
 	}
 }
 
-void Scene1608::update44CED0() {
+void Scene1608::upUpperFloor() {
 	Scene::update();
-	if (_flag1 == 1) {
+	if (_carStatus == 1) {
 		removeSurface(_klayman->getSurface());
 		removeEntity(_klayman);
-		addSprite(_class521);
-		_flag4 = true;
+		addSprite(_asCar);
+		_klaymanInCar = true;
 		clearRectList();
-		SetUpdateHandler(&Scene1608::update44CFE0);
-		SetMessageHandler(&Scene1608::handleMessage44D510);
-		_class547->setVisible(false);
-		_class548->setVisible(false);
-		_class521->setVisible(true);
-		sendMessage(_class521, 0x2009, 0);
-		_class521->handleUpdate();
+		SetUpdateHandler(&Scene1608::upCarAtHome);
+		SetMessageHandler(&Scene1608::hmCarAtHome);
+		_asIdleCarLower->setVisible(false);
+		_asIdleCarFull->setVisible(false);
+		_asCar->setVisible(true);
+		sendMessage(_asCar, 0x2009, 0);
+		_asCar->handleUpdate();
 		_klayman = NULL;
-		_flag1 = 0;
-	}
-	if (_klayman2->getX() <= 375) {
-		_klayman2->setClipRect(_rect1);
-	} else {
-		_klayman2->setClipRect(_rect2);
+		_carStatus = 0;
 	}
+	updateKlaymanCliprect();
 }
 
-void Scene1608::update44CFE0() {
+void Scene1608::upCarAtHome() {
 	Scene::update();
 	if (_mouseClicked) {
-		if (_mouseClickPos.x <= 329 && _class521->getX() == 375 && _class521->getY() == 227) {
-			sendMessage(_class521, 0x200A, 0);
-			SetUpdateHandler(&Scene1608::update44D0C0);
+		if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) {
+			sendMessage(_asCar, 0x200A, 0);
+			SetUpdateHandler(&Scene1608::upGettingOutOfCar);
 		} else {
-			sendPointMessage(_class521, 0x2004, _mouseClickPos);
-			SetMessageHandler(&Scene1608::handleMessage44D470);
-			SetUpdateHandler(&Scene1608::update44D1E0);
+			sendPointMessage(_asCar, 0x2004, _mouseClickPos);
+			SetMessageHandler(&Scene1608::hmRidingCar);
+			SetUpdateHandler(&Scene1608::upRidingCar);
 		}
 		_mouseClicked = false;
 	}
-	if (_klayman2->getX() <= 375) {
-		_klayman2->setClipRect(_rect1);
-	} else {
-		_klayman2->setClipRect(_rect2);
-	}
+	updateKlaymanCliprect();
 }
 
-void Scene1608::update44D0C0() {
+void Scene1608::upGettingOutOfCar() {
 	Scene::update();
-	if (_flag1 == 2) {
-		_klayman = _klayman2;
-		removeSurface(_class521->getSurface());
-		removeEntity(_class521);
+	if (_carStatus == 2) {
+		_klayman = _kmScene1608;
+		removeSurface(_asCar->getSurface());
+		removeEntity(_asCar);
 		addSprite(_klayman);
-		_flag4 = false;
-		SetMessageHandler(&Scene1608::handleMessage44D3C0);
-		SetUpdateHandler(&Scene1608::update44CED0);
+		_klaymanInCar = false;
+		SetMessageHandler(&Scene1608::hmUpperFloor);
+		SetUpdateHandler(&Scene1608::update);
 		setRectList(0x004B4810);
-		_class547->setVisible(true);
-		_class548->setVisible(true);
-		_class521->setVisible(false);
+		_asIdleCarLower->setVisible(true);
+		_asIdleCarFull->setVisible(true);
+		_asCar->setVisible(false);
 		setMessageList(0x004B4748);
 		runMessageList();
 		_klayman->handleUpdate();
-		_flag1 = 0;
-	}
-	if (_klayman2->getX() <= 375) {
-		_klayman2->setClipRect(_rect1);
-	} else {
-		_klayman2->setClipRect(_rect2);
+		_carStatus = 0;
 	}
+	updateKlaymanCliprect();
 }
 
-void Scene1608::update44D1E0() {
+void Scene1608::upRidingCar() {
 	Scene::update();
 	if (_mouseClicked) {
-		sendPointMessage(_class521, 0x2004, _mouseClickPos);
+		sendPointMessage(_asCar, 0x2004, _mouseClickPos);
 		_mouseClicked = false;
 	}
-	if (_class521->getX() < 300) {
-		if (_flag2) {
-			_flag2 = false;
-			_class521->setClipRect(_rect1);
-			if (!_class521->isDoDeltaX())
-				sendMessage(_class521, 0x200E, 0);
+	if (_asCar->getX() < 300) {
+		if (_carClipFlag) {
+			_carClipFlag = false;
+			_asCar->setClipRect(_rect1);
+			if (!_asCar->isDoDeltaX())
+				sendMessage(_asCar, 0x200E, 0);
 		}
-	} else if (!_flag2) {
-		_flag2 = true;
-		_class521->setClipRect(_rect3);
+	} else if (!_carClipFlag) {
+		_carClipFlag = true;
+		_asCar->setClipRect(_rect3);
 	}
 }
 
-uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1315,7 +1306,7 @@ uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam &param,
 			_klayman->setVisible(false);
 			showMouse(false);
 			_sprite1->setVisible(false);
-			sendMessage(_class546, 0x4809, 0);
+			sendMessage(_asDoor, 0x4809, 0);
 			_countdown1 = 28;
 		}
 		break;
@@ -1324,7 +1315,7 @@ uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam &param,
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
-			sendEntityMessage(_klayman2, 0x1014, _asTape);
+			sendEntityMessage(_kmScene1608, 0x1014, _asTape);
 			setMessageList(0x004B4770);
 		} else if (sender == _class545) {
 			setMessageList(0x004B46C8);
@@ -1334,12 +1325,12 @@ uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam &param,
 	return 0;
 }
 
-uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x60842040) {
-			_flag1 = true;
+			_carStatus = 1;
 		}
 		break;
 	case 0x200D:
@@ -1347,7 +1338,7 @@ uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam &param,
 		break;
 	case 0x4826:
 		if (sender == _class545) {
-			sendEntityMessage(_klayman2, 0x1014, _class545);
+			sendEntityMessage(_kmScene1608, 0x1014, _class545);
 			setMessageList(0x004B4760);
 		}
 		break;
@@ -1355,16 +1346,16 @@ uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam &param,
 	return 0;
 }
 
-uint32 Scene1608::handleMessage44D470(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2005:
 		leaveScene(1);
 		break;
 	case 0x2006:
-		SetMessageHandler(&Scene1608::handleMessage44D510);
-		SetUpdateHandler(&Scene1608::update44CFE0);
-		sendMessage(_class521, 0x200F, 1);
+		SetMessageHandler(&Scene1608::hmCarAtHome);
+		SetUpdateHandler(&Scene1608::upCarAtHome);
+		sendMessage(_asCar, 0x200F, 1);
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -1373,11 +1364,11 @@ uint32 Scene1608::handleMessage44D470(int messageNum, const MessageParam &param,
 	return 0;
 }
 
-uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x200A:
-		_flag1 = 2;
+		_carStatus = 2;
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -1386,11 +1377,18 @@ uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam &param,
 	return 0;
 }
 	
+void Scene1608::updateKlaymanCliprect() {
+	if (_kmScene1608->getX() <= 375)
+		_kmScene1608->setClipRect(_rect1);
+	else
+		_kmScene1608->setClipRect(_rect2);
+}
+
 Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown1(1), _index1(0), _index3(0), _flag5(true), _flag6(false) {
+	: Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
 
 	// TODO _vm->gameModule()->initScene3011Vars();
-	_index2 = getGlobalVar(0x2414C2F2);
+	_noisySymbolIndex = getGlobalVar(0x2414C2F2);
 	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene1609::handleMessage);
@@ -1399,8 +1397,8 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x92124A14);
 	setPalette(0x92124A14);
 	
-	for (int i = 0; i < 12; i++)
-		_asSymbols[i] = insertSprite<AsScene3011Symbol>(i, false);
+	for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++)
+		_asSymbols[symbolPosition] = insertSprite<AsScene3011Symbol>(symbolPosition, false);
 	
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
 	_vm->_collisionMan->addSprite(_ssButton);
@@ -1412,21 +1410,21 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 void Scene1609::update() {
-	if (!_flag6 && _countdown1 != 0 && (--_countdown1 == 0)) {
-		if (_flag5) {
-			_index1++;
-			if (_index1 >= 12)
-				_index1 = 0;
-			_asSymbols[_index3]->change(_index1 + 12, _index1 == (int)getSubVar(0x04909A50, _index2));
-			_flag5 = false;
+	if (!_isSolved && _countdown1 != 0 && (--_countdown1 == 0)) {
+		if (_changeCurrentSymbol) {
+			_currentSymbolIndex++;
+			if (_currentSymbolIndex >= 12)
+				_currentSymbolIndex = 0;
+			_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(0x04909A50, _noisySymbolIndex));
+			_changeCurrentSymbol = false;
 			_countdown1 = 36;
 		} else {
-			_asSymbols[_index3]->hide();
-			_flag5 = true;
+			_asSymbols[_symbolPosition]->hide();
+			_changeCurrentSymbol = true;
 			_countdown1 = 12;
 		}
 	}
-	if (_flag6 && !isSoundPlaying(0)) {
+	if (_isSolved && !isSoundPlaying(0)) {
 		leaveScene(1);
 	}
 	Scene::update();
@@ -1442,23 +1440,23 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	// TODO: Debug stuff
 	case 0x2000:
-		if (!_flag6) {
-			if (_flag5)
-				_asSymbols[_index3]->change(_index1 + 12, false);
-			_asSymbols[_index3]->stopSymbolSound();
-			_index3++;
-			if (_index3 >= 12) {
+		if (!_isSolved) {
+			if (_changeCurrentSymbol)
+				_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false);
+			_asSymbols[_symbolPosition]->stopSymbolSound();
+			_symbolPosition++;
+			if (_symbolPosition >= 12) {
 				if (testVars()) {
 					playSound(0);
 					setGlobalVar(0x2C531AF8, 1);
-					_flag6 = true;
+					_isSolved = true;
 				} else {
-					_index3 = 0;
+					_symbolPosition = 0;
 					for (int i = 0; i < 12; i++)
 						_asSymbols[i]->hide();
 				}
 			}
-			_flag5 = true;
+			_changeCurrentSymbol = true;
 			_countdown1 = 1;
 		}
 		break;
@@ -1468,6 +1466,8 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 
 bool Scene1609::testVars() {
 	int index1 = 0;
+
+	// Find the position of the first symbol
 	do {
 		int cmpIndex = _asSymbols[0]->getIndex();
 		if (!_asSymbols[0]->getFlag1())
@@ -1476,17 +1476,20 @@ bool Scene1609::testVars() {
 			break;
 		index1++;
 	} while(1);
+
+	// Check if the entered symbols match
 	for (int index2 = 0; index2 < 12; index2++) {
 		int cmpIndex = _asSymbols[index2]->getIndex();
 		if (!_asSymbols[index2]->getFlag1())
 			cmpIndex -= 12;
 		if ((int)getSubVar(0x04909A50, index1) != cmpIndex)
 			return false;
-		_index1++;
-		if (_index1 >= 12)
-			_index1 = 0;
-		_index2++;
+		index1++;
+		if (index1 >= 12)
+			index1 = 0;
+		index2++;
 	}
+
 	return true;
 }
 	
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index b5b8e6b..ec31b68 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -41,10 +41,10 @@ protected:
 	void updateScene();
 };
 
-class Class521 : public AnimatedSprite {
+class AsCommonCar : public AnimatedSprite {
 public:
-	Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-	~Class521();
+	AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
+	~AsCommonCar();
 	void setPathPoints(NPointArray *pathPoints);
 protected:
 	Scene *_parentScene;
@@ -105,33 +105,33 @@ protected:
 	void sub45E0A0();
 };
 
-class Class546 : public AnimatedSprite {
+class AsScene1608Door : public AnimatedSprite {
 public:
-	Class546(NeverhoodEngine *vm, Scene *parentScene);
+	AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub44D710();
-	void sub44D760();
-	void sub44D790();
-	void sub44D7F0();
+	void stOpenDoor();
+	void stOpenDoorDone();
+	void stCloseDoor();
+	void stCloseDoorDone();
 };
 
-class Class547 : public AnimatedSprite {
+class AsScene1608IdleCarLower : public AnimatedSprite {
 public:
-	Class547(NeverhoodEngine *vm, int16 x, int16 y);
+	AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y);
 };
 
-class Class548 : public AnimatedSprite {
+class AsScene1608IdleCarFull : public AnimatedSprite {
 public:
-	Class548(NeverhoodEngine *vm, int16 x, int16 y);
+	AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y);
 };
 
-class Class518 : public AnimatedSprite {
+class AsCommonCarConnector : public AnimatedSprite {
 public:
-	Class518(NeverhoodEngine *vm, Class521 *class521);
+	AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar);
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	void update();
 };
 
@@ -140,34 +140,34 @@ public:
 	Scene1608(NeverhoodEngine *vm, Module *parentModule, int which);
 	~Scene1608();
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	Sprite *_class545;
-	Sprite *_class546;
-	Sprite *_class547;
-	Sprite *_class548;
+	Sprite *_asDoor;
+	Sprite *_asIdleCarLower;
+	Sprite *_asIdleCarFull;
 	Sprite *_sprite1;
 	Sprite *_sprite2;
 	Sprite *_sprite3;
 	Sprite *_asTape;
-	Klayman *_klayman2;
+	Klayman *_kmScene1608;
 	NRect _rect1;
 	NRect _rect2;
 	NRect _rect3;
-	int _flag1;
-	bool _flag2;
-	bool _flag3;
-	bool _flag4;
+	int _carStatus;
+	bool _carClipFlag;
+	bool _klaymanInCar;
 	int _countdown1;
 	NPointArray *_roomPathPoints;
-	void update44CE90();
-	void update44CED0();
-	void update44CFE0();
-	void update44D0C0();
-	void update44D1E0();
-	uint32 handleMessage44D2A0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage44D3C0(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage44D470(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage44D510(int messageNum, const MessageParam &param, Entity *sender);
+	void upLowerFloor();
+	void upUpperFloor();
+	void upCarAtHome();
+	void upGettingOutOfCar();
+	void upRidingCar();
+	uint32 hmLowerFloor(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmUpperFloor(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRidingCar(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender);
+	void updateKlaymanCliprect();
 };
 
 class Scene1609 : public Scene {
@@ -176,12 +176,12 @@ public:
 protected:
 	Sprite *_ssButton;
 	AsScene3011Symbol *_asSymbols[12];
-	int _index1;
-	int _index2;
-	int _index3;
+	int _currentSymbolIndex;
+	int _noisySymbolIndex;
+	int _symbolPosition;
 	int _countdown1;
-	bool _flag5;
-	bool _flag6;
+	bool _changeCurrentSymbol;
+	bool _isSolved;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	bool testVars();
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index cc0dda9..26d0d88 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -249,7 +249,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class437 = createSprite<Class437>(0x99BE9015); // Don't add this to the sprite list
 	addEntity(_class437);
 
-	_class521 = createSprite<Class521>(this, 211, 400); // Create but don't add to the sprite list yet
+	_asCar = createSprite<AsCommonCar>(this, 211, 400); // Create but don't add to the sprite list yet
 	_class541 = insertSprite<Class541>(211, 400);
 	_class542 = insertSprite<Class542>(211, 400);
 	insertStaticSprite(0xC42AC521, 1500);
@@ -262,11 +262,11 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B2608);
 		SetMessageHandler(&Scene2501::handleMessage);
 		SetUpdateHandler(&Scene2501::update);
-		sendMessage(_class521, 0x2009, 0);
-		_class521->setVisible(false);
+		sendMessage(_asCar, 0x2009, 0);
+		_asCar->setVisible(false);
 		_currTrackIndex = 0;
 	} else if (which == 1 || which == 2) {
-		addSprite(_class521);
+		addSprite(_asCar);
 		_kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393);
 		_klaymanInCar = true;
 		sendMessage(_kmScene2501, 0x2000, 1);
@@ -284,33 +284,33 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B2608);
 		SetMessageHandler(&Scene2501::handleMessage);
 		SetUpdateHandler(&Scene2501::update);
-		sendMessage(_class521, 0x2009, 0);
-		_class521->setVisible(false);
+		sendMessage(_asCar, 0x2009, 0);
+		_asCar->setVisible(false);
 		_currTrackIndex = 0;
 	}
 
-	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
-	insertSprite<Class518>(_class521);
+	_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+	_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
+	_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
+	insertSprite<AsCommonCarConnector>(_asCar);
 	
 	_pointListsCount = 3;
 	_newTrackIndex = -1;
 	_dataResource.load(calcHash("Ashooded"));
 
 	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 
 	if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) {
 		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
-			sendMessage(_class521, 0x2007, 150);
+			sendMessage(_asCar, 0x2007, 150);
 	} else {
 		NPoint testPoint = (*_trackPoints)[0];
-		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_asCar, 0x2002, 0);
 		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
-			sendMessage(_class521, 0x2008, 150);
+			sendMessage(_asCar, 0x2008, 150);
 	}
 	
 	_carStatus = 0;
@@ -322,23 +322,23 @@ Scene2501::~Scene2501() {
 	if (_klaymanInCar)
 		delete _kmScene2501;
 	else
-		delete _class521;
+		delete _asCar;
 }
 
 void Scene2501::update() {
 	Scene::update();
 	if (_carStatus == 1) {
 		removeSprite(_klayman);
-		addSprite(_class521);
+		addSprite(_asCar);
 		clearRectList();
 		_klaymanInCar = true;
 		SetMessageHandler(&Scene2501::hmCarAtHome);
 		SetUpdateHandler(&Scene2501::upCarAtHome);
 		_class541->setVisible(false);
 		_class542->setVisible(false);
-		_class521->setVisible(true);
-		sendMessage(_class521, 0x2009, 0);
-		_class521->handleUpdate();
+		_asCar->setVisible(true);
+		sendMessage(_asCar, 0x2009, 0);
+		_asCar->handleUpdate();
 		_klayman = NULL;
 		_carStatus = 0;
 	}
@@ -348,8 +348,8 @@ void Scene2501::update() {
 void Scene2501::upCarAtHome() {
 	Scene::update();
 	if (_mouseClicked) {
-		if (_mouseClickPos.x <= 210 && _class521->getX() == 211 && _class521->getY() == 400) {
-			sendMessage(_class521, 0x200A, 0);
+		if (_mouseClickPos.x <= 210 && _asCar->getX() == 211 && _asCar->getY() == 400) {
+			sendMessage(_asCar, 0x200A, 0);
 			SetUpdateHandler(&Scene2501::upGettingOutOfCar);
 		} else {
 			findClosestTrack(_mouseClickPos);
@@ -365,7 +365,7 @@ void Scene2501::upGettingOutOfCar() {
 	Scene::update();
 	if (_carStatus == 2) {
 		_klayman = _kmScene2501;
-		removeSprite(_class521);
+		removeSprite(_asCar);
 		addSprite(_klayman);
 		_klaymanInCar = false;
 		SetMessageHandler(&Scene2501::handleMessage);
@@ -373,7 +373,7 @@ void Scene2501::upGettingOutOfCar() {
 		setRectList(0x004B2608);
 		_class541->setVisible(true);
 		_class542->setVisible(true);
-		_class521->setVisible(false);
+		_asCar->setVisible(false);
 		setMessageList(0x004B2570);
 		runMessageList();
 		_klayman->handleUpdate();
@@ -413,7 +413,7 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity
 		} else if (_sceneInfos[_currTrackIndex]->which1 == 0) {
 			SetMessageHandler(&Scene2501::hmCarAtHome);
 			SetUpdateHandler(&Scene2501::upCarAtHome);
-			sendMessage(_class521, 0x200F, 1);
+			sendMessage(_asCar, 0x200F, 1);
 		} else if (_sceneInfos[_currTrackIndex]->which1 > 0) {
 			leaveScene(_sceneInfos[_currTrackIndex]->which1);
 		}
@@ -424,7 +424,7 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity
 		} else if (_sceneInfos[_currTrackIndex]->which2 == 0) {
 			SetMessageHandler(&Scene2501::hmCarAtHome);
 			SetUpdateHandler(&Scene2501::upCarAtHome);
-			sendMessage(_class521, 0x200F, 1);
+			sendMessage(_asCar, 0x200F, 1);
 		} else if (_sceneInfos[_currTrackIndex]->which2 > 0) {
 			leaveScene(_sceneInfos[_currTrackIndex]->which2);
 		}
@@ -452,13 +452,13 @@ uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam &param, Entity
 void Scene2501::changeTrack() {
 	_currTrackIndex = _newTrackIndex;
 	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 	if (_currTrackIndex == 0) {
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 	} else {
-		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_asCar, 0x2002, 0);
 	}
-	sendPointMessage(_class521, 0x2004, _clickPoint);
+	sendPointMessage(_asCar, 0x2004, _clickPoint);
 	_newTrackIndex = -1;
 }
 
@@ -482,12 +482,12 @@ void Scene2501::findClosestTrack(NPoint &pt) {
 		_newTrackIndex = minMatchTrackIndex;
 		_clickPoint = pt;
 		if (_currTrackIndex == 0)
-			sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+			sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
 		else
-			sendMessage(_class521, 0x2003, 0);
+			sendMessage(_asCar, 0x2003, 0);
 	} else {
 		_newTrackIndex = -1;
-		sendMessage(_class521, 0x2004, pt);
+		sendMessage(_asCar, 0x2004, pt);
 	}
 }
 
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index fb61ba5..e5b9157 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -61,7 +61,7 @@ public:
 	Scene2501(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Scene2501();
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	Sprite *_class437;
 	Sprite *_class517;
 	Sprite *_class519;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index f9a5c2a..7c93aa7 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -523,8 +523,8 @@ Class437::Class437(NeverhoodEngine *vm, uint32 fileHash)
 	StaticSprite::update();
 }
 
-Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index)
-	: AnimatedSprite(vm, 1100), _class521(class521), _index(index), _animFileHash(0) {
+Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index)
+	: AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) {
 
 	SetUpdateHandler(&Class517::update);
 	createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource
@@ -537,28 +537,28 @@ void Class517::update() {
 }
 
 void Class517::updateShadow() {
-	if (_class521->getFrameIndex() != _currFrameIndex || _class521->getCurrAnimFileHash() != _animFileHash) {
-		uint32 fileHash = _class521->getCurrAnimFileHash();
+	if (_asCar->getFrameIndex() != _currFrameIndex || _asCar->getCurrAnimFileHash() != _animFileHash) {
+		uint32 fileHash = _asCar->getCurrAnimFileHash();
 		if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 ||
 			fileHash == 0x9966B138 || fileHash == 0xB579A77C || fileHash == 0xA86A9538 ||
 			fileHash == 0xD4220027 || fileHash == 0xD00A1364 || fileHash == 0xD4AA03A4 ||
 			fileHash == 0xF46A0324) {
-			startAnimation(fileHash, _class521->getFrameIndex(), -1);
-			_newStickFrameIndex = _class521->getFrameIndex();
+			startAnimation(fileHash, _asCar->getFrameIndex(), -1);
+			_newStickFrameIndex = _asCar->getFrameIndex();
 		}
 		_animFileHash = fileHash;
 	}
-	_x = _class521->getX() + kClass517Points[_index].x;
-	_y = _class521->getY() + kClass517Points[_index].y;
-	if (!_class521->getVisible()) {
+	_x = _asCar->getX() + kClass517Points[_index].x;
+	_y = _asCar->getY() + kClass517Points[_index].y;
+	if (!_asCar->getVisible()) {
 		startAnimation(0x1209E09F, 0, -1);
 		_newStickFrameIndex = 0;
 	}
-	setDoDeltaX(_class521->isDoDeltaX() ? 1 : 0);
+	setDoDeltaX(_asCar->isDoDeltaX() ? 1 : 0);
 }
 
-Class519::Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index)
-	: AnimatedSprite(vm, 1100), _class521(class521), _index(index) {
+Class519::Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index)
+	: AnimatedSprite(vm, 1100), _asCar(asCar), _index(index) {
 
 	SetUpdateHandler(&Class519::update);
 	createShadowSurface1(shadowSurface, 0x60281C10, 150);
@@ -567,13 +567,13 @@ Class519::Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSur
 } 
 
 void Class519::update() {
-	_x = _class521->getX() + kClass517Points[_index].x;
-	_y = _class521->getY() + kClass517Points[_index].y;
+	_x = _asCar->getX() + kClass517Points[_index].x;
+	_y = _asCar->getY() + kClass517Points[_index].y;
 	AnimatedSprite::update();
 }
 
-Class520::Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex)
-	: AnimatedSprite(vm, 1100), _class521(class521) {
+Class520::Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex)
+	: AnimatedSprite(vm, 1100), _asCar(asCar) {
 
 	SetUpdateHandler(&Class520::update);
 	createShadowSurface1(shadowSurface, 0x0759129C, 100);
@@ -582,8 +582,8 @@ Class520::Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSur
 } 
 
 void Class520::update() {
-	_x = _class521->getX();
-	_y = _class521->getY();
+	_x = _asCar->getX();
+	_y = _asCar->getY();
 	AnimatedSprite::update();
 }
 
@@ -613,43 +613,43 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 		_class437 = createSprite<Class437>(sceneInfo->class437Filename);
 		addEntity(_class437);
 
-		_class521 = insertSprite<Class521>(this, 320, 240);
-		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
+		_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+		_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
+		_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
 	} else {
 		_class437 = NULL;
-		_class521 = insertSprite<Class521>(this, 320, 240);
+		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 	}
 
-	_class518 = insertSprite<Class518>(_class521);
+	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
 	
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
 
 	_dataResource.load(sceneInfo->dataResourceFilename);
 	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 
 	if (which == _which2) {
 		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
-			sendMessage(_class521, 0x2007, 150);
+			sendMessage(_asCar, 0x2007, 150);
 	} else {
 		NPoint testPoint = (*_trackPoints)[0];
-		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_asCar, 0x2002, 0);
 		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
-			sendMessage(_class521, 0x2008, 150);
+			sendMessage(_asCar, 0x2008, 150);
 	}
 	
-	_class521->setClipRect(clipRect);
-	_class518->setClipRect(clipRect);
+	_asCar->setClipRect(clipRect);
+	_asCarConnector->setClipRect(clipRect);
 
 	if (which == 1) {
 		SetMessageHandler(&Scene2701::handleMessage42F500);
 	} else {
-		sendMessage(_class521, 0x2009, 0);
+		sendMessage(_asCar, 0x2009, 0);
 		SetMessageHandler(&Scene2701::handleMessage42F600);
 	}
 
@@ -659,7 +659,7 @@ uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam &param,
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		sendPointMessage(_class521, 0x2004, param.asPoint());
+		sendPointMessage(_asCar, 0x2004, param.asPoint());
 		break;
 	case 0x2005:
 		if (_which1 >= 0)
@@ -683,7 +683,7 @@ uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam &param,
 		if (param.asPoint().x >= 385) {
 			leaveScene(0);
 		} else {
-			sendPointMessage(_class521, 0x2004, param.asPoint());
+			sendPointMessage(_asCar, 0x2004, param.asPoint());
 			SetMessageHandler(&Scene2701::handleMessage42F500);
 		}
 		break;
@@ -723,11 +723,11 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class437 = createSprite<Class437>(0x12002035);
 	addEntity(_class437);
 	
-	_class521 = insertSprite<Class521>(this, 320, 240);
-	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-	insertSprite<Class518>(_class521);
-	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	_asCar = insertSprite<AsCommonCar>(this, 320, 240);
+	_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+	insertSprite<AsCommonCarConnector>(_asCar);
+	_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
+	_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
 
 	_dataResource.load(0x04310014);
 	
@@ -761,14 +761,14 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName);
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 
 	if (which == _currSceneInfos[_currTrackIndex]->which2) {
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
-		sendMessage(_class521, 0x2007, 150);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2007, 150);
 	} else {
-		sendMessage(_class521, 0x2002, 0);
-		sendMessage(_class521, 0x2008, 150);
+		sendMessage(_asCar, 0x2002, 0);
+		sendMessage(_asCar, 0x2008, 150);
 	}
 
 	_palette->copyBasePalette(0, 256, 0);
@@ -777,13 +777,13 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene2702::update() {
 	Scene::update();
-	if (_flag1 && _class521->getX() > 422) {
+	if (_flag1 && _asCar->getX() > 422) {
 		debug("fade #1");
 		_palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0);
 		_palette->startFadeToPalette(12);
 		_flag1 = false;
-	} else if (!_flag1 && _class521->getX() <= 422) {
+	} else if (!_flag1 && _asCar->getX() <= 422) {
 		debug("fade #2");
 		_palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65);
 		_palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0);
@@ -839,35 +839,35 @@ void Scene2702::findClosestTrack(NPoint pt) {
 		_newTrackDestX = pt.x;
 		if (_currSceneInfos == _sceneInfos[0]) {
 			if (_currTrackIndex == 0)
-				sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+				sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
 			else
-				sendMessage(_class521, 0x2003, 0);
+				sendMessage(_asCar, 0x2003, 0);
 		} else if (_currTrackIndex == 2) {
-			sendMessage(_class521, 0x2003, 0);
+			sendMessage(_asCar, 0x2003, 0);
 		} else {
-			sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+			sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
 		}
 	} else {
 		_newTrackIndex = -1;
-		sendMessage(_class521, 0x2004, pt.x);
+		sendMessage(_asCar, 0x2004, pt.x);
 	}
 }
 
 void Scene2702::changeTrack() {
 	_currTrackIndex = _newTrackIndex;
 	_trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName);
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 	if (_currSceneInfos == _sceneInfos[0]) {
 		if (_currTrackIndex == 0)
-			sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+			sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		else
-			sendMessage(_class521, 0x2002, 0);
+			sendMessage(_asCar, 0x2002, 0);
 	} else if (_currTrackIndex == 2) {
-		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_asCar, 0x2002, 0);
 	} else {
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 	}
-	sendMessage(_class521, 0x2004, _newTrackDestX);
+	sendMessage(_asCar, 0x2004, _newTrackDestX);
 	_newTrackIndex = -1;
 }
 
@@ -900,56 +900,56 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 		_class437 = createSprite<Class437>(sceneInfo->class437Filename);
 		addEntity(_class437);
 
-		_class521 = insertSprite<Class521>(this, 320, 240);
-		_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-		_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-		_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
+		_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+		_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
+		_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
 	} else {
 		_class437 = NULL;
 		_class517 = NULL;
-		_class521 = insertSprite<Class521>(this, 320, 240);
+		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 	}
 
-	_class518 = insertSprite<Class518>(_class521);
+	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
 	
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
 
 	_dataResource.load(sceneInfo->dataResourceFilename);
 	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 	
 	if (sceneInfo->rectListName) {
 		_rectList = _dataResource.getRectArray(sceneInfo->rectListName);
-		// TODO _class521->setPathRects(_rectList);
+		// TODO _asCar->setPathRects(_rectList);
 	}
 
 	if (which == _which2) {
 		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
-			sendMessage(_class521, 0x2009, 0);
+			sendMessage(_asCar, 0x2009, 0);
 		else
-			sendMessage(_class521, 0x2007, 0);
+			sendMessage(_asCar, 0x2007, 0);
 	} else {
 		NPoint testPoint = (*_trackPoints)[0];
-		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_asCar, 0x2002, 0);
 		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
-			sendMessage(_class521, 0x2009, 0);
+			sendMessage(_asCar, 0x2009, 0);
 		else
-			sendMessage(_class521, 0x2008, 0);
+			sendMessage(_asCar, 0x2008, 0);
 	}
 	
 	if (clipRect) {
-		_class521->getClipRect() = *clipRect;
+		_asCar->getClipRect() = *clipRect;
 		if (_class517)
 			_class517->getClipRect() = *clipRect; 
 		if (_class520)
 			_class520->getClipRect() = *clipRect; 
 		if (_class519)
 			_class519->getClipRect() = *clipRect; 
-		if (_class518)
-			_class518->getClipRect() = *clipRect;
+		if (_asCarConnector)
+			_asCarConnector->getClipRect() = *clipRect;
 	}
 
 }
@@ -957,7 +957,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 void Scene2704::update() {
 	Scene::update();
 	if (_mouseClicked) {
-		sendPointMessage(_class521, 0x2004, _mouseClickPos);
+		sendPointMessage(_asCar, 0x2004, _mouseClickPos);
 		_mouseClicked = false;
 	}
 }
@@ -1004,11 +1004,11 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class437 = createSprite<Class437>(0x18808B88);
 	addEntity(_class437);
 	
-	_class521 = insertSprite<Class521>(this, 320, 240);
-	_class517 = insertSprite<Class517>(_class521, _class437->getSurface(), 4);
-	_class518 = insertSprite<Class518>(_class521);
-	_class520 = insertSprite<Class520>(_class521, _class437->getSurface(), 4);
-	_class519 = insertSprite<Class519>(_class521, _class437->getSurface(), 4);
+	_asCar = insertSprite<AsCommonCar>(this, 320, 240);
+	_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
+	_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
+	_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
 
 	_dataResource.load(0x06000162);
 	
@@ -1020,20 +1020,20 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 		_currTrackIndex = 0;
 
 	_trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName));
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 
 	if (which == kSceneInfo2706[_currTrackIndex].which2) {
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		if (which == 5)
-			sendMessage(_class521, 0x2007, 50);
+			sendMessage(_asCar, 0x2007, 50);
 		else			
-			sendMessage(_class521, 0x2007, 150);
+			sendMessage(_asCar, 0x2007, 150);
 	} else {
-		sendMessage(_class521, 0x2002, 0);
+		sendMessage(_asCar, 0x2002, 0);
 		if (which == 5)
-			sendMessage(_class521, 0x2008, 50);
+			sendMessage(_asCar, 0x2008, 50);
 		else			
-			sendMessage(_class521, 0x2008, 150);
+			sendMessage(_asCar, 0x2008, 150);
 	}
 	
 }
@@ -1084,24 +1084,24 @@ void Scene2706::findClosestTrack(NPoint pt) {
 		_newTrackIndex = minMatchTrackIndex;
 		_newTrackDestX = pt.x;
 		if (_currTrackIndex == 0)
-			sendMessage(_class521, 0x2003, _trackPoints->size() - 1);
+			sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
 		else
-			sendMessage(_class521, 0x2003, 0);
+			sendMessage(_asCar, 0x2003, 0);
 	} else {
 		_newTrackIndex = -1;
-		sendMessage(_class521, 0x2004, pt.x);
+		sendMessage(_asCar, 0x2004, pt.x);
 	}
 }
 
 void Scene2706::changeTrack() {
 	_currTrackIndex = _newTrackIndex;
 	_trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName));
-	_class521->setPathPoints(_trackPoints);
+	_asCar->setPathPoints(_trackPoints);
 	if (_currTrackIndex == 0)
-		sendMessage(_class521, 0x2002, _trackPoints->size() - 1);
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 	else
-		sendMessage(_class521, 0x2002, 0);
-	sendMessage(_class521, 0x2004, _newTrackDestX);
+		sendMessage(_asCar, 0x2002, 0);
+	sendMessage(_asCar, 0x2004, _newTrackDestX);
 	_newTrackIndex = -1;
 }
 
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index 70c1a80..b2210c5 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -56,10 +56,10 @@ public:
 
 class Class517 : public AnimatedSprite {
 public:
-	Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index);
+	Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index);
 protected:
 	uint _index;
-	AnimatedSprite *_class521;
+	AnimatedSprite *_asCar;
 	uint32 _animFileHash;
 	void update();
 	void updateShadow();
@@ -67,18 +67,18 @@ protected:
 
 class Class519 : public AnimatedSprite {
 public:
-	Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index);
+	Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index);
 protected:
 	uint _index;
-	Sprite *_class521;
+	Sprite *_asCar;
 	void update();
 };
 
 class Class520 : public AnimatedSprite {
 public:
-	Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex);
+	Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex);
 protected:
-	Sprite *_class521;
+	Sprite *_asCar;
 	void update();
 };
 
@@ -86,12 +86,12 @@ class Scene2701 : public Scene {
 public:
 	Scene2701(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	Sprite *_class437;
 	Sprite *_class517;
 	Sprite *_class520;
 	Sprite *_class519;
-	Sprite *_class518;
+	Sprite *_asCarConnector;
 	Sprite *_sprite1;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
@@ -103,7 +103,7 @@ class Scene2702 : public Scene {
 public:
 	Scene2702(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	Sprite *_class437;
 	Sprite *_class517;
 	Sprite *_class520;
@@ -126,10 +126,10 @@ public:
 	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
 		const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	Sprite *_class437;
 	Sprite *_class517;
-	Sprite *_class518;
+	Sprite *_asCarConnector;
 	Sprite *_class520;
 	Sprite *_class519;
 	int _which1, _which2;
@@ -143,10 +143,10 @@ class Scene2706 : public Scene {
 public:
 	Scene2706(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Class521 *_class521;
+	AsCommonCar *_asCar;
 	Sprite *_class437;
 	Sprite *_class517;
-	Sprite *_class518;
+	Sprite *_asCarConnector;
 	Sprite *_class520;
 	Sprite *_class519;
 	int16 _newTrackDestX;


Commit: 2fa76ccca14a50588f6c69e39c67f1cae187c9b3
    https://github.com/scummvm/scummvm/commit/2fa76ccca14a50588f6c69e39c67f1cae187c9b3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:47-07:00

Commit Message:
NEVERHOOD: Work on Module1700:

- Rename stuff
- Add puzzle var initialization in Scene1705

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1700.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index df001c4..edc9b55 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,8 +309,8 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 8;
-	createModule(1600, -1);
+	_vm->gameState().sceneNum = 4;
+	createModule(1700, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index f914fa9..b75167f 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/module1700.h"
+#include "neverhood/gamemodule.h"
 
 namespace Neverhood {
 
@@ -139,19 +140,19 @@ static const uint32 kScene1705FileHashes[] = {
 	0x910EA800
 };
 
-Class602::Class602(NeverhoodEngine *vm, uint32 fileHash, int index)
+SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex)
 	: StaticSprite(vm, fileHash, 100) {
 	
-	_x = _spriteResource.getPosition().x + index * 30;
+	_x = _spriteResource.getPosition().x + symbolIndex * 30;
 	_y = _spriteResource.getPosition().y + 160;
 	StaticSprite::update();
 }
 
-Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash)
-	: StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _index(index) {
+SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash)
+	: StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _tapeIndex(tapeIndex) {
 
-	if (!getSubVar(0x02038314, _index) && !getSubVar(0x02720344, _index)) {
-		SetMessageHandler(&Class606::handleMessage);
+	if (!getSubVar(0x02038314, _tapeIndex) && !getSubVar(0x02720344, _tapeIndex)) {
+		SetMessageHandler(&SsScene1705Tape::handleMessage);
 	} else {
 		setVisible(false);
 		SetMessageHandler(NULL);
@@ -164,7 +165,7 @@ Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfa
 	Sprite::processDelta();
 }
 
-uint32 Class606::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -172,7 +173,7 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam &param, Entity
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setSubVar(0x02038314, _index, 1);
+		setSubVar(0x02038314, _tapeIndex, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 		break;		
@@ -186,7 +187,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	Sprite *tempSprite;
 	
 	setGlobalVar(0xE7498218, 1);
-	// TODO _vm->initVarsScene1705();
+	_vm->gameModule()->initScene3009Vars();
 
 	SetMessageHandler(&Scene1705::handleMessage);
 	SetUpdateHandler(&Scene1705::update);
@@ -204,16 +205,14 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse433(0x18222039);
 
-	insertSprite<Class602>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0);
-	insertSprite<Class602>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1);
-	insertSprite<Class602>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2);
+	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0);
+	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1);
+	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2);
 
 	_sprite = insertStaticSprite(0x31313A22, 1100);
 
-	_class606 = insertSprite<Class606>(this, 15, 1100, 238, 439, 0x02363852);
-	_vm->_collisionMan->addSprite(_class606);
-
-	which = 4;
+	_ssTape = insertSprite<SsScene1705Tape>(this, 15, 1100, 238, 439, 0x02363852);
+	_vm->_collisionMan->addSprite(_ssTape);
 
 	if (which < 0) {
 		insertKlayman<KmScene1705>(231, 434);
@@ -275,7 +274,7 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4826:
-		if (sender == _class606 && _klayman->getX() <= 318) {
+		if (sender == _ssTape && _klayman->getX() <= 318) {
 			sendEntityMessage(_klayman, 0x1014, sender);
 			setMessageList(0x004B6AC0);
 		}
diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h
index 2488c46..c0ec9e5 100644
--- a/engines/neverhood/module1700.h
+++ b/engines/neverhood/module1700.h
@@ -41,17 +41,17 @@ protected:
 
 // Scene1705
 
-class Class602 : public StaticSprite {
+class SsScene1705WallSymbol : public StaticSprite {
 public:
-	Class602(NeverhoodEngine *vm, uint32 fileHash, int index);
+	SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex);
 };
 
-class Class606 : public StaticSprite {
+class SsScene1705Tape : public StaticSprite {
 public:
-	Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash);
+	SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash);
 protected:	
 	Scene *_parentScene;
-	int _index;
+	uint32 _tapeIndex;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -60,7 +60,7 @@ public:
 	Scene1705(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	Sprite *_sprite;
-	Sprite *_class606;
+	Sprite *_ssTape;
 	int _paletteArea;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 7a35ddd..2038548 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -422,7 +422,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite2 = insertStaticSprite(0x061601C8, 1100);
 		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480);
 		insertMouse433(0x00680116);
-		_asTape = insertSprite<Class606>(this, 8, 1100, 302, 437, 0x01142428);
+		_asTape = insertSprite<SsScene1705Tape>(this, 8, 1100, 302, 437, 0x01142428);
 		_vm->_collisionMan->addSprite(_asTape); 
 	} else {
 		setRectList(0x004B6CF0);
@@ -2991,8 +2991,8 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_class545);
 	}
 
-	_class606 = insertSprite<Class606>(this, 6, 1100, 513, 437, 0xA1361863);
-	_vm->_collisionMan->addSprite(_class606);
+	_ssTape = insertSprite<SsScene1705Tape>(this, 6, 1100, 513, 437, 0xA1361863);
+	_vm->_collisionMan->addSprite(_ssTape);
 	
 	_asWinch = insertSprite<AsScene2812Winch>();
 	_asTrapDoor = insertSprite<AsScene2812TrapDoor>();
@@ -3068,8 +3068,8 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asTrapDoor, 0x2000, 0);
 		break;
 	case 0x4826:
-		if (sender == _class606 && !_flag1) {
-			sendEntityMessage(_klayman, 0x1014, _class606);
+		if (sender == _ssTape && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _ssTape);
 			setMessageList(0x004AF658);
 		} else if (sender == _class545 && !_flag1) {
 			sendEntityMessage(_klayman, 0x1014, _class545);
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index b5827bf..1027a6f 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -461,7 +461,7 @@ protected:
 	Sprite *_sprite3;
 	Sprite *_sprite2;
 	Sprite *_sprite4;
-	Sprite *_class606;
+	Sprite *_ssTape;
 	Sprite *_class545;
 	Sprite *_sprite1;
 	bool _flag1;


Commit: 8a9ca493b63cbb81b968fc3db57a957e677846ba
    https://github.com/scummvm/scummvm/commit/8a9ca493b63cbb81b968fc3db57a957e677846ba
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:48-07:00

Commit Message:
NEVERHOOD: Rename stuff in several modules

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h
    engines/neverhood/module1800.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module1900.h
    engines/neverhood/module2000.cpp
    engines/neverhood/module2000.h
    engines/neverhood/module2100.cpp
    engines/neverhood/module2100.h
    engines/neverhood/module2400.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index edc9b55..d132105 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,8 +309,8 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 4;
-	createModule(1700, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(2100, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 88b576ac3..e5c25ca 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -645,7 +645,7 @@ void AsCommonProjector::stStartSuckedIn() {
 }
 
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _projectorBorderFlag(false), _class427(NULL), _asProjector(NULL), 
+	: Scene(vm, parentModule, true), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), 
 	_asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), 
 	_sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) {
 
@@ -658,7 +658,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x08221FA5);
 	insertMouse433(0x21FA108A);
 	
-	_class427 = insertSprite<Class427>(this, 0x980F3124, 0x12192892, 100, 0);
+	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x980F3124, 0x12192892, 100, 0);
 	_asPipe = insertSprite<AsScene1401Pipe>();
 
 	if (!getGlobalVar(0x01023818)) {
@@ -733,7 +733,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02144CB1) {
-			sendEntityMessage(_klayman, 0x1014, _class427);
+			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
 		} else if (param.asInteger() == 0x402064D8) {
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x01C66840) {
@@ -752,7 +752,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 		}			
 		break;
 	case 0x480B:
-		if (sender == _class427) {
+		if (sender == _ssFloorButton) {
 			sendMessage(_asPipe, 0x2000, 0);
 			if (!getGlobalVar(0x01023818)) {
 				sendMessage(_asMouse, 0x4839, 0);
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 8cabc99..437632d 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -131,7 +131,7 @@ public:
 	Scene1401(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	bool _projectorBorderFlag;
-	Sprite *_class427;
+	Sprite *_ssFloorButton;
 	AsCommonProjector *_asProjector;
 	Sprite *_asPipe;
 	Sprite *_asMouse;
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 14c4868..4335595 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -156,6 +156,7 @@ void Module1800::updateScene() {
 			leaveModule(3);
 			break;
 		case 8:
+			// NOTE: After Klayman jumped into the hole and died...
 			leaveModule(1);
 			// TODO GameState stuff
 			break;
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 77f031b..5bb03d4 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -533,7 +533,7 @@ void AsScene1907WaterHint::update() {
 	AnimatedSprite::updatePosition();
 }
 
-uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -546,7 +546,7 @@ uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessagePa
 void AsScene1907WaterHint::show() {
 	setVisible(true);
 	startAnimation(0x110A1061, 0, -1);
-	SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20);
+	SetMessageHandler(&AsScene1907WaterHint::hmShowing);
 	NextState(&AsScene1907WaterHint::hide);
 }
 
@@ -561,9 +561,6 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)
 	_moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) {
 	
 	_surfaceFlag = true;
-
-	//setGlobalVar(0x10938830, 1);
-	
 	setBackground(0x20628E05);
 	setPalette(0x20628E05);
 
diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h
index 386d1c9..5f26c9e 100644
--- a/engines/neverhood/module1900.h
+++ b/engines/neverhood/module1900.h
@@ -98,7 +98,7 @@ public:
 	void show();
 protected:
 	void update();
-	uint32 handleMessage46BA20(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmShowing(int messageNum, const MessageParam &param, Entity *sender);
 	void hide();
 };
 
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index d1d6b82..6ff8a40 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -98,6 +98,8 @@ void Module2000::updateScene() {
 Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
+	Sprite *tempSprite;
+
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2001::handleMessage);
 
@@ -105,7 +107,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0xA6417244);
 	insertMouse433(0x17240A6C);
 
-	_class401 = insertStaticSprite(0x0D641724, 1100);
+	tempSprite = insertStaticSprite(0x0D641724, 1100);
 
 	if (which < 0) {
 		insertKlayman<KmScene2001>(300, 345);
@@ -133,7 +135,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setDoDeltaX(1);
 	}
 	
-	_klayman->setClipRect(_class401->getDrawRect().x, 0, 640, 480);
+	_klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480);
 	
 }
 
diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h
index 8e741b3..8533092 100644
--- a/engines/neverhood/module2000.h
+++ b/engines/neverhood/module2000.h
@@ -46,7 +46,6 @@ class Scene2001 : public Scene {
 public:
 	Scene2001(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_class401;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 98b6e03..06806c7 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -77,7 +77,7 @@ void Module2100::updateScene() {
 
 // Scene2101
 
-Class538::Class538(NeverhoodEngine *vm, bool flag)
+AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag)
 	: AnimatedSprite(vm, 1100) {
 
 	// TODO createSurface3(100, dword_4B9018);
@@ -85,7 +85,7 @@ Class538::Class538(NeverhoodEngine *vm, bool flag)
 	_x = 320;
 	_y = 240;
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class538::handleMessage);
+	SetMessageHandler(&AsScene2101Door::handleMessage);
 	if (flag) {
 		startAnimation(0x0C202B9C, -1, -1);
 		_newStickFrameIndex = -2;
@@ -94,52 +94,52 @@ Class538::Class538(NeverhoodEngine *vm, bool flag)
 	}
 }
 
-uint32 Class538::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
 		gotoNextState();
 		break;
 	case 0x4808:
-		openDoor();
+		stOpenDoor();
 		break;
 	case 0x4809:
-		closeDoor();
+		stCloseDoor();
 		break;
 	}
 	return messageResult;
 }
 
-void Class538::openDoor() {
+void AsScene2101Door::stOpenDoor() {
 	startAnimation(0x0C202B9C, 0, -1);
 	_newStickFrameIndex = -2;
 	setVisible(true);
 	playSound(0, calcHash("fxDoorOpen32"));
 }
 
-void Class538::closeDoor() {
+void AsScene2101Door::stCloseDoor() {
 	startAnimation(0xC222A8D4, 0, -1);
 	_newStickFrameIndex = -2;
 	setVisible(true);
-	NextState(&Class538::hide);
+	NextState(&AsScene2101Door::stCloseDoorDone);
 	playSound(0, calcHash("fxDoorClose32"));
 }
 
-void Class538::hide() {
+void AsScene2101Door::stCloseDoorDone() {
 	stopAnimation();
 	setVisible(false);
 }
 
-Class539::Class539(NeverhoodEngine *vm, Sprite *klayman)
+AsScene2101HitByDoorEffect::AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klayman)
 	: AnimatedSprite(vm, 1400), _klayman(klayman) {
 	
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class539::handleMessage);
+	SetMessageHandler(&AsScene2101HitByDoorEffect::handleMessage);
 	createSurface(1200, 88, 165);
 	setVisible(false);
 }
 
-uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2101HitByDoorEffect::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2001:
@@ -156,12 +156,12 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash)
+SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash)
 	: StaticSprite(vm, 1100), _parentScene(parentScene), _countdown(0),
 	_fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) {
 
-	SetUpdateHandler(&Class427::update);
-	SetMessageHandler(&Class427::handleMessage);
+	SetUpdateHandler(&SsCommonFloorButton::update);
+	SetMessageHandler(&SsCommonFloorButton::handleMessage);
 	if (_soundFileHash == 0)
 		_soundFileHash = 0x44141000;
 	createSurface(1010, 61, 30);
@@ -172,7 +172,7 @@ Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui
 		setVisible(false);
 }
 
-void Class427::update() {
+void SsCommonFloorButton::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		sendMessage(_parentScene, 0x1022, 1010);
 		if (_fileHash1) {
@@ -183,7 +183,7 @@ void Class427::update() {
 	}
 }	
 	
-uint32 Class427::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x480B:
@@ -202,6 +202,8 @@ uint32 Class427::handleMessage(int messageNum, const MessageParam &param, Entity
 Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
+	Sprite *tempSprite;
+	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2101::handleMessage);
 	SetUpdateHandler(&Scene2101::update);
@@ -211,8 +213,8 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x4230144A);
 
 	insertStaticSprite(0x00502330, 1100);
-	_sprite1 = insertStaticSprite(0x78492010, 1100);
-	_class427 = insertSprite<Class427>(this, 0x72427010, 0x32423010, 200, 0);
+	tempSprite = insertStaticSprite(0x78492010, 1100);
+	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x72427010, 0x32423010, 200, 0);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 18, 1100, 412, 443, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape1);
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 11, 1100, 441, 443, 0x9148A011);
@@ -222,71 +224,71 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene2101>(380, 438);
 		setMessageList(0x004B8E48);
 		sendMessage(this, 0x2000, 0);
-		_class538 = insertSprite<Class538>(false);
-		_value1 = 1;
+		_asDoor = insertSprite<AsScene2101Door>(false);
+		_doorStatus = 1;
 		_countdown1 = 0;
 	} else if (which == 1) {
 		insertKlayman<KmScene2101>(640, 438);
 		setMessageList(0x004B8E50);
 		sendMessage(this, 0x2000, 0);
-		_class538 = insertSprite<Class538>(true);
-		_value1 = 2;
+		_asDoor = insertSprite<AsScene2101Door>(true);
+		_doorStatus = 2;
 		_countdown1 = 48;
 	} else if (which == 2) {
 		insertKlayman<KmScene2101>(115, 438);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B8F58);
 		sendMessage(this, 0x2000, 1);
-		_class538 = insertSprite<Class538>(false);
-		_value1 = 1;
+		_asDoor = insertSprite<AsScene2101Door>(false);
+		_doorStatus = 1;
 		_countdown1 = 0;
 	} else if (which == 3) {
 		insertKlayman<KmScene2101>(115, 438);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B8EB0);
 		sendMessage(this, 0x2000, 1);
-		_class538 = insertSprite<Class538>(false);
-		_value1 = 1;
+		_asDoor = insertSprite<AsScene2101Door>(false);
+		_doorStatus = 1;
 		_countdown1 = 0;
 	} else {
 		insertKlayman<KmScene2101>(115, 438);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B8EA0);
 		sendMessage(this, 0x2000, 1);
-		_class538 = insertSprite<Class538>(false);
-		_value1 = 1;
+		_asDoor = insertSprite<AsScene2101Door>(false);
+		_doorStatus = 1;
 		_countdown1 = 0;
 	}
 	
-	_class539 = insertSprite<Class539>(_klayman);
-	_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480);
+	_asHitByDoorEffect = insertSprite<AsScene2101HitByDoorEffect>(_klayman);
+	_klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	
 }
 
 void Scene2101::update() {
 	if (_countdown1 != 0) {
-		if (_value1 == 2) {
+		if (_doorStatus == 2) {
 			if (--_countdown1 == 0) {
-				sendMessage(_class538, 0x4809, 0);
-				_value1 = 1;
+				sendMessage(_asDoor, 0x4809, 0);
+				_doorStatus = 1;
 			}
 		} else {
 			if (_klayman->getX() > 575)
 				_messageListFlag  = false;
 			if (--_countdown1 == 0) {
 				if (_klayman->getX() < 480) {
-					sendMessage(_class538, 0x4809, 0);
-					_value1 = 1;
+					sendMessage(_asDoor, 0x4809, 0);
+					_doorStatus = 1;
 				} else if (_klayman->getX() >= 480 && _klayman->getX() <= 575) {
 					_klayman->setDoDeltaX(0);
 					setMessageList2(0x004B8F48);
-					sendMessage(_class538, 0x4809, 0);
-					sendMessage(_class539, 0x2001, 0);
-					_value1 = 1;
+					sendMessage(_asDoor, 0x4809, 0);
+					sendMessage(_asHitByDoorEffect, 0x2001, 0);
+					_doorStatus = 1;
 				}
 			}
 		}
-	} else if (_value1 == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) {
+	} else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) {
 		setMessageList2(0x004B8F50);
 	}
 	Scene::update();
@@ -297,9 +299,9 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x02144CB1) {
-			sendEntityMessage(_klayman, 0x1014, _class427);
+			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
 		} else if (param.asInteger() == 0x21E64A00) {
-			if (_value1 == 0) {
+			if (_doorStatus == 0) {
 				setMessageList(0x004B8E80);
 			} else {
 				setMessageList(0x004B8EC8);
@@ -318,9 +320,9 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x480B:
-		if (sender == _class427 && _value1 == 1) {
-			sendMessage(_class538, 0x4808, 0);
-			_value1 = 0;
+		if (sender == _ssFloorButton && _doorStatus == 1) {
+			sendMessage(_asDoor, 0x4808, 0);
+			_doorStatus = 0;
 			_countdown1 = 90;
 		}
 		break;
diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h
index ff6898c..4690913 100644
--- a/engines/neverhood/module2100.h
+++ b/engines/neverhood/module2100.h
@@ -41,27 +41,27 @@ protected:
 
 // Scene1901
 
-class Class538 : public AnimatedSprite {
+class AsScene2101Door : public AnimatedSprite {
 public:
-	Class538(NeverhoodEngine *vm, bool flag);
+	AsScene2101Door(NeverhoodEngine *vm, bool flag);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void openDoor();
-	void closeDoor();
-	void hide();
+	void stOpenDoor();
+	void stCloseDoor();
+	void stCloseDoorDone();
 };
 
-class Class539 : public AnimatedSprite {
+class AsScene2101HitByDoorEffect : public AnimatedSprite {
 public:
-	Class539(NeverhoodEngine *vm, Sprite *klayman);
+	AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klayman);
 protected:
 	Sprite *_klayman;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class427 : public StaticSprite {
+class SsCommonFloorButton : public StaticSprite {
 public:
-	Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
+	SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
 protected:
 	Scene *_parentScene;
 	uint32 _soundFileHash;
@@ -76,14 +76,13 @@ class Scene2101 : public Scene {
 public:
 	Scene2101(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_sprite1;
-	Sprite *_class427;
+	Sprite *_ssFloorButton;
 	Sprite *_asTape1;
 	Sprite *_asTape2;
-	Sprite *_class538;
-	Sprite *_class539;
+	Sprite *_asDoor;
+	Sprite *_asHitByDoorEffect;
 	int _countdown1;
-	int _value1;
+	int _doorStatus;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 5dcfa8d..e2973ec 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -409,7 +409,7 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asFlowingWater = insertSprite<AsScene2401FlowingWater>();
 	insertStaticSprite(0x90C0A4B4, 200);
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x0092916A, 100, 0);
-	_ssFloorButton = insertSprite<Class427>(this, 0x28001120, 0x00911068, 100, 0);
+	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x28001120, 0x00911068, 100, 0);
 
 	for (uint i = 0; i < 5; i++)
 		_asWaterFlushing[i] = insertSprite<AsScene2401WaterFlushing>(kScene2401Points[i].x, kScene2401Points[i].y);


Commit: 15cfb9f787d577c130beb4d0fc486acd5f6af355
    https://github.com/scummvm/scummvm/commit/15cfb9f787d577c130beb4d0fc486acd5f6af355
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:48-07:00

Commit Message:
NEVERHOOD: Implement clipping against multiple clipRects, used only in several scenes for the Klayman sprite.

Currently only implemented in KmScene2201 for testing.

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/klayman.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d132105..174edd3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -310,7 +310,7 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().sceneNum = 0;
-	createModule(2100, -1);
+	createModule(2200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index b1597f2..84aa3d6 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -27,7 +27,8 @@
 namespace Neverhood {
 
 BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height)
-	: _vm(vm), _priority(priority), _visible(true), _transparent(true) {
+	: _vm(vm), _priority(priority), _visible(true), _transparent(true),
+	_clipRects(NULL), _clipRectsCount(0) {
 	
 	_drawRect.x = 0;
 	_drawRect.y = 0;
@@ -52,7 +53,9 @@ BaseSurface::~BaseSurface() {
 
 void BaseSurface::draw() {
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
-		if (_sysRect.x == 0 && _sysRect.y == 0) {
+		if (_clipRects && _clipRectsCount) {
+			_vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent);
+		} else if (_sysRect.x == 0 && _sysRect.y == 0) {
 			_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
 		} else {
 			_vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent);
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 3b30b25..57c2250 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -101,6 +101,8 @@ public:
 	NDrawRect& getSysRect() { return _sysRect; }
 	NRect& getClipRect() { return _clipRect; }
 	void setClipRect(NRect clipRect) { _clipRect = clipRect; }
+	void setClipRects(NRect *clipRects, uint clipRectsCount) { _clipRects = clipRects; _clipRectsCount = clipRectsCount; }
+	void clearClipRects() { _clipRects = NULL; _clipRectsCount = 0; }
 	bool getVisible() const { return _visible; }
 	void setVisible(bool value) { _visible = value; }
 	void setTransparent(bool value) { _transparent = value; }
@@ -113,6 +115,8 @@ protected:
 	NDrawRect _drawRect;
 	NDrawRect _sysRect;
 	NRect _clipRect;
+	NRect *_clipRects;
+	uint _clipRectsCount;
 	bool _transparent;
 };
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 93cc49e..82c6114 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -4636,9 +4636,10 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	// TODO: NRect *rect1, int16 unk in Klayman ctor
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
+	_surface->setClipRects(clipRects, clipRectsCount);
+
 	_dataResource.load(0x04104242);
 	_flagF6 = false;
 }
@@ -4831,7 +4832,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
-    _walkResumeFrameIncr = 1;
+	_walkResumeFrameIncr = 1;
 	_vm->_soundMan->addSound(0x80101800, 0xD3B02847);
 }
 
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 4460314..d7991c2 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -526,49 +526,49 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 
-	_rect1.y1 = 0;
-	_rect1.x2 = 640;
-	_rect2.x2 = 640;
-	_rect2.y2 = 480;
+	_clipRects[0].y1 = 0;
+	_clipRects[0].x2 = 640;
+	_clipRects[1].x2 = 640;
+	_clipRects[1].y2 = 480;
 	
 	if (!getGlobalVar(0x404290D5)) {
 		insertStaticSprite(0x00026027, 900);
 	}
 	
 	tempSprite = insertStaticSprite(0x030326A0, 1100);
-	_rect1.x1 = tempSprite->getDrawRect().x;
+	_clipRects[0].x1 = tempSprite->getDrawRect().x;
 	
 	insertStaticSprite(0x811DA061, 1100);
 
 	tempSprite = insertStaticSprite(0x11180022, 1100);
-	_rect2.x1 = tempSprite->getDrawRect().x;
+	_clipRects[1].x1 = tempSprite->getDrawRect().x;
 
 	tempSprite = insertStaticSprite(0x0D411130, 1100);
-	_rect1.y2 = tempSprite->getDrawRect().y2();
-	_rect2.y1 = tempSprite->getDrawRect().y2();
+	_clipRects[0].y2 = tempSprite->getDrawRect().y2();
+	_clipRects[1].y1 = tempSprite->getDrawRect().y2();
 	
 	_doorLightSprite = insertStaticSprite(0xA4062212, 900);
 
 	if (which < 0) {
-		insertKlayman<KmScene2201>(300, 427, &_rect1, 2);
+		insertKlayman<KmScene2201>(300, 427, _clipRects, 2);
 		setMessageList(0x004B8118);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
 	} else if (which == 1) {
-		insertKlayman<KmScene2201>(412, 393, &_rect1, 2);
+		insertKlayman<KmScene2201>(412, 393, _clipRects, 2);
 		setMessageList(0x004B8130);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
-			insertKlayman<KmScene2201>(379, 427, &_rect1, 2);
+			insertKlayman<KmScene2201>(379, 427, _clipRects, 2);
 			_klayman->setDoDeltaX(1);
 		} else {
-			insertKlayman<KmScene2201>(261, 427, &_rect1, 2);
+			insertKlayman<KmScene2201>(261, 427, _clipRects, 2);
 		}
 		setMessageList(0x004B8178);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
 	} else {
 		NPoint pt = _dataResource.getPoint(0x0304D8DC);
-		insertKlayman<KmScene2201>(pt.x, pt.y, &_rect1, 2);
+		insertKlayman<KmScene2201>(pt.x, pt.y, _clipRects, 2);
 		setMessageList(0x004B8120);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, true);
 	}
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 53b9469..e869e4c 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -96,8 +96,7 @@ public:
 	Scene2201(NeverhoodEngine *vm, Module *parentModule, int which);
 	~Scene2201();
 protected:
-	NRect _rect1;
-	NRect _rect2;
+	NRect _clipRects[2];
 	Sprite *_doorLightSprite;
 	Sprite *_asDoor;
 	Sprite *_ssDoorButton;
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index dfc5358..372c705 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -299,4 +299,10 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra
 
 }
 
+void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent) {
+	NDrawRect clipDrawRect(0, 0, drawRect.width, drawRect.height);
+	for (uint i = 0; i < clipRectsCount; i++)
+		drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 07be04c..fe5a254 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -50,6 +50,7 @@ public:
 		const Graphics::Surface *shadowSurface = NULL);
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
 	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent);
+	void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent);
 protected:
 	NeverhoodEngine *_vm;
 	Graphics::Surface *_backScreen;


Commit: 9b7bb71dd952c85fea54d6526d9b2aaa1bd0498f
    https://github.com/scummvm/scummvm/commit/9b7bb71dd952c85fea54d6526d9b2aaa1bd0498f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:43:48-07:00

Commit Message:
NEVERHOOD: Simplify code and rename things

- Add Module::createStaticScene to simplify creation of static scenes
  (and use it in the relevant places)
- Rename Class545 to AsCommonKey and rename related variables
- Rename stuff in Module2200

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 174edd3..ef1b093 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,7 +309,7 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 0;
+	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
 #if 0
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 5be9a63..1cd6c0d 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -23,6 +23,7 @@
 #include "neverhood/module.h"
 #include "neverhood/navigationscene.h"
 #include "neverhood/smackerscene.h"
+#include "neverhood/module1000.h"
 
 namespace Neverhood {
 
@@ -93,6 +94,10 @@ void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface,
 	_childObject = smackerScene;
 }
 
+void Module::createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash) {
+	_childObject = new StaticScene(_vm, this, backgroundFileHash, cursorFileHash);
+}
+
 bool Module::updateChild() {
 	if (_childObject) {
 		_childObject->handleUpdate();
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 57a42c6..bb01218 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -61,6 +61,7 @@ protected:
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
 	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
 	void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort);
+	void createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash);
 	bool updateChild();
 	void leaveModule(uint32 result);
 };
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index dce4b8c..878a0e7 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -62,7 +62,7 @@ void Module1000::createScene(int sceneNum, int which) {
 		break;
 	case 2:
 		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
-		_childObject = new StaticScene(_vm, this, 0xC084110C, 0x41108C00);
+		createStaticScene(0xC084110C, 0x41108C00);
 		break;
 	case 3:
 		_vm->_soundMan->stopMusic(0x061880C6, 0, 2);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 35132b6..80a210b 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -704,11 +704,11 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0xC021006A);
 	
 	if (getGlobalVar(0xAC00C0D0)) {
-		_class545 = insertSprite<Class545>(this, 0, 1100, 278, 347);
-		_vm->_collisionMan->addSprite(_class545);
+		_asKey = insertSprite<AsCommonKey>(this, 0, 1100, 278, 347);
+		_vm->_collisionMan->addSprite(_asKey);
 	} else {
-		_class545 = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
-		// TODO _class545->setUpdateDeltaXY();
+		_asKey = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
+		// TODO _asKey->setUpdateDeltaXY();
 	}
 
 	if (!getGlobalVar(0x31C63C51)) {
@@ -750,8 +750,8 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _asNeedle) {
 			sendEntityMessage(_klayman, 0x1014, _asNeedle);
 			setMessageList(0x004B9130);
-		} else if (sender == _class545) {
-			sendEntityMessage(_klayman, 0x1014, _class545);
+		} else if (sender == _asKey) {
+			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004B9140);
 		}
 		break;
@@ -885,8 +885,8 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x0311005B);
 
 	if (!getGlobalVar(0x13382860)) {
-		_class545 = insertSprite<Class545>(this, 2, 1100, 435, 445);
-		_vm->_collisionMan->addSprite(_class545);
+		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 435, 445);
+		_vm->_collisionMan->addSprite(_asKey);
 	}
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x404A36A0, 100, 0x440C1000);
@@ -991,9 +991,9 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4826:
-		if (sender == _class545) {
+		if (sender == _asKey) {
 			if (_klayman->getX() >= 249) {
-				sendEntityMessage(_klayman, 0x1014, _class545);
+				sendEntityMessage(_klayman, 0x1014, _asKey);
 				setMessageList(0x004AFC58);
 			}
 		} else if (sender == _asTape) {
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index b458602..e01daf1 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -115,7 +115,7 @@ public:
 	Scene1304(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	Sprite *_sprite1;
-	Sprite *_class545;
+	Sprite *_asKey;
 	Sprite *_asNeedle;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -155,7 +155,7 @@ protected:
 	AnimatedSprite *_asElevatorDoor;
 	Sprite *_asElevator;
 	Sprite *_sprite1;
-	Sprite *_class545;
+	Sprite *_asKey;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender);
 };
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index e5c25ca..d31f3de 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1423,7 +1423,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 // Scene1404
 
 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asProjector(NULL), _class545(NULL) {
+	: Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) {
 	
 	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) {
 		setGlobalVar(0x13382860, 5);
@@ -1440,8 +1440,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0xB006BAC8);
 
 	if (getGlobalVar(0x13382860) == 5) {
-		_class545 = insertSprite<Class545>(this, 2, 1100, 267, 411);
-		_vm->_collisionMan->addSprite(_class545);
+		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 267, 411);
+		_vm->_collisionMan->addSprite(_asKey);
 	}
 
 	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
@@ -1514,8 +1514,8 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (sender == _asTape && _messageListStatus != 2) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B8CD0);
-		} else if (sender == _class545 && _messageListStatus != 2) {
-			sendEntityMessage(_klayman, 0x1014, _class545);
+		} else if (sender == _asKey && _messageListStatus != 2) {
+			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004B8D18);
 		}
 		break;
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 437632d..8f5a4c9 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -238,7 +238,7 @@ protected:
 	Sprite *_sprite1;
 	Sprite *_asTape;
 	AsCommonProjector *_asProjector;
-	Sprite *_class545;
+	Sprite *_asKey;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 92c566e..d324130 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1073,8 +1073,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene1608::hmLowerFloor);
 	
-	_class545 = insertSprite<Class545>(this, 1, 1100, 198, 220);
-	_vm->_collisionMan->addSprite(_class545);
+	_asKey = insertSprite<AsCommonKey>(this, 1, 1100, 198, 220);
+	_vm->_collisionMan->addSprite(_asKey);
 
 	if (which < 0) {
 		if (_vm->gameState().which == 1)
@@ -1317,7 +1317,7 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity
 		if (sender == _asTape) {
 			sendEntityMessage(_kmScene1608, 0x1014, _asTape);
 			setMessageList(0x004B4770);
-		} else if (sender == _class545) {
+		} else if (sender == _asKey) {
 			setMessageList(0x004B46C8);
 		}
 		break;
@@ -1337,8 +1337,8 @@ uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam &param, Entity
 		sendMessage(_parentModule, 0x200D, 0);
 		break;
 	case 0x4826:
-		if (sender == _class545) {
-			sendEntityMessage(_kmScene1608, 0x1014, _class545);
+		if (sender == _asKey) {
+			sendEntityMessage(_kmScene1608, 0x1014, _asKey);
 			setMessageList(0x004B4760);
 		}
 		break;
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index ec31b68..3d6e831 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -141,7 +141,7 @@ public:
 	~Scene1608();
 protected:
 	AsCommonCar *_asCar;
-	Sprite *_class545;
+	Sprite *_asKey;
 	Sprite *_asDoor;
 	Sprite *_asIdleCarLower;
 	Sprite *_asIdleCarFull;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index d7991c2..2220fb7 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -86,115 +86,115 @@ void Module2200::createScene(int sceneNum, int which) {
 		_childObject = new Scene2208(_vm, this, which);
 		break;
 	case 9:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180);
+		createHallOfRecordsScene(which, 0x004B7180);
 		break;
 	case 10:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198);
+		createHallOfRecordsScene(which, 0x004B7198);
 		break;
 	case 11:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0);
+		createHallOfRecordsScene(which, 0x004B71B0);
 		break;
 	case 12:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8);
+		createHallOfRecordsScene(which, 0x004B71C8);
 		break;
 	case 13:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0);
+		createHallOfRecordsScene(which, 0x004B71E0);
 		break;
 	case 14:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8);
+		createHallOfRecordsScene(which, 0x004B71F8);
 		break;
 	case 15:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210);
+		createHallOfRecordsScene(which, 0x004B7210);
 		break;
 	case 16:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228);
+		createHallOfRecordsScene(which, 0x004B7228);
 		break;
 	case 17:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240);
+		createHallOfRecordsScene(which, 0x004B7240);
 		break;
 	case 18:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258);
+		createHallOfRecordsScene(which, 0x004B7258);
 		break;
 	case 19:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270);
+		createHallOfRecordsScene(which, 0x004B7270);
 		break;
 	case 20:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288);
+		createHallOfRecordsScene(which, 0x004B7288);
 		break;
 	case 21:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0);
+		createHallOfRecordsScene(which, 0x004B72A0);
 		break;
 	case 22:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8);
+		createHallOfRecordsScene(which, 0x004B72B8);
 		break;
 	case 23:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0);
+		createHallOfRecordsScene(which, 0x004B72D0);
 		break;
 	case 24:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8);
+		createHallOfRecordsScene(which, 0x004B72E8);
 		break;
 	case 25:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300);
+		createHallOfRecordsScene(which, 0x004B7300);
 		break;
 	case 26:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318);
+		createHallOfRecordsScene(which, 0x004B7318);
 		break;
 	case 27:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330);
+		createHallOfRecordsScene(which, 0x004B7330);
 		break;
 	case 28:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348);
+		createHallOfRecordsScene(which, 0x004B7348);
 		break;
 	case 29:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360);
+		createHallOfRecordsScene(which, 0x004B7360);
 		break;
 	case 30:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378);
+		createHallOfRecordsScene(which, 0x004B7378);
 		break;
 	case 31:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390);
+		createHallOfRecordsScene(which, 0x004B7390);
 		break;
 	case 32:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8);
+		createHallOfRecordsScene(which, 0x004B73A8);
 		break;
 	case 33:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0);
+		createHallOfRecordsScene(which, 0x004B73C0);
 		break;
 	case 34:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8);
+		createHallOfRecordsScene(which, 0x004B73D8);
 		break;
 	case 35:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0);
+		createHallOfRecordsScene(which, 0x004B73F0);
 		break;
 	case 36:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408);
+		createHallOfRecordsScene(which, 0x004B7408);
 		break;
 	case 37:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420);
+		createHallOfRecordsScene(which, 0x004B7420);
 		break;
 	case 38:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438);
+		createHallOfRecordsScene(which, 0x004B7438);
 		break;
 	case 39:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450);
+		createHallOfRecordsScene(which, 0x004B7450);
 		break;
 	case 40:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468);
+		createHallOfRecordsScene(which, 0x004B7468);
 		break;
 	case 41:
 		_childObject = new Scene2242(_vm, this, which);
 		break;
 	case 42:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480);
+		createHallOfRecordsScene(which, 0x004B7480);
 		break;
 	case 43:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498);
+		createHallOfRecordsScene(which, 0x004B7498);
 		break;
 	case 44:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0);
+		createHallOfRecordsScene(which, 0x004B74B0);
 		break;
 	case 45:
-		_childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8);
+		createHallOfRecordsScene(which, 0x004B74C8);
 		break;
 	case 46:
 		_childObject = new Scene2247(_vm, this, which);
@@ -202,14 +202,14 @@ void Module2200::createScene(int sceneNum, int which) {
 	case 47:
 		if (!getGlobalVar(0x98109F12)) {
 			if (getGlobalVar(0x4D080E54))
-				_childObject = new StaticScene(_vm, this, 0x83110287, 0x10283839);
+				createStaticScene(0x83110287, 0x10283839);
 			else
-				_childObject = new StaticScene(_vm, this, 0x83412B9D, 0x12B9983C);
+				createStaticScene(0x83412B9D, 0x12B9983C);
 		} else {
 			if (getGlobalVar(0x4D080E54))
-				_childObject = new StaticScene(_vm, this, 0x48632087, 0x3208348E);
+				createStaticScene(0x48632087, 0x3208348E);
 			else
-				_childObject = new StaticScene(_vm, this, 0x08C74886, 0x74882084);
+				createStaticScene(0x08C74886, 0x74882084);
 		}
 		break;
 	}
@@ -399,6 +399,10 @@ void Module2200::updateScene() {
 
 #undef HallOfRecordsSceneLink
 			
+void Module2200::createHallOfRecordsScene(int which, uint32 sceneInfo140Id) {
+	_childObject = new HallOfRecordsScene(_vm, this, which, sceneInfo140Id);
+}
+
 // Scene2201
 
 AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
@@ -411,8 +415,8 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
 	SetUpdateHandler(&AnimatedSprite::update);
 }
 
-AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1)
-	: AnimatedSprite(vm, 1100), _klayman(klayman), _doorLightSprite(doorLightSprite), _countdown(0), _doorOpen(flag1) {
+AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1)
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _doorOpen(flag1) {
 
 	_x = 408;
 	_y = 290;	
@@ -426,7 +430,7 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *
 	} else {
 		startAnimation(0xE2CB0412, 0, -1);
 		_newStickFrameIndex = 0;
-		_doorLightSprite->setVisible(false);
+		_ssDoorLight->setVisible(false);
 	}
 }
 
@@ -443,10 +447,10 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 	case 0x100D:
 		if (param.asInteger() == 0x11001090) {
 			if (_doorOpen)
-				_doorLightSprite->setVisible(true);
+				_ssDoorLight->setVisible(true);
 		} else if (param.asInteger() == 0x11283090) {
 			if (!_doorOpen)
-				_doorLightSprite->setVisible(false);
+				_ssDoorLight->setVisible(false);
 		}
 		break;
 	case 0x2000:
@@ -481,22 +485,22 @@ void AsScene2201Door::stCloseDoor() {
 	playSound(0, calcHash("fxDoorClose33"));
 }
 
-Class444::Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex)
+SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex)
 	: StaticSprite(vm, 900) {
 	
-	_spriteResource.load2(kClass444FileHashes[spriteIndex]);
+	_spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]);
 	createSurface(100, 16, 16);
 	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
 	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
-	_x = kClass444Points[pointIndex].x;
-	_y = kClass444Points[pointIndex].y;
+	_x = kSsScene2201PuzzleCubePoints[positionIndex].x;
+	_y = kSsScene2201PuzzleCubePoints[positionIndex].y;
 	_needRefresh = true;
 }
 
 Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _soundFlag(false) {
+	: Scene(vm, parentModule, true), _isSoundPlaying(false) {
 
 	Sprite *tempSprite;
 
@@ -520,11 +524,9 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
-	for (uint32 i = 0; i < 9; i++) {
-		if ((int16)getSubVar(0x484498D0, i) >= 0) {
-			insertSprite<Class444>(i, (int16)getSubVar(0x484498D0, i));
-		}
-	}
+	for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++)
+		if ((int16)getSubVar(0x484498D0, cubeIndex) >= 0)
+			insertSprite<SsScene2201PuzzleCube>(cubeIndex, (int16)getSubVar(0x484498D0, cubeIndex));
 
 	_clipRects[0].y1 = 0;
 	_clipRects[0].x2 = 640;
@@ -547,16 +549,16 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[0].y2 = tempSprite->getDrawRect().y2();
 	_clipRects[1].y1 = tempSprite->getDrawRect().y2();
 	
-	_doorLightSprite = insertStaticSprite(0xA4062212, 900);
+	_ssDoorLight = insertStaticSprite(0xA4062212, 900);
 
 	if (which < 0) {
 		insertKlayman<KmScene2201>(300, 427, _clipRects, 2);
 		setMessageList(0x004B8118);
-		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else if (which == 1) {
 		insertKlayman<KmScene2201>(412, 393, _clipRects, 2);
 		setMessageList(0x004B8130);
-		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else if (which == 2) {
 		if (getGlobalVar(0xC0418A02)) {
 			insertKlayman<KmScene2201>(379, 427, _clipRects, 2);
@@ -565,12 +567,12 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 			insertKlayman<KmScene2201>(261, 427, _clipRects, 2);
 		}
 		setMessageList(0x004B8178);
-		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, false);
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else {
 		NPoint pt = _dataResource.getPoint(0x0304D8DC);
 		insertKlayman<KmScene2201>(pt.x, pt.y, _clipRects, 2);
 		setMessageList(0x004B8120);
-		_asDoor = insertSprite<AsScene2201Door>(_klayman, _doorLightSprite, true);
+		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, true);
 	}
 	
 	insertSprite<AsScene2201CeilingFan>();
@@ -586,9 +588,9 @@ Scene2201::~Scene2201() {
 
 void Scene2201::update() {
 	Scene::update();
-	if (!_soundFlag) {
+	if (!_isSoundPlaying) {
 		_vm->_soundMan->playSoundLooping(0x81212040);
-		_soundFlag = true;
+		_isSoundPlaying = true;
 	}
 }
 
@@ -884,7 +886,7 @@ void SsScene2202PuzzleTile::stopMoving() {
 
 Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isTileMoving(false),
-	_movingTileSprite(NULL), _doneMovingTileSprite(NULL) {
+	_ssMovingTile(NULL), _ssDoneMovingTile(NULL) {
 
 	// TODO initScene2201Vars();
 	SetMessageHandler(&Scene2202::handleMessage);
@@ -897,9 +899,10 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	addEntity(_palette);
 	insertMouse435(0x00A08089, 20, 620);
 
-	//DEBUG!
+	//DEBUG>>>
 	for (uint32 index = 0; index < 9; index++)
 		setSubVar(0x484498D0, index, 7 - index);
+	//DEBUG<<<
 
 	for (uint32 index = 0; index < 9; index++) {
 		int16 value = (int16)getSubVar(0x484498D0, index);
@@ -938,19 +941,19 @@ void Scene2202::update() {
 		_leaveScene = true;
 	}
 
-	if (_movingTileSprite && !_isTileMoving) {
-		int16 value = getFreeTileIndex(_movingTileIndex);
-		if (value != -1) {
-			setSurfacePriority(_movingTileSprite->getSurface(), 700);
-			sendMessage(_movingTileSprite, 0x2001, value);
-			_movingTileSprite = NULL;
+	if (_ssMovingTile && !_isTileMoving) {
+		int16 freeTileIndex = getFreeTileIndex(_movingTileIndex);
+		if (freeTileIndex != -1) {
+			setSurfacePriority(_ssMovingTile->getSurface(), 700);
+			sendMessage(_ssMovingTile, 0x2001, freeTileIndex);
+			_ssMovingTile = NULL;
 			_isTileMoving = true;
 		}
 	}
 
-	if (_doneMovingTileSprite) {
-		setSurfacePriority(_doneMovingTileSprite->getSurface(), _surfacePriority);
-		_doneMovingTileSprite = NULL;
+	if (_ssDoneMovingTile) {
+		setSurfacePriority(_ssDoneMovingTile->getSurface(), _surfacePriority);
+		_ssDoneMovingTile = NULL;
 		if (testIsSolved()) {
 			playSound(0);
 			setGlobalVar(0x404290D5, 1);
@@ -974,11 +977,11 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2000:
 		_movingTileIndex = (int16)param.asInteger();
-		_movingTileSprite = (Sprite*)sender;
+		_ssMovingTile = (Sprite*)sender;
 		break;
 	case 0x2002:
 		_isTileMoving = false;
-		_doneMovingTileSprite = (Sprite*)sender;
+		_ssDoneMovingTile = (Sprite*)sender;
 		if (param.asInteger() <= 2) {
 			_surfacePriority = 100;
 		} else if (param.asInteger() >= 3 && param.asInteger() <= 5) {
@@ -1015,24 +1018,22 @@ bool Scene2202::testIsSolved() {
 		getSubVar(0x484498D0, 8) == 7;
 }
 
-static const uint32 kClass545FileHashes[] = {
-	0x2450D850,
-	0x0C9CE8D0,
-	0x2C58A152
+static const uint32 kAsCommonKeyFileHashes[] = {
+	0x2450D850,	0x0C9CE8D0,	0x2C58A152
 };
 
-Class545::Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y)
-	: AnimatedSprite(vm, kClass545FileHashes[index], surfacePriority, x, y), _parentScene(parentScene), _index(index) {
+AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y)
+	: AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) {
 
-	if (!getSubVar(0x0090EA95, _index) && !getSubVar(0x08D0AB11, _index)) {
-		SetMessageHandler(&Class545::handleMessage);
+	if (!getSubVar(0x0090EA95, _keyIndex) && !getSubVar(0x08D0AB11, _keyIndex)) {
+		SetMessageHandler(&AsCommonKey::handleMessage);
 	} else {
 		setVisible(false);
 		SetMessageHandler(NULL);
 	}
 }
 
-uint32 Class545::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -1040,7 +1041,7 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam &param, Entity
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setSubVar(0x0090EA95, _index, 1);
+		setSubVar(0x0090EA95, _keyIndex, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 	}
@@ -1048,23 +1049,22 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 static const uint32 kAsScene2203DoorFileHashes[] = {
-	0x7868AE10,
-	0x1A488110
+	0x7868AE10,	0x1A488110
 };
 
-AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) {
+AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _doorIndex(doorIndex) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2203Door::handleMessage);
 	_x = 320;
 	_y = 240;
-	createSurface1(kAsScene2203DoorFileHashes[_index], 900);
-	if (getGlobalVar(0x9A500914) == _index) {
-		startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1);
+	createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900);
+	if (getGlobalVar(0x9A500914) == _doorIndex) {
+		startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1);
 		_newStickFrameIndex = -2;
 	} else {
-		startAnimation(kAsScene2203DoorFileHashes[_index], 0, -1);
+		startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1);
 		_newStickFrameIndex = 0;
 	}
 }
@@ -1073,7 +1073,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (_index == getGlobalVar(0x9A500914))
+		if (_doorIndex == getGlobalVar(0x9A500914))
 			sendMessage(_parentScene, 0x2002, 0);
 		else
 			sendMessage(_parentScene, 0x2001, 0);
@@ -1083,12 +1083,12 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 		_otherDoor = (Sprite*)param.asEntity();
 		break;
 	case 0x3002:
-		if (_index == getGlobalVar(0x9A500914))
+		if (_doorIndex == getGlobalVar(0x9A500914))
 			sendMessage(_parentScene, 0x4808, 0);
 		stopAnimation();
 		break;
 	case 0x4808:
-		setGlobalVar(0x9A500914, _index);
+		setGlobalVar(0x9A500914, _doorIndex);
 		sendMessage(_otherDoor, 0x4809, 0);
 		openDoor();
 		break;
@@ -1102,11 +1102,11 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 
 void AsScene2203Door::openDoor() {
 	playSound(0, 0x341014C4);
-	startAnimation(kAsScene2203DoorFileHashes[_index], 1, -1);
+	startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 1, -1);
 }
 
 void AsScene2203Door::closeDoor() {
-	startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1);
+	startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1);
 	_playBackwards = true;
 	_newStickFrameIndex = 0;
 }
@@ -1126,9 +1126,11 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setHitRects(0x004B8320);
 
+	//DEBUG setGlobalVar(0x13382860, 1);//###//TODO CHECK IF Below...
+
 	if (getGlobalVar(0x13382860) == 1) {
-		_class545 = insertSprite<Class545>(this, 2, 1100, 282, 432);
-		_vm->_collisionMan->addSprite(_class545);
+		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 282, 432);
+		_vm->_collisionMan->addSprite(_asKey);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 1, 1100, 435, 432, 0x9148A011);
@@ -1222,8 +1224,8 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _asTape) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B83E0);
-		} else if (sender == _class545) {
-			sendEntityMessage(_klayman, 0x1014, _class545);
+		} else if (sender == _asKey) {
+			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004B83F0);
 		}
 		break;
@@ -1395,112 +1397,112 @@ static const uint32 kScene2206MessageIds2[] = {
 	0x004B8A48
 };
 
-static const int16 kClass603XDeltas1[] = {
+static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = {
 	-24, -28, -18, 6, 9, -8
 };
 
-static const int16 kClass603XDeltas2[] = {
+static const int16 kAsScene2206DoorSpikesXDeltasClose[] = {
 	-8, 7, 11, 26, 13, 14
 };
 
-Class603::Class603(NeverhoodEngine *vm, uint32 fileHash)
+AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash)
 	: StaticSprite(vm, fileHash, 200) {
 	
 	if (getGlobalVar(0x18890C91))
 		_x -= 63;
-	SetUpdateHandler(&Class603::update);
-	SetMessageHandler(&Class603::handleMessage);
+	SetUpdateHandler(&AsScene2206DoorSpikes::update);
+	SetMessageHandler(&AsScene2206DoorSpikes::handleMessage);
 	SetSpriteUpdate(NULL);
 }
 
-void Class603::update() {
+void AsScene2206DoorSpikes::update() {
 	handleSpriteUpdate();
 	StaticSprite::update();
 }
 
-uint32 Class603::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4808:
-		_index = 0;
+		_deltaIndex = 0;
 		SetMessageHandler(NULL);
-		SetSpriteUpdate(&Class603::spriteUpdate481E60);
+		SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen);
 		playSound(0, 0x032746E0);
 		break;
 	case 0x4809:
-		_index = 0;
+		_deltaIndex = 0;
 		SetMessageHandler(NULL);
-		SetSpriteUpdate(&Class603::spriteUpdate481E90);
+		SetSpriteUpdate(&AsScene2206DoorSpikes::suClose);
 		playSound(0, 0x002642C0);
 		break;
 	}
 	return messageResult;
 }
 
-void Class603::spriteUpdate481E60() {
-	if (_index < 6) {
-		_x += kClass603XDeltas1[_index];
-		_index++;
+void AsScene2206DoorSpikes::suOpen() {
+	if (_deltaIndex < 6) {
+		_x += kAsScene2206DoorSpikesXDeltasOpen[_deltaIndex];
+		_deltaIndex++;
 	} else {
-		SetMessageHandler(&Class603::handleMessage);
+		SetMessageHandler(&AsScene2206DoorSpikes::handleMessage);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-void Class603::spriteUpdate481E90() {
-	if (_index < 6) {
-		_x += kClass603XDeltas2[_index];
-		_index++;
+void AsScene2206DoorSpikes::suClose() {
+	if (_deltaIndex < 6) {
+		_x += kAsScene2206DoorSpikesXDeltasClose[_deltaIndex];
+		_deltaIndex++;
 	} else {
-		SetMessageHandler(&Class603::handleMessage);
+		SetMessageHandler(&AsScene2206DoorSpikes::handleMessage);
 		SetSpriteUpdate(NULL);
 	}
 }
 
-Class604::Class604(NeverhoodEngine *vm, uint32 fileHash)
+AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash)
 	: StaticSprite(vm, fileHash, 50) {
 
-	SetUpdateHandler(&Class604::update);
-	SetMessageHandler(&Class604::handleMessage);
+	SetUpdateHandler(&AsScene2206Platform::update);
+	SetMessageHandler(&AsScene2206Platform::handleMessage);
 	SetSpriteUpdate(NULL);
 }
 
-void Class604::update() {
+void AsScene2206Platform::update() {
 	handleSpriteUpdate();
 	StaticSprite::update();
 }
 
-uint32 Class604::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4803:
 		SetMessageHandler(NULL);
-		SetSpriteUpdate(&Class604::spriteUpdate482020);
+		SetSpriteUpdate(&AsScene2206Platform::suMoveDown);
 		_yDelta = 0;
 		break;
 	}
 	return messageResult;
 }
 
-void Class604::spriteUpdate482020() {
+void AsScene2206Platform::suMoveDown() {
 	_yDelta++;
 	_y += _yDelta;
 }
 
-Class607::Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash)
+SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash)
 	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) {
 
 	if (getGlobalVar(0x45080C38)) {
 		setVisible(false);
 		SetMessageHandler(NULL);
 	} else {
-		SetMessageHandler(&Class607::handleMessage);
+		SetMessageHandler(&SsScene2206TestTube::handleMessage);
 	}
 	_deltaRect = _drawRect;
 	processDelta();
 }
 
-uint32 Class607::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -1530,28 +1532,28 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite1 = insertStaticSprite(0x2201266A, 100);
 		_sprite2 = insertStaticSprite(0x3406A333, 300);
 		_sprite3 = insertStaticSprite(0x24A223A2, 100);
-		_sprite4 = insertSprite<Class603>(0x26133023);
-		_sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
+		_asDoorSpikes = insertSprite<AsScene2206DoorSpikes>(0x26133023);
+		_asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8AF8);
-		_sprite5 = insertSprite<SsCommonButtonSprite>(this, 0x0E038022, 100, 0);
+		_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x0E038022, 100, 0);
 		insertMouse433(0x83212411);
-		_class607 = insertSprite<Class607>(this, 1100, /*464, 433, */0x5E00E262);
-		_class604 = insertSprite<Class604>(0x085E25E0);
+		_ssTestTube = insertSprite<SsScene2206TestTube>(this, 1100, /*464, 433, */0x5E00E262);
+		_asPlatform = insertSprite<AsScene2206Platform>(0x085E25E0);
 	} else {
 		fileHash = 0xE0102A45;
 		_sprite1 = insertStaticSprite(0x1C1106B8, 100);
 		_sprite2 = insertStaticSprite(0x020462E0, 300);
 		_sprite3 = insertStaticSprite(0x900626A2, 100);
-		_sprite4 = insertSprite<Class603>(0x544822A8);
-		_sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
+		_asDoorSpikes = insertSprite<AsScene2206DoorSpikes>(0x544822A8);
+		_asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8B58);
-		_sprite5 = insertSprite<SsCommonButtonSprite>(this, 0x16882608, 100, 0);
+		_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x16882608, 100, 0);
 		insertMouse433(0x02A41E09);
-		_class607 = insertSprite<Class607>(this, 1100, /*464, 433, */0x52032563);
-		_class604 = insertSprite<Class604>(0x317831A0);
+		_ssTestTube = insertSprite<SsScene2206TestTube>(this, 1100, /*464, 433, */0x52032563);
+		_asPlatform = insertSprite<AsScene2206Platform>(0x317831A0);
 	}
 
-	_class604->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
+	_asPlatform->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
 
 	setBackground(fileHash);
 
@@ -1564,7 +1566,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->addPalette(0x0263D144, 0, 65, 0);
 	}
 	
-	_vm->_collisionMan->addSprite(_class607);
+	_vm->_collisionMan->addSprite(_ssTestTube);
 	
 	if (which < 0) {
 		insertKlayman<KmScene2206>(200, 430);
@@ -1576,7 +1578,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene2206>(205, 396);
 		setMessageList(0x004B88C8);
 		_palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
-		sub4819D0();
+		klaymanBehindSpikes();
 		playSound(0, 0x53B8284A);
 	} else if (which == 3) {
 		insertKlayman<KmScene2206>(kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
@@ -1602,9 +1604,9 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x800C6694) {
-			sub481B00();
+			readClickedColumn();
 		} else if (param.asInteger() == 0x402064D8) {
-			sendEntityMessage(_klayman, 0x1014, _sprite5);
+			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x11C40840) {
 			if (getGlobalVar(0x18890C91))
 				setMessageList(0x004B8948);
@@ -1613,32 +1615,32 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4803:
-		sendMessage(_class604, 0x4803, 0);
+		sendMessage(_asPlatform, 0x4803, 0);
 		break;
 	case 0x480B:
-		if (sender == _sprite5) {
+		if (sender == _ssButton) {
 			setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1);
 			if (getGlobalVar(0x18890C91))
-				sendMessage(_sprite4, 0x4808, 0);
+				sendMessage(_asDoorSpikes, 0x4808, 0);
 			else
-				sendMessage(_sprite4, 0x4809, 0);
+				sendMessage(_asDoorSpikes, 0x4809, 0);
 		}
 		break;
 	case 0x4826:
-		sendEntityMessage(_klayman, 0x1014, _class607);
+		sendEntityMessage(_klayman, 0x1014, _ssTestTube);
 		setMessageList(0x004B8988);
 		break;
 	case 0x482A:
-		sub4819D0();
+		klaymanBehindSpikes();
 		break;
 	case 0x482B:
-		sub481950();
+		klaymanInFrontSpikes();
 		break;
 	}
 	return messageResult;
 }
 
-void Scene2206::sub481950() {
+void Scene2206::klaymanInFrontSpikes() {
 	if (getGlobalVar(0x4D080E54)) {
 		_palette->addBasePalette(0x41983216, 0, 65, 0);
 		_palette->startFadeToPalette(12);
@@ -1646,11 +1648,11 @@ void Scene2206::sub481950() {
 	setSurfacePriority(_sprite1->getSurface(), 100);
 	setSurfacePriority(_sprite2->getSurface(), 300);
 	setSurfacePriority(_sprite3->getSurface(), 100);
-	setSurfacePriority(_sprite4->getSurface(), 200);
+	setSurfacePriority(_asDoorSpikes->getSurface(), 200);
 	_klayman->setClipRect(0, 0, 640, 480);
 }
 
-void Scene2206::sub4819D0() {
+void Scene2206::klaymanBehindSpikes() {
 	if (!getGlobalVar(0x4D080E54)) {
 		_palette->addBasePalette(0xB103B604, 0, 65, 0);
 		_palette->startFadeToPalette(12);
@@ -1658,11 +1660,11 @@ void Scene2206::sub4819D0() {
 	setSurfacePriority(_sprite1->getSurface(), 1100);
 	setSurfacePriority(_sprite2->getSurface(), 1300);
 	setSurfacePriority(_sprite3->getSurface(), 1100);
-	setSurfacePriority(_sprite4->getSurface(), 1200);
+	setSurfacePriority(_asDoorSpikes->getSurface(), 1200);
 	_klayman->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
 }
 
-void Scene2206::sub481B00() {
+void Scene2206::readClickedColumn() {
 	setGlobalVar(0x48A68852, (_mouseClickPos.x - 354) / 96);
 	if (getGlobalVar(0x48A68852) > 2)
 		setGlobalVar(0x48A68852, 2);
@@ -2008,8 +2010,9 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
 Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
-	//DEBUG
+	//DEBUG>>>
 	setGlobalVar(0x4D080E54, 1);
+	//DEBUG<<<
 
 	_vm->gameModule()->initScene3009Vars();
 
@@ -2208,21 +2211,13 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam &param, Enti
 }
 
 static const uint32 kScene2208FileHashes1[] = {
-	0x041023CB,
-	0x041020CB,
-	0x041026CB,
-	0x04102ACB,
-	0x041032CB,
-	0x041002CB
+	0x041023CB, 0x041020CB, 0x041026CB, 0x04102ACB,
+	0x041032CB, 0x041002CB
 };
 	
 static const uint32 kScene2208FileHashes2[] = {
-	0x091206C9,
-	0x091406C9,
-	0x091806C9,
-	0x090006C9,
-	0x093006C9,
-	0x095006C9
+	0x091206C9, 0x091406C9, 0x091806C9, 0x090006C9,
+	0x093006C9, 0x095006C9
 };
 
 Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -2402,18 +2397,15 @@ void Scene2208::drawRow(int16 rowIndex) {
 }
 
 static const int16 kScene2242XPositions[] = {
-	68, 
-	158
+	68, 158
 };
 
 static const uint32 kScene2242MessageListIds2[] = {
-	0x004B3CB8,
-	0x004B3CD8
+	0x004B3CB8, 0x004B3CD8
 };
 
 static const uint32 kScene2242MessageListIds1[] = {
-	0x004B3CF8,
-	0x004B3D20
+	0x004B3CF8, 0x004B3D20
 };
 
 Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -2520,33 +2512,18 @@ void Scene2242::readClickedColumn() {
 }
 
 static const int16 kHallOfRecordsKlaymanXPos[] = {
-	68, 
-	157, 
-	246, 
-	335, 
-	424, 
-	513, 
-	602
+	 68, 157, 246, 335, 
+	424, 513, 602
 };
 
 static const uint32 kHallOfRecordsSceneMessageListIds2[] = {
-	0x004B2978,
-	0x004B2998,
-	0x004B29B8,
-	0x004B29D8,
-	0x004B29F8,
-	0x004B2A18,
-	0x004B2A38
+	0x004B2978,	0x004B2998,	0x004B29B8,	0x004B29D8,
+	0x004B29F8,	0x004B2A18,	0x004B2A38
 };
 
 static const uint32 kHallOfRecordsSceneMessageListIds1[] = {
-	0x004B2A58,
-	0x004B2A80,
-	0x004B2AA8,
-	0x004B2AD0,
-	0x004B2AF8,
-	0x004B2B20,
-	0x004B2B48
+	0x004B2A58,	0x004B2A80,	0x004B2AA8,	0x004B2AD0,
+	0x004B2AF8,	0x004B2B20,	0x004B2B48
 };
 
 HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id)
@@ -2629,18 +2606,15 @@ void HallOfRecordsScene::readClickedColumn() {
 }
 
 static const int16 kScene2247XPositions[] = {
-	513,
-	602
+	513, 602
 };
 
 static const uint32 kScene2247MessageListIds2[] = {
-	0x004B54A0,
-	0x004B54C0
+	0x004B54A0,	0x004B54C0
 };
 
 static const uint32 kScene2247MessageListIds1[] = {
-	0x004B54E0,
-	0x004B5508
+	0x004B54E0,	0x004B5508
 };
 
 Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index e869e4c..625990b 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -40,31 +40,20 @@ public:
 protected:
 	void createScene(int sceneNum, int which);
 	void updateScene();
+	void createHallOfRecordsScene(int which, uint32 sceneInfo140Id);
 };
 
 // Scene2201
 
-static const NPoint kClass444Points[] = {
-	{305, 305},
-	{321, 305},
-	{336, 305},
-	{305, 319},
-	{321, 319},
-	{336, 319},
-	{305, 332},
-	{321, 332},
+static const NPoint kSsScene2201PuzzleCubePoints[] = {
+	{305, 305},	{321, 305},	{336, 305},	{305, 319},
+	{321, 319},	{336, 319},	{305, 332},	{321, 332},
 	{336, 333}
 };
 
-static const uint32 kClass444FileHashes[] = {
-	0x88134A44,
-	0xAA124340,
-	0xB8124602,
-	0xA902464C,
-	0x890A4244,
-	0xA8124642,
-	0xB812C204,
-	0x381A4A4C
+static const uint32 kSsScene2201PuzzleCubeFileHashes[] = {
+	0x88134A44,	0xAA124340,	0xB8124602,	0xA902464C,
+	0x890A4244,	0xA8124642,	0xB812C204,	0x381A4A4C
 };
 
 class AsScene2201CeilingFan : public AnimatedSprite {
@@ -74,10 +63,10 @@ public:
 
 class AsScene2201Door : public AnimatedSprite {
 public:
-	AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1);
+	AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1);
 protected:
 	Klayman *_klayman;
-	Sprite *_doorLightSprite;
+	Sprite *_ssDoorLight;
 	bool _doorOpen;
 	int _countdown;
 	void update();
@@ -86,9 +75,9 @@ protected:
 	void stCloseDoor();
 };
 
-class Class444 : public StaticSprite {
+class SsScene2201PuzzleCube : public StaticSprite {
 public:
-	Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex);
+	SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex);
 };
 
 class Scene2201 : public Scene {
@@ -97,11 +86,11 @@ public:
 	~Scene2201();
 protected:
 	NRect _clipRects[2];
-	Sprite *_doorLightSprite;
+	Sprite *_ssDoorLight;
 	Sprite *_asDoor;
 	Sprite *_ssDoorButton;
 	Sprite *_asTape;
-	bool _soundFlag;
+	bool _isSoundPlaying;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -135,8 +124,8 @@ public:
 	Scene2202(NeverhoodEngine *vm, Module *parentModule, int which);
 	~Scene2202();
 protected:
-	Sprite *_movingTileSprite;
-	Sprite *_doneMovingTileSprite;
+	Sprite *_ssMovingTile;
+	Sprite *_ssDoneMovingTile;
 	bool _isTileMoving;
 	int16 _movingTileIndex;
 	int _surfacePriority;
@@ -148,22 +137,22 @@ protected:
 	bool testIsSolved();	
 };
 
-class Class545 : public AnimatedSprite {
+class AsCommonKey : public AnimatedSprite {
 public:
-	Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y);
+	AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y);
 protected:
 	Scene *_parentScene;
-	int _index;
+	int _keyIndex;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene2203Door : public AnimatedSprite {
 public:
-	AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index);
+	AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex);
 protected:
 	Scene *_parentScene;
 	Sprite *_otherDoor;
-	uint _index;
+	uint _doorIndex;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void openDoor();
 	void closeDoor();
@@ -179,7 +168,7 @@ protected:
 	Sprite *_ssSmallLeftDoor;
 	Sprite *_ssSmallRightDoor;
 	Sprite *_asTape;
-	Sprite *_class545;
+	Sprite *_asKey;
 	NRect _leftDoorClipRect;
 	NRect _rightDoorClipRect;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -204,30 +193,30 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class Class603 : public StaticSprite {
+class AsScene2206DoorSpikes : public StaticSprite {
 public:
-	Class603(NeverhoodEngine *vm, uint32 fileHash);
+	AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash);
 protected:
-	int _index;
+	int _deltaIndex;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate481E60();
-	void spriteUpdate481E90();
+	void suOpen();
+	void suClose();
 };
 
-class Class604 : public StaticSprite {
+class AsScene2206Platform : public StaticSprite {
 public:
-	Class604(NeverhoodEngine *vm, uint32 fileHash);
+	AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash);
 protected:
 	int16 _yDelta;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void spriteUpdate482020();
+	void suMoveDown();
 };
 
-class Class607 : public StaticSprite {
+class SsScene2206TestTube : public StaticSprite {
 public:
-	Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash);
+	SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -241,14 +230,14 @@ protected:
 	Sprite *_sprite1;
 	Sprite *_sprite2;
 	Sprite *_sprite3;
-	Sprite *_sprite4;
-	Sprite *_sprite5;
-	Sprite *_class604;
-	Sprite *_class607;
+	Sprite *_asDoorSpikes;
+	Sprite *_ssButton;
+	Sprite *_asPlatform;
+	Sprite *_ssTestTube;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub481950();
-	void sub4819D0();
-	void sub481B00();
+	void klaymanInFrontSpikes();
+	void klaymanBehindSpikes();
+	void readClickedColumn();
 };
 
 class AsScene2207Elevator : public AnimatedSprite {
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index e2973ec..5f1d5bb 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -70,13 +70,13 @@ void Module2400::createScene(int sceneNum, int which) {
 		createSmackerScene(0x20D80001, true, true, false);
 		break;
 	case 7:
-		_childObject = new StaticScene(_vm, this, 0x81523218, 0x2321C81D);
+		createStaticScene(0x81523218, 0x2321C81D);
 		break;
 	case 8:
-		_childObject = new StaticScene(_vm, this, 0x08100210, 0x00214089);
+		createStaticScene(0x08100210, 0x00214089);
 		break;
 	case 9:
-		_childObject = new StaticScene(_vm, this, 0x8C020505, 0x205018C8);
+		createStaticScene(0x8C020505, 0x205018C8);
 		break;
 	}
 	SetUpdateHandler(&Module2400::updateScene);
@@ -930,8 +930,8 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0xB03001A8);
 
 	if (getGlobalVar(0x13382860) == 2) {
-		_class545 = insertSprite<Class545>(this, 2, 1100, 560, 409);
-		_vm->_collisionMan->addSprite(_class545);
+		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 560, 409);
+		_vm->_collisionMan->addSprite(_asKey);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011);
@@ -1016,8 +1016,8 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _asTape && !_flag1) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B77C8);
-		} else if (sender == _class545 && !_flag1) {
-			sendEntityMessage(_klayman, 0x1014, _class545);
+		} else if (sender == _asKey && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004B77D8);
 		}
 		break;
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index bbfa47d..2fa7a9a 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -162,7 +162,7 @@ protected:
 	Sprite *_sprite2;
 	Sprite *_ssButton;
 	Sprite *_asTape;
-	Sprite *_class545;
+	Sprite *_asKey;
 	Sprite *_asLightCord;
 	bool _flag1;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -174,7 +174,7 @@ public:
 protected:
 	Sprite *_sprite1;
 	Sprite *_asTape;
-	Sprite *_class545;
+	Sprite *_asKey;
 	NRect _clipRects[2];
 	bool _flag1;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 26d0d88..978695d 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -126,9 +126,9 @@ void Module2500::createScene(int sceneNum, int which) {
 		break;
 	case 9:
 		if (getGlobalVar(0xD0A14D10))
-			_childObject = new StaticScene(_vm, this, 0xC62A0645, 0xA0641C6A);
+			createStaticScene(0xC62A0645, 0xA0641C6A);
 		else
-			_childObject = new StaticScene(_vm, this, 0x7A343546, 0x435427AB);
+			createStaticScene(0x7A343546, 0x435427AB);
 		break;
 	}
 	SetUpdateHandler(&Module2500::updateScene);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 7c93aa7..ec0ddf0 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -267,7 +267,7 @@ void Module2700::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B1E60, 150);
 		break;
 	case 30:
-		_childObject = new StaticScene(_vm, this, 0x09507248, 0x0724C09D);
+		createStaticScene(0x09507248, 0x0724C09D);
 		break;
 	case 31:
 //TODO		_childObject = new Scene2732(_vm, this, which);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 2038548..95e2c3e 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -70,7 +70,7 @@ void Module2800::createScene(int sceneNum, int which) {
 		if (_flag) {
 			_childObject = new Scene2802(_vm, this, which);
 		} else {
-			_childObject = new StaticScene(_vm, this, 0x000C6444, 0xC6440008);
+			createStaticScene(0x000C6444, 0xC6440008);
 		}
 #endif		
 		break;
@@ -119,39 +119,39 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 12:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x0000A245, 0x0A241008);
+		createStaticScene(0x0000A245, 0x0A241008);
 		break;
 	case 13:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x81C60635, 0x60631814);
+		createStaticScene(0x81C60635, 0x60631814);
 		break;
 	case 14:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0xCA811204, 0x11200CA0);
+		createStaticScene(0xCA811204, 0x11200CA0);
 		break;
 	case 15:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x2D438A00, 0x38A042DC);
+		createStaticScene(0x2D438A00, 0x38A042DC);
 		break;
 	case 16:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x0A806204, 0x062000A0);
+		createStaticScene(0x0A806204, 0x062000A0);
 		break;
 	case 17:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x010F9284, 0xF9280018);
+		createStaticScene(0x010F9284, 0xF9280018);
 		break;
 	case 18:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x0100022B, 0x0022F018);
+		createStaticScene(0x0100022B, 0x0022F018);
 		break;
 	case 19:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x10866205, 0x66201100);
+		createStaticScene(0x10866205, 0x66201100);
 		break;
 	case 20:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x01C58000, 0x58004014);
+		createStaticScene(0x01C58000, 0x58004014);
 		break;
 	case 21:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
@@ -159,22 +159,22 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 22:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x9408121E, 0x8121A948);
+		createStaticScene(0x9408121E, 0x8121A948);
 		break;
 	case 23:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x048C0600, 0xC0604040);
+		createStaticScene(0x048C0600, 0xC0604040);
 		break;
 	case 24:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		_childObject = new StaticScene(_vm, this, 0x04270A94, 0x70A9004A);
+		createStaticScene(0x04270A94, 0x70A9004A);
 		break;
 	case 25:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		if (getGlobalVar(0x190A1D18))
-			_childObject = new StaticScene(_vm, this, 0x01600204, 0x0020001E);
+			createStaticScene(0x01600204, 0x0020001E);
 		else
-			_childObject = new StaticScene(_vm, this, 0x08611204, 0x1120008E);
+			createStaticScene(0x08611204, 0x1120008E);
 		break;
 	case 26:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
@@ -2987,8 +2987,8 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x0060203E);
 
 	if (getGlobalVar(0x13382860) == 3) {
-		_class545 = insertSprite<Class545>(this, 2, 1100, 474, 437);
-		_vm->_collisionMan->addSprite(_class545);
+		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 474, 437);
+		_vm->_collisionMan->addSprite(_asKey);
 	}
 
 	_ssTape = insertSprite<SsScene1705Tape>(this, 6, 1100, 513, 437, 0xA1361863);
@@ -3071,8 +3071,8 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _ssTape && !_flag1) {
 			sendEntityMessage(_klayman, 0x1014, _ssTape);
 			setMessageList(0x004AF658);
-		} else if (sender == _class545 && !_flag1) {
-			sendEntityMessage(_klayman, 0x1014, _class545);
+		} else if (sender == _asKey && !_flag1) {
+			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004AF668);
 		}
 		break;
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 1027a6f..6317783 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -462,7 +462,7 @@ protected:
 	Sprite *_sprite2;
 	Sprite *_sprite4;
 	Sprite *_ssTape;
-	Sprite *_class545;
+	Sprite *_asKey;
 	Sprite *_sprite1;
 	bool _flag1;
 	int _palStatus;


Commit: 483d76d635dac1ea4418a4ab6cbb639e9314a0c7
    https://github.com/scummvm/scummvm/commit/483d76d635dac1ea4418a4ab6cbb639e9314a0c7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:39-07:00

Commit Message:
NEVERHOOD: Enable/fixup navigation scene sound update code in several modules

- Rename some NavigationScene stuff

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2300.h
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/navigationscene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index ef1b093..190934f 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,8 +309,8 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 5;
-	createModule(2200, -1);
+	_vm->gameState().sceneNum = 1;
+	createModule(2300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 257ee27..53ede43 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -206,23 +206,19 @@ void Module1100::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-#if 0 // TODO		
-			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
-				SoundMan_playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64);
-				SoundMan_setSoundVolume(0x48498E46, 65);
-				SoundMan_setSoundVolume(0x50399F64, 65);
+			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) {
+				_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
+				_vm->_soundMan->setSoundVolume(0x48498E46, 65);
+				_vm->_soundMan->setSoundVolume(0x50399F64, 65);
 			}
-#endif			
 			break;
 		case 1:
-#if 0 // TODO		
-			if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) {
-				SoundMan_playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F);
+			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) {
+				_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
 			}
-#endif			
 			break;
 		case 2:
-			_vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->getSoundFlag1(), 0, 0, 0, 0);
+			_vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0);
 			break;
 		case 5:
 		case 6:
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 4335595..ea6182d 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -158,7 +158,7 @@ void Module1800::updateScene() {
 		case 8:
 			// NOTE: After Klayman jumped into the hole and died...
 			leaveModule(1);
-			// TODO GameState stuff
+			// TODO GameState stuff // Restarts the game?
 			break;
 		case 9:
 			leaveModule(0);
@@ -167,7 +167,7 @@ void Module1800::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 2) {
+			if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) {
 				_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			}
 			break;
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 4f35122..9e2acff 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -21,25 +21,25 @@
  */
 
 #include "neverhood/module2300.h"
+#include "neverhood/navigationscene.h"
 
 namespace Neverhood {
 
 static const uint32 kModule2300SoundList[] = {
-	0x90805C50,
-	0x90804450,
-	0xB4005E60,
-	0x91835066,
-	0x90E14440,
-	0x90F0D1C3,
-	0
+	0x90805C50, 0x90804450, 0xB4005E60, 0x91835066,
+	0x90E14440, 0x90F0D1C3, 0
 };
 
 Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _volume(0) {
+	: Module(vm, parentModule), _soundVolume(0) {
 	
 	_vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList);
 	_vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150);
 
+	//DEBUG>>>
+	setGlobalVar(0x10938830, 0);
+	//DEBUG<<<
+
 	_flag = getGlobalVar(0x10938830) == 0;
 	
 	if (_flag) {
@@ -82,7 +82,7 @@ void Module2300::createScene(int sceneNum, int which) {
 	case 1:
 		createNavigationScene(0x004B67E8, which);
 		if (_flag) {
-			_volume = 15;
+			_soundVolume = 15;
 			_vm->_soundMan->setSoundVolume(0x90F0D1C3, 15);
 		}
 		break;
@@ -93,10 +93,10 @@ void Module2300::createScene(int sceneNum, int which) {
 		if (getGlobalVar(0x10938830)) {
 			createNavigationScene(0x004B68F0, which);
 		} else {
-			_vm->_soundMan->setSoundVolume(0x90F0D1C3, _volume);
+			_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 			createNavigationScene(0x004B68A8, which);
 			if (_flag) {
-				_volume = 87;
+				_soundVolume = 87;
 				_vm->_soundMan->setSoundVolume(0x90F0D1C3, 87);
 			}
 		}
@@ -157,32 +157,23 @@ void Module2300::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 1:
-#if 0 // TODO
-			NavigationScene *navigationScene = (NavigationScene*)_childObject; 
-			if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && 
-				navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
-				_volume++;
-				SoundMan_setSoundVolume(0x90F0D1C3, _volume);
+			if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && 
+				navigationScene()->getFrameNumber() % 2) {
+				_soundVolume++;
+				_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 			}
-#endif
-#if 0 // TODO
-			if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && 
-				navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) {
-				SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64);
-				SoundMan_setSoundVolume(0x48498E46, 70);
-				SoundMan_setSoundVolume(0x50399F64, 70);
+			if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0 && 
+				navigationScene()->getFrameNumber() == 50) {
+				_vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0);
+				_vm->_soundMan->setSoundVolume(0x48498E46, 70);
+				_vm->_soundMan->setSoundVolume(0x50399F64, 70);
 			}
-#endif
 			break;
 		case 3:
-#if 0 // TODO
-			NavigationScene *navigationScene = (NavigationScene*)_childObject; 
-			if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && 
-				navigationScene->getSmackerPlayer()->getFrameNumber() % 2) {
-				_volume--;
-				SoundMan_setSoundVolume(0x90F0D1C3, _volume);
+			if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) {
+				_soundVolume--;
+				_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 			}
-#endif
 			break;
 		}
 	}
diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h
index 7222559..ed39a45 100644
--- a/engines/neverhood/module2300.h
+++ b/engines/neverhood/module2300.h
@@ -37,7 +37,7 @@ public:
 	virtual ~Module2300();
 protected:
 	bool _flag;
-	int _volume;
+	int _soundVolume;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 78ab74d..55ad05b 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -240,12 +240,12 @@ void Module3000::updateScene() {
 		case 8:
 			_flag = getGlobalVar(0x10938830); // CHECKME
 			if (_moduleResult != 1) {
-				// TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0):
+				_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
 				createScene(4, 1);
 			} else if (getGlobalVar(0xF0402B0A)) {
 				createScene(1008, -1);
 			} else {
-				// TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
+				_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
 				createScene(4, 1);
 			}
 			break;
@@ -280,10 +280,9 @@ void Module3000::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 1:
-#if 0 // ALL TODO
-			if (navigationScene()->getSoundFlag1()) {
+			if (navigationScene()->isWalkingForward()) {
 				uint32 frameNumber = navigationScene()->getFrameNumber();
-				int navigationIndex = navigationScene()->getIndex();
+				int navigationIndex = navigationScene()->getNavigationIndex();
 				if (navigationIndex == 1) {
 					if (frameNumber == 0) {
 						_vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0);
@@ -309,13 +308,11 @@ void Module3000::updateScene() {
 					}
 				}
 			}
-#endif
 			break;
 		case 2:
-#if 0 // ALL TODO
-			if (navigationScene()->getSoundFlag1()) {
+			if (navigationScene()->isWalkingForward()) {
 				uint32 frameNumber = navigationScene()->getFrameNumber();
-				int navigationIndex = navigationScene()->getIndex();
+				int navigationIndex = navigationScene()->getNavigationIndex();
 				if (_flag && _soundVolume > 1 && frameNumber % 2) {
 					_soundVolume--;
 					_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
@@ -332,13 +329,11 @@ void Module3000::updateScene() {
 					}
 				}
 			}
-#endif
 			break;
 		case 3:
-#if 0 // ALL TODO
-			if (navigationScene()->getSoundFlag1()) {
+			if (navigationScene()->isWalkingForward()) {
 				uint32 frameNumber = navigationScene()->getFrameNumber();
-				int navigationIndex = navigationScene()->getIndex();
+				int navigationIndex = navigationScene()->getNavigationIndex();
 				if (navigationIndex == 2) {
 					if (frameNumber == 40) {
 						_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
@@ -352,10 +347,9 @@ void Module3000::updateScene() {
 					}
 				}
 			}
-#endif
 			break;
 		case 5:
-			if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 0) {
+			if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0) {
 				_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			}
 			break;
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index a3e1536..66b30cf 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -27,13 +27,16 @@ namespace Neverhood {
 
 NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes)
 	: Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false),
-	_soundFlag1(false), _soundFlag2(false), _smackerFileHash(0), _interactive(true), _done(false) {
+	_isWalkingForward(false), _isTurning(false), _smackerFileHash(0), _interactive(true), _leaveSceneAfter(false) {
 
 	_navigationList = _vm->_staticData->getNavigationList(navigationListId);
+	
+	//DEBUG>>>
 	for (NavigationList::iterator it = _navigationList->begin(); it != _navigationList->end(); it++) {
 		debug("%08X %08X %08X %08X %d %d %08X",	(*it).fileHash,	(*it).leftSmackerFileHash, (*it).rightSmackerFileHash,
 		(*it).middleSmackerFileHash, (*it).interactive, (*it).middleFlag, (*it).mouseCursorFileHash);
 	}
+	//DEBUG<<<
 
 	if (_navigationIndex < 0) {
 		_navigationIndex = (int)getGlobalVar(0x4200189E);
@@ -46,9 +49,7 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 	SetMessageHandler(&NavigationScene::handleMessage);
 	
 	_smackerPlayer = new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true);	
-
 	addEntity(_smackerPlayer);
-	
 	addSurface(_smackerPlayer->getSurface());
 
 	createMouseCursor();
@@ -79,14 +80,14 @@ void NavigationScene::update() {
 		_smackerDone = false;
 		_smackerFileHash = 0;
 	} else if (_smackerDone) {
-		if (_done) {
+		if (_leaveSceneAfter) {
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		} else {
 			const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
 			createMouseCursor();
 			showMouse(true);
-			_soundFlag2 = false;
-			_soundFlag1 = false;
+			_isTurning = false;
+			_isWalkingForward = false;
 			_interactive = true;
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			_vm->_soundMan->setSoundThreePlayFlag(false);
@@ -151,8 +152,8 @@ void NavigationScene::createMouseCursor() {
 void NavigationScene::handleNavigation(const NPoint &mousePos) {
 
 	const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
-	bool oldSoundFlag1 = _soundFlag1;
-	bool oldSoundFlag2 = _soundFlag2;
+	bool oldIsWalkingForward = _isWalkingForward;
+	bool oldIsTurning = _isTurning;
 	uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos);
 	
 	switch (direction) {
@@ -161,8 +162,8 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 		if (navigationItem.leftSmackerFileHash != 0) {
 			_smackerFileHash = navigationItem.leftSmackerFileHash;
 			_interactive = false;
-			_soundFlag1 = false;
-			_soundFlag2 = true;
+			_isWalkingForward = false;
+			_isTurning = true;
 			do {
 				_navigationIndex--;
 				if (_navigationIndex < 0)
@@ -177,8 +178,8 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 		if (navigationItem.rightSmackerFileHash != 0) {
 			_smackerFileHash = navigationItem.rightSmackerFileHash;
 			_interactive = false;
-			_soundFlag1 = false;
-			_soundFlag2 = true;
+			_isWalkingForward = false;
+			_isTurning = true;
 			do {
 				_navigationIndex++;
 				if (_navigationIndex >= (int)_navigationList->size())
@@ -197,20 +198,18 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 		} else if (navigationItem.middleSmackerFileHash != 0) {
 			_smackerFileHash = navigationItem.middleSmackerFileHash;
 			_interactive = false;
-			_soundFlag1 = true;
-			_soundFlag2 = false;
-			_done = true;
+			_isWalkingForward = true;
+			_isTurning = false;
+			_leaveSceneAfter = true;
 		}
 		break;
 	}
 	
-	if (oldSoundFlag2 != _soundFlag2) {
-		_vm->_soundMan->setSoundThreePlayFlag(_soundFlag2);
-	}
+	if (oldIsTurning != _isTurning)
+		_vm->_soundMan->setSoundThreePlayFlag(_isTurning);
 
-	if (oldSoundFlag1 != _soundFlag1) {
-		_vm->_soundMan->setTwoSoundsPlayFlag(_soundFlag1);
-	}
+	if (oldIsWalkingForward != _isWalkingForward)
+		_vm->_soundMan->setTwoSoundsPlayFlag(_isWalkingForward);
 
 }
 
diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h
index cf351d1..ebe9a35 100644
--- a/engines/neverhood/navigationscene.h
+++ b/engines/neverhood/navigationscene.h
@@ -35,8 +35,9 @@ public:
 	virtual ~NavigationScene();
 	int getNavigationAreaType();
 	int getNavigationIndex() const { return _navigationIndex; }
-	bool getSoundFlag1() const { return _soundFlag1; }
-	bool getSoundFlag2() const { return _soundFlag2; }
+	bool isWalkingForward() const { return _isWalkingForward; }
+	bool isTurning() const { return _isTurning; }
+	int getFrameNumber() const { return _smackerPlayer->getFrameNumber(); }
 protected:
 	SmackerPlayer *_smackerPlayer;
 	bool _smackerDone;
@@ -44,9 +45,9 @@ protected:
 	int _navigationIndex;
 	uint32 _smackerFileHash;
 	bool _interactive;
-	bool _soundFlag1;
-	bool _soundFlag2;
-	bool _done;
+	bool _isWalkingForward;
+	bool _isTurning;
+	bool _leaveSceneAfter;
 	const byte *_itemsTypes;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);


Commit: 4c421a09c8f8cdc4455f3644e7ea7fbf0bbb95fc
    https://github.com/scummvm/scummvm/commit/4c421a09c8f8cdc4455f3644e7ea7fbf0bbb95fc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:39-07:00

Commit Message:
NEVERHOOD: Add clipRects to all Klayman subclasses

- Rename stuff in Module2400
- Move some temp sprites from class scope to local scope in the respective constructors

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 190934f..7fa6906 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,8 +309,8 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 1;
-	createModule(2300, -1);
+	_vm->gameState().sceneNum = 2;
+	createModule(2400, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 82c6114..90ba8aa 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5420,7 +5420,9 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 	
 KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// TODO Cliprects
+	
+	_surface->setClipRects(clipRects, clipRectsCount);
+	
 }
 
 uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5635,7 +5637,8 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene2803::KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
-	// TODO ClipRects stuff
+	_surface->setClipRects(clipRects, clipRectsCount);
+	
 	_dataResource.load(0x00900849);
 }
 
@@ -5808,6 +5811,8 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 
+	_surface->setClipRects(clipRects, clipRectsCount);
+
 	if (flag) {
 		// TODO Maybe? Don't know. Set Klayman clip rects
 		loadSound(3, 0x58E0C341);
@@ -5866,6 +5871,8 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	bool flag, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
+	_surface->setClipRects(clipRects, clipRectsCount);
+
 	if (flag) {
 		// TODO Maybe? Don't know. Set Klayman clip rects
 		loadSound(3, 0x58E0C341);
@@ -5973,7 +5980,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
 KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
-	// TODO ClipRects stuff
+	_surface->setClipRects(clipRects, clipRectsCount);
 	
 }
 		
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index b83eb14..90e71de 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -413,7 +413,7 @@ protected:
 	Sprite *_otherSprite;
 	int _idleTableNum;
 
-    int16 _walkResumeFrameIncr;
+	int16 _walkResumeFrameIncr;
 
 	int _moveObjectCountdown;
 
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 5f1d5bb..3b6c6bb 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -720,7 +720,9 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *
 
 Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown(0), _soundToggle(false) {
-	
+
+	Sprite *tempSprite;
+
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2402::handleMessage);
 	SetUpdateHandler(&Scene2402::update);
@@ -748,9 +750,9 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AF7D0);
 	}
 
-	_sprite1 = insertStaticSprite(0x081A60A8, 1100);
+	tempSprite = insertStaticSprite(0x081A60A8, 1100);
 	_ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100);
-	_klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, _sprite1->getDrawRect().y2());
+	_klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2());
 	_asDoor = insertSprite<AsScene2402Door>(this, which == 1/*CHECKME or != ?*/);
 	insertSprite<AsScene2402TV>(_klayman);
 	insertStaticSprite(0x3A01A020, 200);
@@ -823,7 +825,7 @@ void Scene2402::playPipeSound(uint32 fileHash) {
 Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	Sprite *tempSprite;
+	Sprite *tempSprite1, *tempSprite2, *tempSprite3;
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2403::handleMessage);
@@ -837,34 +839,34 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asLightCord->setClipRect(0, 25, 640, 480);
 	
 	if (which < 0) {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2403>(220, 449);
 		setMessageList(0x004B5C98);
 		setRectList(0x004B5E18);
 	} else if (which == 1) {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2403>(433, 449);
 		setMessageList(0x004B5D70);
 		setRectList(0x004B5E18);
 	} else if (which == 2) {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2403>(440, 449);
 		_klayman->setDoDeltaX(1);
 		setMessageList(0x004B5C98);
 		setRectList(0x004B5E18);
 	} else {
-		_flag1 = true;
+		_isClimbingLadder = true;
 		insertKlayman<KmScene2403>(122, 599);
 		setMessageList(0x004B5CA0);
 		setRectList(0x004B5E28);
 	}
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x3130B0EB, 100, 0);
-	_sprite1 = insertStaticSprite(0x20C24220, 1100);	
-	_sprite2 = insertStaticSprite(0x03080900, 1300);
-	tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
-	tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2());
-	_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2());	
+	tempSprite1 = insertStaticSprite(0x20C24220, 1100);	
+	tempSprite2 = insertStaticSprite(0x03080900, 1300);
+	tempSprite3 = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+	tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2());
+	_klayman->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2());	
 
 	loadSound(1, calcHash("fxFogHornSoft"));
 
@@ -881,11 +883,11 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		_flag1 = true;
+		_isClimbingLadder = true;
 		setRectList(0x004B5E28);
 		break;
 	case 0x2001:
-		_flag1 = false;
+		_isClimbingLadder = false;
 		setRectList(0x004B5E18);
 		break;
 	case 0x480B:
@@ -905,7 +907,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4826:
-		if (sender == _asTape && !_flag1) {
+		if (sender == _asTape && !_isClimbingLadder) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B5D98);
 		}
@@ -917,7 +919,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	Sprite *tempSprite;
+	Sprite *tempSprite1, *tempSprite2;
 
 	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) {
 		setGlobalVar(0x13382860, 2);
@@ -937,58 +939,58 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 
-	tempSprite = insertStaticSprite(0x19625293, 1100);
+	tempSprite2 = insertStaticSprite(0x19625293, 1100);
 	_clipRects[0].x1 = 0;
 	_clipRects[0].y1 = 0;
-	_clipRects[0].x2 = tempSprite->getDrawRect().x2();
+	_clipRects[0].x2 = tempSprite2->getDrawRect().x2();
 	_clipRects[0].y2 = 480;
 
 	if (getGlobalVar(0x18890C91)) {
 		setBackground(0x1A0B0304);
 		setPalette(0x1A0B0304);
-		_sprite1 = insertStaticSprite(0x32923922, 1100);
+		tempSprite1 = insertStaticSprite(0x32923922, 1100);
 	} else {
 		setBackground(0x0A038595);
 		setPalette(0x0A038595);
-		_sprite1 = insertStaticSprite(0x1712112A, 1100);
+		tempSprite1 = insertStaticSprite(0x1712112A, 1100);
 	}
 	
-	tempSprite = insertStaticSprite(0x22300924, 1300);
+	tempSprite2 = insertStaticSprite(0x22300924, 1300);
 
-	_clipRects[1].x1 = _sprite1->getDrawRect().x;
-	_clipRects[1].y1 = tempSprite->getDrawRect().y;
+	_clipRects[1].x1 = tempSprite1->getDrawRect().x;
+	_clipRects[1].y1 = tempSprite2->getDrawRect().y;
 	_clipRects[1].x2 = 640;
 	_clipRects[1].y2 = 480;
 
 	if (which < 0) {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(307, 404, _clipRects, 2);
 		setMessageList(0x004B76C8);
 		setRectList(0x004B78C8);
 	} else if (which == 1) {
-		_flag1 = true;
+		_isClimbingLadder = true;
 		insertKlayman<KmScene2406>(253, -16, _clipRects, 2);
 		setMessageList(0x004B76D8);
 		setRectList(0x004B78D8);
 	} else if (which == 2) {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(480, 404, _clipRects, 2);
 		setMessageList(0x004B77C0);
 		setRectList(0x004B78C8);
 	} else if (which == 3) {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(387, 404, _clipRects, 2);
 		setMessageList(0x004B7810);
 		setRectList(0x004B78C8);
 	} else {
-		_flag1 = false;
+		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(0, 404, _clipRects, 2);
 		setMessageList(0x004B76D0);
 		setRectList(0x004B78C8);
 	}
 
-	tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
-	tempSprite->setClipRect(_clipRects[1]);
+	tempSprite2 = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
+	tempSprite2->setClipRect(_clipRects[1]);
 
 }
 
@@ -1005,18 +1007,18 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		_flag1 = true;
+		_isClimbingLadder = true;
 		setRectList(0x004B78D8);
 		break;
 	case 0x2001:
-		_flag1 = false;
+		_isClimbingLadder = false;
 		setRectList(0x004B78C8);
 		break;
 	case 0x4826:
-		if (sender == _asTape && !_flag1) {
+		if (sender == _asTape && !_isClimbingLadder) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B77C8);
-		} else if (sender == _asKey && !_flag1) {
+		} else if (sender == _asKey && !_isClimbingLadder) {
 			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004B77D8);
 		}
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index 2fa7a9a..8074c58 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -141,7 +141,6 @@ public:
 	Scene2402(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Scene2402();
 protected:
-	Sprite *_sprite1;
 	Sprite *_asDoor;
 	Sprite *_ssButton;
 	Sprite *_asTape;
@@ -158,13 +157,11 @@ class Scene2403 : public Scene {
 public:
 	Scene2403(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_sprite1;
-	Sprite *_sprite2;
 	Sprite *_ssButton;
 	Sprite *_asTape;
 	Sprite *_asKey;
 	Sprite *_asLightCord;
-	bool _flag1;
+	bool _isClimbingLadder;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -172,11 +169,10 @@ class Scene2406 : public Scene {
 public:
 	Scene2406(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_sprite1;
 	Sprite *_asTape;
 	Sprite *_asKey;
 	NRect _clipRects[2];
-	bool _flag1;
+	bool _isClimbingLadder;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 


Commit: 1da6b95af9d94ba5e8ceb6ce03467c3627022a48
    https://github.com/scummvm/scummvm/commit/1da6b95af9d94ba5e8ceb6ce03467c3627022a48
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:39-07:00

Commit Message:
NEVERHOOD: Work on Module2500:

- Remove Class541 and Class542 and instead use AsCommonIdleCarLower and AsCommonIdleCarFull
- Some renaming

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7fa6906..066c4b4 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,8 +309,8 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 2;
-	createModule(2400, -1);
+	_vm->gameState().sceneNum = 3;
+	createModule(2500, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index d324130..9d96510 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1031,7 +1031,7 @@ void AsScene1608Door::stCloseDoorDone() {
 	stopAnimation();
 }
 
-AsScene1608IdleCarLower::AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y)
+AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
 
 	setDoDeltaX(1);
@@ -1039,7 +1039,7 @@ AsScene1608IdleCarLower::AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, i
 	_newStickFrameIndex = 1;
 }
 
-AsScene1608IdleCarFull::AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y)
+AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
 
 	setDoDeltaX(1);
@@ -1124,8 +1124,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertMouse433(0x01600988);
 		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
 		_asCar = createSprite<AsCommonCar>(this, 375, 227); // Create but don't add to the sprite list yet
-		_asIdleCarLower = insertSprite<AsScene1608IdleCarLower>(375, 227);
-		_asIdleCarFull = insertSprite<AsScene1608IdleCarFull>(375, 227);
+		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
+		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
 		_asCar->setVisible(false);
 		if (getGlobalVar(0xC0418A02)) {
 			insertKlayman<KmScene1608>(373, 220);
@@ -1168,8 +1168,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->addPalette("paPodRed", 65, 31, 65);
 		insertMouse433(0x01600988);
 		_asCar = insertSprite<AsCommonCar>(this, 375, 227);
-		_asIdleCarLower = insertSprite<AsScene1608IdleCarLower>(375, 227);
-		_asIdleCarFull = insertSprite<AsScene1608IdleCarFull>(375, 227);
+		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
+		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
 		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
 		_kmScene1608 = createSprite<KmScene1608>(this, 439, 220); // Special Klayman handling...
 		sendMessage(_kmScene1608, 0x2032, 1);
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 3d6e831..8c794e0 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -117,14 +117,14 @@ protected:
 	void stCloseDoorDone();
 };
 
-class AsScene1608IdleCarLower : public AnimatedSprite {
+class AsCommonIdleCarLower : public AnimatedSprite {
 public:
-	AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y);
+	AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y);
 };
 
-class AsScene1608IdleCarFull : public AnimatedSprite {
+class AsCommonIdleCarFull : public AnimatedSprite {
 public:
-	AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y);
+	AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y);
 };
 
 class AsCommonCarConnector : public AnimatedSprite {
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 978695d..5d60a17 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/module2500.h"
+#include "neverhood/module1600.h"
 
 namespace Neverhood {
 
@@ -212,24 +213,10 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam &param, Enti
 }
 			
 void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
+	// TODO Move to module class?
 	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
 }
 
-Class541::Class541(NeverhoodEngine *vm, int16 x, int16 y)
-	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
-	
-	startAnimation(0x1209E09F, 1, -1);
-	_newStickFrameIndex = 1;
-	setDoDeltaX(1);
-}
-
-Class542::Class542(NeverhoodEngine *vm, int16 x, int16 y)
-	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
-	
-	_newStickFrameIndex = 0;
-	setDoDeltaX(1);
-}
-
 Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
@@ -250,8 +237,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	addEntity(_class437);
 
 	_asCar = createSprite<AsCommonCar>(this, 211, 400); // Create but don't add to the sprite list yet
-	_class541 = insertSprite<Class541>(211, 400);
-	_class542 = insertSprite<Class542>(211, 400);
+	_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(211, 400);
+	_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(211, 400);
 	insertStaticSprite(0xC42AC521, 1500);
 
 	if (which < 0) {
@@ -273,8 +260,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		_kmScene2501->setDoDeltaX(1);
 		SetMessageHandler(&Scene2501::hmRidingCar);
 		SetUpdateHandler(&Scene2501::upRidingCar);
-		_class541->setVisible(false);
-		_class542->setVisible(false);
+		_asIdleCarLower->setVisible(false);
+		_asIdleCarFull->setVisible(false);
 		_currTrackIndex = which;
 	} else {
 		insertKlayman<KmScene2501>(162, 393);
@@ -334,8 +321,8 @@ void Scene2501::update() {
 		_klaymanInCar = true;
 		SetMessageHandler(&Scene2501::hmCarAtHome);
 		SetUpdateHandler(&Scene2501::upCarAtHome);
-		_class541->setVisible(false);
-		_class542->setVisible(false);
+		_asIdleCarLower->setVisible(false);
+		_asIdleCarFull->setVisible(false);
 		_asCar->setVisible(true);
 		sendMessage(_asCar, 0x2009, 0);
 		_asCar->handleUpdate();
@@ -371,8 +358,8 @@ void Scene2501::upGettingOutOfCar() {
 		SetMessageHandler(&Scene2501::handleMessage);
 		SetUpdateHandler(&Scene2501::update);
 		setRectList(0x004B2608);
-		_class541->setVisible(true);
-		_class542->setVisible(true);
+		_asIdleCarLower->setVisible(true);
+		_asIdleCarFull->setVisible(true);
 		_asCar->setVisible(false);
 		setMessageList(0x004B2570);
 		runMessageList();
@@ -498,8 +485,8 @@ void Scene2501::updateKlaymanCliprect() {
 		_kmScene2501->setClipRect(0, 0, 640, 388);
 }
 
-Class450::Class450(NeverhoodEngine *vm)
-	: StaticSprite(vm, 1400), _countdown(0), _flag1(false) {
+SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
+	: StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) {
 	
 	_spriteResource.load2(0x070220D9);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -517,16 +504,16 @@ Class450::Class450(NeverhoodEngine *vm)
 	loadSound(1, 0x408C0034);
 	loadSound(2, 0x44043000);
 	loadSound(3, 0x44045000);
-	SetMessageHandler(&Class450::handleMessage);
-	SetUpdateHandler(&Class450::update);
+	SetMessageHandler(&SsScene2504Button::handleMessage);
+	SetUpdateHandler(&SsScene2504Button::update);
 }
 
-void Class450::update() {
+void SsScene2504Button::update() {
 	StaticSprite::update();
-	if (_flag1 && !isSoundPlaying(0) && !isSoundPlaying(1)) {
+	if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) {
 		playSound(3);
 		setVisible(false);
-		_flag1 = false;
+		_isSoundPlaying = false;
 	}
 	if (_countdown != 0 && (--_countdown) == 0) {
 		if (getSubVar(0x14800353, 0x01180951)) {
@@ -534,15 +521,15 @@ void Class450::update() {
 		} else {
 			playSound(1);
 		}
-		_flag1 = true;
+		_isSoundPlaying = true;
 	}
 }
 
-uint32 Class450::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (_countdown == 0 && !_flag1) {
+		if (_countdown == 0 && !_isSoundPlaying) {
 			setVisible(true);
 			_countdown = 2;
 			if (getSubVar(0x14800353, 0x01180951)) {
@@ -561,13 +548,13 @@ uint32 Class450::handleMessage(int messageNum, const MessageParam &param, Entity
 Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	Sprite *class450;
+	Sprite *ssButton;
 	
 	_surfaceFlag = true;
 	setBackground(0x90791B80);
 	setPalette(0x90791B80);
-	class450 = insertSprite<Class450>();
-	_vm->_collisionMan->addSprite(class450);
+	ssButton = insertSprite<SsScene2504Button>();
+	_vm->_collisionMan->addSprite(ssButton);
 	insertMouse435(0x91B8490F, 20, 620);
 	SetMessageHandler(&Scene2504::handleMessage);
 	SetUpdateHandler(&Scene::update);
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index e5b9157..60f762f 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -46,16 +46,6 @@ protected:
 	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
-class Class541 : public AnimatedSprite {
-public:
-	Class541(NeverhoodEngine *vm, int16 x, int16 y);
-};
-
-class Class542 : public AnimatedSprite {
-public:
-	Class542(NeverhoodEngine *vm, int16 x, int16 y);
-};
-
 class Scene2501 : public Scene {
 public:
 	Scene2501(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -66,8 +56,8 @@ protected:
 	Sprite *_class517;
 	Sprite *_class519;
 	Sprite *_class520;
-	Sprite *_class541;
-	Sprite *_class542;
+	Sprite *_asIdleCarLower;
+	Sprite *_asIdleCarFull;
 	Klayman *_kmScene2501;
 	NPointArray *_trackPoints;
 	SceneInfo2700 *_sceneInfos[3];
@@ -89,12 +79,12 @@ protected:
 	void updateKlaymanCliprect();
 };
 
-class Class450 : public StaticSprite {
+class SsScene2504Button : public StaticSprite {
 public:
-	Class450(NeverhoodEngine *vm);
+	SsScene2504Button(NeverhoodEngine *vm);
 protected:
 	int _countdown;
-	bool _flag1;
+	bool _isSoundPlaying;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: fcbab805079bff0b55cfdda51eb0ba15d6a2f228
    https://github.com/scummvm/scummvm/commit/fcbab805079bff0b55cfdda51eb0ba15d6a2f228
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Rename stuff in Module2700 (also in Module2500 which uses some of it)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 066c4b4..68a59de 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -309,8 +309,9 @@ void GameModule::startup() {
 
 
 #if 1
-	_vm->gameState().sceneNum = 3;
-	createModule(2500, -1);
+	_vm->gameState().which = 0;
+	_vm->gameState().sceneNum = 1;
+	createModule(2700, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 5d60a17..f8053d2 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -233,8 +233,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette("paKlayRed", 0, 64, 0);
 	insertMouse433(0xE81111B0);
 
-	_class437 = createSprite<Class437>(0x99BE9015); // Don't add this to the sprite list
-	addEntity(_class437);
+	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x99BE9015); // Don't add this to the sprite list
+	addEntity(_ssTrackShadowBackground);
 
 	_asCar = createSprite<AsCommonCar>(this, 211, 400); // Create but don't add to the sprite list yet
 	_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(211, 400);
@@ -276,9 +276,9 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		_currTrackIndex = 0;
 	}
 
-	_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
-	_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
-	_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
+	_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+	_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+	_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	insertSprite<AsCommonCarConnector>(_asCar);
 	
 	_pointListsCount = 3;
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index 60f762f..3e018f9 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -52,10 +52,10 @@ public:
 	virtual ~Scene2501();
 protected:
 	AsCommonCar *_asCar;
-	Sprite *_class437;
-	Sprite *_class517;
-	Sprite *_class519;
-	Sprite *_class520;
+	Sprite *_ssTrackShadowBackground;
+	Sprite *_asCarShadow;
+	Sprite *_asCarConnectorShadow;
+	Sprite *_asCarTrackShadow;
 	Sprite *_asIdleCarLower;
 	Sprite *_asIdleCarFull;
 	Klayman *_kmScene2501;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index ec0ddf0..73ea264 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -498,7 +498,7 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
 }
 
-static const NPoint kClass517Points[] = {
+static const NPoint kCarShadowOffsets[] = {
 	{-63,  3},
 	{-48, 40},
 	{-33, 58},
@@ -511,7 +511,7 @@ static const NPoint kClass517Points[] = {
 	{ 26, 25}
 };
 
-Class437::Class437(NeverhoodEngine *vm, uint32 fileHash)
+SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash)
 	: StaticSprite(vm, 0) {
 	
 	_spriteResource.load2(fileHash);
@@ -523,20 +523,20 @@ Class437::Class437(NeverhoodEngine *vm, uint32 fileHash)
 	StaticSprite::update();
 }
 
-Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index)
+AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index)
 	: AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) {
 
-	SetUpdateHandler(&Class517::update);
+	SetUpdateHandler(&AsCommonCarShadow::update);
 	createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource
 	updateShadow();
 } 
 
-void Class517::update() {
+void AsCommonCarShadow::update() {
 	updateShadow();
 	AnimatedSprite::update();
 }
 
-void Class517::updateShadow() {
+void AsCommonCarShadow::updateShadow() {
 	if (_asCar->getFrameIndex() != _currFrameIndex || _asCar->getCurrAnimFileHash() != _animFileHash) {
 		uint32 fileHash = _asCar->getCurrAnimFileHash();
 		if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 ||
@@ -548,8 +548,8 @@ void Class517::updateShadow() {
 		}
 		_animFileHash = fileHash;
 	}
-	_x = _asCar->getX() + kClass517Points[_index].x;
-	_y = _asCar->getY() + kClass517Points[_index].y;
+	_x = _asCar->getX() + kCarShadowOffsets[_index].x;
+	_y = _asCar->getY() + kCarShadowOffsets[_index].y;
 	if (!_asCar->getVisible()) {
 		startAnimation(0x1209E09F, 0, -1);
 		_newStickFrameIndex = 0;
@@ -557,31 +557,31 @@ void Class517::updateShadow() {
 	setDoDeltaX(_asCar->isDoDeltaX() ? 1 : 0);
 }
 
-Class519::Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index)
+AsCommonCarConnectorShadow::AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index)
 	: AnimatedSprite(vm, 1100), _asCar(asCar), _index(index) {
 
-	SetUpdateHandler(&Class519::update);
+	SetUpdateHandler(&AsCommonCarConnectorShadow::update);
 	createShadowSurface1(shadowSurface, 0x60281C10, 150);
 	startAnimation(0x60281C10, -1, -1);
 	_newStickFrameIndex = -2;	
 } 
 
-void Class519::update() {
-	_x = _asCar->getX() + kClass517Points[_index].x;
-	_y = _asCar->getY() + kClass517Points[_index].y;
+void AsCommonCarConnectorShadow::update() {
+	_x = _asCar->getX() + kCarShadowOffsets[_index].x;
+	_y = _asCar->getY() + kCarShadowOffsets[_index].y;
 	AnimatedSprite::update();
 }
 
-Class520::Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex)
+AsCommonCarTrackShadow::AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex)
 	: AnimatedSprite(vm, 1100), _asCar(asCar) {
 
-	SetUpdateHandler(&Class520::update);
+	SetUpdateHandler(&AsCommonCarTrackShadow::update);
 	createShadowSurface1(shadowSurface, 0x0759129C, 100);
 	startAnimation(0x0759129C, frameIndex, -1);
 	_newStickFrameIndex = frameIndex;
 } 
 
-void Class520::update() {
+void AsCommonCarTrackShadow::update() {
 	_x = _asCar->getX();
 	_y = _asCar->getY();
 	AnimatedSprite::update();
@@ -590,6 +590,8 @@ void Class520::update() {
 Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
+	Sprite *tempSprite;
+
 	NRect clipRect;
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240);
 	setGlobalVar(0x21E60190, 1);
@@ -604,21 +606,21 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B08180);
 	
-	_sprite1 = insertStaticSprite(0x1E086325, 1200);
+	tempSprite = insertStaticSprite(0x1E086325, 1200);
 	
-	clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2());
+	clipRect.set(0, 0, 640, tempSprite->getDrawRect().x2());
 
 	if (sceneInfo->class437Filename) {
 
-		_class437 = createSprite<Class437>(sceneInfo->class437Filename);
-		addEntity(_class437);
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
+		addEntity(_ssTrackShadowBackground);
 
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
-		_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
-		_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
-		_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
+		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+		_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+		_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	} else {
-		_class437 = NULL;
+		_ssTrackShadowBackground = NULL;
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 	}
 
@@ -720,14 +722,14 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B04180);
 
-	_class437 = createSprite<Class437>(0x12002035);
-	addEntity(_class437);
+	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x12002035);
+	addEntity(_ssTrackShadowBackground);
 	
 	_asCar = insertSprite<AsCommonCar>(this, 320, 240);
-	_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+	_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	insertSprite<AsCommonCarConnector>(_asCar);
-	_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
-	_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
+	_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+	_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 
 	_dataResource.load(0x04310014);
 	
@@ -897,16 +899,16 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	
 	if (sceneInfo->class437Filename) {
 
-		_class437 = createSprite<Class437>(sceneInfo->class437Filename);
-		addEntity(_class437);
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
+		addEntity(_ssTrackShadowBackground);
 
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
-		_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
-		_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
-		_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
+		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+		_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+		_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	} else {
-		_class437 = NULL;
-		_class517 = NULL;
+		_ssTrackShadowBackground = NULL;
+		_asCarShadow = NULL;
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 	}
 
@@ -942,12 +944,12 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	
 	if (clipRect) {
 		_asCar->getClipRect() = *clipRect;
-		if (_class517)
-			_class517->getClipRect() = *clipRect; 
-		if (_class520)
-			_class520->getClipRect() = *clipRect; 
-		if (_class519)
-			_class519->getClipRect() = *clipRect; 
+		if (_asCarShadow)
+			_asCarShadow->getClipRect() = *clipRect; 
+		if (_asCarTrackShadow)
+			_asCarTrackShadow->getClipRect() = *clipRect; 
+		if (_asCarConnectorShadow)
+			_asCarConnectorShadow->getClipRect() = *clipRect; 
 		if (_asCarConnector)
 			_asCarConnector->getClipRect() = *clipRect;
 	}
@@ -1001,14 +1003,14 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0x08B8C180);
 
-	_class437 = createSprite<Class437>(0x18808B88);
-	addEntity(_class437);
+	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x18808B88);
+	addEntity(_ssTrackShadowBackground);
 	
 	_asCar = insertSprite<AsCommonCar>(this, 320, 240);
-	_class517 = insertSprite<Class517>(_asCar, _class437->getSurface(), 4);
+	_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-	_class520 = insertSprite<Class520>(_asCar, _class437->getSurface(), 4);
-	_class519 = insertSprite<Class519>(_asCar, _class437->getSurface(), 4);
+	_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+	_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 
 	_dataResource.load(0x06000162);
 	
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index b2210c5..4274bcc 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -49,14 +49,14 @@ protected:
 	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
-class Class437 : public StaticSprite {
+class SsCommonTrackShadowBackground : public StaticSprite {
 public:
-	Class437(NeverhoodEngine *vm, uint32 fileHash);
+	SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash);
 };
 
-class Class517 : public AnimatedSprite {
+class AsCommonCarShadow : public AnimatedSprite {
 public:
-	Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index);
+	AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index);
 protected:
 	uint _index;
 	AnimatedSprite *_asCar;
@@ -65,18 +65,18 @@ protected:
 	void updateShadow();
 };
 
-class Class519 : public AnimatedSprite {
+class AsCommonCarConnectorShadow : public AnimatedSprite {
 public:
-	Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index);
+	AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index);
 protected:
 	uint _index;
 	Sprite *_asCar;
 	void update();
 };
 
-class Class520 : public AnimatedSprite {
+class AsCommonCarTrackShadow : public AnimatedSprite {
 public:
-	Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex);
+	AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex);
 protected:
 	Sprite *_asCar;
 	void update();
@@ -87,12 +87,11 @@ public:
 	Scene2701(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	AsCommonCar *_asCar;
-	Sprite *_class437;
-	Sprite *_class517;
-	Sprite *_class520;
-	Sprite *_class519;
+	Sprite *_ssTrackShadowBackground;
+	Sprite *_asCarShadow;
+	Sprite *_asCarTrackShadow;
+	Sprite *_asCarConnectorShadow;
 	Sprite *_asCarConnector;
-	Sprite *_sprite1;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
 	uint32 handleMessage42F500(int messageNum, const MessageParam &param, Entity *sender);
@@ -104,10 +103,10 @@ public:
 	Scene2702(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	AsCommonCar *_asCar;
-	Sprite *_class437;
-	Sprite *_class517;
-	Sprite *_class520;
-	Sprite *_class519;
+	Sprite *_ssTrackShadowBackground;
+	Sprite *_asCarShadow;
+	Sprite *_asCarTrackShadow;
+	Sprite *_asCarConnectorShadow;
 	int16 _newTrackDestX;
 	int _currTrackIndex, _newTrackIndex;
 	int _count;
@@ -127,11 +126,11 @@ public:
 		const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 protected:
 	AsCommonCar *_asCar;
-	Sprite *_class437;
-	Sprite *_class517;
+	Sprite *_ssTrackShadowBackground;
+	Sprite *_asCarShadow;
 	Sprite *_asCarConnector;
-	Sprite *_class520;
-	Sprite *_class519;
+	Sprite *_asCarTrackShadow;
+	Sprite *_asCarConnectorShadow;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
 	NRectArray *_rectList;
@@ -144,11 +143,11 @@ public:
 	Scene2706(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	AsCommonCar *_asCar;
-	Sprite *_class437;
-	Sprite *_class517;
+	Sprite *_ssTrackShadowBackground;
+	Sprite *_asCarShadow;
 	Sprite *_asCarConnector;
-	Sprite *_class520;
-	Sprite *_class519;
+	Sprite *_asCarTrackShadow;
+	Sprite *_asCarConnectorShadow;
 	int16 _newTrackDestX;
 	int _currTrackIndex, _newTrackIndex;
 	NPointArray *_trackPoints;


Commit: 5aee04b127f96305542d7b37d33f57c5dfc0f9ec
    https://github.com/scummvm/scummvm/commit/5aee04b127f96305542d7b37d33f57c5dfc0f9ec
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Work on Module2800:

- Rename KmScene2803b to KmScene2803Small; Scene2803b to Scene2803Small
- Rename lots of stuff

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 68a59de..5bcd29a 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -310,8 +310,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 1;
-	createModule(2700, -1);
+	_vm->gameState().sceneNum = 11;
+	createModule(2800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 90ba8aa..ee4bfe1 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -5698,13 +5698,13 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	_dataResource.load(0x81120132);
 }
 
-uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam &param) {
+uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x4001:
 	case 0x4800:
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 90e71de..1ac4519 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -692,9 +692,9 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
-class KmScene2803b : public Klayman {
+class KmScene2803Small : public Klayman {
 public:
-	KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 95e2c3e..1ec23e0 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -78,7 +78,7 @@ void Module2800::createScene(int sceneNum, int which) {
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		//setGlobalVar(0x1860C990,1);//DEBUG
 		if (getGlobalVar(0x1860C990))
-			_childObject = new Scene2803b(_vm, this, which);
+			_childObject = new Scene2803Small(_vm, this, which);
 		else
 			_childObject = new Scene2803(_vm, this, which);
 		break;
@@ -477,27 +477,27 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 
 AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2),
-	_flag1(false), _flag2(false) {
+	_isPulled(false), _isBusy(false) {
 
 	createSurface(1010, 640, 480); // TODO Use correct size	from the two hashes
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	_x = x;
 	_y = y;
-	sub4343C0();
+	stIdle();
 }
 
 uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (!_flag2 && param.asInteger() == calcHash("ClickSwitch")) {
+		if (!_isBusy && param.asInteger() == calcHash("ClickSwitch")) {
 			sendMessage(_parentScene, 0x480F, 0);
 			playSound(0, 0x4E1CA4A0);
 		}
 		break;
 	case 0x480F:
-		sub434380();
+		stPulled();
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -509,7 +509,7 @@ uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &p
 	return messageResult;
 }
 
-uint32 AsScene2803LightCord::handleMessage434340(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2803LightCord::hmPulled(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -519,16 +519,16 @@ uint32 AsScene2803LightCord::handleMessage434340(int messageNum, const MessagePa
 	return messageResult;
 }
 
-void AsScene2803LightCord::sub434380() {
-	_flag2 = false;
-	_flag1 = true;
+void AsScene2803LightCord::stPulled() {
+	_isBusy = false;
+	_isPulled = true;
 	startAnimation(_fileHash2, 0, -1);
-	SetMessageHandler(&AsScene2803LightCord::handleMessage434340);
-	NextState(&AsScene2803LightCord::sub4343C0);
+	SetMessageHandler(&AsScene2803LightCord::hmPulled);
+	NextState(&AsScene2803LightCord::stIdle);
 }
 
-void AsScene2803LightCord::sub4343C0() {
-	_flag1 = false;
+void AsScene2803LightCord::stIdle() {
+	_isPulled = false;
 	startAnimation(_fileHash1, 0, -1);
 	SetMessageHandler(&AsScene2803LightCord::handleMessage);
 }
@@ -536,9 +536,9 @@ void AsScene2803LightCord::sub4343C0() {
 void AsScene2803LightCord::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHash1 = fileHash1;
 	_fileHash2 = fileHash2;
-	if (_flag1) {
+	if (_isPulled) {
 		startAnimation(_fileHash2, _currFrameIndex, -1);
-		_flag2 = true;
+		_isBusy = true;
 	} else {
 		startAnimation(_fileHash1, 0, -1);
 	}
@@ -575,7 +575,7 @@ AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	SetMessageHandler(&AsScene2803Rope::handleMessage);
 	startAnimation(0x9D098C23, 35, 53);
-	NextState(&AsScene2803Rope::sub476A70);
+	NextState(&AsScene2803Rope::stReleased);
 	_x = x;
 	_y = -276;
 }
@@ -585,7 +585,7 @@ uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x3002:
 		startAnimation(0x9D098C23, 50, -1);
-		SetMessageHandler(&AsScene2803Rope::handleMessage4769E0);
+		SetMessageHandler(&AsScene2803Rope::hmReleased);
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -597,7 +597,7 @@ uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 AsScene2803Rope::handleMessage4769E0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2803Rope::hmReleased(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -613,7 +613,7 @@ uint32 AsScene2803Rope::handleMessage4769E0(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-void AsScene2803Rope::sub476A70() {
+void AsScene2803Rope::stReleased() {
 	startAnimation(0x8258A030, 0, 1);
 	NextState(&AsScene2803Rope::stHide);
 }
@@ -624,7 +624,7 @@ void AsScene2803Rope::stHide() {
 }
 
 Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _field134(0) {
+	: Scene(vm, parentModule, true), _paletteArea(0) {
 	
 	static const uint32 kScene2803FileHashes1[] = {
 		0,
@@ -648,7 +648,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	loadDataResource(0x00900849);
 	
 	_surfaceFlag = true;
-	
+
 	_background = new DirtyBackground(_vm, 0);
 	_background->createSurface(0, 640, 480);
 	addBackground(_background);
@@ -682,75 +682,75 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite9 = (StaticSprite*)insertStaticSprite(0x341A0237, 1100);
 	_sprite10 = insertStaticSprite(0x855820A3, 1200);
 
-	_clipRects1[0].x1 = 0;
-	_clipRects1[0].y1 = 0;
-	_clipRects1[0].x2 = 640;
-	_clipRects1[0].y2 = _sprite8->getDrawRect().y2();
+	_clipRectsFloor[0].x1 = 0;
+	_clipRectsFloor[0].y1 = 0;
+	_clipRectsFloor[0].x2 = 640;
+	_clipRectsFloor[0].y2 = _sprite8->getDrawRect().y2();
 	
-	_clipRects1[1].x1 = _sprite8->getDrawRect().x2();
-	_clipRects1[1].y1 = _sprite8->getDrawRect().y2();
-	_clipRects1[1].x2 = 640;
-	_clipRects1[1].y2 = 480;
+	_clipRectsFloor[1].x1 = _sprite8->getDrawRect().x2();
+	_clipRectsFloor[1].y1 = _sprite8->getDrawRect().y2();
+	_clipRectsFloor[1].x2 = 640;
+	_clipRectsFloor[1].y2 = 480;
 
-	_clipRects2[0].x1 = _sprite5->getDrawRect().x;
-	_clipRects2[0].y1 = 0;
-	_clipRects2[0].x2 = _sprite5->getDrawRect().x2();
-	_clipRects2[0].y2 = _sprite5->getDrawRect().y2();
+	_clipRectsStairs[0].x1 = _sprite5->getDrawRect().x;
+	_clipRectsStairs[0].y1 = 0;
+	_clipRectsStairs[0].x2 = _sprite5->getDrawRect().x2();
+	_clipRectsStairs[0].y2 = _sprite5->getDrawRect().y2();
 	
-	_clipRects2[1].x1 = _sprite6->getDrawRect().x;
-	_clipRects2[1].y1 = 0;
-	_clipRects2[1].x2 = _sprite3->getDrawRect().x;
-	_clipRects2[1].y2 = _sprite6->getDrawRect().y2();
+	_clipRectsStairs[1].x1 = _sprite6->getDrawRect().x;
+	_clipRectsStairs[1].y1 = 0;
+	_clipRectsStairs[1].x2 = _sprite3->getDrawRect().x;
+	_clipRectsStairs[1].y2 = _sprite6->getDrawRect().y2();
 	
-	_clipRects2[2].x1 = _sprite3->getDrawRect().x;
-	_clipRects2[2].y1 = 0;
-	_clipRects2[2].x2 = _sprite4->getDrawRect().x2();
-	_clipRects2[2].y2 = 480;
+	_clipRectsStairs[2].x1 = _sprite3->getDrawRect().x;
+	_clipRectsStairs[2].y1 = 0;
+	_clipRectsStairs[2].x2 = _sprite4->getDrawRect().x2();
+	_clipRectsStairs[2].y2 = 480;
 
 	if (which < 0) {
-		insertKlayman<KmScene2803>(302, 445, _clipRects1, 2);
+		insertKlayman<KmScene2803>(302, 445, _clipRectsFloor, 2);
 		setMessageList(0x004B79F0);
-		sub476090();
+		klaymanFloor();
 	} else if (which == 1) {
-		insertKlayman<KmScene2803>(200, 445, _clipRects1, 2);
+		insertKlayman<KmScene2803>(200, 445, _clipRectsFloor, 2);
 		setMessageList(0x004B79C8);
-		sub476090();
+		klaymanFloor();
 	} else if (which == 3) {
 		NPoint pt = _dataResource.getPoint(0xC2A08694);
-		insertKlayman<KmScene2803>(pt.x, pt.y, _clipRects2, 3);
+		insertKlayman<KmScene2803>(pt.x, pt.y, _clipRectsStairs, 3);
 		setMessageList(0x004B7A00);
-		sub475FF0();
+		klaymanStairs();
 	} else if (which == 5) {
-		insertKlayman<KmScene2803>(253, 298, _clipRects2, 3);
+		insertKlayman<KmScene2803>(253, 298, _clipRectsStairs, 3);
 		setMessageList(0x004B7A00);
-		sub475FF0();
+		klaymanStairs();
 	} else if (which == 6) {
 		_asRope = insertSprite<AsScene2803Rope>(this, 384);
 		_asRope->setClipRect(0, 25, 640, 480);
-		insertKlayman<KmScene2803>(384, 0, _clipRects1, 2);
+		insertKlayman<KmScene2803>(384, 0, _clipRectsFloor, 2);
 		sendEntityMessage(_klayman, 0x1014, _asRope);
 		_klayman->setClipRect(0, 25, 640, 480);
 		setMessageList(0x004B7A78);
-		sub476090();
+		klaymanFloor();
 	} else if (which == 2) {
-		insertKlayman<KmScene2803>(400, 445, _clipRects1, 2);
+		insertKlayman<KmScene2803>(400, 445, _clipRectsFloor, 2);
 		setMessageList(0x004B79F8);
-		sub476090();
+		klaymanFloor();
 	} else {
-		insertKlayman<KmScene2803>(50, 231, _clipRects2, 3);
+		insertKlayman<KmScene2803>(50, 231, _clipRectsStairs, 3);
 		setMessageList(0x004B79C0);
-		sub475FF0();
+		klaymanStairs();
 	}
 
-	sub476180();
+	changeBackground();
 
 }
 
-void Scene2803::update475E40() {
+void Scene2803::upKlaymanStairs() {
 	if (_klayman->getX() < 350) {
-		sub4765D0();
+		setPaletteArea0();
 	} else {
-		sub4765F0();
+		setPaletteArea1();
 	}
 	Scene::update();
 }
@@ -759,7 +759,7 @@ uint32 Scene2803::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x480F:
-		sub476130();
+		toggleBackground();
 		// NOTE Intentional fall-through
 	case 0x100D:
 		if (param.asInteger() == 0x84251F82)
@@ -777,20 +777,20 @@ uint32 Scene2803::handleMessage(int messageNum, const MessageParam &param, Entit
 			setMessageList(0x004B7A88);
 		break;
 	case 0x482A:
-		sub475FF0();
-		sub4765F0();
+		klaymanStairs();
+		setPaletteArea1();
 		break;
 	case 0x482B:
-		sub476090();
-		sub4765D0();
+		klaymanFloor();
+		setPaletteArea0();
 		break;
 	}
 	return messageResult;
 }
 
-void Scene2803::sub475FF0() {
-	SetUpdateHandler(&Scene2803::update475E40);
-	// TODO _klayman->setClipRects(_clipRects2, 3);
+void Scene2803::klaymanStairs() {
+	SetUpdateHandler(&Scene2803::upKlaymanStairs);
+	_klayman->getSurface()->setClipRects(_clipRectsStairs, 3);
 	sendMessage(_klayman, 0x482C, 0xE5A48297);
 	_sprite3->setVisible(true);
 	_sprite4->setVisible(true);
@@ -801,9 +801,9 @@ void Scene2803::sub475FF0() {
 	_sprite9->setVisible(false);
 }
 
-void Scene2803::sub476090() {
+void Scene2803::klaymanFloor() {
 	SetUpdateHandler(&Scene::update);
-	// TODO _klayman->setClipRects(_clipRects1, 2);
+	_klayman->getSurface()->setClipRects(_clipRectsFloor, 2);
 	sendMessage(_klayman, 0x482C, 0);
 	_sprite3->setVisible(false);
 	_sprite4->setVisible(false);
@@ -814,12 +814,12 @@ void Scene2803::sub476090() {
 	_sprite9->setVisible(true);
 }
 
-void Scene2803::sub476130() {
+void Scene2803::toggleBackground() {
 	setGlobalVar(0x190A1D18, getGlobalVar(0x190A1D18) ? 0 : 1);
-	sub476180();
+	changeBackground();
 }
 
-void Scene2803::sub476180() {
+void Scene2803::changeBackground() {
 	// TODO? g_screen->resetDirtyRects();
 	if (getGlobalVar(0x190A1D18)) {
 		_asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D);
@@ -892,46 +892,46 @@ void Scene2803::sub476180() {
 		}
 		_sprite10->setVisible(false);
 	}
-	sub476610();
+	updatePaletteArea();
 }
 
-void Scene2803::sub4765D0() {
-	if (_field134) {
-		_field134 = 0;
-		sub476610();
+void Scene2803::setPaletteArea0() {
+	if (_paletteArea != 0) {
+		_paletteArea = 0;
+		updatePaletteArea();
 	}
 }
 
-void Scene2803::sub4765F0() {
-	if (!_field134) {
-		_field134 = 1;
-		sub476610();
+void Scene2803::setPaletteArea1() {
+	if (_paletteArea != 1) {
+		_paletteArea = 1;
+		updatePaletteArea();
 	}
 }
 
-void Scene2803::sub476610() {
+void Scene2803::updatePaletteArea() {
 	uint32 fadePaletteHash;
 	if (getGlobalVar(0x190A1D18))
-		fadePaletteHash = _field134 ? 0xB103B604 : 0x412A423E;
+		fadePaletteHash = (_paletteArea == 1) ? 0xB103B604 : 0x412A423E;
 	else
-		fadePaletteHash = _field134 ? 0x0263D144 : 0x29800A01;
+		fadePaletteHash = (_paletteArea == 1) ? 0x0263D144 : 0x29800A01;
 	_palette->addBasePalette(fadePaletteHash, 0, 64, 0);
 	_palette->startFadeToPalette(12);
 }
 
-Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _palStatus(0) {
+Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _paletteArea(0) {
 
-	static const uint32 kScene2803bFileHashes1[] = {
+	static const uint32 kScene2803SmallFileHashes1[] = {
 		0, 0x081000F1, 0x08100171, 0x08100271
 	};
 
-	static const uint32 kScene2803bFileHashes2[] = {
+	static const uint32 kScene2803SmallFileHashes2[] = {
 		0, 0x286800D4, 0x286806D4, 0x28680AD4
 	};
 	
 	_surfaceFlag = true;
-	SetMessageHandler(&Scene2803b::handleMessage);
+	SetMessageHandler(&Scene2803Small::handleMessage);
 
 	loadDataResource(0x81120132);
 	insertMouse433(0x00A05290);
@@ -954,7 +954,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getSubVar(0x0C601058, 0) == 0)
 			insertStaticSprite(0x66121222, 100);
 		else
-			insertSprite<AnimatedSprite>(kScene2803bFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326);
+			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326);
 
 		if (getSubVar(0x0C601058, 1) == 3)
 			insertStaticSprite(0x64330236, 100);
@@ -980,7 +980,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getSubVar(0x0C601058, 0) == 0)
 			insertStaticSprite(0x50C027A8, 100);
 		else
-			insertSprite<AnimatedSprite>(kScene2803bFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326);
+			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326);
 
 		if (getSubVar(0x0C601058, 1) == 3)
 			insertStaticSprite(0xD48077A0, 100);
@@ -994,35 +994,35 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite7->setVisible(false);
 
 	if (which < 0) {
-		insertKlayman<KmScene2803b>(479, 435);
-		sub460110();
+		insertKlayman<KmScene2803Small>(479, 435);
+		klaymanFloor();
 		setMessageList(0x004B60D8);
 	} else if (which == 3) {
 		NPoint pt = _dataResource.getPoint(0x096520ED);
-		insertKlayman<KmScene2803b>(pt.x, pt.y);
-		sub460090();
+		insertKlayman<KmScene2803Small>(pt.x, pt.y);
+		klaymanSlope();
 		setMessageList(0x004B6100);
 		_klayman->setRepl(64, 0);
 	} else if (which == 4) {
 		NPoint pt = _dataResource.getPoint(0x20C6238D);
-		insertKlayman<KmScene2803b>(pt.x, pt.y);
-		sub460090();
+		insertKlayman<KmScene2803Small>(pt.x, pt.y);
+		klaymanSlope();
 		setMessageList(0x004B60F8);
 		_klayman->setRepl(64, 0);
 	} else if (which == 5) {
 		NPoint pt = _dataResource.getPoint(0x2146690D);
-		insertKlayman<KmScene2803b>(pt.x, pt.y);
-		sub460090();
+		insertKlayman<KmScene2803Small>(pt.x, pt.y);
+		klaymanSlope();
 		setMessageList(0x004B6100);
 		_klayman->setRepl(64, 0);
 	} else if (which == 2) {
 		NPoint pt = _dataResource.getPoint(0x104C03ED);
-		insertKlayman<KmScene2803b>(pt.x, pt.y);
-		sub460110();
+		insertKlayman<KmScene2803Small>(pt.x, pt.y);
+		klaymanFloor();
 		setMessageList(0x004B6138);
 	} else {
-		insertKlayman<KmScene2803b>(135, 444);
-		sub460110();
+		insertKlayman<KmScene2803Small>(135, 444);
+		klaymanFloor();
 		setMessageList(0x004B60E0, false);
 		_sprite6->setVisible(true);
 		_sprite7->setVisible(true);
@@ -1030,7 +1030,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which)
 
 }
 
-uint32 Scene2803b::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -1041,7 +1041,7 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam &param, Enti
 			_klayman->setX(pt.x);
 			_klayman->setY(pt.y);
 			_klayman->processDelta();
-			sub460110();
+			klaymanFloor();
 			_klayman->setClipRect(517, 401, 536, 480);
 			setMessageList(0x004B6198);
 		} else if (param.asInteger() == 0xB00C7C48) {
@@ -1055,7 +1055,7 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam &param, Enti
 			_klayman->setX(560);
 			_klayman->setY(315);
 			_klayman->processDelta();
-			sub460090();
+			klaymanSlope();
 			setMessageList(0x004B61A0);
 		} else if (param.asInteger() == 0x002CAA68) {
 			setMessageList(0x004B61A8);
@@ -1063,14 +1063,14 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam &param, Enti
 		break;
 	case 0x482A:
 		if (_klayman->getX() < 200) {
-			sub4601D0();
+			setPaletteArea3();
 		} else if (_klayman->getX() < 500) {
 			setSurfacePriority(_sprite5->getSurface(), 1100);
 			sendMessage(_klayman, 0x482C, 0);
-			sub4601B0();
+			setPaletteArea2();
 		} else {
 			_klayman->setClipRect(517, 401, 536, 480);
-			sub4601B0();
+			setPaletteArea2();
 		}
 		break;
 	case 0x482B:
@@ -1084,72 +1084,72 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam &param, Enti
 	return 0;
 }
 
-void Scene2803b::update45FCB0() {
+void Scene2803Small::upKlaymanSlope() {
 	if (_klayman->getX() < 388) {
 		_klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
-		sub460170();
+		setPaletteArea0();
 	} else if (_klayman->getX() < 500) {
 		_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2());
-		sub460190();
+		setPaletteArea1();
 	}
 	Scene::update();
 }
 
-void Scene2803b::update45FD50() {
+void Scene2803Small::upKlaymanFloor() {
 	if (_klayman->getX() > 194 && _klayman->getX() < 273)
-		sub4601B0();
+		setPaletteArea2();
 	else if (_klayman->getX() > 155 && _klayman->getX() < 300)
-		sub460170();
+		setPaletteArea0();
 	Scene::update();
 }
 
-void Scene2803b::sub460090() {
-	SetUpdateHandler(&Scene2803b::update45FCB0);
+void Scene2803Small::klaymanSlope() {
+	SetUpdateHandler(&Scene2803Small::upKlaymanSlope);
 	sendMessage(_klayman, 0x482C, 0x23C630D9);
 	_klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2());
 	_klayman->setRepl(64, 0);
 	_sprite1->setVisible(true);
 }
 
-void Scene2803b::sub460110() {
-	SetUpdateHandler(&Scene2803b::update45FD50);
+void Scene2803Small::klaymanFloor() {
+	SetUpdateHandler(&Scene2803Small::upKlaymanFloor);
 	sendMessage(_klayman, 0x482C, 0x2086222D);
 	_klayman->setClipRect(0, 0, 640, 480);
 	_klayman->clearRepl();
 	_sprite1->setVisible(false);
 }
 
-void Scene2803b::sub460170() {
-	if (_palStatus != 0) {
-		_palStatus = 0;
-		sub4601F0(false);
+void Scene2803Small::setPaletteArea0() {
+	if (_paletteArea != 0) {
+		_paletteArea = 0;
+		updatePaletteArea(false);
 	}
 }
 
-void Scene2803b::sub460190() {
-	if (_palStatus != 1) {
-		_palStatus = 1;
-		sub4601F0(false);
+void Scene2803Small::setPaletteArea1() {
+	if (_paletteArea != 1) {
+		_paletteArea = 1;
+		updatePaletteArea(false);
 	}
 }
 
-void Scene2803b::sub4601B0() {
-	if (_palStatus != 2) {
-		_palStatus = 2;
-		sub4601F0(false);
+void Scene2803Small::setPaletteArea2() {
+	if (_paletteArea != 2) {
+		_paletteArea = 2;
+		updatePaletteArea(false);
 	}
 }
 
-void Scene2803b::sub4601D0() {
-	if (_palStatus != 3) {
-		_palStatus = 3;
-		sub4601F0(true);
+void Scene2803Small::setPaletteArea3() {
+	if (_paletteArea != 3) {
+		_paletteArea = 3;
+		updatePaletteArea(true);
 	}
 }
 
-void Scene2803b::sub4601F0(bool flag) {
+void Scene2803Small::updatePaletteArea(bool instantly) {
 	if (getGlobalVar(0x190A1D18)) {
-		switch (_palStatus) {
+		switch (_paletteArea) {
 		case 1:
 			_palette->addBasePalette(0x0A938204, 0, 64, 0);
 			break;
@@ -1164,7 +1164,7 @@ void Scene2803b::sub4601F0(bool flag) {
 			break;
 		}
 	} else {
-		switch (_palStatus) {
+		switch (_paletteArea) {
 		case 2:
 			_palette->addBasePalette(0x0263D144, 0, 64, 0);
 			break;
@@ -1176,11 +1176,7 @@ void Scene2803b::sub4601F0(bool flag) {
 			break;
 		}
 	}
-	if (flag) {
-		_palette->startFadeToPalette(0);
-	} else {
-		_palette->startFadeToPalette(12);
-	}
+	_palette->startFadeToPalette(instantly ? 0 : 12);
 }
 
 SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene)
@@ -2441,10 +2437,11 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam &param, Entit
 
 void Scene2808::update() {
 
-	// DEBUG: Show correct values
+	// DEBUG>>>: Show correct values
 	debug("---------------");
 	debug("%03d %03d %03d", getSubVar(0x0C601058, 0), getSubVar(0x0C601058, 1), getSubVar(0x0C601058, 2));
 	debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel());
+	// DEBUG<<<
 	
 	Scene::update();
 	if (_countdown != 0 && (--_countdown) == 0) {
@@ -2699,7 +2696,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 			setMessageList(0x004AE438);
 			setRectList(0x004AE810);
-			_flag1 = false;
+			_isRopingDown = false;
 			_vm->_collisionMan->removeSprite(_asTape);
 		} else {
 			insertKlayman<KmScene2810>(300, 424, _clipRects, 2);
@@ -2711,7 +2708,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
 			_clipRects[0].y1 = _sprite1->getDrawRect().y;
-			_flag1 = false;
+			_isRopingDown = false;
 		}
 	} else if (which == 1) {
 		insertKlayman<KmScene2810>(186, 64, _clipRects, 2);
@@ -2719,7 +2716,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		loadDataResource(0x84130112);
 		tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
-		_flag1 = true;
+		_isRopingDown = true;
 		_clipRects[0].y1 = _sprite1->getDrawRect().y;
 	} else if (which == 5) {
 		insertStaticSprite(0xC3007EA0, 100);
@@ -2734,7 +2731,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_soundMan->addSound(0x84400112, 0xC874EE6C);
 		_vm->_soundMan->playSoundLooping(0xC874EE6C);
 		_vm->_soundMan->setSoundVolume(0xC874EE6C, 50);
-		_flag1 = false;
+		_isRopingDown = false;
 	} else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) {
 		if (getGlobalVar(0x1860C990)) {
 			insertKlayman<KmScene2810Small>((int16)getGlobalVar(0x00D30138), 448);
@@ -2743,30 +2740,30 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 			setMessageList(0x004AE6D8);
 			setRectList(0x004AE810);
-			_flag1 = false;
+			_isRopingDown = false;
 			_vm->_collisionMan->removeSprite(_asTape);
 		} else {
-			sub406650();
+			insertKlaymanLadder();
 			if (getGlobalVar(0x00188211)) {
 				setMessageList(0x004AE6E8);
 				setGlobalVar(0x00188211, 0);
-				_flag1 = false;
+				_isRopingDown = false;
 			} else {
 				setMessageList(0x004AE6D8);
-				_flag1 = false;
+				_isRopingDown = false;
 			}
 		}
 	} else if (which >= 15 && which <= 18) {
-		sub406650();
+		insertKlaymanLadder();
 		setMessageList(0x004AE6E0);
-		_flag1 = false;
+		_isRopingDown = false;
 	} else if (which == 4) {
 		if (getGlobalVar(0x1860C990)) {
 			insertKlayman<KmScene2810Small>(473, 448);
 			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 			setMessageList(0x004AE428);
 			setRectList(0x004AE810);
-			_flag1 = false;
+			_isRopingDown = false;
 			_vm->_collisionMan->removeSprite(_asTape);
 		} else {
 			insertKlayman<KmScene2810>(450, 424, _clipRects, 2);
@@ -2778,14 +2775,14 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			tempSprite = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480);
 			_clipRects[0].y1 = _sprite1->getDrawRect().y;
-			_flag1 = false;
+			_isRopingDown = false;
 		}
 	} else {
 		insertKlayman<KmScene2810Small>(120, 448);
 		_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 		setMessageList(0x004AE410);
 		setRectList(0x004AE810);
-		_flag1 = false;
+		_isRopingDown = false;
 		_vm->_collisionMan->removeSprite(_asTape);
 	}
 
@@ -2797,7 +2794,7 @@ Scene2810::~Scene2810() {
 	_vm->_soundMan->deleteSoundGroup(0x84400112);
 }
 
-void Scene2810::sub406650() {
+void Scene2810::insertKlaymanLadder() {
 	Sprite *tempSprite;
 
 	if (getGlobalVar(0x00188211)) {
@@ -2851,18 +2848,20 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entit
 			setMessageList(0x004AE688);
 		break;
 	case 0x2000:
+	debug("0x2000");
 		setRectList(0x004AE800);
-		_flag1 = true;
+		_isRopingDown = true;
 		break;
 	case 0x2001:
+	debug("0x2001");
 		if (getGlobalVar(0x0018CA22))
 			loadDataResource(0x84130112);
 		else
 			loadDataResource(0x84500132);
-		_flag1 = false;
+		_isRopingDown = false;
 		break;
 	case 0x4826:
-		if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_flag1) {
+		if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_isRopingDown) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004AE750);
 		}
@@ -2919,7 +2918,7 @@ uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x4806:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
-		sub413E00();
+		stRopingDown();
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -2931,7 +2930,7 @@ uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-uint32 AsScene2812Rope::handleMessage413DC0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsScene2812Rope::hmRopingDown(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -2941,10 +2940,10 @@ uint32 AsScene2812Rope::handleMessage413DC0(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-void AsScene2812Rope::sub413E00() {
+void AsScene2812Rope::stRopingDown() {
 	sendMessage(_parentScene, 0x4806, 0);
 	startAnimation(0x9D098C23, 0, -1);
-	SetMessageHandler(&AsScene2812Rope::handleMessage413DC0);
+	SetMessageHandler(&AsScene2812Rope::hmRopingDown);
 }
 
 AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm)
@@ -2967,7 +2966,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa
 }
 
 Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _palStatus(0) {
+	: Scene(vm, parentModule, true), _paletteArea(0) {
 	
 	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
 		setGlobalVar(0x13382860, 3);
@@ -3003,19 +3002,19 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite4 = insertStaticSprite(0x08592134, 1100);
 
 	if (which < 0) {
-		_flag1 = false;
+		_isRopingDown = false;
 		insertKlayman<KmScene2812>(272, 432);
 		setMessageList(0x004AF560);
 		_sprite1->setVisible(false);
 		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
 	} else if (which == 1) {
-		_flag1 = false;
+		_isRopingDown = false;
 		insertKlayman<KmScene2812>(338, 398);
 		setMessageList(0x004AF588);
-		setPalStatus1(1);
+		setPaletteArea1(true);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2());
 	} else if (which == 2) {
-		_flag1 = false;
+		_isRopingDown = false;
 		if (getGlobalVar(0xC0418A02)) {
 			insertKlayman<KmScene2812>(554, 432);
 			_klayman->setDoDeltaX(1);
@@ -3026,10 +3025,10 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite1->setVisible(false);
 		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
 	} else {
-		_flag1 = true;
+		_isRopingDown = true;
 		insertKlayman<KmScene2812>(150, 582);
 		setMessageList(0x004AF568);
-		setPalStatus2(1);
+		setPaletteArea2(true);
 		_sprite1->setVisible(false);
 		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
 	}
@@ -3040,9 +3039,9 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene2812::update() {
 	if (_klayman->getX() < 220)
-		setPalStatus2(0);
+		setPaletteArea2(false);
 	else if (_klayman->getX() < 240)
-		setPalStatus0(0);
+		setPaletteArea0(false);
 	Scene::update();
 }
 
@@ -3054,12 +3053,12 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
 			sendEntityMessage(_klayman, 0x1014, _asRope);
 		break;
 	case 0x2001:
-		_flag1 = true;
+		_isRopingDown = true;
 		setRectList(0x004AF710);
 		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2());
 		break;
 	case 0x2002:
-		_flag1 = false;
+		_isRopingDown = false;
 		setRectList(0x004AF700);
 		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
 		break;
@@ -3068,21 +3067,21 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asTrapDoor, 0x2000, 0);
 		break;
 	case 0x4826:
-		if (sender == _ssTape && !_flag1) {
+		if (sender == _ssTape && !_isRopingDown) {
 			sendEntityMessage(_klayman, 0x1014, _ssTape);
 			setMessageList(0x004AF658);
-		} else if (sender == _asKey && !_flag1) {
+		} else if (sender == _asKey && !_isRopingDown) {
 			sendEntityMessage(_klayman, 0x1014, _asKey);
 			setMessageList(0x004AF668);
 		}
 		break;
 	case 0x482A:
-		setPalStatus1(0);
+		setPaletteArea1(false);
 		_sprite1->setVisible(true);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2());
 		break;
 	case 0x482B:
-		setPalStatus0(false);
+		setPaletteArea0(false);
 		_sprite1->setVisible(false);
 		_klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2());
 		break;
@@ -3090,39 +3089,35 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-void Scene2812::setPalStatus0(int fadeTime) {
-	if (_palStatus != 0) {
-		_palStatus = 0;
-		setPalStatus(fadeTime);
+void Scene2812::setPaletteArea0(bool instantly) {
+	if (_paletteArea != 0) {
+		_paletteArea = 0;
+		updatePaletteArea(instantly);
 	}
 }
 
-void Scene2812::setPalStatus1(int fadeTime) {
-	if (_palStatus != 1) {
-		_palStatus = 1;
-		setPalStatus(fadeTime);
+void Scene2812::setPaletteArea1(bool instantly) {
+	if (_paletteArea != 1) {
+		_paletteArea = 1;
+		updatePaletteArea(instantly);
 	}
 }
 
-void Scene2812::setPalStatus2(int fadeTime) {
-	if (_palStatus != 2) {
-		_palStatus = 2;
-		setPalStatus(fadeTime);
+void Scene2812::setPaletteArea2(bool instantly) {
+	if (_paletteArea != 2) {
+		_paletteArea = 2;
+		updatePaletteArea(instantly);
 	}
 }
 
-void Scene2812::setPalStatus(int fadeTime) {
-	if (_palStatus == 0)
+void Scene2812::updatePaletteArea(bool instantly) {
+	if (_paletteArea == 0)
 		_palette->addBasePalette(0x05D30F11, 0, 64, 0);
-	else if (_palStatus == 1)
+	else if (_paletteArea == 1)
 		_palette->addBasePalette(0x92CA2C9B, 0, 64, 0);
-	else if (_palStatus == 2)
+	else if (_paletteArea == 2)
 		_palette->addBasePalette(0x381F92C5, 0, 64, 0);
-	if (fadeTime > 0) {
-		_palette->startFadeToPalette(0);
-	} else {
-		_palette->startFadeToPalette(12);
-	}
+	_palette->startFadeToPalette(instantly ? 0 : 12);
 }
 
 Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 6317783..f0403f4 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -57,15 +57,15 @@ protected:
 class AsScene2803LightCord : public AnimatedSprite {
 public:
 	AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y);
-	void sub434380();
-	void sub4343C0();
+	void stPulled();
+	void stIdle();
 	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
 protected:
 	Scene *_parentScene;
 	uint32 _fileHash1, _fileHash2;
-	bool _flag1, _flag2;	
+	bool _isPulled, _isBusy;	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage434340(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmPulled(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene2803TestTubeOne : public AnimatedSprite {
@@ -82,8 +82,8 @@ public:
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage4769E0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub476A70();
+	uint32 hmReleased(int messageNum, const MessageParam &param, Entity *sender);
+	void stReleased();
 	void stHide();
 };
 
@@ -104,25 +104,25 @@ protected:
 	StaticSprite *_sprite8;
 	StaticSprite *_sprite9;
 	Sprite *_sprite10;
-	NRect _clipRects1[2];
-	NRect _clipRects2[3];
-	bool _field134;
+	NRect _clipRectsFloor[2];
+	NRect _clipRectsStairs[3];
+	int _paletteArea;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void update475E40();
-	void sub475FF0();
-	void sub476090();
-	void sub476130();
-	void sub476180();
-	void sub4765D0();
-	void sub4765F0();
-	void sub476610();
+	void upKlaymanStairs();
+	void klaymanStairs();
+	void klaymanFloor();
+	void toggleBackground();
+	void changeBackground();
+	void setPaletteArea0();
+	void setPaletteArea1();
+	void updatePaletteArea();
 };
 
-class Scene2803b : public Scene {
+class Scene2803Small : public Scene {
 public:
-	Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	int _palStatus;
+	int _paletteArea;
 	Sprite *_sprite1;
 	Sprite *_sprite2;
 	Sprite *_sprite3;
@@ -131,15 +131,15 @@ protected:
 	Sprite *_sprite6;
 	Sprite *_sprite7;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void update45FCB0();
-	void update45FD50();
-	void sub460090();
-	void sub460110();
-	void sub460170();
-	void sub460190();
-	void sub4601B0();
-	void sub4601D0();
-	void sub4601F0(bool flag);
+	void upKlaymanSlope();
+	void upKlaymanFloor();
+	void klaymanSlope();
+	void klaymanFloor();
+	void setPaletteArea0();
+	void setPaletteArea1();
+	void setPaletteArea2();
+	void setPaletteArea3();
+	void updatePaletteArea(bool instantly);
 };
 
 class Scene2804;
@@ -420,10 +420,10 @@ protected:
 	Sprite *_asTape;
 	Sprite *_sprite5;
 	Sprite *_sprite6;
-	bool _flag1;
+	bool _isRopingDown;
 	NRect _clipRects[2];
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub406650();
+	void insertKlaymanLadder();
 };
 
 class AsScene2812Winch : public AnimatedSprite {
@@ -440,8 +440,8 @@ public:
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage413DC0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub413E00();
+	uint32 hmRopingDown(int messageNum, const MessageParam &param, Entity *sender);
+	void stRopingDown();
 };
 
 class AsScene2812TrapDoor : public AnimatedSprite {
@@ -464,14 +464,14 @@ protected:
 	Sprite *_ssTape;
 	Sprite *_asKey;
 	Sprite *_sprite1;
-	bool _flag1;
-	int _palStatus;
+	bool _isRopingDown;
+	int _paletteArea;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void setPalStatus0(int fadeTime);
-	void setPalStatus1(int fadeTime);
-	void setPalStatus2(int fadeTime);
-	void setPalStatus(int fadeTime);
+	void setPaletteArea0(bool instantly);
+	void setPaletteArea1(bool instantly);
+	void setPaletteArea2(bool instantly);
+	void updatePaletteArea(bool instantly);
 };
 
 class Scene2822 : public Scene {


Commit: 016638bd9ef38e1d46ae855ee1944ff149c11310
    https://github.com/scummvm/scummvm/commit/016638bd9ef38e1d46ae855ee1944ff149c11310
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Rename stuff in Module2700

- Also fix the clipRect in Scene2701

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 5bcd29a..807d6e1 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -310,8 +310,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 11;
-	createModule(2800, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(2700, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 73ea264..983e265 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -591,7 +591,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
 	Sprite *tempSprite;
-
+	
 	NRect clipRect;
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240);
 	setGlobalVar(0x21E60190, 1);
@@ -608,7 +608,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	tempSprite = insertStaticSprite(0x1E086325, 1200);
 	
-	clipRect.set(0, 0, 640, tempSprite->getDrawRect().x2());
+	clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2());
 
 	if (sceneInfo->class437Filename) {
 
@@ -625,7 +625,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-	
+
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
 
@@ -649,15 +649,15 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asCarConnector->setClipRect(clipRect);
 
 	if (which == 1) {
-		SetMessageHandler(&Scene2701::handleMessage42F500);
+		SetMessageHandler(&Scene2701::hmRidingCar);
 	} else {
 		sendMessage(_asCar, 0x2009, 0);
-		SetMessageHandler(&Scene2701::handleMessage42F600);
+		SetMessageHandler(&Scene2701::hmCarAtHome);
 	}
 
 }
 
-uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene2701::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
@@ -665,7 +665,7 @@ uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam &param,
 		break;
 	case 0x2005:
 		if (_which1 >= 0)
-			SetMessageHandler(&Scene2701::handleMessage42F600);
+			SetMessageHandler(&Scene2701::hmCarAtHome);
 		break;
 	case 0x2006:
 		if (_which2 >= 0)
@@ -678,7 +678,7 @@ uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam &param,
 	return 0;
 }
 
-uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
@@ -686,7 +686,7 @@ uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam &param,
 			leaveScene(0);
 		} else {
 			sendPointMessage(_asCar, 0x2004, param.asPoint());
-			SetMessageHandler(&Scene2701::handleMessage42F500);
+			SetMessageHandler(&Scene2701::hmRidingCar);
 		}
 		break;
 	case 0x200D:
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index 4274bcc..d11586e 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -94,8 +94,8 @@ protected:
 	Sprite *_asCarConnector;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
-	uint32 handleMessage42F500(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage42F600(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmRidingCar(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class Scene2702 : public Scene {


Commit: 59901c5d13f59c64e4ed3174544f39b7b507b0ca
    https://github.com/scummvm/scummvm/commit/59901c5d13f59c64e4ed3174544f39b7b507b0ca
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Rename stuff in Module3000

- Also change Scene1609::testVars
- Update globalvars.txt

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 807d6e1..8c5e369 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -310,8 +310,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 0;
-	createModule(2700, -1);
+	_vm->gameState().sceneNum = 8;
+	createModule(3000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 9d96510..114bc3e 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1465,29 +1465,19 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 bool Scene1609::testVars() {
-	int index1 = 0;
+	int cmpSymbolIndex = 0;
 
 	// Find the position of the first symbol
-	do {
-		int cmpIndex = _asSymbols[0]->getIndex();
-		if (!_asSymbols[0]->getFlag1())
-			cmpIndex -= 12;
-		if ((int)getSubVar(0x04909A50, index1) == cmpIndex)
-			break;
-		index1++;
-	} while(1);
+	while ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex())
+		cmpSymbolIndex++;
 
 	// Check if the entered symbols match
-	for (int index2 = 0; index2 < 12; index2++) {
-		int cmpIndex = _asSymbols[index2]->getIndex();
-		if (!_asSymbols[index2]->getFlag1())
-			cmpIndex -= 12;
-		if ((int)getSubVar(0x04909A50, index1) != cmpIndex)
+	for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) {
+		if ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex())
 			return false;
-		index1++;
-		if (index1 >= 12)
-			index1 = 0;
-		index2++;
+		cmpSymbolIndex++;
+		if (cmpSymbolIndex >= 12)
+			cmpSymbolIndex = 0;
 	}
 
 	return true;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 55ad05b..f4dd674 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -359,7 +359,26 @@ void Module3000::updateScene() {
 
 // Scene3009
 
-static const uint32 kScene3009SmackerFileHashes[] = {
+enum {
+	kCTSNull				= 0,
+	kCTSBreakWall			= 1,
+	kCTSWall				= 2,
+	kCTSEmptyness			= 3,
+	kCTSFireRobotNoTarget	= 4,
+	kCTSFireRobotIsTarget	= 5,
+	kCTSFireNoRobot			= 6,
+	kCTSRaiseCannon			= 7,
+	kCTSRightRobotNoTarget	= 8,
+	kCTSRightRobotIsTarget	= 9,
+	kCTSRightNoRobot		= 10,
+	kCTSLeftRobotNoTarget	= 11,
+	kCTSLeftRobotIsTarget	= 12,
+	kCTSLeftNoRobot			= 13,
+	kCTSLowerCannon			= 14,
+	kCTSCount				= 14
+};
+
+static const uint32 kScene3009CannonScopeVideos[] = {
 	0x1010000D,
 	0x340A0049,
 	0x340A0049,
@@ -377,22 +396,22 @@ static const uint32 kScene3009SmackerFileHashes[] = {
 	0x340A0049
 };
 
-static const uint32 kScene3009CannonLocationFileHashes[] = {
+static const uint32 kScene3009CannonActionVideos[] = {
 	0x00000000,
-	0x8004001B,
-	0x0004001A,
-	0x1048404B,
-	0x50200109,
-	0x12032109,
-	0x10201109,
-	0x000A2030,
-	0x000A0028,
-	0x000A0028,
-	0x000A0028,
-	0x040A1069,
-	0x040A1069,
-	0x040A1069,
-	0x240A1101
+	0x8004001B,	// 1 Fire cannon at wall, it breaks (lowered)
+	0x0004001A,	// 2 Fire cannon at wall, nothing happens (lowered)
+	0x1048404B,	// 3 Fire cannon at emptyness (raised)
+	0x50200109,	// 4 Fire cannon, robot missed (raised)
+	0x12032109,	// 5 Fire cannon, robot hit (raised)
+	0x10201109,	// 6 Fire cannon, no robot (raised)
+	0x000A2030,	// 7 Raise the cannon
+	0x000A0028,	// 8
+	0x000A0028,	// 9
+	0x000A0028,	// 10
+	0x040A1069,	// 11
+	0x040A1069,	// 12
+	0x040A1069,	// 13
+	0x240A1101	// 14 Lower the cannon
 };
 
 static const uint32 kSsScene3009SymbolEdgesFileHashes[] = {
@@ -450,7 +469,7 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = {
 };
 
 SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene)
-	: StaticSprite(vm, 1400), _parentScene(parentScene), _flag1(false) {
+	: StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) {
 	
 	_spriteResource.load2(0x120B24B0);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -474,7 +493,7 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc
 
 void SsScene3009FireCannonButton::update() {
 	StaticSprite::update();
-	if (_flag1 && !isSoundPlaying(0)) {
+	if (_isClicked && !isSoundPlaying(0)) {
 		sendMessage(_parentScene, 0x2000, 0);
 		setVisible(false);
 	}
@@ -484,8 +503,8 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (!_flag1 && !_parentScene->sub462E90()) {
-			_flag1 = true;
+		if (!_isClicked && !_parentScene->isTurning()) {
+			_isClicked = true;
 			setVisible(true);
 			playSound(0);
 		}
@@ -659,7 +678,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message
 	return messageResult;
 }
 
-AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue)
+AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus)
 	: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
 	
 	_x = getGlobalVar(0x9040018A) ? 533 : 92;
@@ -670,7 +689,7 @@ AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *
 	setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage);
-	if (varValue == 8 || varValue == 9 || varValue == 10) {
+	if (cannonTargetStatus == kCTSRightRobotNoTarget || cannonTargetStatus == kCTSRightRobotIsTarget || cannonTargetStatus == kCTSRightNoRobot) {
 		SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight);
 		_x = 280;
 	}
@@ -722,23 +741,23 @@ void AsScene3009HorizontalIndicator::stMoveRight() {
 	SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight);
 }
 
-AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) {
+AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _symbolPosition(symbolPosition) {
 
-	_symbolIndex = getSubVar(0x00000914, _index);
+	_symbolIndex = getSubVar(0x00000914, _symbolPosition);
 	
-	_x = kAsScene3009SymbolPoints[_index].x;
-	_y = kAsScene3009SymbolPoints[_index].y;
-	createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200);
-	startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+	_x = kAsScene3009SymbolPoints[_symbolPosition].x;
+	_y = kAsScene3009SymbolPoints[_symbolPosition].y;
+	createSurface1(kAsScene3009SymbolFileHashes[_symbolPosition / 3], 1200);
+	startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1);
 	_newStickFrameIndex = _symbolIndex;
 	_needRefresh = true;
 	updatePosition();
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009Symbol::handleMessage);
-	_ssArrowPrev = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _index * 2 + 0);
+	_ssArrowPrev = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _symbolPosition * 2 + 0);
 	_vm->_collisionMan->addSprite(_ssArrowPrev);
-	_ssArrowNext = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _index * 2 + 1);
+	_ssArrowNext = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _symbolPosition * 2 + 1);
 	_vm->_collisionMan->addSprite(_ssArrowNext);
 }
 
@@ -757,10 +776,10 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &para
 			else
 				_symbolIndex--;
 		}
-		startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1);
+		startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1);
 		_newStickFrameIndex = _symbolIndex;
-		setSubVar(0x00000914, _index, _symbolIndex);
-		if (_index / 3 == 0) {
+		setSubVar(0x00000914, _symbolPosition, _symbolIndex);
+		if (_symbolPosition / 3 == 0) {
 			sendMessage(_parentScene, 0x2001, 0);
 		} else {
 			sendMessage(_parentScene, 0x2003, 0);
@@ -777,11 +796,11 @@ void AsScene3009Symbol::hide() {
 }
 
 Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _keepVideo(false), _flag2(false), 
-	/*_flag3(false), */_flag4(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
+	: Scene(vm, parentModule, true), _keepVideo(false), _moveCannonLeftFirst(false), 
+	_isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
 
-	_cannonLocation = getGlobalVar(0x20580A86);
-	debug("_cannonLocation = %d", _cannonLocation);
+	_cannonTargetStatus = getGlobalVar(0x20580A86);
+	debug("_cannonTargetStatus = %d", _cannonTargetStatus);
 	
 	_vm->gameModule()->initScene3009Vars();
 	
@@ -797,23 +816,23 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssFireCannonButton = insertSprite<SsScene3009FireCannonButton>(this);
 	_vm->_collisionMan->addSprite(_ssFireCannonButton);
 
-	_asVerticalIndicator = insertSprite<AsScene3009VerticalIndicator>(this, _cannonLocation);
+	_asVerticalIndicator = insertSprite<AsScene3009VerticalIndicator>(this, _cannonTargetStatus);
 	_vm->_collisionMan->addSprite(_asVerticalIndicator);
 
-	_asHorizontalIndicator = insertSprite<AsScene3009HorizontalIndicator>(this, _cannonLocation);
+	_asHorizontalIndicator = insertSprite<AsScene3009HorizontalIndicator>(this, _cannonTargetStatus);
 	_vm->_collisionMan->addSprite(_asHorizontalIndicator);
 
-	if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) {
+	if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) {
 		_keepVideo = true;
 	} else {
 		_keepVideo = false;
-		if (_cannonLocation != 0) {
+		if (_cannonTargetStatus != kCTSNull) {
 			_asHorizontalIndicator->stMoveRight();
-			_flag4 = true;
+			_isTurning = true;
 		}
 	}
 
-	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo));
+	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009CannonScopeVideos[_cannonTargetStatus], false, _keepVideo));
 	_smackerPlayer->setDrawPos(89, 37);
 	_palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage
 
@@ -824,12 +843,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 		_ssTargetLines[i] = insertSprite<SsScene3009TargetLine>(i);
 	}
 
-	for (int i = 0; i < 6; i++) {
-		_asSymbols[i] = insertSprite<AsScene3009Symbol>(this, i);
-		if (i < 3)
-			_correctSymbols[i] = getSubVar(0x00504B86, i);
+	for (int symbolPosition = 0; symbolPosition < 6; symbolPosition++) {
+		_asSymbols[symbolPosition] = insertSprite<AsScene3009Symbol>(this, symbolPosition);
+		if (symbolPosition < 3)
+			_correctSymbols[symbolPosition] = getSubVar(0x00504B86, symbolPosition);
 		else
-			_correctSymbols[i] = getSubVar(0x0A4C0A9A, i - 3);
+			_correctSymbols[symbolPosition] = getSubVar(0x0A4C0A9A, symbolPosition - 3);
 	}
 
 	SetMessageHandler(&Scene3009::handleMessage);
@@ -846,47 +865,47 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene3009::update() {
 	Scene::update();
 	
-	if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonLocation <= 14) {
-		switch (_cannonLocation) {
-		case 0:
-		case 14:
+	if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonTargetStatus <= kCTSCount) {
+		switch (_cannonTargetStatus) {
+		case kCTSNull:
+		case kCTSLowerCannon:
 			_smackerPlayer->open(0x340A0049, true);
 			_palette->usePalette();
 			_keepVideo = true;
 			break;
-		case 8:
+		case kCTSRightRobotNoTarget:
 			_smackerPlayer->open(0x0082080D, true);
 			_palette->usePalette();
 			_keepVideo = true;
-			_flag4 = false;
+			_isTurning = false;
 			break;
-		case 9:
+		case kCTSRightRobotIsTarget:
 			_smackerPlayer->open(0x0282080D, true);
 			_palette->usePalette();
 			_keepVideo = true;
-			_flag4 = false;
+			_isTurning = false;
 			break;
-		case 10:
+		case kCTSRightNoRobot:
 			_smackerPlayer->open(0x0882080D, true);
 			_palette->usePalette();
 			_keepVideo = true;
-			_flag4 = false;
+			_isTurning = false;
 			break;
-		case 11:
-		case 12:
-		case 13:
-			if (_flag2) {
-				if (_cannonLocation == 11)
+		case kCTSLeftRobotNoTarget:
+		case kCTSLeftRobotIsTarget:
+		case kCTSLeftNoRobot:
+			if (_moveCannonLeftFirst) {
+				if (_cannonTargetStatus == kCTSLeftRobotNoTarget)
 					_smackerPlayer->open(0x110A000F, false);
-				else if (_cannonLocation == 12)				
+				else if (_cannonTargetStatus == kCTSLeftRobotIsTarget)				
 					_smackerPlayer->open(0x500B004F, false);
-				else if (_cannonLocation == 13)				
+				else if (_cannonTargetStatus == kCTSLeftNoRobot)				
 					_smackerPlayer->open(0x100B010E, false);
 				_palette->usePalette();
-				_flag2 = false;
+				_moveCannonLeftFirst = false;
 				_asHorizontalIndicator->stMoveLeft();
 			} else {
-				playExtVideo();
+				playActionVideo();
 			}
 			break;
 		}
@@ -930,68 +949,72 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		if (!getGlobalVar(0x000809C2)) {
 			if (!getGlobalVar(0x10938830)) {
-				_cannonLocation = 1;
+				_cannonTargetStatus = kCTSBreakWall;
 				setGlobalVar(0x10938830, 1);
 			} else {
-				_cannonLocation = 2;
+				_cannonTargetStatus = kCTSWall;
 			}
 		} else if (!getGlobalVar(0x9040018A)) {
-			_cannonLocation = 3;
+			_cannonTargetStatus = kCTSEmptyness;
 		} else if (!getGlobalVar(0x610210B7)) {
-			_cannonLocation = 4;
+			_cannonTargetStatus = kCTSFireRobotNoTarget;
 		} else if (!getGlobalVar(0x0C0288F4)) {
 			setGlobalVar(0x0C0288F4, 1);
-			_cannonLocation = 5;
+			_cannonTargetStatus = kCTSFireRobotIsTarget;
 		} else {
-			_cannonLocation = 6;
+			_cannonTargetStatus = kCTSFireNoRobot;
 		}
-		playExtVideo();
+		playActionVideo();
 		break;
 	case 0x2001:
 		_lockSymbolsPart1Countdown = 24;
 		break;
 	case 0x2002:
-		if (!getGlobalVar(0x9040018A) && !_flag4) {
+		// Raise/lower the cannon
+		if (!getGlobalVar(0x9040018A) && !_isTurning) {
 			if (getGlobalVar(0x000809C2)) {
-				_cannonLocation = 14;
+				_cannonTargetStatus = kCTSLowerCannon;
 				setGlobalVar(0x000809C2, 0);
 			} else {
-				_cannonLocation = 7;
+				_cannonTargetStatus = kCTSRaiseCannon;
 				setGlobalVar(0x000809C2, 1);
 			}
-			playExtVideo();
+			playActionVideo();
 		}
 		break;
 	case 0x2003:
 		_lockSymbolsPart2Countdown = 24;
 		break;
 	case 0x2004:
+		// Turn the cannon if it's raised
 		if (getGlobalVar(0x000809C2)) {
 			if (!getGlobalVar(0x9040018A)) {
+				// Cannon is at the left position
 				if (!getGlobalVar(0x610210B7)) {
-					_cannonLocation = 8;
+					_cannonTargetStatus = kCTSRightRobotNoTarget;
 				} else if (!getGlobalVar(0x0C0288F4)) {
-					_cannonLocation = 9;
+					_cannonTargetStatus = kCTSRightRobotIsTarget;
 				} else {
-					_cannonLocation = 10;
+					_cannonTargetStatus = kCTSRightNoRobot;
 				}
 				setGlobalVar(0x9040018A, 1);
-				_flag4 = true;
-				playExtVideo();
+				_isTurning = true;
+				playActionVideo();
 			} else {
+				// Cannon is at the right position
 				if (!getGlobalVar(0x610210B7)) {
-					_cannonLocation = 11;
+					_cannonTargetStatus = kCTSLeftRobotNoTarget;
 					_smackerPlayer->open(0x108A000F, false);
 				} else if (!getGlobalVar(0x0C0288F4)) {
-					_cannonLocation = 12;
+					_cannonTargetStatus = kCTSLeftRobotIsTarget;
 					_smackerPlayer->open(0x500B002F, false);
 				} else {
-					_cannonLocation = 13;
+					_cannonTargetStatus = kCTSLeftNoRobot;
 					_smackerPlayer->open(0x100B008E, false);
 				}
 				_palette->usePalette();
-				_flag2 = true;
-				_flag4 = true;
+				_moveCannonLeftFirst = true;
+				_isTurning = true;
 				_keepVideo = false;
 				setGlobalVar(0x9040018A, 0);
 			}
@@ -1001,9 +1024,9 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-void Scene3009::playExtVideo() {
-	setGlobalVar(0x20580A86, _cannonLocation);
-	setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]);
+void Scene3009::playActionVideo() {
+	setGlobalVar(0x20580A86, _cannonTargetStatus);
+	setGlobalVar(0xF0402B0A, kScene3009CannonActionVideos[_cannonTargetStatus]);
 	leaveScene(1);
 }
 
@@ -1021,8 +1044,8 @@ bool Scene3009::isSymbolsPart2Solved() {
 	return true;
 }
 
-bool Scene3009::sub462E90() {
-	return _flag4;
+bool Scene3009::isTurning() {
+	return _isTurning;
 }
 
 // Scene3010
@@ -1454,18 +1477,18 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
-	: AnimatedSprite(vm, 1000), _index(index), _flag1(flag), _flag2(false) {
+AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol)
+	: AnimatedSprite(vm, 1000), _symbolIndex(symbolIndex), _largeSymbol(largeSymbol), _isNoisy(false) {
 
-	if (flag) {
+	if (_largeSymbol) {
 		_x = 310;
 		_y = 200;
-		createSurface1(kAsScene3011SymbolFileHashes[_index], 1200);
+		createSurface1(kAsScene3011SymbolFileHashes[_symbolIndex], 1200);
 		loadSound(0, 0x6052C60F);
 		loadSound(1, 0x6890433B);
 	} else {
-		_index = 12;
-		_x = index * 39 + 96;
+		_symbolIndex = 12;
+		_x = symbolIndex * 39 + 96;
 		_y = 225;
 		createSurface(1200, 41, 48);
 		loadSound(0, 0x64428609);
@@ -1476,11 +1499,11 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag)
 	SetUpdateHandler(&AnimatedSprite::update);
 }
 
-void AsScene3011Symbol::show(bool flag) {
-	_flag2 = flag;
-	startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1);
+void AsScene3011Symbol::show(bool isNoisy) {
+	_isNoisy = isNoisy;
+	startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1);
 	setVisible(true);
-	if (flag) {
+	if (_isNoisy) {
 		playSound(1);
 	} else {
 		playSound(0);
@@ -1493,19 +1516,19 @@ void AsScene3011Symbol::hide() {
 }
 
 void AsScene3011Symbol::stopSymbolSound() {
-	if (_flag2) {
+	if (_isNoisy) {
 		stopSound(1);
 	} else {
 		stopSound(0);
 	}
 }
 
-void AsScene3011Symbol::change(int index, bool flag) {
-	_index = index;
-	_flag2 = flag;
-	startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1);
+void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) {
+	_symbolIndex = symbolIndex;
+	_isNoisy = isNoisy;
+	startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1);
 	setVisible(true);
-	if (flag) {
+	if (_isNoisy) {
 		playSound(1);
 	} else {
 		playSound(0);
@@ -1513,10 +1536,10 @@ void AsScene3011Symbol::change(int index, bool flag) {
 }
 
 Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) {
+	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) {
 
 	// TODO _vm->gameModule()->initScene3011Vars();
-	_index1 = getGlobalVar(0x2414C2F2);
+	_noisySymbolIndex = getGlobalVar(0x2414C2F2);
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene3011::handleMessage);
@@ -1528,8 +1551,8 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse435(0x24A00929, 20, 620);
 
-	for (int i = 0; i < 12; i++)
-		_asSymbols[i] = insertSprite<AsScene3011Symbol>(i, true);
+	for (int symbolIndex = 0; symbolIndex < 12; symbolIndex++)
+		_asSymbols[symbolIndex] = insertSprite<AsScene3011Symbol>(symbolIndex, true);
 
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
 	_vm->_collisionMan->addSprite(_ssButton);
@@ -1543,13 +1566,13 @@ void Scene3011::update() {
 		switch (_updateStatus) {
 		case 0:
 			if (_buttonClicked) {
-				if (_index1 == _index2) {
+				if (_noisySymbolIndex == _currentSymbolIndex) {
 					do {
-						_index3 = _vm->_rnd->getRandomNumber(12 - 1);
-					} while (_index1 == _index3);
-					_asSymbols[getSubVar(0x04909A50, _index3)]->show(true);
+						_noisyRandomSymbolIndex = _vm->_rnd->getRandomNumber(12 - 1);
+					} while (_noisySymbolIndex == _noisyRandomSymbolIndex);
+					_asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->show(true);
 				} else {
-					_asSymbols[getSubVar(0x04909A50, _index2)]->show(false);
+					_asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->show(false);
 				}
 				_updateStatus = 1;
 				_countdown = 24;
@@ -1569,14 +1592,14 @@ void Scene3011::update() {
 		case 3:
 			_updateStatus = 0;
 			_countdown = 1;
-			if (_index1 == _index2) {
-				_asSymbols[getSubVar(0x04909A50, _index3)]->hide();
+			if (_noisySymbolIndex == _currentSymbolIndex) {
+				_asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->hide();
 			} else {
-				_asSymbols[getSubVar(0x04909A50, _index2)]->hide();
+				_asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->hide();
 			}
-			_index2++;
-			if (_index2 >= 12)
-				_index2 = 0;
+			_currentSymbolIndex++;
+			if (_currentSymbolIndex >= 12)
+				_currentSymbolIndex = 0;
 			break;
 		}
 	}
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 2f7c21f..945ca7e 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -50,7 +50,7 @@ public:
 	SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene);
 protected:
 	Scene3009 *_parentScene;
-	bool _flag1;
+	bool _isClicked;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -100,7 +100,7 @@ protected:
 
 class AsScene3009HorizontalIndicator : public AnimatedSprite {
 public:
-	AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue);
+	AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus);
 	void show();
 	void stMoveLeft();
 	void stMoveRight();
@@ -114,11 +114,11 @@ protected:
 
 class AsScene3009Symbol : public AnimatedSprite {
 public:
-	AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index);
+	AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition);
 	void hide();
 protected:
 	Scene3009 *_parentScene;
-	int _index;
+	int _symbolPosition;
 	uint32 _symbolIndex;
 	SsScene3009SymbolArrow *_ssArrowPrev;
 	SsScene3009SymbolArrow *_ssArrowNext;
@@ -128,7 +128,7 @@ protected:
 class Scene3009 : public Scene {
 public:
 	Scene3009(NeverhoodEngine *vm, Module *parentModule, int which);
-	bool sub462E90();
+	bool isTurning();
 protected:
 	int _lockSymbolsPart1Countdown;
 	int _lockSymbolsPart2Countdown;
@@ -139,15 +139,14 @@ protected:
 	AsScene3009VerticalIndicator *_asVerticalIndicator;
 	AsScene3009HorizontalIndicator *_asHorizontalIndicator;
 	AsScene3009Symbol *_asSymbols[6];
-	uint32 _cannonLocation;
+	uint32 _cannonTargetStatus;
 	uint32 _correctSymbols[6];
 	bool _keepVideo;
-	bool _flag2;
-	// UNUSED? bool _flag3;
-	bool _flag4;
+	bool _moveCannonLeftFirst;
+	bool _isTurning;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void playExtVideo();
+	void playActionVideo();
 	bool isSymbolsPart1Solved();
 	bool isSymbolsPart2Solved();
 };
@@ -221,17 +220,16 @@ protected:
 
 class AsScene3011Symbol : public AnimatedSprite {
 public:
-	AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag);
-	void show(bool flag);
+	AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol);
+	void show(bool isNoisy);
 	void hide();
 	void stopSymbolSound();
-	void change(int index, bool flag);
-	bool getFlag1() { return _flag1; }
-	int getIndex() { return _index; }
+	void change(int symbolIndex, bool isNoisy);
+	int getSymbolIndex() { return _largeSymbol ? _symbolIndex : _symbolIndex - 12; }
 protected:
-	bool _flag1;
-	bool _flag2;
-	int _index;
+	bool _largeSymbol;
+	bool _isNoisy;
+	int _symbolIndex;
 };
 
 class Scene3011 : public Scene {
@@ -243,9 +241,9 @@ protected:
 	int _updateStatus;
 	bool _buttonClicked;
 	int _countdown;
-	int _index1;
-	int _index2;   
-	int _index3;
+	int _noisySymbolIndex;
+	int _currentSymbolIndex;   
+	int _noisyRandomSymbolIndex;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void fadeIn();


Commit: fd13b546a7d2a2f63cca8ace7aa900a590f665bb
    https://github.com/scummvm/scummvm/commit/fd13b546a7d2a2f63cca8ace7aa900a590f665bb
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Rename stuff in the Scene class and clean up a little

- Try to stay close to the actual frame rate
- Also use the Smacker frame rate when a video is playing to
  keep videos in sync with the audio

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h
    engines/neverhood/smackerplayer.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index cb37a24..8788dcf 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -347,10 +347,11 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	_class494 = new Class494(_vm);
 	addSprite(_class494);
 
-	// DEBUG: Give all disks
+	// DEBUG>>>: Give all disks
 	for (int i = 0; i < 19; i++) {
 		setSubVar(0x02720344, i, 1);
 	}
+	// DEBUG<<<
 
 	for (int i = 0; i < 20; i++) {
 		_diskAvailable[i] = 0;
@@ -385,6 +386,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	addSurface(_smackerPlayer->getSurface());
 	_smackerPlayer->setDrawPos(154, 86);
 	// TODO _smackerPlayer->gotoFrame(0);
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 
 	_palette->usePalette();
 
@@ -517,6 +519,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 
 void DiskplayerScene::stop() {
 	_smackerPlayer->open(0x08288103, true);
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
 	_playButton->release();
 	_updateStatus = 0;
@@ -525,6 +528,7 @@ void DiskplayerScene::stop() {
 
 void DiskplayerScene::tuneIn() {
 	_smackerPlayer->open(0x900001C1, false);
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
 	_playButton->release();
 	_updateStatus = 1;
@@ -533,6 +537,7 @@ void DiskplayerScene::tuneIn() {
 
 void DiskplayerScene::playDisk() {
 	_smackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false);
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
 	_updateStatus = 2;
 	_diskSlots[_diskIndex]->play();
@@ -540,6 +545,7 @@ void DiskplayerScene::playDisk() {
 
 void DiskplayerScene::playStatic() {
 	_smackerPlayer->open(0x90000101, false);
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
 	_playButton->release();
 	_updateStatus = 2;
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 8c5e369..e35e16e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -300,18 +300,20 @@ void GameModule::startup() {
 //	createModule(1500, 0); // Logos and intro video //Real
 
 	// DEBUG>>>
+	/*
 	setGlobalVar(0x0A310817, 1);
 	setGlobalVar(0x0A18CA33, 0);
 	setGlobalVar(0x0112090A, 0);
 	//setGlobalVar(0x000CF819, 1);
 	setGlobalVar(0x04A105B3, 2);
+	*/
 	// <<<DEBUG
 
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 8;
-	createModule(3000, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(1200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index ee4bfe1..7343b0a 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -480,6 +480,7 @@ void Klayman::gotoNextStateExt() {
 		removeCallbackList();
 #endif		
 	} else {
+		// Inform the scene that the current Klayman animation sequence has finished
 		sendMessage(_parentScene, 0x1006, 0);
 	}
 }
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 191789d..a20ed94 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -916,7 +916,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x140E5744) {
 			sendMessage(_asCreature, 0x2005, 0);
 		} else if (param.asInteger() == 0x40253C40) {
-			_messageListFlag = false;
+			_canAcceptInput = false;
 			sendMessage(_asCreature, 0x2006, 0);
 		} else if (param.asInteger() == 0x090EB048) {
 			if (_klayman->getX() < 572) {
@@ -950,7 +950,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x4814:
-		messageList402220();
+		cancelMessageList();
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 80a210b..f385835 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -487,13 +487,13 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (getGlobalVar(0x13206309)) {
 				setMessageList2(0x004B0910);
 			} else {
-				messageList402220();
+				cancelMessageList();
 			}
 		} else if (param.asInteger() == 0x012E2070) {
 			if (getGlobalVar(0x13206309)) {
 				setMessageList2(0x004B0968);
 			} else {
-				messageList402220();
+				cancelMessageList();
 			}
 		} else if (param.asInteger() == 0x11C40840) {
 			if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) {
@@ -740,7 +740,7 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x415634A4) {
 			if (getGlobalVar(0xAC00C0D0)) {
-				messageList402220();
+				cancelMessageList();
 			} else {
 				setMessageList(0x004B9158);
 			}
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 114bc3e..5d0207b 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1271,7 +1271,7 @@ void Scene1608::upGettingOutOfCar() {
 		_asIdleCarFull->setVisible(true);
 		_asCar->setVisible(false);
 		setMessageList(0x004B4748);
-		runMessageList();
+		processMessageList();
 		_klayman->handleUpdate();
 		_carStatus = 0;
 	}
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 06806c7..44ef868 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -274,7 +274,7 @@ void Scene2101::update() {
 			}
 		} else {
 			if (_klayman->getX() > 575)
-				_messageListFlag  = false;
+				_canAcceptInput  = false;
 			if (--_countdown1 == 0) {
 				if (_klayman->getX() < 480) {
 					sendMessage(_asDoor, 0x4809, 0);
@@ -307,7 +307,7 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
 				setMessageList(0x004B8EC8);
 			}
 		} else if (param.asInteger() == 0x41442820) {
-			messageList402220();
+			cancelMessageList();
 		}
 		break;
 	case 0x2000:
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 2220fb7..777b848 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2116,16 +2116,16 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 				sendEntityMessage(_klayman, 0x1014, _asElevator);
 				sendMessage(_klayman, 0x2001, 0);
 			} else {
-				messageList402220();
+				cancelMessageList();
 			}
 		} else if (param.asInteger() == 0x34569073) {
 			if (_klaymanAtElevator) {
-				_messageListFlag1 = true;
+				_isKlaymanBusy = true;
 				sendMessage(_asElevator, 0x2000, 0);
 				sendEntityMessage(_klayman, 0x1014, _asElevator);
 				sendMessage(_klayman, 0x2001, 0);
 			} else {
-				messageList402220();
+				cancelMessageList();
 			}
 		} else if (param.asInteger() == 0x4054C877) {
 			if (_klaymanAtElevator) {
@@ -2133,7 +2133,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 				sendEntityMessage(_klayman, 0x1014, _asElevator);
 				sendMessage(_klayman, 0x2001, 0);
 			} else {
-				messageList402220();
+				cancelMessageList();
 			}
 		} else if (param.asInteger() == 0x0CBC6211) {
 			sendEntityMessage(_klayman, 0x1014, _asElevator);
@@ -2153,7 +2153,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		_elevatorSurfacePriority = param.asInteger();
 		break;
 	case 0x2003:
-		_messageListFlag1 = false;
+		_isKlaymanBusy = false;
 		break;
 	case 0x4807:
 		sendMessage(_asWallRobotAnimation, 0x2007, 0);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 3b6c6bb..238768c 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -517,7 +517,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 			setSurfacePriority(_sprite1->getSurface(), 1100);
 		} else if (param.asInteger() == 0x80C40322) {
 			setSurfacePriority(_sprite1->getSurface(), 200);
-			messageList402220();
+			cancelMessageList();
 			_flag = true;
 		} else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) {
 			_countdown2 = 12;
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index f8053d2..b4d39d9 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -362,7 +362,7 @@ void Scene2501::upGettingOutOfCar() {
 		_asIdleCarFull->setVisible(true);
 		_asCar->setVisible(false);
 		setMessageList(0x004B2570);
-		runMessageList();
+		processMessageList();
 		_klayman->handleUpdate();
 		_carStatus = 0;
 	}
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 66b30cf..5594cce 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -51,10 +51,11 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 	_smackerPlayer = new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true);	
 	addEntity(_smackerPlayer);
 	addSurface(_smackerPlayer->getSurface());
-
+	
 	createMouseCursor();
 
 	_vm->_screen->clear();
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 
 	sendMessage(_parentModule, 0x100A, _navigationIndex);
 
@@ -77,10 +78,12 @@ void NavigationScene::update() {
 		showMouse(false);
 		_smackerPlayer->open(_smackerFileHash, false);
 		_vm->_screen->clear();
+		_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 		_smackerDone = false;
 		_smackerFileHash = 0;
 	} else if (_smackerDone) {
 		if (_leaveSceneAfter) {
+			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		} else {
 			const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex];
@@ -94,6 +97,7 @@ void NavigationScene::update() {
 			_smackerDone = false;
 			_smackerPlayer->open(navigationItem.fileHash, true);
 			_vm->_screen->clear();
+			_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 			sendMessage(_parentModule, 0x100A, _navigationIndex);
 		}
 	} 
@@ -171,6 +175,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 			} while (!(*_navigationList)[_navigationIndex].interactive);
 			setGlobalVar(0x4200189E, _navigationIndex);
 		} else {
+			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		}
 		break;
@@ -187,6 +192,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 			} while (!(*_navigationList)[_navigationIndex].interactive);
 			setGlobalVar(0x4200189E, _navigationIndex);
 		} else {
+			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		}
 		break;
@@ -194,6 +200,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 	case 3:
 	case 4:
 		if (navigationItem.middleFlag) {
+			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
 		} else if (navigationItem.middleSmackerFileHash != 0) {
 			_smackerFileHash = navigationItem.middleSmackerFileHash;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index dde437d..318a0df 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -28,7 +28,7 @@ namespace Neverhood {
 Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) {
 	
-	_messageListFlag1 = false;
+	_isKlaymanBusy = false;
 	_systemCallbackFlag = false;
 	_messageList = NULL;
 	_rectType = 0;
@@ -40,22 +40,18 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_mouseCursor = NULL;
 	_palette = NULL;
 	_background = NULL;
-	// TODO _field_8E = -1;
 	if (clearHitRects) {
 		_vm->_collisionMan->clearHitRects();
 		_vm->_collisionMan->clearSprites();
 	}
 	_vm->_screen->setFps(24);
-	// TODO g_screen->hSmack = NULL;	
-	// TODO g_screen->field_24 = 0;
-	// TODO g_screen->field_26 = 0;
+	_vm->_screen->setSmackerDecoder(NULL);
 	// TODO g_screen->resetDirtyRects();	
-	_messageListFlag = true;
+	_canAcceptInput = true;
 	_surfaceFlag = false;
 	_messageList2 = NULL;
 	_smackerPlayer = NULL;
-	_smkFileHash = 0;
-	_messageListFlag2 = false;
+	_isMessageListBusy = false;
 	_messageValue = -1;
 	
 	SetUpdateHandler(&Scene::update);
@@ -96,7 +92,6 @@ void Scene::draw() {
 		}
 #endif		
 		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
-			//debug(4, "priority = %d", (*iter)->getPriority());
 			(*iter)->draw();
 		}
 	}	
@@ -244,43 +239,29 @@ SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) {
 
 void Scene::update() {
 
-	if (_smkFileHash != 0) {
-		// TODO
-		_smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0);
-		_savedUpdateHandlerCb = _updateHandlerCb;
-		_savedMessageHandlerCb = _messageHandlerCb;
-		SetUpdateHandler(&Scene::smackerUpdate);  
-		SetMessageHandler(&Scene::smackerHandleMessage);
-		_smackerDone = false;
-		smackerUpdate();
-		// g_screen->smackerPlayer = _smackerPlayer;  
-		_smkFileHash = 0;
-	} else {
-		if (_mouseClicked) {
-			if (_klayman) {
-				// TODO: Merge later
-				if (_messageListFlag &&
-					_klayman->hasMessageHandler() && 
-					sendMessage(_klayman, 0x1008, 0) != 0 &&
-					queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
-					_mouseClicked = false;
-				} else if (_messageListFlag &&
-					_klayman->hasMessageHandler() && 
-					sendMessage(_klayman, 0x1008, 0) != 0) {
-					_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
-				}
-			} else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
+	if (_mouseClicked) {
+		if (_klayman) {
+			// TODO: Merge later
+			if (_canAcceptInput &&
+				_klayman->hasMessageHandler() && 
+				sendMessage(_klayman, 0x1008, 0) != 0 &&
+				queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
 				_mouseClicked = false;
+			} else if (_canAcceptInput &&
+				_klayman->hasMessageHandler() && 
+				sendMessage(_klayman, 0x1008, 0) != 0) {
+				_mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y);
 			}
+		} else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) {
+			_mouseClicked = false;
 		}
+	}
 
-		runMessageList();
+	processMessageList();
 
-		// Update all entities		
-		for (Common::Array<Entity*>::iterator iter = _entities.begin(); iter != _entities.end(); iter++)
-			(*iter)->handleUpdate();
-	
-	}
+	// Update all entities		
+	for (Common::Array<Entity*>::iterator iter = _entities.begin(); iter != _entities.end(); iter++)
+		(*iter)->handleUpdate();
 
 }
 
@@ -293,7 +274,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 	case 0: // mouse moved
 		if (_mouseCursor && _mouseCursor->hasMessageHandler())
 			sendMessage(_mouseCursor, 0x4002, param);
-		// TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
+		// TODO Seems unused: queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
 		break;
 	case 1: // mouse clicked
 		_mouseClicked = true;
@@ -309,44 +290,53 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		drawRectListRects();		
 		break;
 	*/		
+	/* ORIGINAL DEBUG		
 	case 5:
-#if 0	
 		broadcastObjectMessage5();		
-#endif	
 		break;
+	*/		
 	case 6:
 		sendMessage(_parentModule, 0x1009, param);		
 		break;
 	case 0x1006:
-		if (_messageListFlag1) {
-			_messageListFlag1 = false;
-			if (_messageListIndex == _messageListCount)
+		// Sent by Klayman when its animation sequence has finished
+		if (_isKlaymanBusy) {
+			_isKlaymanBusy = false;
+			if (_messageListIndex == _messageListCount) {
+				// If the current message list was processed completely,
+				// sent Klayman into the idle state.
 				sendMessage(_klayman, 0x4004, 0);
-			else {
-				runMessageList();
+			} else {
+				// Else continue with the next message in the current message list
+				processMessageList();
 			}
 		}
 		break;
 	case 0x1007:
-		if (_messageListFlag1) {
-			_messageListFlag1 = false;
+		// This isn't sent by any code, check if it's in a message list
+		// This cancels the current message list and sets Klayman into the idle state.
+		if (_isKlaymanBusy) {
+			_isKlaymanBusy = false;
 			_messageList = NULL;
 			sendMessage(_klayman, 0x4004, 0);
 		}
 		break;
 	case 0x101D:
+		// Hide the mouse cursor
 		if (_mouseCursor) {
-			_prevVisible = _mouseCursor->getSurface()->getVisible();
+			_mouseCursorWasVisible = _mouseCursor->getSurface()->getVisible();
 			_mouseCursor->getSurface()->setVisible(false);
 		}
 		break;
 	case 0x101E:
-		if (_prevVisible && _mouseCursor) {
-			_mouseCursor->getSurface()->setVisible(false);
+		// Show the mouse cursor
+		if (_mouseCursorWasVisible && _mouseCursor) {
+			_mouseCursor->getSurface()->setVisible(true);//CHECKME?!?
 			// TODO sendMessage(_mouseCursor, 0x4002, g_Screen->_mousePos);
 		}
 		break;
 	case 0x1022:
+		// Set the sender's surface priority
 		setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger());
 		break;
 	}
@@ -416,17 +406,17 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 	return true;
 }
 
-void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackFlag) {
-	setMessageList(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag);
+void Scene::setMessageList(uint32 id, bool canAcceptInput, bool systemCallbackFlag) {
+	setMessageList(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag);
 }
 
-void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
+void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) {
 	//debug("Scene::setMessageList(%p)", (void*)messageList);
 	_messageList = messageList;
 	_messageListCount = _messageList ? _messageList->size() : 0;
 	_messageListIndex = 0;
-	_messageListFlag1 = false;
-	_messageListFlag = messageListFlag;
+	_isKlaymanBusy = false;
+	_canAcceptInput = canAcceptInput;
 	_systemCallbackFlag = systemCallbackFlag;
 	_messageListStatus = 1;
 	sendMessage(_klayman, 0x101C, 0);
@@ -441,13 +431,11 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool
 	
 }
 
-bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallbackFlag) {
-	return setMessageList2(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag);
+bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool systemCallbackFlag) {
+	return setMessageList2(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag);
 }
 
-bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) {
-	bool result = false;
-	
+bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) {
 	//debug("Scene::setMessageList2(%p)", (void*)messageList);
 
 #if 0
@@ -457,46 +445,26 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool
 	}
 	debug("B: ================================================================");
 #endif
-	
-	if (_messageListStatus == 1) {
-		if (messageList != _messageList2) {
-			if (_messageValue >= 0) {
-				sendMessage(_parentModule, 0x1023, _messageValue);
-				_messageValue = -1;
-			}
-			_messageList2 = messageList;
-			setMessageList(messageList, messageListFlag, systemCallbackFlag);
-			result = true;
-		}
-	} else if (_messageListStatus == 2) {
-		if (messageList == _messageList2) {
-			if (_messageValue >= 0) {
-				sendMessage(_parentModule, 0x1023, _messageValue);
-				_messageValue = -1;
-			}
-			_messageList2 = messageList;
-			setMessageList(messageList, messageListFlag, systemCallbackFlag);
-			result = true;
-		}
-	} else {
-		if (_messageValue >= 0) {
-			sendMessage(_parentModule, 0x1023, _messageValue);
-			_messageValue = -1;
-		}
+
+	if (_messageListStatus == 0 ||
+		(_messageListStatus == 1 && messageList != _messageList2) ||
+		(_messageListStatus == 2 && messageList == _messageList2)) {
+		// NOTE Skipped unneeded resource preloading code
+		_messageValue = -1;
 		_messageList2 = messageList;
-		setMessageList(messageList, messageListFlag, systemCallbackFlag);
-		result = true;
+		setMessageList(messageList, canAcceptInput, systemCallbackFlag);
+		return true;
 	}
-	return result;
+	return false;
 }
 
-void Scene::runMessageList() {
-	debug(7, "Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1);
+void Scene::processMessageList() {
+	debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymanBusy = %d", _isMessageListBusy, _isKlaymanBusy);
 
-	if (_messageListFlag2 || _messageListFlag1)
+	if (_isMessageListBusy || _isKlaymanBusy)
 		return;
 
-	_messageListFlag2 = true;
+	_isMessageListBusy = true;
 
 	if (!_messageList) {
 		_messageList2 = NULL;
@@ -505,11 +473,11 @@ void Scene::runMessageList() {
 	
 	if (_messageList && _klayman) {
 	
-		while (_messageList && _messageListIndex < _messageListCount && !_messageListFlag1) {
+		while (_messageList && _messageListIndex < _messageListCount && !_isKlaymanBusy) {
 			uint32 messageNum = (*_messageList)[_messageListIndex].messageNum;
 			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
 			
-			//debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam);
+			//debug("Scene::processMessageList() %04X, %08X", messageNum, messageParam);
 			
 			_messageListIndex++;
 			if (_messageListIndex == _messageListCount) {
@@ -525,7 +493,7 @@ void Scene::runMessageList() {
 					_messageValue = messageParam;
 					sendMessage(_parentModule, messageNum, messageParam);
 				} else if (messageNum == 0x4001) {
-					_messageListFlag1 = true;
+					_isKlaymanBusy = true;
 					sendPointMessage(_klayman, 0x4001, _mouseClickPos);
 				} else if (messageNum == 0x100D) {
 					if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0)
@@ -535,34 +503,34 @@ void Scene::runMessageList() {
 				} else if (messageNum == 0x101B) {
 					_messageListStatus = 2;
 				} else if (messageNum == 0x1020) {
-					_messageListFlag = false;
+					_canAcceptInput = false;
 				} else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) {
 					if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) {
-						_messageListFlag2 = false;
+						_isMessageListBusy = false;
 						return;
 					}
 				} else {
-					_messageListFlag1 = true;
+					_isKlaymanBusy = true;
 					if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) {
-						_messageListFlag1 = false;
+						_isKlaymanBusy = false;
 					}
 				} 
 			}
 			if (_messageListIndex == _messageListCount) {
-				_messageListFlag = true;
+				_canAcceptInput = true;
 				_messageList = NULL;
 			}
 		}
 	}
 
-	_messageListFlag2 = false;
+	_isMessageListBusy = false;
 	
 }
 
-void Scene::messageList402220() {
-	_messageListFlag1 = false;
+void Scene::cancelMessageList() {
+	_isKlaymanBusy = false;
 	_messageList = NULL;
-	_messageListFlag = true;
+	_canAcceptInput = true;
 	sendMessage(_klayman, 0x4004, 0);
 }
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 35adb44..a0f7dafd 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -159,54 +159,55 @@ protected:
 	Module *_parentModule;
 	Common::Array<Entity*> _entities;
 	Common::Array<BaseSurface*> _surfaces;
-	bool _systemCallbackFlag;
+
+	bool _surfaceFlag;
+
+	Klayman *_klayman;
+	Background *_background;
+	Palette *_palette;
+	SmackerPlayer *_smackerPlayer;
+
 	MessageList *_messageList;
+	MessageList *_messageList2;
+	int _messageListStatus;
 	uint _messageListCount;
 	uint _messageListIndex;
-	bool _messageListFlag1;
+	bool _systemCallbackFlag;
+
+	bool _canAcceptInput;
+	bool _isKlaymanBusy;
+	bool _isMessageListBusy;
+
+	Mouse *_mouseCursor;
 	NPoint _mouseClickPos;
 	bool _mouseClicked;
-	DataResource _dataResource;
+	bool _mouseCursorWasVisible;
+
+	int _rectType;
 	RectList *_rectList;
+	DataResource _dataResource;
+
 	HitRectList _hitRectList;
-	int _rectType;
-	// TODO 0000008E field_8E		dw ?
-	Mouse *_mouseCursor;
-	Klayman *_klayman;
-	Palette *_palette;
-	Background *_background;
-	bool _surfaceFlag;
-	bool _messageListFlag;
-	MessageList *_messageList2;
-	int _messageListStatus;
-	SmackerPlayer *_smackerPlayer;
+
 	void (Entity::*_savedUpdateHandlerCb)();
 	uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
 	bool _smackerDone;
-	// TODO 000000BD field_BD		db ?
-	// TODO 000000BE field_BE		db ?
-	// TODO 000000BF field_BF		db ?
-	uint32 _smkFileHash;
-	// TODO 000000C4 hitArray		dd ?
-	bool _messageListFlag2;
-	bool _prevVisible;
 	int _messageValue;
-	// TODO 000000CF field_CF		db ?
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void smackerUpdate();
 	uint32 smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	bool queryPositionSprite(int16 mouseX, int16 mouseY);
 	bool queryPositionRectList(int16 mouseX, int16 mouseY);
-	void setMessageList(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false);
-	void setMessageList(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false);
-	bool setMessageList2(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false);
-	bool setMessageList2(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false);
-	void runMessageList();
+	void setMessageList(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false);
+	void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false);
+	bool setMessageList2(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false);
+	bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false);
+	void processMessageList();
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);
 	void clearRectList();
 	void loadHitRectList();
-	void messageList402220();
+	void cancelMessageList();
 	void loadDataResource(uint32 fileHash);
 	uint16 convertMessageNum(uint32 messageNum);
 };
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 372c705..4689d3b 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -26,7 +26,7 @@
 namespace Neverhood {
 
 Screen::Screen(NeverhoodEngine *vm)
-	: _vm(vm), _paletteData(NULL), _paletteChanged(false) {
+	: _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL) {
 	
 	_ticks = _vm->_system->getMillis();
 	
@@ -48,8 +48,13 @@ void Screen::update() {
 }
 
 void Screen::wait() {
-	// TODO
-	_vm->_system->delayMillis(40);
+	int32 frameDelay = _frameDelay;
+	if (_smackerDecoder && _smackerDecoder->isVideoLoaded() && !_smackerDecoder->endOfVideo())
+		frameDelay = _smackerDecoder->getTimeToNextFrame();
+	int32 waitTicks = frameDelay - (_vm->_system->getMillis() - _ticks);
+	if (waitTicks > 0)
+		_vm->_system->delayMillis(waitTicks);
+	_ticks = _vm->_system->getMillis();
 }
 
 void Screen::setFps(int fps) {
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index fe5a254..56a2567 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -24,6 +24,7 @@
 #define NEVERHOOD_SCREEN_H
 
 #include "graphics/surface.h"
+#include "video/smk_decoder.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/graphics.h"
 
@@ -51,11 +52,13 @@ public:
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
 	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent);
 	void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent);
+	void setSmackerDecoder(Video::SmackerDecoder *smackerDecoder) { _smackerDecoder = smackerDecoder; }
 protected:
 	NeverhoodEngine *_vm;
 	Graphics::Surface *_backScreen;
-	uint32 _ticks;
-	uint32 _frameDelay;
+	Video::SmackerDecoder *_smackerDecoder;
+	int32 _ticks;
+	int32 _frameDelay;
 	byte *_paletteData;
 	bool _paletteChanged;
 };
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 65c0c84..697893d 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -60,6 +60,7 @@ public:
 	uint getStatus();
 	void setDrawPos(int16 x, int16 y);
 	void rewind();
+	Video::SmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; }
 protected:
 	Scene *_scene;
 	Palette *_palette;
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 9982043..375f7f3 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -73,6 +73,7 @@ void SmackerScene::nextVideo() {
 		uint32 smackerFileHash = _fileHashList[_fileHashListIndex];
 		if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) {
 			// Not a Smacker file
+			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, 0);
 			return;
 		}
@@ -80,12 +81,13 @@ void SmackerScene::nextVideo() {
 		if (!_fieldDF) {
 			setSubVar(0x00800410, smackerFileHash, 1);
 		}
-		if (_fileHashListIndex == 0) {
+		if (_fileHashListIndex == 0)
 			_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false));
-		} else {
+		else
 			_smackerPlayer->open(smackerFileHash, false);
-		}
+		_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 	} else {
+		_vm->_screen->setSmackerDecoder(NULL);
 		sendMessage(_parentModule, 0x1009, 0);
 	}
 


Commit: 97ee348c2aaabcab5ebb6e7009b7cc96dbd907eb
    https://github.com/scummvm/scummvm/commit/97ee348c2aaabcab5ebb6e7009b7cc96dbd907eb
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Rename stuff in DiskplayerScene

- Add SmackerPlayer::isDone()
- Fix puzzle key variable handling
- Update globalvars.txt

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/diskplayerscene.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/smackerplayer.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 8788dcf..e20dec0 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -155,7 +155,7 @@ static const uint32 kDiskplayerSlotFileHashes4[] = {
 	0xDC802161
 };
 
-Class494::Class494(NeverhoodEngine *vm)
+AsDiskplayerSceneKey::AsDiskplayerSceneKey(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100) {
 	
 	createSurface1(0x100B90B4, 1200);
@@ -168,7 +168,7 @@ Class494::Class494(NeverhoodEngine *vm)
 	_surface->setVisible(false);
 }
 
-uint32 Class494::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsDiskplayerSceneKey::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
@@ -178,19 +178,19 @@ uint32 Class494::handleMessage(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Class494::sub43BE00() {
-	stopAnimation();
+void AsDiskplayerSceneKey::stDropKey() {
+	startAnimation(0x100B90B4, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Sprite::handleMessage);
-	_surface->setVisible(false);
+	SetMessageHandler(&AsDiskplayerSceneKey::handleMessage);
+	NextState(&AsDiskplayerSceneKey::stDropKeyDone);
+	_surface->setVisible(true);
 }
 
-void Class494::sub43BE20() {
-	startAnimation(0x100B90B4, 0, -1);
+void AsDiskplayerSceneKey::stDropKeyDone() {
+	stopAnimation();
 	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&Class494::handleMessage);
-	NextState(&Class494::sub43BE00);
-	_surface->setVisible(true);
+	SetMessageHandler(&Sprite::handleMessage);
+	_surface->setVisible(false);
 }
 
 DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene)
@@ -202,16 +202,13 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene
 	_drawRect.y = 0;
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = _spriteResource.getDimensions().width;
-	_deltaRect.height = _spriteResource.getDimensions().height;
+	_deltaRect = _drawRect;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_surface->setVisible(false);
 	processDelta();
 	_needRefresh = true;
 	StaticSprite::update();
+	_surface->setVisible(false);
 	loadSound(0, 0x44043000);
 	loadSound(1, 0x44045000);
 	SetMessageHandler(&DiskplayerPlayButton::handleMessage);
@@ -222,7 +219,7 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (!_diskplayerScene->getFlag3()) {
+		if (!_diskplayerScene->getDropKey()) {
 			if (_isPlaying) {
 				sendMessage(_diskplayerScene, 0x2001, 0);
 				release();
@@ -258,7 +255,7 @@ void DiskplayerPlayButton::release() {
 
 DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value)
 	: Entity(vm, 0), _diskplayerScene(diskplayerScene), _elementIndex(elementIndex), _value(value),
-	_flag2(false), _flag(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
+	_isLocked(false), _isBlinking(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
 
 	if (value != 0 && elementIndex < 20) {
 		_inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100));
@@ -271,84 +268,84 @@ DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerS
 		// TODO sound panning stuff
 	} else if (elementIndex != 20) {
 		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100));
-		_activeSlot->getSurface()->setVisible(false);
+		_activeSlot->setVisible(false);
 	}
 	SetUpdateHandler(&DiskplayerSlot::update);
 }
 
 void DiskplayerSlot::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		if (_flag) {
+		if (_isBlinking) {
 			if (_inactiveSlot)
-				_inactiveSlot->getSurface()->setVisible(true);
+				_inactiveSlot->setVisible(true);
 			if (_activeSlot)
-				_activeSlot->getSurface()->setVisible(false);
+				_activeSlot->setVisible(false);
 			_countdown = _initialCountdown / 2;
 		} else {
 			if (_inactiveSlot)
-				_inactiveSlot->getSurface()->setVisible(false);
+				_inactiveSlot->setVisible(false);
 			if (_activeSlot)
-				_activeSlot->getSurface()->setVisible(true);
+				_activeSlot->setVisible(true);
 			_countdown = _initialCountdown;
 		}
-		_flag = !_flag;
+		_isBlinking = !_isBlinking;
 	}
 }
 
 void DiskplayerSlot::appear() {
 	if (_inactiveSlot)
-		_inactiveSlot->getSurface()->setVisible(true);
+		_inactiveSlot->setVisible(true);
 	if (_appearSlot)
-		_appearSlot->getSurface()->setVisible(true);
+		_appearSlot->setVisible(true);
 	if (_inactiveSlot)
 		playSound(0);
 }
 
 void DiskplayerSlot::play() {
-	if (!_flag2) {
+	if (!_isLocked) {
 		if (_inactiveSlot)
-			_inactiveSlot->getSurface()->setVisible(false);
+			_inactiveSlot->setVisible(false);
 		if (_activeSlot)
-			_activeSlot->getSurface()->setVisible(true);
-		_flag = true;
+			_activeSlot->setVisible(true);
+		_isBlinking = true;
 		_countdown = 0;
 	}
 }
 
 void DiskplayerSlot::activate() {
-	if (!_flag2)
+	if (!_isLocked)
 		_countdown = _initialCountdown;
 }
 
 void DiskplayerSlot::stop() {
-	if (!_flag2) {
+	if (!_isLocked) {
 		if (_inactiveSlot)
-			_inactiveSlot->getSurface()->setVisible(true);
+			_inactiveSlot->setVisible(true);
 		if (_activeSlot)
-			_activeSlot->getSurface()->setVisible(false);
-		_flag = false;
+			_activeSlot->setVisible(false);
+		_isBlinking = false;
 		_countdown = 0;
 	}
 }
 
-DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _which(which), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0),
-	_fullFlag(false), _flag3(false), _inputDisabled(true), _updateStatus(0) { 
+DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int paletteIndex)
+	: Scene(vm, parentModule, true), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0),
+	_hasAllDisks(false), _dropKey(false), _inputDisabled(true), _updateStatus(kUSStopped) { 
 
-	int count = 0;
+	int availableDisksCount = 0;
 	
 	_surfaceFlag = true;
 
 	setBackground(0x8A000044);
-	setPalette(kDiskplayerPaletteFileHashes[_which]);
-	_playButton = new DiskplayerPlayButton(_vm, this);
-	addSprite(_playButton);
-	_vm->_collisionMan->addSprite(_playButton);
-	_class494 = new Class494(_vm);
-	addSprite(_class494);
+	setPalette(kDiskplayerPaletteFileHashes[paletteIndex]);
+
+	_ssPlayButton = insertSprite<DiskplayerPlayButton>(this);
+	_vm->_collisionMan->addSprite(_ssPlayButton);
+
+	_asKey = insertSprite<AsDiskplayerSceneKey>();
 
 	// DEBUG>>>: Give all disks
-	for (int i = 0; i < 19; i++) {
+	for (int i = 0; i < 20; i++) {
 		setSubVar(0x02720344, i, 1);
 	}
 	// DEBUG<<<
@@ -356,37 +353,34 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	for (int i = 0; i < 20; i++) {
 		_diskAvailable[i] = 0;
 		if (getSubVar(0x02720344, i))
-			count++;
+			availableDisksCount++;
 	}
 
-	for (int i = 0; i < count; i++) {
+	for (int i = 0; i < availableDisksCount; i++)
 		_diskAvailable[kDiskplayerInitArray[i] - 1] = 1;
-	}
 
 	for (int i = 0; i < 20; i++) {
 		_diskSlots[i] = new DiskplayerSlot(_vm, this, i, _diskAvailable[i]);
 		addEntity(_diskSlots[i]);
 	}
 
-	_fullFlag = count == 20;
+	_hasAllDisks = availableDisksCount == 20;
 	
-	if (_fullFlag && !getGlobalVar(0xC0780812))
-		_flag3 = true;
-
-	_flag4 = _flag3;	
+	if (_hasAllDisks && !getGlobalVar(0xC0780812))
+		_dropKey = true;
 
-	_class650 = new DiskplayerSlot(_vm, this, 20, 0);
-	addEntity(_class650);
+	_finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0);
+	addEntity(_finalDiskSlot);
 
 	insertMouse435(0x000408A8, 20, 620);
 	showMouse(false);
 
-	_smackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true);
-	addEntity(_smackerPlayer);
-	addSurface(_smackerPlayer->getSurface());
-	_smackerPlayer->setDrawPos(154, 86);
-	// TODO _smackerPlayer->gotoFrame(0);
-	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
+	_diskSmackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true);
+	addEntity(_diskSmackerPlayer);
+	addSurface(_diskSmackerPlayer->getSurface());
+	_diskSmackerPlayer->setDrawPos(154, 86);
+	// TODO _diskSmackerPlayer->gotoFrame(0);
+	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
 
 	_palette->usePalette();
 
@@ -399,73 +393,63 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 void DiskplayerScene::update() {
 	Scene::update();
 
-	debug("_updateStatus = %d", _updateStatus);
-
-	if (_updateStatus == 1) {
-		if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) {
-			if (_diskAvailable[_diskIndex]) {
-				playDisk();
-			} else {
-				playStatic();
-			}
+	if (_updateStatus == kUSTuningIn && _diskSmackerPlayer->isDone()) {
+		if (_diskAvailable[_diskIndex]) {
+			playDisk();
+		} else {
+			playStatic();
 		}
-	} else if (_updateStatus == 2) {
-		if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) {
-			_diskSlots[_diskIndex]->stop();
-			_diskIndex++;
-			if (_fullFlag) {
-				if (_diskIndex == 20) {
-					if (_flag3) {
-						playDisk();
-						_updateStatus = 3;
-					} else {
-						_diskIndex = 0;
-						stop();
-					}
-				} else {
-					playDisk();
-				}
+	} else if (_updateStatus == kUSPlaying && _diskSmackerPlayer->isDone()) {
+		_diskSlots[_diskIndex]->stop();
+		_diskIndex++;
+		if (_hasAllDisks) {
+			if (_diskIndex != 20) {
+				playDisk();
+			} else if (_dropKey) {
+				playDisk();
+				_updateStatus = kUSPlayingFinal;
 			} else {
-				if (_diskIndex == 20) {
-					_diskIndex = 0;
-					stop();
-				} else {
-					tuneIn();
-				}
+				_diskIndex = 0;
+				stop();
 			}
+		} else if (_diskIndex != 20) {
+			tuneIn();
+		} else {
+			_diskIndex = 0;
+			stop();
 		}
-	} else if (_updateStatus == 3) {
-		if (_smackerPlayer->getFrameNumber() == 133) {
-			_class494->sub43BE20();
+	} else if (_updateStatus == kUSPlayingFinal) {
+		if (_diskSmackerPlayer->getFrameNumber() == 133) {
+			_asKey->stDropKey();
 			setGlobalVar(0xC0780812, 1);
-		} else if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) {
+		} else if (_diskSmackerPlayer->isDone()) {
 			for (int i = 0; i < 20; i++) {
-				_diskSlots[i]->setFlag2(false);
+				_diskSlots[i]->setLocked(false);
 				_diskSlots[i]->stop();
 			}
 			_diskIndex = 0;
 			stop();
 			showMouse(true);
-			_flag3 = false;
+			_dropKey = false;
 		}
 	}
 
 	if (_appearCountdown != 0 && (--_appearCountdown == 0)) {
 		_diskSlots[_diskIndex]->appear();
-		if (_flag3) {
+		if (_dropKey) {
 			_diskSlots[_diskIndex]->activate();
-			_diskSlots[_diskIndex]->setFlag2(true);
+			_diskSlots[_diskIndex]->setLocked(true);
 		}
 		_diskIndex++;
-		while (_diskAvailable[_diskIndex] == 0 && _diskIndex < 19)
+		while (!_diskAvailable[_diskIndex] && _diskIndex < 19)
 			_diskIndex++;					
 		if (_diskIndex < 20) {
 			_appearCountdown = 1;
 		} else {
 			_diskIndex = 0;
 			_inputDisabled = false;
-			if (_flag3) {
-				_playButton->press();
+			if (_dropKey) {
+				_ssPlayButton->press();
 				_tuneInCountdown = 2;
 			} else {
 				showMouse(true);
@@ -474,9 +458,8 @@ void DiskplayerScene::update() {
 		}
 	}
 
-	if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0)) {
+	if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0))
 		playDisk();
-	}
 
 }
 
@@ -489,14 +472,14 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 			// TODO: Debug/Cheat
 			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 				sendMessage(_parentModule, 0x1009, 0);
-			} else if (!_flag3 &&
+			} else if (!_dropKey &&
 				param.asPoint().x > 38 && param.asPoint().x < 598 &&
 				param.asPoint().y > 400 && param.asPoint().y < 460) {
 				
 				_diskSlots[_diskIndex]->stop();
 				_diskIndex = (param.asPoint().x - 38) / 28;
 				_diskSlots[_diskIndex]->activate();
-				if (_updateStatus == 2) {
+				if (_updateStatus == kUSPlaying) {
 					if (_diskAvailable[_diskIndex]) {
 						playDisk();
 					} else {
@@ -518,37 +501,37 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 }
 
 void DiskplayerScene::stop() {
-	_smackerPlayer->open(0x08288103, true);
-	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
+	_diskSmackerPlayer->open(0x08288103, true);
+	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
-	_playButton->release();
-	_updateStatus = 0;
+	_ssPlayButton->release();
+	_updateStatus = kUSStopped;
 	_diskSlots[_diskIndex]->activate();
 }
 
 void DiskplayerScene::tuneIn() {
-	_smackerPlayer->open(0x900001C1, false);
-	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
+	_diskSmackerPlayer->open(0x900001C1, false);
+	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
-	_playButton->release();
-	_updateStatus = 1;
+	_ssPlayButton->release();
+	_updateStatus = kUSTuningIn;
 	_diskSlots[_diskIndex]->activate();
 }
 
 void DiskplayerScene::playDisk() {
-	_smackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false);
-	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
+	_diskSmackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false);
+	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
-	_updateStatus = 2;
+	_updateStatus = kUSPlaying;
 	_diskSlots[_diskIndex]->play();
 }
 
 void DiskplayerScene::playStatic() {
-	_smackerPlayer->open(0x90000101, false);
-	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
+	_diskSmackerPlayer->open(0x90000101, false);
+	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
 	_palette->usePalette();
-	_playButton->release();
-	_updateStatus = 2;
+	_ssPlayButton->release();
+	_updateStatus = kUSPlaying;
 	_diskSlots[_diskIndex]->activate();
 }
 
diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h
index d005f79..7225ff6 100644
--- a/engines/neverhood/diskplayerscene.h
+++ b/engines/neverhood/diskplayerscene.h
@@ -32,13 +32,13 @@ namespace Neverhood {
 
 class DiskplayerScene;
 
-class Class494 : public AnimatedSprite {
+class AsDiskplayerSceneKey : public AnimatedSprite {
 public:
-	Class494(NeverhoodEngine *vm);
-	void sub43BE20();
+	AsDiskplayerSceneKey(NeverhoodEngine *vm);
+	void stDropKey();
 protected:	
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void sub43BE00();
+	void stDropKeyDone();
 };
 
 class DiskplayerPlayButton : public StaticSprite {
@@ -59,7 +59,7 @@ public:
 	void stop();
 	void appear();
 	void play();
-	void setFlag2(bool value) { _flag2 = value; }
+	void setLocked(bool isLocked) { _isLocked = isLocked; }
 protected:
 	DiskplayerScene *_diskplayerScene;
 	Sprite *_inactiveSlot;
@@ -68,32 +68,37 @@ protected:
 	int _elementIndex;
 	int _initialCountdown;
 	int _countdown;
-	bool _flag2;
+	bool _isLocked;
 	int _value;
-	bool _flag;
+	bool _isBlinking;
 	void update();	
 };
 
+enum {
+	kUSStopped		= 0,
+	kUSTuningIn		= 1,
+	kUSPlaying		= 2,
+	kUSPlayingFinal	= 3
+};
+
 class DiskplayerScene : public Scene {
 public:
-	DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which);
-	bool getFlag3() const { return _flag3; }
+	DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int paletteIndex);
+	bool getDropKey() const { return _dropKey; }
 protected:
-	SmackerPlayer *_smackerPlayer;
-	DiskplayerPlayButton *_playButton;
-	Class494 *_class494;
+	SmackerPlayer *_diskSmackerPlayer;
+	DiskplayerPlayButton *_ssPlayButton;
+	AsDiskplayerSceneKey *_asKey;
 	DiskplayerSlot *_diskSlots[20];
-	DiskplayerSlot *_class650;
+	DiskplayerSlot *_finalDiskSlot;
 	int _updateStatus;
 	byte _diskAvailable[20];
-	bool _flag4;
-	int _which;
 	int _diskIndex;
 	int _appearCountdown;
 	int _tuneInCountdown;
-	bool _fullFlag;
+	bool _hasAllDisks;
 	bool _inputDisabled;
-	bool _flag3;
+	bool _dropKey;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stop();
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e35e16e..4be8785 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -312,8 +312,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 0;
-	createModule(1200, -1);
+	_vm->gameState().sceneNum = 3;
+	createModule(1300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index f385835..6533e07 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -874,7 +874,7 @@ void AsScene1306Elevator::cbGoingDownEvent() {
 Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860))
+	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
 		setGlobalVar(0x13382860, 4);
 	
 	_surfaceFlag = true;
@@ -884,7 +884,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x05303114);
 	insertMouse433(0x0311005B);
 
-	if (!getGlobalVar(0x13382860)) {
+	if (getGlobalVar(0x13382860) == 4) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 435, 445);
 		_vm->_collisionMan->addSprite(_asKey);
 	}
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index d31f3de..9cfb826 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1425,9 +1425,8 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) {
 	
-	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) {
+	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
 		setGlobalVar(0x13382860, 5);
-	}
 	
 	SetMessageHandler(&Scene1404::handleMessage);
 	_surfaceFlag = true;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 777b848..29b4103 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -1028,6 +1028,7 @@ AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex,
 	if (!getSubVar(0x0090EA95, _keyIndex) && !getSubVar(0x08D0AB11, _keyIndex)) {
 		SetMessageHandler(&AsCommonKey::handleMessage);
 	} else {
+		// If Klayman already has the key or it's already inserted then don't show it
 		setVisible(false);
 		SetMessageHandler(NULL);
 	}
@@ -1114,7 +1115,7 @@ void AsScene2203Door::closeDoor() {
 Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860))
+	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
 		setGlobalVar(0x13382860, 1);
 
 	SetMessageHandler(&Scene2203::handleMessage);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 238768c..a29795b 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -921,9 +921,8 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite1, *tempSprite2;
 
-	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) {
+	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
 		setGlobalVar(0x13382860, 2);
-	}
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2406::handleMessage);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index f4dd674..88caff9 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -865,7 +865,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene3009::update() {
 	Scene::update();
 	
-	if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonTargetStatus <= kCTSCount) {
+	if (!_keepVideo && _smackerPlayer->isDone() && _cannonTargetStatus <= kCTSCount) {
 		switch (_cannonTargetStatus) {
 		case kCTSNull:
 		case kCTSLowerCannon:
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 697893d..c480c2d 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -60,6 +60,7 @@ public:
 	uint getStatus();
 	void setDrawPos(int16 x, int16 y);
 	void rewind();
+	bool isDone() { return getFrameNumber() + 1 == getFrameCount(); }
 	Video::SmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; }
 protected:
 	Scene *_scene;


Commit: 1539023834a2ad7cf8942711d60983891a10a82a
    https://github.com/scummvm/scummvm/commit/1539023834a2ad7cf8942711d60983891a10a82a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:44:40-07:00

Commit Message:
NEVERHOOD: Use constants for the numbers in get/setGlobalVar

Now the code is much more readable

- Still TODO is to do the same with get/setSubVar

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/klayman.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index e20dec0..54c33dd 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -366,7 +366,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 
 	_hasAllDisks = availableDisksCount == 20;
 	
-	if (_hasAllDisks && !getGlobalVar(0xC0780812))
+	if (_hasAllDisks && !getGlobalVar(V_HAS_FINAL_KEY))
 		_dropKey = true;
 
 	_finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0);
@@ -421,7 +421,7 @@ void DiskplayerScene::update() {
 	} else if (_updateStatus == kUSPlayingFinal) {
 		if (_diskSmackerPlayer->getFrameNumber() == 133) {
 			_asKey->stDropKey();
-			setGlobalVar(0xC0780812, 1);
+			setGlobalVar(V_HAS_FINAL_KEY, 1);
 		} else if (_diskSmackerPlayer->isDone()) {
 			for (int i = 0; i < 20; i++) {
 				_diskSlots[i]->setLocked(false);
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 4be8785..ac20138 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -301,19 +301,20 @@ void GameModule::startup() {
 
 	// DEBUG>>>
 	/*
-	setGlobalVar(0x0A310817, 1);
+	setGlobalVar(V_SEEN_MUSIC_BOX, 1);
 	setGlobalVar(0x0A18CA33, 0);
 	setGlobalVar(0x0112090A, 0);
 	//setGlobalVar(0x000CF819, 1);
-	setGlobalVar(0x04A105B3, 2);
+	setGlobalVar(V_PROJECTOR_LOCATION, 2);
 	*/
+	//setGlobalVar(V_ENTRANCE_OPEN, 0);
+	//setGlobalVar(V_DOOR_SPIKES_OPEN, 1);
 	// <<<DEBUG
 
-
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 3;
-	createModule(1300, -1);
+	_vm->gameState().sceneNum = 5;
+	createModule(2200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -358,7 +359,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 0
-	setGlobalVar(0x1860C990, 1); // DEBUG Make Klayman small
+	setGlobalVar(V_KLAYMAN_SMALL, 1); // DEBUG Make Klayman small
 	_vm->gameState().sceneNum = 2;
 	createModule(2800, -1);
 #endif
@@ -378,84 +379,84 @@ void GameModule::createModule(int moduleNum, int which) {
 	_moduleNum = moduleNum;
 	switch (_moduleNum) {
 	case 1000:
-		setGlobalVar(0x91080831, 0x03294419);
+		setGlobalVar(V_MODULE_NAME, 0x03294419);
 		_childObject = new Module1000(_vm, this, which);
 		break;
 	case 1100:
-		setGlobalVar(0x91080831, 0x0002C818);
+		setGlobalVar(V_MODULE_NAME, 0x0002C818);
 		_childObject = new Module1100(_vm, this, which);
 		break;
 	case 1200:
-		setGlobalVar(0x91080831, 0x00478311);
+		setGlobalVar(V_MODULE_NAME, 0x00478311);
 		_childObject = new Module1200(_vm, this, which);
 		break;
 	case 1300:
-		setGlobalVar(0x91080831, 0x0061C090);
+		setGlobalVar(V_MODULE_NAME, 0x0061C090);
 		_childObject = new Module1300(_vm, this, which);
 		break;
 	case 1400:
-		setGlobalVar(0x91080831, 0x00AD0012);
+		setGlobalVar(V_MODULE_NAME, 0x00AD0012);
 		_childObject = new Module1400(_vm, this, which);
 		break;
 	case 1500:
 		_someFlag1 = false;
-		setGlobalVar(0x91080831, 0x00F10114);
+		setGlobalVar(V_MODULE_NAME, 0x00F10114);
 		_childObject = new Module1500(_vm, this, which, true);
 		break;
 	case 1600:
-		setGlobalVar(0x91080831, 0x01A008D8);
+		setGlobalVar(V_MODULE_NAME, 0x01A008D8);
 		_childObject = new Module1600(_vm, this, which);
 		break;
 	case 1700:
-		setGlobalVar(0x91080831, 0x04212331);
+		setGlobalVar(V_MODULE_NAME, 0x04212331);
 		_childObject = new Module1700(_vm, this, which);
 		break;
 	case 1800:
-		setGlobalVar(0x91080831, 0x04A14718);
+		setGlobalVar(V_MODULE_NAME, 0x04A14718);
 		_childObject = new Module1800(_vm, this, which);
 		break;
 	case 1900:
-		setGlobalVar(0x91080831, 0x04E1C09C);
+		setGlobalVar(V_MODULE_NAME, 0x04E1C09C);
 		_childObject = new Module1900(_vm, this, which);
 		break;
 	case 2000:
-		setGlobalVar(0x91080831, 0x08250000);
+		setGlobalVar(V_MODULE_NAME, 0x08250000);
 		_childObject = new Module2000(_vm, this, which);
 		break;
 	case 2100:
-		setGlobalVar(0x91080831, 0x10A10C14);
+		setGlobalVar(V_MODULE_NAME, 0x10A10C14);
 		_childObject = new Module2100(_vm, this, which);
 		break;
 	case 2200:
-		setGlobalVar(0x91080831, 0x11391412);
+		setGlobalVar(V_MODULE_NAME, 0x11391412);
 		_childObject = new Module2200(_vm, this, which);
 		break;
 	case 2300:
-		setGlobalVar(0x91080831, 0x1A214010);
+		setGlobalVar(V_MODULE_NAME, 0x1A214010);
 		_childObject = new Module2300(_vm, this, which);
 		break;
 	case 2400:
-		setGlobalVar(0x91080831, 0x202D1010);
+		setGlobalVar(V_MODULE_NAME, 0x202D1010);
 		_childObject = new Module2400(_vm, this, which);
 		break;
 	case 2500:
-		setGlobalVar(0x91080831, 0x29220120);
+		setGlobalVar(V_MODULE_NAME, 0x29220120);
 		_childObject = new Module2500(_vm, this, which);
 		break;
 	case 2600:
-		setGlobalVar(0x91080831, 0x40271018);
+		setGlobalVar(V_MODULE_NAME, 0x40271018);
 		_childObject = new Module2600(_vm, this, which);
 		break;
 	case 2700:
-		setGlobalVar(0x91080831, 0x42212411);
+		setGlobalVar(V_MODULE_NAME, 0x42212411);
 		_childObject = new Module2700(_vm, this, which);
 		break;
 	case 2800:
-		setGlobalVar(0x91080831, 0x64210814);
+		setGlobalVar(V_MODULE_NAME, 0x64210814);
 		_childObject = new Module2800(_vm, this, which);
 		break;
 	case 3000:
-		setGlobalVar(0x91080831, 0x81293110);
+		setGlobalVar(V_MODULE_NAME, 0x81293110);
 		_childObject = new Module3000(_vm, this, which);
 		break;
 	default:
@@ -482,7 +483,7 @@ void GameModule::updateModule() {
 			if (_moduleResult == 0) {
 				createModule(2900, 2);
 			} else {
-				setGlobalVar(0xD0A14D10, 1);
+				setGlobalVar(V_ENTRANCE_OPEN, 1);
 				createModule(1300, 0);
 			}
 			break;
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 863aa1b..a99459f 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -28,6 +28,102 @@
 
 namespace Neverhood {
 
+enum {
+	// Misc
+	V_MODULE_NAME			= 0x91080831,			// Currently active module name hash
+	V_DEBUG					= 0xA4014072,			// Original debug-flag, can probably be removed
+	V_SMACKER_CAN_ABORT		= 0x06C02850,			// Not set anywhere (yet), seems like a debug flag
+	V_KEY3_LOCATION			= 0x13382860,			// Location of the third key
+	V_TEXT_FLAG1			= 0x8440001F,
+	V_TEXT_INDEX			= 0x01830201,
+	V_TEXT_COUNTING_INDEX1	= 0x29408F00,
+	V_TEXT_COUNTING_INDEX2	= 0x8A140C21,
+	V_TALK_COUNTING_INDEX	= 0xA0808898,
+	V_FRUIT_COUNTING_INDEX	= 0x40040831,
+	V_NOISY_SYMBOL_INDEX	= 0x2414C2F2,
+	V_COLUMN_BACK_NAME		= 0x4CE79018,
+	V_COLUMN_TEXT_NAME		= 0xC8C28808,
+	V_CLICKED_COLUMN_INDEX	= 0x48A68852,
+	V_CLICKED_COLUMN_ROW	= 0x49C40058,
+	V_MUSIC_NAME			= 0x89A82A15,
+	// Klayman
+	V_KLAYMAN_SMALL			= 0x1860C990,			// Is Klayman small?
+	V_KLAYMAN_FRAMEINDEX	= 0x18288913,
+	V_KLAYMAN_IS_DELTA_X	= 0xC0418A02,
+	V_KLAYMAN_SAVED_X		= 0x00D30138,
+	V_CAR_DELTA_X			= 0x21E60190,
+	// Flags
+	V_CRYSTAL_COLORS_INIT	= 0xDE2EC914,
+	V_TV_JOKE_TOLD			= 0x92603A79,
+	V_NOTES_DOOR_UNLOCKED	= 0x0045D021,
+	V_WATER_RUNNING			= 0x4E0BE910,
+	V_CREATURE_ANGRY		= 0x0A310817,			// After having played with the music box
+	V_BEEN_SHRINKING_ROOM	= 0x1C1B8A9A,
+	V_BEEN_STATUE_ROOM		= 0xCB45DE03,
+	V_MOUSE_PUZZLE_SOLVED	= 0x70A1189C,
+	V_NOTES_PUZZLE_SOLVED	= 0x86615030,
+	V_TILE_PUZZLE_SOLVED	= 0x404290D5,
+	V_STAIRS_PUZZLE_SOLVED	= 0xA9035F60,
+	V_SPIKES_RETRACTED		= 0x18890C91,
+	V_LARGE_DOOR_NUMBER		= 0x9A500914,			// Number of the currently "large" door
+	V_LIGHTS_ON				= 0x4D080E54,
+	V_SHRINK_LIGHTS_ON		= 0x190A1D18,			// Lights on in the room with the shrinking device
+	V_STAIRS_DOWN			= 0x09221A62,
+	V_LADDER_DOWN			= 0x0018CA22,			// Is the ladder in the statue room down?
+	V_LADDER_DOWN_ACTION	= 0x00188211,
+	V_WALL_BROKEN			= 0x10938830,
+	V_BOLT_DOOR_OPEN		= 0x01BA1A52,
+	V_BOLT_DOOR_UNLOCKED	= 0x00040153,
+	V_SEEN_SYMBOLS_NO_LIGHT	= 0x81890D14,
+	V_FELL_DOWN_HOLE		= 0xE7498218,
+	V_DOOR_PASSED			= 0x2090590C,			// Auto-closing door was passed
+	V_ENTRANCE_OPEN			= 0xD0A14D10,			// Is the entrance to Module1300 open (after the robot got his teddy)
+	V_WINDOW_OPEN			= 0x03C698DA,
+	V_DOOR_STATUS			= 0x52371C95,
+	V_DOOR_BUSTED			= 0xD217189D,
+	V_WORLDS_JOINED			= 0x98109F12,			// Are the worlds joined?
+	V_KEYDOOR_UNLOCKED		= 0x80455A41,			// Is the keyboard-door unlocked?
+	V_MOUSE_SUCKED_IN		= 0x01023818,			// Are mouse/cheese in Scene1308?
+	V_BALLOON_POPPED		= 0xAC00C0D0,			// Has the balloon with the key been popped?
+	V_TNT_DUMMY_BUILT		= 0x000CF819,			// Are all TNT parts on the dummy?
+	V_TNT_DUMMY_FUSE_LIT	= 0x20A0C516,
+	V_RING5_PULLED			= 0x4DE80AC0,
+	V_CREATURE_EXPLODED		= 0x2A02C07B,
+	// Match
+	V_MATCH_STATUS			= 0x0112090A,
+	// Venus fly trap
+	V_FLYTRAP_RING_EATEN	= 0x2B514304,
+	V_FLYTRAP_RING_DOOR		= 0x8306F218,
+	V_FLYTRAP_RING_FENCE	= 0x80101B1E,
+	V_FLYTRAP_RING_BRIDGE	= 0x13206309,
+	V_FLYTRAP_POSITION_1	= 0x1B144052,
+	V_FLYTRAP_POSITION_2	= 0x86341E88,
+	// Navigation
+	V_NAVIGATION_INDEX		= 0x4200189E,			// Navigation scene: Current navigation index
+	// Cannon
+	V_CANNON_RAISED			= 0x000809C2,			// Is the cannon raised?
+	V_CANNON_TURNED			= 0x9040018A,			// Is the cannon turned?
+	V_ROBOT_HIT				= 0x0C0288F4,			// Was the robot hit by the cannon?
+	V_ROBOT_TARGET			= 0x610210B7,			// Is the robot at the cannon target position? (teddy)
+	V_CANNON_SMACKER_NAME	= 0xF0402B0A,
+	V_CANNON_TARGET_STATUS	= 0x20580A86,
+	// Projector
+	V_PROJECTOR_SLOT		= 0x04A10F33,			// Projector x slot index
+	V_PROJECTOR_LOCATION	= 0x04A105B3,			// Projector scene location
+	V_PROJECTOR_ACTIVE		= 0x12A10DB3,			// Is the projecor projecting?
+	// Inventory
+	V_HAS_NEEDLE			= 0x31C63C51,			// Has Klayman the needle?
+	V_HAS_FINAL_KEY			= 0xC0780812,			// Has Klayman the key from the diskplayer?
+	V_HAS_TEST_TUBE			= 0x45080C38,
+#if 0
+Arrays:
+0x0800547C		Water pipes water level (index equals pipe number; 0 to 4)
+0x0090EA95		Has Klayman the key (index equals the key number; 0 to 2)
+0x08D0AB11		Has Klayman inserted the key (index equals the key number; 0 to 2)
+#endif
+	V_END_	
+};
+
 struct GameVar {
 	uint32 nameHash;
 	uint32 value;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 7343b0a..0342b02 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3048,7 +3048,7 @@ uint32 Klayman::hmMatch(int messageNum, const MessageParam &param, Entity *sende
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x51281850) {
-			setGlobalVar(0x20A0C516, 1);
+			setGlobalVar(V_TNT_DUMMY_FUSE_LIT, 1);
 		} else if (param.asInteger() == 0x43000538) {
 			playSound(0, 0x21043059);
 		} else if (param.asInteger() == 0x02B20220) {
@@ -3283,7 +3283,7 @@ void Klayman::stWaitLeverDown() {
 }
 
 void Klayman::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(0x18288913) + _walkResumeFrameIncr;
+	int16 frameIndex = getGlobalVar(V_KLAYMAN_FRAMEINDEX) + _walkResumeFrameIncr;
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
 	_status2 = 0;
@@ -4788,7 +4788,7 @@ KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 void KmScene2205::xUpdate() {
-	setGlobalVar(0x18288913, _currFrameIndex);
+	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
 }
 	
 uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4842,7 +4842,7 @@ KmScene2206::~KmScene2206() {
 }
 
 void KmScene2206::xUpdate() {
-	setGlobalVar(0x18288913, _currFrameIndex);
+	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
 }
 	
 uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5006,7 +5006,7 @@ KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 void KmScene2242::xUpdate() {
-	setGlobalVar(0x18288913, _currFrameIndex);
+	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
 }
 
 uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5076,7 +5076,7 @@ KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16
 }
 
 void KmHallOfRecords::xUpdate() {
-	setGlobalVar(0x18288913, _currFrameIndex);
+	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
 }
 
 uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5130,7 +5130,7 @@ KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 void KmScene2247::xUpdate() {
-	setGlobalVar(0x18288913, _currFrameIndex);
+	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
 }
 
 uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5274,7 +5274,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (!getGlobalVar(0x92603A79))
+		if (!getGlobalVar(V_TV_JOKE_TOLD))
 			GotoState(&Klayman::stStandWonderAbout);
 		else
 			GotoState(&Klayman::stTryStandIdle);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 878a0e7..2c52842 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -29,7 +29,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	debug("Create Module1000(%d)", which);
 
-	_musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144;		
+	_musicFileHash = getGlobalVar(V_ENTRANCE_OPEN) ? 0x81106480 : 0x00103144;		
 
 	_vm->_soundMan->addMusic(0x03294419, 0x061880C6);
 	_vm->_soundMan->addMusic(0x03294419, _musicFileHash);
@@ -140,7 +140,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param,
 }
 
 void AsScene1001Door::hammerHitsDoor() {
-	switch (getGlobalVar(0x52371C95)) {
+	switch (getGlobalVar(V_DOOR_STATUS)) {
 	case 0:
 	case 1:
 		playSound(0, 0x65482F03);
@@ -156,11 +156,11 @@ void AsScene1001Door::hammerHitsDoor() {
 		// Nothing
 		break;		
 	}
-	incGlobalVar(0x52371C95, 1);
+	incGlobalVar(V_DOOR_STATUS, 1);
 }
 
 void AsScene1001Door::stShowIdleDoor() {
-	switch (getGlobalVar(0x52371C95)) {
+	switch (getGlobalVar(V_DOOR_STATUS)) {
 	case 1:
 		startAnimation(0x624C0498, 4, -1);
 		_newStickFrameIndex = 4;
@@ -181,7 +181,7 @@ void AsScene1001Door::stShowIdleDoor() {
 }
 
 void AsScene1001Door::stBustedDoorMove() {
-	setGlobalVar(0xD217189D, 1);
+	setGlobalVar(V_DOOR_BUSTED, 1);
 	startAnimation(0x624C0498, 6, 6);
 	NextState(&AsScene1001Door::stBustedDoorGone);
 	_x = 30;
@@ -249,7 +249,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 		break;
 	case 0x3002:
 		SetMessageHandler(NULL);
-		setGlobalVar(0x03C698DA, 1);
+		setGlobalVar(V_WINDOW_OPEN, 1);
 		setVisible(false);
 		break;
 	}
@@ -354,7 +354,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
 		setRectList(0x004B49F0);
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1001>(390, 433);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -371,7 +371,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	
-	if (getGlobalVar(0xD217189D) == 0) {
+	if (getGlobalVar(V_DOOR_BUSTED) == 0) {
 		_asDoor = insertSprite<AsScene1001Door>();
 		_asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	} else {
@@ -385,7 +385,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
 
-	if (getGlobalVar(0x03C698DA) == 0) {
+	if (getGlobalVar(V_WINDOW_OPEN) == 0) {
 		tempSprite = insertStaticSprite(0x8C066150, 200);
 		_asWindow = insertSprite<AsScene1001Window>();
 		_asWindow->setClipRect(tempSprite->getDrawRect());
@@ -398,7 +398,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1001::~Scene1001() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX());
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX());
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -407,7 +407,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
+		if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) {
 			leaveScene(0);
 		}
 		break;
@@ -423,7 +423,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 			setMessageList2(0x004B4910);
 			messageResult = 1;
 		} else if (param.asInteger() == 0x21E64A00) {
-			if (getGlobalVar(0xD217189D)) {
+			if (getGlobalVar(V_DOOR_BUSTED)) {
 				setMessageList(0x004B48A8);
 			} else {
 				setMessageList(0x004B48C8);
@@ -432,7 +432,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x040424D0) {
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x80006358) {
-			if (getGlobalVar(0x03C698DA)) {
+			if (getGlobalVar(V_WINDOW_OPEN)) {
 				setMessageList(0x004B4938);
 			} else {
 				setMessageList(0x004B4960);
@@ -615,7 +615,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 
 	_x = 526;
 	
-	if (getGlobalVar(0x8306F218)) {
+	if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 		_y = 49; 
 	} else {
 		_y = 239; 
@@ -644,11 +644,11 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4808:
-		setGlobalVar(0x8306F218, 1);
+		setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
 		SetSpriteUpdate(&AsScene1002Door::suOpenDoor);
 		break;
 	case 0x4809:
-		setGlobalVar(0x8306F218, 0);
+		setGlobalVar(V_FLYTRAP_RING_DOOR, 0);
 		SetSpriteUpdate(&AsScene1002Door::suCloseDoor);
 		break;
 	}
@@ -872,20 +872,20 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 
 	if (!_flag) {
-		if (getGlobalVar(0x8306F218)) {
+		if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 			setDoDeltaX(1);
 			_x = 366;
 			_y = 435;
 			stRingGrabbed();
 		} else {
-			_x = 174 + getGlobalVar(0x1B144052) * 32;
+			_x = 174 + getGlobalVar(V_FLYTRAP_POSITION_1) * 32;
 			_y = 435;
 			stIdle();
 		}
 	} else {
-		_x = 186 + getGlobalVar(0x86341E88) * 32;
+		_x = 186 + getGlobalVar(V_FLYTRAP_POSITION_2) * 32;
 		_y = 364;
-		if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) {
+		if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) {
 			stRingGrabbed();
 		} else {
 			stIdle();
@@ -937,13 +937,13 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
 	case 0x480B:
 		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
 		if (!_flag) {
-			if (getGlobalVar(0x8306F218)) {
+			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 				stRelease();
 			} else {
 				stWalk();
 			}
 		} else {
-			if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) {
 				stRelease();
 			} else {
 				stWalk();
@@ -1079,14 +1079,14 @@ void AsScene1002VenusFlyTrap::stIdle() {
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
 	if (_flag) {
 		if (_x >= 154 && _x <= 346) {
-			setGlobalVar(0x86341E88, (_x - 186) / 32);
+			setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32);
 		} else {
 			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
 			_countdown = 12;
 		}
 	} else {
 		if (_x >= 174 && _x <= 430) {
-			setGlobalVar(0x1B144052, (_x - 174) / 32);
+			setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32);
 		} else {
 			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
 			_countdown = 12;
@@ -1129,7 +1129,7 @@ AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngi
 	createSurface(850, 186, 212);
 	_x = 320;
 	_y = 240;
-	if (getGlobalVar(0x8306F218)) {
+	if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 		startAnimation(0x004A4495, -1, -1);
 		_newStickFrameIndex = -2;
 	} else {
@@ -1346,7 +1346,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 258, 191, _class599->getDrawRect().y, false);
 	_asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _class599->getDrawRect().y, false);
-	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0);
+	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR) != 0);
 	_asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _class599->getDrawRect().y, false);
 	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _class599->getDrawRect().y, false);
 
@@ -1395,24 +1395,24 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		// Debug stuff (original)
-		if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) {
-			setGlobalVar(0x8306F218, 1);
-			setGlobalVar(0x1B144052, 3);
+		if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) {
+			setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
+			setGlobalVar(V_FLYTRAP_POSITION_1, 3);
 			leaveScene(1);
 		}
 		break;
 	case 0x000D:
 		// Debug stuff (original)
 		if (param.asInteger() == 0x48848178) {
-			setGlobalVar(0x8306F218, 1);
-			setGlobalVar(0x1B144052, 3);
+			setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
+			setGlobalVar(V_FLYTRAP_POSITION_1, 3);
 			leaveScene(1);
 		}
 		messageResult = 1;
 		break;
 	case 0x100D:
 		if (param.asInteger() == 0xE6EE60E1) {
-			if (getGlobalVar(0x8306F218)) {
+			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 				setMessageList(0x004B4428);
 			} else {
 				setMessageList(0x004B4448);
@@ -1423,12 +1423,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x43807801) {
 			sendEntityMessage(_klayman, 0x1014, _asRing2);
 		} else if (param.asInteger() == 0x46C26A01) {
-			if (getGlobalVar(0x8306F218)) {
+			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 				setMessageList(0x004B44B8);
 			} else {
 				sendEntityMessage(_klayman, 0x1014, _asRing3);
 				if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) {
-					setGlobalVar(0x2B514304, 1);
+					setGlobalVar(V_FLYTRAP_RING_EATEN, 1);
 					setMessageList(0x004B44A8);
 				} else {
 					setMessageList(0x004B44A0);
@@ -1475,21 +1475,21 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_parentModule, 0x1024, 2);
 		_flag1BE = true;
 		if (sender == _asRing1) {
-			setGlobalVar(0x4DE80AC0, 0);
+			setGlobalVar(V_RING5_PULLED, 0);
 			playSound(0, 0x665198C0);
 		} else if (sender == _asRing2) {
-			setGlobalVar(0x4DE80AC0, 0);
+			setGlobalVar(V_RING5_PULLED, 0);
 			playSound(0, 0xE2D389C0);
 		} else if (sender == _asRing3) {
-			setGlobalVar(0x4DE80AC0, 0);
+			setGlobalVar(V_RING5_PULLED, 0);
 			playSound(1);
 			sendMessage(_asDoor, 0x4808, 0);
 			sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		} else if (sender == _asRing4) {
-			setGlobalVar(0x4DE80AC0, 0);
+			setGlobalVar(V_RING5_PULLED, 0);
 			playSound(0, 0xE0558848);
 		} else if (sender == _asRing5) {
-			setGlobalVar(0x4DE80AC0, 1);
+			setGlobalVar(V_RING5_PULLED, 1);
 			playSound(0, 0x44014282);
 		}
 		break;
@@ -1499,7 +1499,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 			sendMessage(_asDoor, 0x4809, 0);
 			sendMessage(_asOutsideDoorBackground, 0x4809, 0);
 		} else if (sender == _asVenusFlyTrap) {
-			if (getGlobalVar(0x8306F218)) {
+			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 				sendMessage(_asRing3, 0x4807, 0);
 			}
 		}	
@@ -1508,7 +1508,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendEntityMessage(_klayman, 0x1014, _asDoorSpy);
 		break;				
 	case 0x480F:
-		setGlobalVar(0x4DE80AC0, 0);
+		setGlobalVar(V_RING5_PULLED, 0);
 		playSound(1);
 		sendMessage(_asDoor, 0x4808, 0);
 		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
@@ -1595,7 +1595,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x50C03005);
 
-	if (getGlobalVar(0x0D0A14D10)) {
+	if (getGlobalVar(V_ENTRANCE_OPEN)) {
 		setPalette(0xA30BA329);
 		_palette->addBasePalette(0xA30BA329, 0, 256, 0);
 	} else {
@@ -1689,7 +1689,7 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_surfaceFlag = true;
 	
-	if (getGlobalVar(0xD0A14D10)) {
+	if (getGlobalVar(V_ENTRANCE_OPEN)) {
 		setBackground(0x2800E011);
 		setPalette(0x2800E011);
 		insertStaticSprite(0x492D5AD7, 100);
@@ -1745,7 +1745,7 @@ FontSurface *Scene1005::createFontSurface() {
 	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
 	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
 	fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight);	
-	if (getGlobalVar(0xD0A14D10)) {
+	if (getGlobalVar(V_ENTRANCE_OPEN)) {
 		fontSprite.load2(0x283CE401);
 	} else {
 		fontSprite.load2(0xC6604282);
@@ -1757,71 +1757,71 @@ FontSurface *Scene1005::createFontSurface() {
 uint32 Scene1005::getTextIndex() {
 	uint32 textIndex;
 	textIndex = getTextIndex1();
-	if (getGlobalVar(0xD0A14D10)) {
+	if (getGlobalVar(V_ENTRANCE_OPEN)) {
 		textIndex = getTextIndex2();
 	}
-	if (getGlobalVar(0x8440001F) && getGlobalVar(0x01830201) == textIndex) {
+	if (getGlobalVar(V_TEXT_FLAG1) && getGlobalVar(V_TEXT_INDEX) == textIndex) {
 		textIndex = getTextIndex3();
 	} else {
-		setGlobalVar(0x8440001F, 1);
-		setGlobalVar(0x01830201, textIndex);
+		setGlobalVar(V_TEXT_FLAG1, 1);
+		setGlobalVar(V_TEXT_INDEX, textIndex);
 	}
 	return textIndex;
 }
 
 uint32 Scene1005::getTextIndex1() {
 	uint32 textIndex;
-	if (getGlobalVar(0x98109F12)) {
-		if (!getGlobalVar(0x2090590C))
+	if (getGlobalVar(V_WORLDS_JOINED)) {
+		if (!getGlobalVar(V_DOOR_PASSED))
 			textIndex = 18;
-		else if (!getGlobalVar(0x610210B7))
+		else if (!getGlobalVar(V_ROBOT_TARGET))
 			textIndex = 19;
-		else if (getGlobalVar(0x0C0288F4)) {
-			if (!getGlobalVar(0xD0A14D10))
+		else if (getGlobalVar(V_ROBOT_HIT)) {
+			if (!getGlobalVar(V_ENTRANCE_OPEN))
 				textIndex = 23;
 			else if (!getSubVar(0x0090EA95, 0) && !getSubVar(0x08D0AB11, 0))
 				textIndex = 24;
-			else if (!getGlobalVar(0xC0780812))			
+			else if (!getGlobalVar(V_HAS_FINAL_KEY))			
 				textIndex = 26;
 			else if (!getSubVar(0x0090EA95, 1) && !getSubVar(0x08D0AB11, 1))
 				textIndex = 27;
-			else if (!getGlobalVar(0xC0780812)) 
+			else if (!getGlobalVar(V_HAS_FINAL_KEY)) 
 				textIndex = 28;
 			else				
 				textIndex = 29;
-		} else if (!getGlobalVar(0xE7498218))
+		} else if (!getGlobalVar(V_FELL_DOWN_HOLE))
 			textIndex = 20;
-		else if (!getGlobalVar(0x081890D14))
+		else if (!getGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT))
 			textIndex = 21;
 		else			
 			textIndex = 22;
-	} else if (getGlobalVar(0x00040153)) {
-		if (!getGlobalVar(0x10938830))
+	} else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) {
+		if (!getGlobalVar(V_WALL_BROKEN))
 			textIndex = 12;
 		else if (!getGlobalVar(0x2050861A))
 			textIndex = 13;
-		else if (!getGlobalVar(0x4DE80AC0))
+		else if (!getGlobalVar(V_RING5_PULLED))
 			textIndex = 50;
 		else if (!getGlobalVar(0x89C669AA))
 			textIndex = 14;
-		else if (!getGlobalVar(0x1C1B8A9A))
+		else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM))
 			textIndex = 15;
-		else if (!getGlobalVar(0xCB45DE03))
+		else if (!getGlobalVar(V_BEEN_STATUE_ROOM))
 			textIndex = 16;
 		else 
 			textIndex = 17;
-	} else if (!getGlobalVar(0x2B514304)) {
+	} else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) {
 		textIndex = 0;
 	} else if (getGlobalVar(0x0A18CA33)) {
-		if (!getGlobalVar(0x404290D5))
+		if (!getGlobalVar(V_TILE_PUZZLE_SOLVED))
 			textIndex = 4;
-		else if (!getGlobalVar(0x45080C38))
+		else if (!getGlobalVar(V_HAS_TEST_TUBE))
 			textIndex = 5;
 		else if (!getSubVar(0x14800353, 0x40119852))
 			textIndex = 6;
-		else if (!getGlobalVar(0x4E0BE910))
+		else if (!getGlobalVar(V_WATER_RUNNING))
 			textIndex = 7;
-		else if (!getGlobalVar(0x86615030))
+		else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED))
 			textIndex = 8;
 		else if (!getSubVar(0x14800353, 0x304008D2))
 			textIndex = 9;
@@ -1829,9 +1829,9 @@ uint32 Scene1005::getTextIndex1() {
 			textIndex = 10;
 		else 
 			textIndex = 11;
-	} else if (!getGlobalVar(0x0A310817)) {
+	} else if (!getGlobalVar(V_CREATURE_ANGRY)) {
 		textIndex = 1;
-	} else if (getGlobalVar(0x000CF819)) {
+	} else if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
 		textIndex = 3;
 	} else {
 		textIndex = 2;
@@ -1840,23 +1840,23 @@ uint32 Scene1005::getTextIndex1() {
 }
 
 uint32 Scene1005::getTextIndex2() {
-	uint32 textIndex = getGlobalVar(0x29408F00);
+	uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX1);
 	if (textIndex + 1 >= 10) {
-		setGlobalVar(0x29408F00, 0);
+		setGlobalVar(V_TEXT_COUNTING_INDEX1, 0);
 		textIndex = 0;
 	} else {
-		setGlobalVar(0x29408F00, textIndex + 1);
+		setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1);
 	}
 	return textIndex + 40;
 }
 
 uint32 Scene1005::getTextIndex3() {
-	uint32 textIndex = getGlobalVar(0x8A140C21);
+	uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX2);
 	if (textIndex + 1 >= 10) {
-		setGlobalVar(0x8A140C21, 0);
+		setGlobalVar(V_TEXT_COUNTING_INDEX2, 0);
 		textIndex = 0;
 	} else {
-		setGlobalVar(0x8A140C21, textIndex + 1);
+		setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1);
 	}
 	return textIndex + 30;
 }
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 53ede43..44fe70e 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -76,14 +76,14 @@ void Module1100::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B8460, which);
 		break;
 	case 2:
-		if (getGlobalVar(0x610210B7)) {
+		if (getGlobalVar(V_ROBOT_TARGET)) {
 			createNavigationScene(0x004B84F0, which);
 		} else {
 			createNavigationScene(0x004B8490, which);
 		}
 		break;
 	case 3:
-		if (getGlobalVar(0x610210B7)) {
+		if (getGlobalVar(V_ROBOT_TARGET)) {
 			createNavigationScene(0x004B8580, which);
 		} else {
 			createNavigationScene(0x004B8550, which);
@@ -93,7 +93,7 @@ void Module1100::createScene(int sceneNum, int which) {
 		_childObject = new Scene1105(_vm, this, which);
 		break;
 	case 5:
-		if (getGlobalVar(0x610210B7))
+		if (getGlobalVar(V_ROBOT_TARGET))
 			createSmackerScene(0x04180001, true, false, false);
 		else
 			createSmackerScene(0x04180007, true, false, false);
@@ -135,7 +135,7 @@ void Module1100::updateScene() {
 			break;
 		case 1:
 			_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
-			if (getGlobalVar(0x0C0288F4)) {
+			if (getGlobalVar(V_ROBOT_HIT)) {
 				if (_moduleResult == 0) {
 					createScene(6, -1);
 				} else if (_moduleResult == 1) {
@@ -175,7 +175,7 @@ void Module1100::updateScene() {
 			break;
 		case 5:
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			if (getGlobalVar(0x610210B7)) {
+			if (getGlobalVar(V_ROBOT_TARGET)) {
 				createScene(3, 0);
 			} else {
 				createScene(4, 0);
@@ -372,7 +372,7 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2002:
-		if (getGlobalVar(0x610210B7)) {
+		if (getGlobalVar(V_ROBOT_TARGET)) {
 			startAnimation(0x6B0C0432, 0, -1);
 			playSound(0);
 		} else {
@@ -505,7 +505,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (getSubVar(0x7500993A, 0) == getSubVar(0x61084036, 0) &&
 				getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) &&
 				getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) {
-				setGlobalVar(0x610210B7, 1);
+				setGlobalVar(V_ROBOT_TARGET, 1);
 				playSound(2);
 				_flag3 = true;
 			} else {
@@ -520,7 +520,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (sender == _ssActionButton) {
 				sendMessage(_ssActionButton, 0x480B, 0);
 				_flag1 = false;
-			} else if (!getGlobalVar(0x610210B7)) {
+			} else if (!getGlobalVar(V_ROBOT_TARGET)) {
 				if (sender == _ssSymbol1UpButton) {
 					if (getSubVar(0x61084036, 0) < 9) {
 						incSubVar(0x61084036, 0, +1);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index a20ed94..041be6f 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -60,7 +60,7 @@ void Module1200::createScene(int sceneNum, int which) {
 	case 2:
 		_vm->_soundMan->stopMusic(0x62222CAE, 0, 0);
 		createSmackerScene(0x31890001, true, true, false);
-		setGlobalVar(0x2A02C07B, 1);
+		setGlobalVar(V_CREATURE_EXPLODED, 1);
 		break;
 	}
 	SetUpdateHandler(&Module1200::updateScene);
@@ -74,7 +74,7 @@ void Module1200::updateScene() {
 			if (_moduleResult == 1) {
 				createScene(1, 0);
 			} else if (_moduleResult == 2) {
-				if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) {
+				if (getGlobalVar(0x0A18CA33) && !getGlobalVar(V_CREATURE_EXPLODED)) {
 					createScene(2, -1);
 				} else {
 					leaveModule(1);
@@ -439,7 +439,7 @@ AsScene1201TntManFlame::~AsScene1201TntManFlame() {
 
 void AsScene1201TntManFlame::update() {
 	AnimatedSprite::update();
-	if (getGlobalVar(0x20A0C516)) {
+	if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) {
 		setVisible(true);
 		SetUpdateHandler(&AnimatedSprite::update);
 		_vm->_soundMan->addSound(0x041080A4, 0x460A1050);
@@ -459,7 +459,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene)
 	SetUpdateHandler(&AsScene1201Match::update);
 	SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	switch (getGlobalVar(0x0112090A)) {
+	switch (getGlobalVar(V_MATCH_STATUS)) {
 	case 0:
 		_x = 521;
 		_y = 112;
@@ -522,7 +522,7 @@ uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4806:
 		setVisible(false);
-		setGlobalVar(0x0112090A, 3);
+		setGlobalVar(V_MATCH_STATUS, 3);
 		break;
 	}
 	return messageResult;
@@ -539,7 +539,7 @@ void AsScene1201Match::stOnDoorFrameMoving() {
 }
 
 void AsScene1201Match::stFallingFromDoorFrame() {
-	setGlobalVar(0x0112090A, 2);
+	setGlobalVar(V_MATCH_STATUS, 2);
 	_x -= 199;
 	_y += 119;
 	startAnimation(0x018D0240, 0, -1);
@@ -752,7 +752,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x04063110, 500);
 	topY4 = tempSprite->getY() + 1; 
 
-	_asTntManRope = insertSprite<AsScene1201TntManRope>(getGlobalVar(0x000CF819) && which != 1);
+	_asTntManRope = insertSprite<AsScene1201TntManRope>(getGlobalVar(V_TNT_DUMMY_BUILT) && which != 1);
 	_asTntManRope->setClipRect(0, topY4, 640, 480);
 	
 	insertStaticSprite(0x400B04B0, 1200);
@@ -772,7 +772,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1201>(400, 329);
 		setMessageList(0x004AEC08);
 	} else if (which == 2) {
-		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
 			insertKlayman<KmScene1201>(374, 333);
 			setMessageList(0x004AEC08);
 		} else {
@@ -780,7 +780,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AEC20);
 		}
 	} else if (which == 1) {
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1201>(364, 333);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -795,7 +795,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setClipRect(x1, 0, x2, 480);
 	_klayman->setRepl(64, 0);
 	
-	if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+	if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
 		setBackground(0x4019A2C4);
 		setPalette(0x4019A2C4);
 		_asRightDoor = NULL;
@@ -805,7 +805,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asRightDoor = insertSprite<AsScene1201RightDoor>(_klayman, which == 2);
 	}
 
-	if (getGlobalVar(0x000CF819)) {
+	if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
 		insertStaticSprite(0x10002ED8, 500);
 		if (!getGlobalVar(0x0A18CA33)) {
 			_asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1);
@@ -838,7 +838,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			tntIndex += 3;
 		}
 
-		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
 			setRectList(0x004AEE58);
 		} else {
 			setRectList(0x004AEDC8);
@@ -866,7 +866,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			tntIndex++;
 		}
 
-		if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
 			setRectList(0x004AEE18);
 		} else {
 			setRectList(0x004AED88);
@@ -879,18 +879,18 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asLeftDoor = insertSprite<AsScene1201LeftDoor>(_klayman);
 	_asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480);
 
-	if (getGlobalVar(0x0A310817) && getGlobalVar(0x0112090A) == 0) {
-		setGlobalVar(0x0112090A, 1);
+	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) {
+		setGlobalVar(V_MATCH_STATUS, 1);
 	}
 
 	_asMatch = NULL;
 
-	if (getGlobalVar(0x0112090A) < 3) {
+	if (getGlobalVar(V_MATCH_STATUS) < 3) {
 		_asMatch = insertSprite<AsScene1201Match>(this);
 		_vm->_collisionMan->addSprite(_asMatch);
 	}
 
-	if (getGlobalVar(0x0A310817) && getGlobalVar(0x0A18CA33) == 0) {
+	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(0x0A18CA33) == 0) {
 		_asCreature = insertSprite<AsScene1201Creature>(this, _klayman);
 		_asCreature->setClipRect(x1, 0, x2, 480);
 	}
@@ -902,7 +902,7 @@ Scene1201::~Scene1201() {
 
 void Scene1201::update() {
 	Scene::update();
-	if (_asMatch && getGlobalVar(0x0112090A) == 3)
+	if (_asMatch && getGlobalVar(V_MATCH_STATUS) == 3)
 		deleteSprite(&_asMatch);
 }
 
@@ -927,7 +927,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2001:
-		if (!getGlobalVar(0x0112090A)) {
+		if (getGlobalVar(V_MATCH_STATUS) == 0) {
 			setMessageList2(0x004AECB0);
 		} else {
 			sendEntityMessage(_klayman, 0x1014, _asMatch);
@@ -935,12 +935,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2002:		
-		if (getGlobalVar(0x20A0C516)) {
-			// Move the TNT dummy
+		if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) {
+			// Move the TNT dummy if the fuse is burning
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			setMessageList2(0x004AECF0, false);
-		} else if (getGlobalVar(0x0112090A) == 3) {
-			// Light the TNT dummy
+		} else if (getGlobalVar(V_MATCH_STATUS) == 3) {
+			// Light the TNT dummy if we have the match
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
 			if (_klayman->getX() > _asTntMan->getX()) {
 				setMessageList(0x004AECD0);
@@ -1107,7 +1107,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertStaticSprite(0x8E8419C1, 1100);
 
-	if (getGlobalVar(0x000CF819)) {
+	if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
 		SetMessageHandler(&Scene1202::hmSolved);
 	}
 
@@ -1120,7 +1120,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 Scene1202::~Scene1202() {
 	if (isSolved()) {
-		setGlobalVar(0x000CF819, 1);
+		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 	}
 }
 
@@ -1133,7 +1133,7 @@ void Scene1202::update() {
 	} else if (_counter == 0 && isSolved()) {
 		_clickedIndex = 0;
 		SetMessageHandler(&Scene1202::hmSolved);
-		setGlobalVar(0x000CF819, 1);
+		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 		doPaletteEffect();
 		playSound(3);
 		_soundFlag = true;
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 6533e07..e8cc843 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -305,7 +305,7 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 	createSurface1(0x88148150, 500);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1302Bridge::handleMessage);
-	if (!getGlobalVar(0x13206309)) {
+	if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 		startAnimation(0x88148150, 0, -1);
 		_newStickFrameIndex = 0;
 	} else {
@@ -358,7 +358,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
 	SetMessageHandler(&SsScene1302Fence::handleMessage);
 	SetSpriteUpdate(NULL);
 	_firstY = _y;
-	if (getGlobalVar(0x80101B1E))
+	if (getGlobalVar(V_FLYTRAP_RING_FENCE))
 		_y += 152;
 	loadSound(0, 0x7A00400C);
 	loadSound(1, 0x78184098);
@@ -422,9 +422,9 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
 
 	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 218, 122, _class595->getDrawRect().y, false);
-	_asRing2 = insertSprite<AsScene1002Ring>(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309));
+	_asRing2 = insertSprite<AsScene1002Ring>(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE));
 	_asRing3 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false);
-	_asRing4 = insertSprite<AsScene1002Ring>(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E));
+	_asRing4 = insertSprite<AsScene1002Ring>(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE));
 	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false);
 
 	_asBridge = insertSprite<AsScene1302Bridge>(this);
@@ -456,7 +456,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asInteger() == 0x4A845A00) {
 			sendEntityMessage(_klayman, 0x1014, _asRing1);
 		} else if (param.asInteger() == 0x43807801) {
-			if (!getGlobalVar(0x13206309)) {
+			if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 				sendEntityMessage(_klayman, 0x1014, _asRing2);
 				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) {
 					setMessageList(0x004B0940);
@@ -470,7 +470,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x46C26A01) {
 			sendEntityMessage(_klayman, 0x1014, _asRing3);
 		} else if (param.asInteger() == 0x468C7B11) {
-			if (!getGlobalVar(0x80101B1E)) {
+			if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) {
 				sendEntityMessage(_klayman, 0x1014, _asRing4);
 				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) {
 					setMessageList(0x004B0940);
@@ -484,13 +484,13 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x42845B19) {
 			sendEntityMessage(_klayman, 0x1014, _asRing5);
 		} else if (param.asInteger() == 0x430A6060) {
-			if (getGlobalVar(0x13206309)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 				setMessageList2(0x004B0910);
 			} else {
 				cancelMessageList();
 			}
 		} else if (param.asInteger() == 0x012E2070) {
-			if (getGlobalVar(0x13206309)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 				setMessageList2(0x004B0968);
 			} else {
 				cancelMessageList();
@@ -525,12 +525,12 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 			playSound(0, 0x665198C0);
 		} else if (sender == _asRing2) {
 			sendMessage(_asBridge, 0x4808, 0);
-			setGlobalVar(0x13206309, 1);
+			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
 		} else if (sender == _asRing3) {
 			playSound(0, 0xE2D389C0);
 		} else if (sender == _asRing4) {
 			sendMessage(_ssFence, 0x4808, 0);
-			setGlobalVar(0x80101B1E, 1);
+			setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
 		} else if (sender == _asRing5) {
 			playSound(0, 0x40428A09);
 		}
@@ -538,13 +538,13 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x4807:
 		if (sender == _asRing2) {
 			sendMessage(_asBridge, 0x4809, 0);
-			setGlobalVar(0x13206309, 0);
+			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 0);
 			_sprite2->setVisible(false);
 		} else if (sender == _asRing4) {
 			sendMessage(_ssFence, 0x4809, 0);
-			setGlobalVar(0x80101B1E, 0);
+			setGlobalVar(V_FLYTRAP_RING_FENCE, 0);
 		} else if (sender == _asVenusFlyTrap) {
-			if (getGlobalVar(0x13206309)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 				sendMessage(_asRing2, 0x4807, 0);
 			} else {
 				sendMessage(_asRing4, 0x4807, 0);
@@ -555,11 +555,11 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _asRing2) {
 			playSound(0, 0x60755842);
 			sendMessage(_asBridge, 0x4808, 0);
-			setGlobalVar(0x13206309, 1);
+			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
 		} else if (sender == _asRing4) {
 			playSound(0, 0x60755842);
 			sendMessage(_ssFence, 0x4808, 0);
-			setGlobalVar(0x80101B1E, 1);
+			setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
 		}
 		break;
 	case 0x482A:
@@ -639,7 +639,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x01581A9C);
 	insertMouse433(0x81A9801D);
 
-	if (!getGlobalVar(0xAC00C0D0)) {
+	if (!getGlobalVar(V_BALLOON_POPPED)) {
 		_asBalloon = insertSprite<AsScene1303Balloon>(this);
 		_vm->_collisionMan->addSprite(_asBalloon);
 	}
@@ -657,11 +657,11 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
-		setGlobalVar(0xAC00C0D0, 1);
+		setGlobalVar(V_BALLOON_POPPED, 1);
 		sendMessage(_asBalloon, 0x2000, 0);
 		break;
 	case 0x4826:
-		if (sender == _asBalloon && getGlobalVar(0x31C63C51)) {
+		if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) {
 			setMessageList(0x004AF9B8);
 		}
 		break;
@@ -684,7 +684,7 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &para
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setGlobalVar(0x31C63C51, 1);
+		setGlobalVar(V_HAS_NEEDLE, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 		break;
@@ -703,7 +703,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x062C0214);
 	insertMouse433(0xC021006A);
 	
-	if (getGlobalVar(0xAC00C0D0)) {
+	if (getGlobalVar(V_BALLOON_POPPED)) {
 		_asKey = insertSprite<AsCommonKey>(this, 0, 1100, 278, 347);
 		_vm->_collisionMan->addSprite(_asKey);
 	} else {
@@ -711,7 +711,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 		// TODO _asKey->setUpdateDeltaXY();
 	}
 
-	if (!getGlobalVar(0x31C63C51)) {
+	if (!getGlobalVar(V_HAS_NEEDLE)) {
 		_asNeedle = insertSprite<AsScene1304Needle>(this, 1100, 278, 347);
 		_vm->_collisionMan->addSprite(_asNeedle);
 	} else {
@@ -739,7 +739,7 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x415634A4) {
-			if (getGlobalVar(0xAC00C0D0)) {
+			if (getGlobalVar(V_BALLOON_POPPED)) {
 				cancelMessageList();
 			} else {
 				setMessageList(0x004B9158);
@@ -874,8 +874,8 @@ void AsScene1306Elevator::cbGoingDownEvent() {
 Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
-		setGlobalVar(0x13382860, 4);
+	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
+		setGlobalVar(V_KEY3_LOCATION, 4);
 	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene1306::handleMessage);
@@ -884,7 +884,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x05303114);
 	insertMouse433(0x0311005B);
 
-	if (getGlobalVar(0x13382860) == 4) {
+	if (getGlobalVar(V_KEY3_LOCATION) == 4) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 435, 445);
 		_vm->_collisionMan->addSprite(_asKey);
 	}
@@ -915,7 +915,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 2) {
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1306>(515, 440);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -955,7 +955,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 	
 Scene1306::~Scene1306() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1320,7 +1320,7 @@ void Scene1307::update() {
 	}
 	if (_doLeaveScene && !isSoundPlaying(0)) {
 		leaveScene(1);
-		setGlobalVar(0x80455A41, 1);
+		setGlobalVar(V_KEYDOOR_UNLOCKED, 1);
 	} 
 }
 
@@ -1593,7 +1593,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asTape = insertSprite<AsScene1201Tape>(this, 17, 1100, 502, 445, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 
-	if (getGlobalVar(0x01023818)) {
+	if (getGlobalVar(V_MOUSE_SUCKED_IN)) {
 		insertSprite<AsScene1308Mouse>();
 		insertSprite<AnimatedSprite>(0x461A1490, 200, 235, 429);
 	}
@@ -1613,7 +1613,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		insertKlayman<KmScene1308>(380, 440);
 		setMessageList(0x004B57C0);
-		if (getGlobalVar(0x80455A41)) {
+		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			setRectList(0x004B5990);
 		} else {
@@ -1623,7 +1623,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 1) {
 		insertKlayman<KmScene1308>(640, 440);
 		setMessageList(0x004B57C8);
-		if (getGlobalVar(0x80455A41)) {
+		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			setRectList(0x004B5990);
 		} else {
@@ -1633,7 +1633,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 2) {
 		insertKlayman<KmScene1308>(475, 440);
 		setMessageList(0x004B58B0);
-		if (getGlobalVar(0x80455A41)) {
+		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
 			_sprite5 = insertSprite<AsScene1308KeyboardDoor>(this);
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			_sprite4->setVisible(false);
@@ -1646,7 +1646,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B57D0);
 		sendMessage(_asJaggyDoor, 0x4808, 0);
 		_sprite1->setVisible(false);
-		if (getGlobalVar(0x80455A41)) {
+		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
 			_sprite4 = insertStaticSprite(0x0101A624, 1100);
 			_klayman->setVisible(false);
 		} else {
@@ -1661,7 +1661,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 	}
 
-	if (getGlobalVar(0x04A105B3) == 4) {
+	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_asProjector);
 		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
@@ -1681,7 +1681,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 			_flag1 = true;
 		} else if (param.asInteger() == 0x08821382) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
-			if (getGlobalVar(0x80455A41)) {
+			if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
 				setRectList(0x004B5990);
 			} else {
 				setRectList(0x004B5980);
@@ -1703,7 +1703,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		if (getGlobalVar(0x80455A41)) {
+		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
 			setRectList(0x004B5990);
 		} else {
 			setRectList(0x004B5980);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 9cfb826..d207428 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -387,19 +387,18 @@ static const AsCommonProjectorItem kAsCommonProjectorItems[] = {
 AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) {
 
-	_asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(0x04A105B3)];
+	_asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)];
 	// TODO createSurface3(990, dword_4B26D8);
 	createSurface(990, 640, 480); //TODO: Remeove once the line above is done
 	startAnimation(0x10E3042B, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsCommonProjector::handleMessage);
-	_x = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
+	_x = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
 	_lockedInSlot = true;
 	moveProjector();
 	setDoDeltaX(1);
-	if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) {
+	if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
 		stStayLockedInSlot();
-	}
 	loadSound(2, 0xC8C2507C);
 }
 
@@ -415,8 +414,8 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
 		messageResult = 1;
 		break;
 	case 0x4807:
-		setGlobalVar(0x04A10F33, (_x - _asProjectorItem->point.x) / 108);
-		if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) {
+		setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108);
+		if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) {
 			stStartLockedInSlot();
 		} else {
 			stIdle();
@@ -424,20 +423,20 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) {
-				incGlobalVar(0x04A10F33, 1);
+			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) {
+				incGlobalVar(V_PROJECTOR_SLOT, 1);
 			}
-		} else if (getGlobalVar(0x04A10F33) > 0) {
-			incGlobalVar(0x04A10F33, -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(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0;
+			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
 		} else {
-			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
+			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
 		}
 		break;
 	case 0x482A:
@@ -471,20 +470,20 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) {
-				incGlobalVar(0x04A10F33, 1);
+			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) {
+				incGlobalVar(V_PROJECTOR_SLOT, 1);
 			}
-		} else if (getGlobalVar(0x04A10F33) > 0) {
-			incGlobalVar(0x04A10F33, -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(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0;
+			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
 		} else {
-			messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0;
+			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
 		}
 		break;
 	case 0x480F:
@@ -517,14 +516,14 @@ void AsCommonProjector::suMoving() {
 		_x = _klayman->getX() + 100;
 	moveProjector();
 	if (_beforeMoveX == _x) {
-		if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->leftBorderLeaves != 0) {
+		if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) {
 			sendMessage(_parentScene, 0x1019, 0);
-			incGlobalVar(0x04A105B3, -1);
-			setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].maxSlotCount);
-		} else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 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(0x04A105B3, +1);
-			setGlobalVar(0x04A10F33, 0);
+			incGlobalVar(V_PROJECTOR_LOCATION, +1);
+			setGlobalVar(V_PROJECTOR_SLOT, 0);
 		}
 	}
 	Sprite::processDelta();
@@ -579,7 +578,7 @@ void AsCommonProjector::stIdle() {
 }
 
 void AsCommonProjector::stMoving() {
-	_beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
+	_beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
 	startAnimation(0x14A10137, 0, -1);
 	SetSpriteUpdate(&AsCommonProjector::suMoving);
 	SetMessageHandler(&AsCommonProjector::handleMessage);
@@ -604,7 +603,7 @@ void AsCommonProjector::stStartProjecting() {
 	SetMessageHandler(&AsCommonProjector::hmAnimation);
 	SetSpriteUpdate(NULL);
 	NextState(&AsCommonProjector::stLockedInSlot);
-	setGlobalVar(0x12A10DB3, 1);
+	setGlobalVar(V_PROJECTOR_ACTIVE, 1);
 	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->addSound(0x05331081, 0xCE428854);
 	_vm->_soundMan->playSoundLooping(0xCE428854);
@@ -622,13 +621,13 @@ void AsCommonProjector::stStopProjecting() {
 	SetSpriteUpdate(NULL);
 	SetMessageHandler(&AsCommonProjector::hmAnimation);
 	NextState(&AsCommonProjector::stStayLockedInSlot);
-	setGlobalVar(0x12A10DB3, 0);
+	setGlobalVar(V_PROJECTOR_ACTIVE, 0);
 	playSound(0, 0xCC4A8456);
 	_vm->_soundMan->deleteSound(0xCE428854);
 }
 
 void AsCommonProjector::stTurnToFront() {
-	_beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x;
+	_beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x;
 	startAnimation(0x22CB4A33, 0, -1);
 	SetSpriteUpdate(&AsCommonProjector::suMoving);
 	SetMessageHandler(&AsCommonProjector::hmAnimation);
@@ -636,8 +635,8 @@ void AsCommonProjector::stTurnToFront() {
 }
 
 void AsCommonProjector::stStartSuckedIn() {
-	setGlobalVar(0x04A105B3, 4);
-	setGlobalVar(0x04A10F33, 0);
+	setGlobalVar(V_PROJECTOR_LOCATION, 4);
+	setGlobalVar(V_PROJECTOR_SLOT, 0);
 	SetSpriteUpdate(&AsCommonProjector::stSuckedIn);
 	SetMessageHandler(&Sprite::handleMessage);
 	startAnimation(0x708D4712, 0, -1);
@@ -661,7 +660,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x980F3124, 0x12192892, 100, 0);
 	_asPipe = insertSprite<AsScene1401Pipe>();
 
-	if (!getGlobalVar(0x01023818)) {
+	if (!getGlobalVar(V_MOUSE_SUCKED_IN)) {
 		_asMouse = insertSprite<AsScene1401Mouse>();
 		_asCheese = insertSprite<AsScene1401Cheese>();
 	}
@@ -691,15 +690,15 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite1->setVisible(false);
 	}
 
-	if (getGlobalVar(0x04A105B3) == 2) {
+	if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, _asPipe);
 		_vm->_collisionMan->addSprite(_asProjector);
-		if (getGlobalVar(0x04A10F33) == 6) {
+		if (getGlobalVar(V_PROJECTOR_SLOT) == 6) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B6670);
-		} else if (getGlobalVar(0x04A10F33) == 0) {
+		} else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
 			_klayman->processDelta();
@@ -754,10 +753,10 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x480B:
 		if (sender == _ssFloorButton) {
 			sendMessage(_asPipe, 0x2000, 0);
-			if (!getGlobalVar(0x01023818)) {
+			if (!getGlobalVar(V_MOUSE_SUCKED_IN)) {
 				sendMessage(_asMouse, 0x4839, 0);
 				sendMessage(_asCheese, 0x4839, 0);
-				setGlobalVar(0x01023818, 1);
+				setGlobalVar(V_MOUSE_SUCKED_IN, 1);
 			}
 			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504)
 				sendMessage(_asProjector , 0x4839, 0);
@@ -880,7 +879,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssBridgePart2 = insertSprite<SsScene1402BridgePart>(0x10A02120, 1100);
 	_ssBridgePart3 = insertSprite<SsScene1402BridgePart>(0x60882BE0, 1100);
 
-	if (getGlobalVar(0x70A1189C))
+	if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
 		setRectList(0x004B0C48);
 	else
 		setRectList(0x004B0C98);
@@ -888,7 +887,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B48);
-		if (!getGlobalVar(0x70A1189C)) {
+		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
 			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
 		}
 	} else if (which == 1) {
@@ -898,7 +897,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B60);
 		_klayman->setDoDeltaX(1);
-		if (getGlobalVar(0x70A1189C)) {
+		if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
 			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 1);
 			clearRectList();
 			showMouse(false);
@@ -909,7 +908,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else {
 		insertKlayman<KmScene1402>(513, 391);
 		setMessageList(0x004B0B58);
-		if (!getGlobalVar(0x70A1189C)) {
+		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
 			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 2);
 			startShaking();
 		}
@@ -959,7 +958,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x00F43389) {
-			if (getGlobalVar(0x70A1189C)) {
+			if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
 				leaveScene(0);
 			} else {
 				clearRectList();
@@ -1301,7 +1300,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2000:
 		// The mouse got the cheese (nomnom)
-		setGlobalVar(0x70A1189C, 1);
+		setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1);
 		playSound(0, 0x68E25540);
 		showMouse(false);
 		_puzzleSolvedCountdown = 72;
@@ -1348,10 +1347,10 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	_klayman->setRepl(64, 0);
 
-	if (getGlobalVar(0x04A105B3) == 4) {
+	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_asProjector);
-		if (getGlobalVar(0x04A10F33) == 4) {
+		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
 			_klayman->processDelta();
@@ -1425,8 +1424,8 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) {
 	
-	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
-		setGlobalVar(0x13382860, 5);
+	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
+		setGlobalVar(V_KEY3_LOCATION, 5);
 	
 	SetMessageHandler(&Scene1404::handleMessage);
 	_surfaceFlag = true;
@@ -1438,7 +1437,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette(0x00801510, 0, 65, 0);
 	insertMouse433(0xB006BAC8);
 
-	if (getGlobalVar(0x13382860) == 5) {
+	if (getGlobalVar(V_KEY3_LOCATION) == 5) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 267, 411);
 		_vm->_collisionMan->addSprite(_asKey);
 	}
@@ -1455,7 +1454,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1404>(376, 406);
 		setMessageList(0x004B8C30);
 	} else if (which == 2) {
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1404>(347, 406);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -1467,10 +1466,10 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B8C38);
 	}
 
-	if (getGlobalVar(0x04A105B3) == 3) {
+	if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_asProjector);
-		if (getGlobalVar(0x04A10F33) == 0) {
+		if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
 			_klayman->processDelta();
@@ -1484,7 +1483,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1404::~Scene1404() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 5d0207b..f45f87f 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -95,17 +95,17 @@ void Module1600::createScene(int sceneNum, int which) {
 		_childObject = new Scene1609(_vm, this, which);
 		break;
 	case 1001:
-		if (getGlobalVar(0xA0808898) == 1) {
+		if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) {
 			createSmackerScene(0x80050200, true, true, false);
-		} else if (getGlobalVar(0xA0808898) == 2) {
+		} else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) {
 			createSmackerScene(0x80090200, true, true, false);
 		} else {
 			createSmackerScene(0x80000200, true, true, false);
 		}
-		if (getGlobalVar(0xA0808898) >= 2)
-			setGlobalVar(0xA0808898, 0);
+		if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2)
+			setGlobalVar(V_TALK_COUNTING_INDEX, 0);
 		else
-			incGlobalVar(0xA0808898, +1);			
+			incGlobalVar(V_TALK_COUNTING_INDEX, +1);			
 		break;
 	}
 	SetUpdateHandler(&Module1600::updateScene);
@@ -210,13 +210,13 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	_rectList = NULL;
 	
 	startAnimation(0xD4220027, 0, -1);
-	setDoDeltaX(getGlobalVar(0x21E60190));
+	setDoDeltaX(getGlobalVar(V_CAR_DELTA_X));
 
 }
 
 AsCommonCar::~AsCommonCar() {
 	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::sub45D620)) {
-		setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190));
+		setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X));
 	}
 }
 
@@ -548,7 +548,7 @@ void AsCommonCar::sub45D100() {
 	} else {
 		startAnimation(0xD4220027, 0, -1);
 	}
-	setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0);
+	setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0);
 }
 
 void AsCommonCar::sub45D180() {
@@ -1068,7 +1068,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		the upper/lower floors and rename them accordingly.
 	*/
 	
-	setGlobalVar(0x21E60190, 1);
+	setGlobalVar(V_CAR_DELTA_X, 1);
 	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene1608::hmLowerFloor);
@@ -1127,7 +1127,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
 		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
 		_asCar->setVisible(false);
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1608>(373, 220);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -1204,7 +1204,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1608::~Scene1608() {
-	setGlobalVar(0xC0418A02, _kmScene1608->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0);
 	if (_klaymanInCar) {
 		delete _kmScene1608;
 	} else {
@@ -1388,7 +1388,7 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
 
 	// TODO _vm->gameModule()->initScene3011Vars();
-	_noisySymbolIndex = getGlobalVar(0x2414C2F2);
+	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
 	
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene1609::handleMessage);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index b75167f..f6d140b 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -186,7 +186,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 	
-	setGlobalVar(0xE7498218, 1);
+	setGlobalVar(V_FELL_DOWN_HOLE, 1);
 	_vm->gameModule()->initScene3009Vars();
 
 	SetMessageHandler(&Scene1705::handleMessage);
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 5bb03d4..7925c46 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -101,9 +101,9 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertStaticSprite(0x42213133, 1100);
 	
-	if (!getGlobalVar(0xA9035F60)) {
+	if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
 		insertStaticSprite(0x40A40168, 100);
-	} else if (getGlobalVar(0x09221A62)) {
+	} else if (getGlobalVar(V_STAIRS_DOWN)) {
 		insertStaticSprite(0x124404C4, 100);
 		setGlobalVar(0x2050861A, 1);
 	} else {
@@ -195,10 +195,10 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 	_symbolFlag1 = 0;
 	_symbolFlag2 = 0;
 	
-	if (getGlobalVar(0xA9035F60)) {
+	if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
 		_isPluggedIn = true;
 		_currPositionIndex = elementIndex;
-		if (!getGlobalVar(0x09221A62)) {
+		if (!getGlobalVar(V_STAIRS_DOWN)) {
 			_x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x;
 			_y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y;
 		} else {
@@ -325,7 +325,7 @@ void AsScene1907Symbol::suMoveDown() {
 
 void AsScene1907Symbol::suMoveUp() {
 	_y -= _yIncr;
-	if (getGlobalVar(0x10938830)) {
+	if (getGlobalVar(V_WALL_BROKEN)) {
 		if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) {
 			_yIncr--;
 		} else {
@@ -470,8 +470,8 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
 	loadSound(0, 0x44061000);
 	SetUpdateHandler(&SsScene1907UpDownButton::update);
 	SetMessageHandler(&SsScene1907UpDownButton::handleMessage);
-	if (getGlobalVar(0xA9035F60)) {
-		if (getGlobalVar(0x09221A62))
+	if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
+		if (getGlobalVar(V_STAIRS_DOWN))
 			setToDownPosition();
 		else
 			setToUpPosition();
@@ -490,7 +490,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) {
+		if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
 			setVisible(true);
 			_countdown1 = 4;
 			StaticSprite::update();
@@ -582,7 +582,7 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1907::handleMessage);
 	SetUpdateHandler(&Scene1907::update);
 
-	if (getGlobalVar(0xA9035F60))
+	if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED))
 		_pluggedInCount = 9;
 		
 	loadSound(0, 0x72004A10);
@@ -640,20 +640,20 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	// TODO Debug stuff
 	case 0x2000:
-		if (getGlobalVar(0x09221A62)) {
+		if (getGlobalVar(V_STAIRS_DOWN)) {
 			playSound(0);
 			for (int i = 0; i < 9; i++)
 				_asSymbols[i]->moveUp();
 			_ssUpDownButton->setToUpPosition();
-			setGlobalVar(0x09221A62, 0);
+			setGlobalVar(V_STAIRS_DOWN, 0);
 		} else {
-			if (!getGlobalVar(0x10938830)) {
+			if (!getGlobalVar(V_WALL_BROKEN)) {
 				playSound(2);
 				_countdown3 = 5;
 			} else {
 				playSound(1);
 				_ssUpDownButton->setToDownPosition();
-				setGlobalVar(0x09221A62, 1);
+				setGlobalVar(V_STAIRS_DOWN, 1);
 			}
 			_moveDownCountdown = 1;
 			_currMovingSymbolIndex = 8;
@@ -661,7 +661,7 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2001:
 		playSound(3);
-		setGlobalVar(0xA9035F60, 1);
+		setGlobalVar(V_STAIRS_PUZZLE_SOLVED, 1);
 		break;
 	}	
 	return 0;
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 6ff8a40..befcc34 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -51,10 +51,10 @@ void Module2000::createScene(int sceneNum, int which) {
 		_childObject = new Scene2001(_vm, this, which);
 		break;
 	case 1:
-		createNavigationScene(getGlobalVar(0x98109F12) ? 0x004B7B48 : 0x004B7B00, which);
+		createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which);
 		break;
 	case 2:
-		setGlobalVar(0x98109F12, 1);
+		setGlobalVar(V_WORLDS_JOINED, 1);
 		setSubVar(0x2C145A98, 1, 1);
 		createSmackerScene(0x204B2031, true, true, false);
 		break;
@@ -75,7 +75,7 @@ void Module2000::updateScene() {
 			break;
 		case 1:
 			if (_moduleResult == 0) {
-				if (getGlobalVar(0x98109F12)) {
+				if (getGlobalVar(V_WORLDS_JOINED)) {
 					createScene(1, 0);
 				} else {
 					createScene(2, -1);
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 44ef868..700f0cd 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -65,7 +65,7 @@ void Module2100::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			if (_moduleResult == 1) {
-				setGlobalVar(0x2090590C, 1);
+				setGlobalVar(V_DOOR_PASSED, 1);
 				leaveModule(0);
 			} else {
 				leaveModule(1);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 29b4103..503a1d3 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -200,13 +200,13 @@ void Module2200::createScene(int sceneNum, int which) {
 		_childObject = new Scene2247(_vm, this, which);
 		break;
 	case 47:
-		if (!getGlobalVar(0x98109F12)) {
-			if (getGlobalVar(0x4D080E54))
+		if (!getGlobalVar(V_WORLDS_JOINED)) {
+			if (getGlobalVar(V_LIGHTS_ON))
 				createStaticScene(0x83110287, 0x10283839);
 			else
 				createStaticScene(0x83412B9D, 0x12B9983C);
 		} else {
-			if (getGlobalVar(0x4D080E54))
+			if (getGlobalVar(V_LIGHTS_ON))
 				createStaticScene(0x48632087, 0x3208348E);
 			else
 				createStaticScene(0x08C74886, 0x74882084);
@@ -533,7 +533,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[1].x2 = 640;
 	_clipRects[1].y2 = 480;
 	
-	if (!getGlobalVar(0x404290D5)) {
+	if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
 		insertStaticSprite(0x00026027, 900);
 	}
 	
@@ -560,7 +560,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B8130);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else if (which == 2) {
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene2201>(379, 427, _clipRects, 2);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -582,7 +582,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2201::~Scene2201() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 	_vm->_soundMan->deleteSoundGroup(0x04106220);
 }
 
@@ -607,7 +607,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 				setMessageList(0x004B81B8);
 			} 
 		} else if (param.asInteger() == 0x51445010) {
-			if (getGlobalVar(0x404290D5)) {
+			if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
 				setMessageList(0x004B8108);
 			} else {
 				setMessageList(0x004B8150);
@@ -615,7 +615,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x1D203082) {
 			setMessageList(0x004B8180);
 		} else if (param.asInteger() == 0x00049091) {
-			if (getGlobalVar(0x404290D5)) {
+			if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
 				setMessageList(0x004B8138);
 			} else {
 				setMessageList(0x004B8108);
@@ -707,7 +707,7 @@ uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam &
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (!_isMoving && !getGlobalVar(0x404290D5)) {
+		if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
 			sendMessage(_parentScene, 0x2000, _tileIndex);
 		}
 		messageResult = 1;
@@ -956,7 +956,7 @@ void Scene2202::update() {
 		_ssDoneMovingTile = NULL;
 		if (testIsSolved()) {
 			playSound(0);
-			setGlobalVar(0x404290D5, 1);
+			setGlobalVar(V_TILE_PUZZLE_SOLVED, 1);
 			_isSolved = true;
 		}
 	}
@@ -1061,7 +1061,7 @@ AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint d
 	_x = 320;
 	_y = 240;
 	createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900);
-	if (getGlobalVar(0x9A500914) == _doorIndex) {
+	if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) {
 		startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1);
 		_newStickFrameIndex = -2;
 	} else {
@@ -1074,7 +1074,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (_doorIndex == getGlobalVar(0x9A500914))
+		if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER))
 			sendMessage(_parentScene, 0x2002, 0);
 		else
 			sendMessage(_parentScene, 0x2001, 0);
@@ -1084,12 +1084,12 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam &param,
 		_otherDoor = (Sprite*)param.asEntity();
 		break;
 	case 0x3002:
-		if (_doorIndex == getGlobalVar(0x9A500914))
+		if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER))
 			sendMessage(_parentScene, 0x4808, 0);
 		stopAnimation();
 		break;
 	case 0x4808:
-		setGlobalVar(0x9A500914, _doorIndex);
+		setGlobalVar(V_LARGE_DOOR_NUMBER, _doorIndex);
 		sendMessage(_otherDoor, 0x4809, 0);
 		openDoor();
 		break;
@@ -1115,8 +1115,8 @@ void AsScene2203Door::closeDoor() {
 Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
-		setGlobalVar(0x13382860, 1);
+	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
+		setGlobalVar(V_KEY3_LOCATION, 1);
 
 	SetMessageHandler(&Scene2203::handleMessage);
 	_surfaceFlag = true;
@@ -1127,9 +1127,9 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setHitRects(0x004B8320);
 
-	//DEBUG setGlobalVar(0x13382860, 1);//###//TODO CHECK IF Below...
+	//DEBUG setGlobalVar(V_KEY3_LOCATION, 1);//###//TODO CHECK IF Below...
 
-	if (getGlobalVar(0x13382860) == 1) {
+	if (getGlobalVar(V_KEY3_LOCATION) == 1) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 282, 432);
 		_vm->_collisionMan->addSprite(_asKey);
 	}
@@ -1159,7 +1159,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene2203>(640, 427);
 		setMessageList(0x004B8350);
 	} else if (which == 2) {
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene2203>(362, 427);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -1171,7 +1171,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B8348);
 	}
 
-	if (getGlobalVar(0x9A500914)) {
+	if (getGlobalVar(V_LARGE_DOOR_NUMBER)) {
 		_ssSmallLeftDoor->setVisible(false);
 		_klayman->setClipRect(_rightDoorClipRect);
 	} else {
@@ -1184,7 +1184,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2203::~Scene2203() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1238,7 +1238,7 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 
 	SetMessageHandler(&SsScene2205DoorFrame::handleMessage);
-	_spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0);
+	_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
 	createSurface(1100, 45, 206);
 	_drawRect.x = 0;
 	_drawRect.y = 0;
@@ -1254,7 +1254,7 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
-		_spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0);
+		_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
 		_drawRect.x = 0;
 		_drawRect.y = 0;
 		_drawRect.width = _spriteResource.getDimensions().width;
@@ -1276,7 +1276,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	setHitRects(0x004B0620);
 	_surfaceFlag = true;
 
-	if (getGlobalVar(0x4D080E54)) {
+	if (getGlobalVar(V_LIGHTS_ON)) {
 		_isLightOn = true;
 		setBackground(0x0008028D);
 		setPalette(0x0008028D);
@@ -1299,14 +1299,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		insertKlayman<KmScene2205>(320, 417);
 		setMessageList(0x004B0658);
-		if (!getGlobalVar(0x4D080E54)) {
+		if (!getGlobalVar(V_LIGHTS_ON)) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
 		}
 		_isKlaymanInLight = false;
 	} else if (which == 1) {
 		insertKlayman<KmScene2205>(640, 417);
 		setMessageList(0x004B0648);
-		if (!getGlobalVar(0x4D080E54)) {
+		if (!getGlobalVar(V_LIGHTS_ON)) {
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
 		}
 		_isKlaymanInLight = false;
@@ -1326,14 +1326,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene2205::update() {
 	Scene::update();
 
-	if (!_isLightOn && getGlobalVar(0x4D080E54)) {
+	if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) {
 		_palette->addPalette(0x0008028D, 0, 256, 0);
 		changeBackground(0x0008028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030);
 		sendMessage(_ssDoorFrame, 0x2000, 0);
 		changeMouseCursor(0x80289008);
 		_isLightOn = true;
-	} else if (_isLightOn && !getGlobalVar(0x4D080E54)) {
+	} else if (_isLightOn && !getGlobalVar(V_LIGHTS_ON)) {
 		_palette->addPalette(0xD00A028D, 0, 256, 0);
 		changeBackground(0xD00A028D);
 		_ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84);
@@ -1347,7 +1347,7 @@ void Scene2205::update() {
 		_isLightOn = false;
 	}
 
-	if (!getGlobalVar(0x4D080E54)) {
+	if (!getGlobalVar(V_LIGHTS_ON)) {
 		if (_isKlaymanInLight && _klayman->getX() > 85) {
 			_palette->addBasePalette(0x68033B1C, 0, 65, 0);
 			_palette->startFadeToPalette(12);
@@ -1374,7 +1374,7 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x480B:
-		setGlobalVar(0x4D080E54, getGlobalVar(0x4D080E54) ? 0 : 1);
+		setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1);
 		break;
 	}
 	return 0;
@@ -1409,7 +1409,7 @@ static const int16 kAsScene2206DoorSpikesXDeltasClose[] = {
 AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash)
 	: StaticSprite(vm, fileHash, 200) {
 	
-	if (getGlobalVar(0x18890C91))
+	if (getGlobalVar(V_SPIKES_RETRACTED))
 		_x -= 63;
 	SetUpdateHandler(&AsScene2206DoorSpikes::update);
 	SetMessageHandler(&AsScene2206DoorSpikes::handleMessage);
@@ -1493,7 +1493,7 @@ void AsScene2206Platform::suMoveDown() {
 SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash)
 	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) {
 
-	if (getGlobalVar(0x45080C38)) {
+	if (getGlobalVar(V_HAS_TEST_TUBE)) {
 		setVisible(false);
 		SetMessageHandler(NULL);
 	} else {
@@ -1511,7 +1511,7 @@ uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &pa
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setGlobalVar(0x45080C38, 1);
+		setGlobalVar(V_HAS_TEST_TUBE, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 		break;
@@ -1528,7 +1528,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2206::handleMessage);
 	_surfaceFlag = true;
 	
-	if (getGlobalVar(0x4D080E54)) {
+	if (getGlobalVar(V_LIGHTS_ON)) {
 		fileHash = 0x41983216;
 		_sprite1 = insertStaticSprite(0x2201266A, 100);
 		_sprite2 = insertStaticSprite(0x3406A333, 300);
@@ -1563,7 +1563,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_palette->addBasePalette(fileHash, 0, 256, 0);
 
-	if (!getGlobalVar(0x4D080E54)) {
+	if (!getGlobalVar(V_LIGHTS_ON)) {
 		_palette->addPalette(0x0263D144, 0, 65, 0);
 	}
 	
@@ -1578,12 +1578,12 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 2) {
 		insertKlayman<KmScene2206>(205, 396);
 		setMessageList(0x004B88C8);
-		_palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
+		_palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
 		klaymanBehindSpikes();
 		playSound(0, 0x53B8284A);
 	} else if (which == 3) {
-		insertKlayman<KmScene2206>(kScene2206XPositions[getGlobalVar(0x48A68852)], 430);
-		if (getGlobalVar(0xC0418A02))
+		insertKlayman<KmScene2206>(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430);
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B8A70);
 	} else {
@@ -1597,7 +1597,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2206::~Scene2206() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1609,7 +1609,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (param.asInteger() == 0x402064D8) {
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
 		} else if (param.asInteger() == 0x11C40840) {
-			if (getGlobalVar(0x18890C91))
+			if (getGlobalVar(V_SPIKES_RETRACTED))
 				setMessageList(0x004B8948);
 			else
 				setMessageList(0x004B8970);
@@ -1620,8 +1620,8 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
-			setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1);
-			if (getGlobalVar(0x18890C91))
+			setGlobalVar(V_SPIKES_RETRACTED, getGlobalVar(V_SPIKES_RETRACTED) ? 0 : 1);
+			if (getGlobalVar(V_SPIKES_RETRACTED))
 				sendMessage(_asDoorSpikes, 0x4808, 0);
 			else
 				sendMessage(_asDoorSpikes, 0x4809, 0);
@@ -1642,7 +1642,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 void Scene2206::klaymanInFrontSpikes() {
-	if (getGlobalVar(0x4D080E54)) {
+	if (getGlobalVar(V_LIGHTS_ON)) {
 		_palette->addBasePalette(0x41983216, 0, 65, 0);
 		_palette->startFadeToPalette(12);
 	}
@@ -1654,7 +1654,7 @@ void Scene2206::klaymanInFrontSpikes() {
 }
 
 void Scene2206::klaymanBehindSpikes() {
-	if (!getGlobalVar(0x4D080E54)) {
+	if (!getGlobalVar(V_LIGHTS_ON)) {
 		_palette->addBasePalette(0xB103B604, 0, 65, 0);
 		_palette->startFadeToPalette(12);
 	}
@@ -1666,16 +1666,16 @@ void Scene2206::klaymanBehindSpikes() {
 }
 
 void Scene2206::readClickedColumn() {
-	setGlobalVar(0x48A68852, (_mouseClickPos.x - 354) / 96);
-	if (getGlobalVar(0x48A68852) > 2)
-		setGlobalVar(0x48A68852, 2);
-	setGlobalVar(0x49C40058, (_mouseClickPos.y - 183) / 7);
-	setGlobalVar(0xC8C28808, calcHash("stLineagex"));
-	setGlobalVar(0x4CE79018, 0);
-	if (ABS(kScene2206XPositions[getGlobalVar(0x48A68852)] - _klayman->getX()) >= 144) {
-		setMessageList2(kScene2206MessageIds1[getGlobalVar(0x48A68852)]);
+	setGlobalVar(V_CLICKED_COLUMN_INDEX, (_mouseClickPos.x - 354) / 96);
+	if (getGlobalVar(V_CLICKED_COLUMN_INDEX) > 2)
+		setGlobalVar(V_CLICKED_COLUMN_INDEX, 2);
+	setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7);
+	setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex"));
+	setGlobalVar(V_COLUMN_BACK_NAME, 0);
+	if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144) {
+		setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]);
 	} else {
-		setMessageList2(kScene2206MessageIds2[getGlobalVar(0x48A68852)]);
+		setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]);
 	}
 }
 
@@ -1705,7 +1705,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene
 	_x = pt.x;
 	_y = pt.y;
 	createSurface(1100, 129, 103);
-	startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0);
+	startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0);
 	SetUpdateHandler(&AsScene2207Elevator::update);
 	SetSpriteUpdate(&AsScene2207Elevator::suSetPosition);
 	SetMessageHandler(&AsScene2207Elevator::handleMessage);
@@ -1720,7 +1720,7 @@ void AsScene2207Elevator::update() {
 
 	if (_destPointIndex + _destPointIndexDelta > _pointIndex) {
 		_pointIndex++;
-		startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
+		startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
 		_newStickFrameIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
 			if (_destPointIndexDelta != 0) {
@@ -1736,7 +1736,7 @@ void AsScene2207Elevator::update() {
 		_pointIndex--;
 		if (_pointIndex == 0)
 			sendMessage(_parentScene, 0x2003, 0);
-		startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
+		startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
 		_newStickFrameIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
 			if (_destPointIndexDelta != 0) {
@@ -2012,7 +2012,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
 	//DEBUG>>>
-	setGlobalVar(0x4D080E54, 1);
+	//setGlobalVar(V_LIGHTS_ON, 1);
 	//DEBUG<<<
 
 	_vm->gameModule()->initScene3009Vars();
@@ -2031,7 +2031,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_asElevator = insertSprite<AsScene2207Elevator>(this);
 	
-	if (getGlobalVar(0x4D080E54)) {
+	if (getGlobalVar(V_LIGHTS_ON)) {
 
 		setBackground(0x88C00241);
 		setPalette(0x88C00241);
@@ -2061,7 +2061,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	} else {
 
-		setGlobalVar(0x81890D14, 1);
+		setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1);
 
 		setBackground(0x05C02A55);
 		setPalette(0x05C02A55);
@@ -2227,18 +2227,18 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	SpriteResource spriteResource(_vm);
 	const char *textStart, *textEnd;
 
-	if (!getGlobalVar(0xC8C28808))
-		setGlobalVar(0xC8C28808, calcHash("stLineagex"));
+	if (!getGlobalVar(V_COLUMN_TEXT_NAME))
+		setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex"));
 
-	_textResource.load(getGlobalVar(0xC8C28808));
+	_textResource.load(getGlobalVar(V_COLUMN_TEXT_NAME));
 	
-	textStart = _textResource.getString(getGlobalVar(0x48A68852), textEnd);
+	textStart = _textResource.getString(getGlobalVar(V_CLICKED_COLUMN_INDEX), textEnd);
 	while (textStart < textEnd) {
 		_strings.push_back(textStart);
 		textStart += strlen(textStart) + 1;
 	}
 	
-	_maxRowIndex = 8 + 10 * (3 - (getGlobalVar(0xC8C28808) == calcHash("stLineagex") ? 1 : 0));
+	_maxRowIndex = 8 + 10 * (3 - (getGlobalVar(V_COLUMN_TEXT_NAME) == calcHash("stLineagex") ? 1 : 0));
 
 	_background = new Background(_vm, 0);
 	_background->createSurface(0, 640, 528);
@@ -2257,11 +2257,11 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	_backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 
 	_topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192);
-	spriteResource.load2(!getGlobalVar(0x4CE79018) ? kScene2208FileHashes1[getGlobalVar(0x48A68852) % 6] : getGlobalVar(0x4CE79018));
+	spriteResource.load2(!getGlobalVar(V_COLUMN_BACK_NAME) ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] : getGlobalVar(V_COLUMN_BACK_NAME));
 	_topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 
 	_bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192);
-	spriteResource.load2(kScene2208FileHashes2[getGlobalVar(0x48A68852) % 6]);
+	spriteResource.load2(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6]);
 	_bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 	
 	SetUpdateHandler(&Scene2208::update);
@@ -2269,7 +2269,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_visibleRowsCount = 10;
 
-	_newRowIndex = (int16)getGlobalVar(0x49C40058);
+	_newRowIndex = (int16)getGlobalVar(V_CLICKED_COLUMN_ROW);
 	if (_newRowIndex + _visibleRowsCount > _maxRowIndex)
 		_newRowIndex = _maxRowIndex - _visibleRowsCount;
 	if (_newRowIndex < 6)
@@ -2416,7 +2416,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2242::handleMessage);
 	SetUpdateHandler(&Scene2242::update);
 	
-	if (getGlobalVar(0x4D080E54)) {
+	if (getGlobalVar(V_LIGHTS_ON)) {
 		setBackground(0x11840E24);
 		setPalette(0x11840E24);
 		insertMouse433(0x40E20110);
@@ -2441,9 +2441,9 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene2242>(530, 430);
 		setMessageList(0x004B3D60);
 	} else if (which == 2) {
-		insertKlayman<KmScene2242>(kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430);
+		insertKlayman<KmScene2242>(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430);
 		setMessageList(0x004B3D48);
-		if (getGlobalVar(0xC0418A02))
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 	} else {
 		insertKlayman<KmScene2242>(0, 430);
@@ -2455,11 +2455,11 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2242::~Scene2242() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 void Scene2242::update() {
-	if (!getGlobalVar(0x4D080E54)) {
+	if (!getGlobalVar(V_LIGHTS_ON)) {
 		if (_isKlaymanInLight && _klayman->getX() < 440) {
 			_palette->addBasePalette(0x68033B1C, 0, 65, 0);
 			_palette->startFadeToPalette(12);
@@ -2494,17 +2494,17 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
 void Scene2242::readClickedColumn() {
 	int index;
 	if (_mouseClickPos.x < 108) {
-		setGlobalVar(0xC8C28808, 0x04290188);
-		setGlobalVar(0x48A68852, 42);
-		setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart1"));
+		setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188);
+		setGlobalVar(V_CLICKED_COLUMN_INDEX, 42);
+		setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart1"));
 		index = 0;
 	} else {
-		setGlobalVar(0xC8C28808, 0x04290188);
-		setGlobalVar(0x48A68852, 43);
-		setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2"));
+		setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188);
+		setGlobalVar(V_CLICKED_COLUMN_INDEX, 43);
+		setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart2"));
 		index = 1;
 	}
-	setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
+	setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7);
 	if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) {
 		setMessageList2(kScene2242MessageListIds1[index]);
 	} else {
@@ -2536,7 +2536,7 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 	SetMessageHandler(&HallOfRecordsScene::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
-	if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) {
+	if (!getGlobalVar(V_LIGHTS_ON) && _sceneInfo140->bgFilename2) {
 		setRectList(0x004B2BF8);
 		setBackground(_sceneInfo140->bgFilename2);
 		setPalette(_sceneInfo140->bgFilename2);
@@ -2555,9 +2555,9 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 		insertKlayman<KmHallOfRecords>(640, 430);
 		setMessageList(0x004B2910);
 	} else if (which == 2) {
-		insertKlayman<KmHallOfRecords>(kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430);
+		insertKlayman<KmHallOfRecords>(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _sceneInfo140->xPosIndex], 430);
 		setMessageList(0x004B2B70);
-		if (getGlobalVar(0xC0418A02))
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 	} else {
 		insertKlayman<KmHallOfRecords>(0, 430);
@@ -2570,7 +2570,7 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 }
 
 HallOfRecordsScene::~HallOfRecordsScene() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2590,13 +2590,13 @@ void HallOfRecordsScene::readClickedColumn() {
 	if (index >= _sceneInfo140->count) {
 		setMessageList2(0x004B2920);
 	} else {
-		setGlobalVar(0x48A68852, _sceneInfo140->xPosIndex + index);
-		setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
-		setGlobalVar(0xC8C28808, _sceneInfo140->txFilename);
+		setGlobalVar(V_CLICKED_COLUMN_INDEX, _sceneInfo140->xPosIndex + index);
+		setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7);
+		setGlobalVar(V_COLUMN_TEXT_NAME, _sceneInfo140->txFilename);
 		if (index == 0 && _sceneInfo140->bgFilename3) {
-			setGlobalVar(0x4CE79018, _sceneInfo140->bgFilename3);
+			setGlobalVar(V_COLUMN_BACK_NAME, _sceneInfo140->bgFilename3);
 		} else {
-			setGlobalVar(0x4CE79018, 0);
+			setGlobalVar(V_COLUMN_BACK_NAME, 0);
 		}
 		if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) {
 			setMessageList2(kHallOfRecordsSceneMessageListIds1[index]);
@@ -2622,13 +2622,13 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
 	//DEBUG
-	setGlobalVar(0x4D080E54, 1);
+	setGlobalVar(V_LIGHTS_ON, 1);
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2247::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
-	if (getGlobalVar(0x4D080E54)) {
+	if (getGlobalVar(V_LIGHTS_ON)) {
 		setRectList(0x004B5588);
 		setBackground(0x40339414);
 		setPalette(0x40339414);
@@ -2647,8 +2647,8 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene2247>(640, 430);
 		setMessageList(0x004B5438);
 	} else if (which == 2) {
-		insertKlayman<KmScene2247>(kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430);
-		if (getGlobalVar(0xC0418A02))
+		insertKlayman<KmScene2247>(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430);
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B5530);
 	} else {
@@ -2661,7 +2661,7 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2247::~Scene2247() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2680,16 +2680,16 @@ uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entit
 void Scene2247::readClickedColumn() {
 	int index;
 	if (_mouseClickPos.x < 553) {
-		setGlobalVar(0xC8C28808, 0x0008E486);
-		setGlobalVar(0x4CE79018, calcHash("bgFatherHeader"));
+		setGlobalVar(V_COLUMN_TEXT_NAME, 0x0008E486);
+		setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgFatherHeader"));
 		index = 0;
 	} else {
-		setGlobalVar(0xC8C28808, 0x03086004);
-		setGlobalVar(0x4CE79018, calcHash("bgQuaterHeader"));
+		setGlobalVar(V_COLUMN_TEXT_NAME, 0x03086004);
+		setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgQuaterHeader"));
 		index = 1;
 	}
-	setGlobalVar(0x48A68852, 0);
-	setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7);
+	setGlobalVar(V_CLICKED_COLUMN_INDEX, 0);
+	setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7);
 	if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) {
 		setMessageList2(kScene2247MessageListIds1[index]);
 	} else {
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 9e2acff..c2cf0df 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -37,10 +37,10 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150);
 
 	//DEBUG>>>
-	setGlobalVar(0x10938830, 0);
+	setGlobalVar(V_WALL_BROKEN, 0);
 	//DEBUG<<<
 
-	_flag = getGlobalVar(0x10938830) == 0;
+	_flag = getGlobalVar(V_WALL_BROKEN) == 0;
 	
 	if (_flag) {
 		_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
@@ -90,7 +90,7 @@ void Module2300::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B6878, which);
 		break;
 	case 3:
-		if (getGlobalVar(0x10938830)) {
+		if (getGlobalVar(V_WALL_BROKEN)) {
 			createNavigationScene(0x004B68F0, which);
 		} else {
 			_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index a29795b..4e8d26d 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -389,8 +389,8 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_vm->gameModule()->initScene2401Vars();
 
-	setGlobalVar(0x4E0BE910, 1); //DEBUG! Enables water
-	setGlobalVar(0x45080C38, 1); //DEBUG! Gives the test tube
+	setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water
+	setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2401::handleMessage);
@@ -454,8 +454,8 @@ void Scene2401::update() {
 					waterInside = true;
 			}
 			if (puzzleSolved) {
-				setGlobalVar(0x0045D021, 1);
-				setGlobalVar(0x86615030, 1);
+				setGlobalVar(V_NOTES_DOOR_UNLOCKED, 1);
+				setGlobalVar(V_NOTES_PUZZLE_SOLVED, 1);
 				sendMessage(_asDoor, 0x4808, 0);
 			} else if (waterInside) {
 				playPipeSound(0xD0431020);
@@ -495,20 +495,20 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 		else if (param.asInteger() == 0x02144CB1)
 			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
 		else if (param.asInteger() == 0x11C40840) {
-			if (getGlobalVar(0x0045D021) && sendMessage(_asDoor, 0x2004, 0)) {
+			if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) {
 				setMessageList(0x004B3090);
 			} else {
 				setMessageList(0x004B30B0);
 			}
 		} else if (param.asInteger() == 0x412722C0) {
-			if (_countdown2 > 0 && getGlobalVar(0x45080C38)) {
+			if (_countdown2 > 0 && getGlobalVar(V_HAS_TEST_TUBE)) {
 				_countdown2 = 144;
 				setMessageList(0x004B3020);
 			} else {
 				setMessageList(0x004B3050);
 			}
 		} else if (param.asInteger() == 0x21142050) {
-			if (_flag && _countdown1 == 0 && getGlobalVar(0x86615030) == 0) {
+			if (_flag && _countdown1 == 0 && getGlobalVar(V_NOTES_PUZZLE_SOLVED) == 0) {
 				setMessageList(0x004B2FA8);
 			} else {
 				setMessageList(0x004B2FC8);
@@ -542,7 +542,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (sender == _ssButton) {
 			_pipeStatus = 0;
 			_countdown1 = 8;
-		} else if (sender == _ssFloorButton && getGlobalVar(0x4E0BE910)) {
+		} else if (sender == _ssFloorButton && getGlobalVar(V_WATER_RUNNING)) {
 			_countdown2 = 144;
 			sendMessage(_asFlowingWater, 0x2002, 0);
 			playSound(0, 0xE1130324);
@@ -643,7 +643,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 	_y = 210;
 	setDoDeltaX(1);
 
-	if (!getGlobalVar(0x92603A79)) {
+	if (!getGlobalVar(V_TV_JOKE_TOLD)) {
 		loadSound(0, 0x58208810);
 		_countdown1 = 48;
 		startAnimation(0x4919397A, 0, -1);
@@ -697,7 +697,7 @@ void AsScene2402TV::upFocusKlayman() {
 }
 
 void AsScene2402TV::stJokeFinished() {
-	setGlobalVar(0x92603A79, 1);
+	setGlobalVar(V_TV_JOKE_TOLD, 1);
 	startAnimation(0x050A0103, 0, -1);
 	_newStickFrameIndex = 0;
 	SetUpdateHandler(&AsScene2402TV::upFocusKlayman);
@@ -743,7 +743,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AF7D8);
 	} else if (which == 2) {
 		insertKlayman<KmScene2402>(409, 404);
-		_klayman->setDoDeltaX(getGlobalVar(0xC0418A02) ? 1 : 0);
+		_klayman->setDoDeltaX(getGlobalVar(V_KLAYMAN_IS_DELTA_X) ? 1 : 0);
 		setMessageList(0x004AF888);
 	} else {
 		insertKlayman<KmScene2402>(0, 404);
@@ -760,7 +760,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2402::~Scene2402() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 void Scene2402::update() {
@@ -921,8 +921,8 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite1, *tempSprite2;
 
-	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
-		setGlobalVar(0x13382860, 2);
+	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
+		setGlobalVar(V_KEY3_LOCATION, 2);
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2406::handleMessage);
@@ -930,7 +930,7 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B78C8);
 	insertMouse433(0xB03001A8);
 
-	if (getGlobalVar(0x13382860) == 2) {
+	if (getGlobalVar(V_KEY3_LOCATION) == 2) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 560, 409);
 		_vm->_collisionMan->addSprite(_asKey);
 	}
@@ -944,7 +944,7 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[0].x2 = tempSprite2->getDrawRect().x2();
 	_clipRects[0].y2 = 480;
 
-	if (getGlobalVar(0x18890C91)) {
+	if (getGlobalVar(V_SPIKES_RETRACTED)) {
 		setBackground(0x1A0B0304);
 		setPalette(0x1A0B0304);
 		tempSprite1 = insertStaticSprite(0x32923922, 1100);
@@ -998,7 +998,7 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x41062804) {
-			if (getGlobalVar(0x18890C91)) {
+			if (getGlobalVar(V_SPIKES_RETRACTED)) {
 				setMessageList(0x004B7758);
 			} else {
 				setMessageList(0x004B7738);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index b4d39d9..d6840a3 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -92,9 +92,9 @@ void Module2500::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B01B8, 220);
 		break;
 	case 2:
-		setGlobalVar(0x98109F12, 1);// TODO DEBUG! Join the tracks.
+		setGlobalVar(V_WORLDS_JOINED, 1);// TODO DEBUG! Join the tracks.
 		_vm->gameState().which = which;
-		if (getGlobalVar(0x98109F12))
+		if (getGlobalVar(V_WORLDS_JOINED))
 			createScene2704(which, 0x004B01E0, 150);
 		else
 			createScene2704(which, 0x004B0208, 150);
@@ -107,7 +107,7 @@ void Module2500::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect);
 		break;
 	case 5:
-		setGlobalVar(0x21E60190, 1);
+		setGlobalVar(V_CAR_DELTA_X, 1);
 		_vm->gameState().which = which;
 		createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect);
 		break;
@@ -117,7 +117,7 @@ void Module2500::createScene(int sceneNum, int which) {
 		break;
 	case 7:
 		_vm->gameState().which = which;
-		if (getGlobalVar(0xD0A14D10))
+		if (getGlobalVar(V_ENTRANCE_OPEN))
 			createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1);
 		else
 			createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2);
@@ -126,7 +126,7 @@ void Module2500::createScene(int sceneNum, int which) {
 		_childObject = new Scene1608(_vm, this, which);
 		break;
 	case 9:
-		if (getGlobalVar(0xD0A14D10))
+		if (getGlobalVar(V_ENTRANCE_OPEN))
 			createStaticScene(0xC62A0645, 0xA0641C6A);
 		else
 			createStaticScene(0x7A343546, 0x435427AB);
@@ -224,7 +224,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C);
 	_sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670);
 
-	setGlobalVar(0x21E60190, 1);
+	setGlobalVar(V_CAR_DELTA_X, 1);
 	SetUpdateHandler(&Scene2501::update);
 	_surfaceFlag = true;
 	setBackground(0x1B8E8115);
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 435c38c..6eebd40 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -68,7 +68,7 @@ void Module2600::createScene(int sceneNum, int which) {
 		createNavigationScene(0x004B86C8, which);
 		break;
 	case 3:
-		if (getGlobalVar(0x0A310817)) {
+		if (getGlobalVar(V_CREATURE_ANGRY)) {
 			createNavigationScene(0x004B8758, which);
 		} else {
 			createNavigationScene(0x004B86F8, which);
@@ -88,31 +88,31 @@ void Module2600::createScene(int sceneNum, int which) {
 		_childObject = new Scene2609(_vm, this, which);
 		break;
 	case 1002:
-		if (getGlobalVar(0x40040831) == 1) {
+		if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) {
 			createSmackerScene(0x018C0404, true, true, false);
-		} else if (getGlobalVar(0x40040831) == 2) {
+		} else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) {
 			createSmackerScene(0x018C0407, true, true, false);
 		} else {
 			createSmackerScene(0x818C0405, true, true, false);
 		}
-		if (getGlobalVar(0x40040831) >= 2) {
-			setGlobalVar(0x40040831, 0);
+		if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) {
+			setGlobalVar(V_FRUIT_COUNTING_INDEX, 0);
 		} else {
-			incGlobalVar(0x40040831, +1);
+			incGlobalVar(V_FRUIT_COUNTING_INDEX, +1);
 		}
 		break;
 	case 1003:
 		createSmackerScene(0x001C0007, true, true, false);
 		break;
 	case 1006:
-		if (getGlobalVar(0x4E0BE910)) {
+		if (getGlobalVar(V_WATER_RUNNING)) {
 			createSmackerScene(0x049A1181, true, true, false);
 		} else {
 			createSmackerScene(0x04981181, true, true, false);
 		}
 		break;
 	case 1008:
-		if (getGlobalVar(0x4E0BE910)) {
+		if (getGlobalVar(V_WATER_RUNNING)) {
 			createSmackerScene(0x42B80941, true, true, false);
 		} else {
 			createSmackerScene(0x42980941, true, true, false);
@@ -153,7 +153,7 @@ void Module2600::updateScene() {
 			break;
 		case 3:
 			if (_moduleResult == 0) {
-				if (getGlobalVar(0x0A310817)) {
+				if (getGlobalVar(V_CREATURE_ANGRY)) {
 					createScene(4, 0);
 				} else {
 					createScene(1003, -1);
@@ -161,10 +161,10 @@ void Module2600::updateScene() {
 			} else if (_moduleResult == 2) {
 				createScene(1, 1);
 			} else if (_moduleResult == 3) {
-				if (getGlobalVar(0x0A310817)) {
+				if (getGlobalVar(V_CREATURE_ANGRY)) {
 					createScene(4, 0);
 				} else {
-					setGlobalVar(0x0A310817, 1);
+					setGlobalVar(V_CREATURE_ANGRY, 1);
 					createScene(7, -1);
 				}
 			}
@@ -210,7 +210,7 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 	
 	_spriteResource.load2(0x825A6923);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	if (!getGlobalVar(0x4E0BE910))
+	if (!getGlobalVar(V_WATER_RUNNING))
 		setVisible(false);
 
 	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
@@ -233,11 +233,11 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 void SsScene2609Button::update() {
 	StaticSprite::update();
 	if (_countdown != 0 && (--_countdown == 0)) {
-		if (getGlobalVar(0x4E0BE910)) {
-			setGlobalVar(0x4E0BE910, 0);
+		if (getGlobalVar(V_WATER_RUNNING)) {
+			setGlobalVar(V_WATER_RUNNING, 0);
 			sendMessage(_parentScene, 0x2001, 0);
 		} else {
-			setGlobalVar(0x4E0BE910, 1);
+			setGlobalVar(V_WATER_RUNNING, 1);
 			sendMessage(_parentScene, 0x2002, 0);
 		}
 	}
@@ -249,7 +249,7 @@ uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam &para
 	case 0x1011:
 		if (_countdown == 0) {
 			sendMessage(_parentScene, 0x2000, 0);
-			if (getGlobalVar(0x4E0BE910)) {
+			if (getGlobalVar(V_WATER_RUNNING)) {
 				setVisible(false);
 				playSound(3);
 				playSound(1);
@@ -278,7 +278,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm)
 	_vm->_soundMan->addSound(0x08526C36, 0xDC2769B0);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2609Water::handleMessage);
-	if (getGlobalVar(0x4E0BE910))
+	if (getGlobalVar(V_WATER_RUNNING))
 		sendMessage(this, 0x2002, 0);
 }
 
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 983e265..9603f70 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -459,7 +459,7 @@ void Module2700::updateScene() {
 			if (!_flag1) {
 				_vm->_soundMan->stopMusic(0x04020210, 0, 1);
 				// TODO _vm->gameModule()->initScene2801Vars();
-				_musicFileHash = getGlobalVar(0x89A82A15);
+				_musicFileHash = getGlobalVar(V_MUSIC_NAME);
 				// TODO? GameState_sub_469C50(&field_52, 0);
 				// TODO MusicMan_create(); // Why?
 				_vm->_soundMan->addMusic(0x42212411, _musicFileHash);
@@ -594,7 +594,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	NRect clipRect;
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240);
-	setGlobalVar(0x21E60190, 1);
+	setGlobalVar(V_CAR_DELTA_X, 1);
 	
 	_surfaceFlag = true;
 	
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 1ec23e0..e664eb3 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -76,8 +76,8 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 2:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		//setGlobalVar(0x1860C990,1);//DEBUG
-		if (getGlobalVar(0x1860C990))
+		//setGlobalVar(V_KLAYMAN_SMALL,1);//DEBUG
+		if (getGlobalVar(V_KLAYMAN_SMALL))
 			_childObject = new Scene2803Small(_vm, this, which);
 		else
 			_childObject = new Scene2803(_vm, this, which);
@@ -171,7 +171,7 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 25:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		if (getGlobalVar(0x190A1D18))
+		if (getGlobalVar(V_SHRINK_LIGHTS_ON))
 			createStaticScene(0x01600204, 0x0020001E);
 		else
 			createStaticScene(0x08611204, 0x1120008E);
@@ -378,7 +378,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2801::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
-	if (getGlobalVar(0x4DE80AC0) == 0) {
+	if (getGlobalVar(V_RING5_PULLED) == 0) {
 		insertStaticSprite(0x0001264C, 100);
 	}
 
@@ -389,7 +389,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene2801>(443, 398);
 		setMessageList(0x004B6BC0);
 	} else if (which == 2) {
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene2801>(312, 432);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -450,7 +450,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2801::~Scene2801() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -640,7 +640,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 		0x28680AD4
 	};
 
-	setGlobalVar(0x1C1B8A9A, 1);
+	setGlobalVar(V_BEEN_SHRINKING_ROOM, 1);
 	_vm->gameModule()->initScene2808Vars1();
 	
 	SetMessageHandler(&Scene2803::handleMessage);
@@ -815,13 +815,13 @@ void Scene2803::klaymanFloor() {
 }
 
 void Scene2803::toggleBackground() {
-	setGlobalVar(0x190A1D18, getGlobalVar(0x190A1D18) ? 0 : 1);
+	setGlobalVar(V_SHRINK_LIGHTS_ON, getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0 : 1);
 	changeBackground();
 }
 
 void Scene2803::changeBackground() {
 	// TODO? g_screen->resetDirtyRects();
-	if (getGlobalVar(0x190A1D18)) {
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 		_asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D);
 		_background->load(0x412A423E);
 		_palette->addPalette(0x412A423E, 0, 256, 0);
@@ -911,7 +911,7 @@ void Scene2803::setPaletteArea1() {
 
 void Scene2803::updatePaletteArea() {
 	uint32 fadePaletteHash;
-	if (getGlobalVar(0x190A1D18))
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON))
 		fadePaletteHash = (_paletteArea == 1) ? 0xB103B604 : 0x412A423E;
 	else
 		fadePaletteHash = (_paletteArea == 1) ? 0x0263D144 : 0x29800A01;
@@ -938,7 +938,7 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 
 	insertSprite<AsScene2803LightCord>(this, 0xAFAD591A, 0x276E321D, 578, 200);
 
-	if (getGlobalVar(0x190A1D18)) {
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 		setBackground(0x412A423E);
 		setPalette(0x412A423E);
 		_palette->addBasePalette(0x412A423E, 0, 256, 0);
@@ -1148,7 +1148,7 @@ void Scene2803Small::setPaletteArea3() {
 }
 
 void Scene2803Small::updatePaletteArea(bool instantly) {
-	if (getGlobalVar(0x190A1D18)) {
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 		switch (_paletteArea) {
 		case 1:
 			_palette->addBasePalette(0x0A938204, 0, 64, 0);
@@ -1182,7 +1182,7 @@ void Scene2803Small::updatePaletteArea(bool instantly) {
 SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene)
 	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) {
 	
-	if (getGlobalVar(0x190A1D18))
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON))
 		_spriteResource.load2(0x51A10202);
 	else
 		_spriteResource.load2(0x11814A21);
@@ -1387,7 +1387,7 @@ AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWa
 	};
 
 	_colorNum = (int16)getSubVar(0xE11A1929, crystalIndex);
-	_isLightOn = getGlobalVar(0x190A1D18) != 0;
+	_isLightOn = getGlobalVar(V_SHRINK_LIGHTS_ON) != 0;
 	if (_isLightOn) {
 		_x = kAsScene2804CrystalPoints[crystalIndex].x;
 		_y = kAsScene2804CrystalPoints[crystalIndex].y;
@@ -1464,7 +1464,7 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280
 		0x5008292B
 	};
 	
-	if (getGlobalVar(0x190A1D18))
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON))
 		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]);
 	else
 		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]);
@@ -1626,9 +1626,9 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2804::handleMessage);
 	SetUpdateHandler(&Scene2804::update);
 
-	//setGlobalVar(0x190A1D18, 1); // DEBUG Set lights on
+	//setGlobalVar(V_SHRINK_LIGHTS_ON, 1); // DEBUG Set lights on
 
-	if (getGlobalVar(0x190A1D18)) {
+	if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 		setBackground(0xA1D03005);
 		setPalette(0xA1D03005);
 		addEntity(_palette);
@@ -1652,7 +1652,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) {
 		AsScene2804CrystalWaves *asCrystalWaves = NULL;
-		if (crystalIndex < 4 && getGlobalVar(0x190A1D18) == 0)
+		if (crystalIndex < 4 && getGlobalVar(V_SHRINK_LIGHTS_ON) == 0)
 			asCrystalWaves = insertSprite<AsScene2804CrystalWaves>(crystalIndex);
 		_asCrystals[crystalIndex] = insertSprite<AsScene2804Crystal>(asCrystalWaves, crystalIndex);
 		_ssCrystalButtons[crystalIndex] = insertSprite<SsScene2804CrystalButton>(this, _asCrystals[crystalIndex], crystalIndex);
@@ -1676,7 +1676,7 @@ uint32 Scene2804::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2000:
 		_isWorking = true;
 		sendMessage(_asCoil, 0x2002, 0);
-		if (getGlobalVar(0x190A1D18)) {
+		if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 			sendMessage(_asTarget, 0x2004, 0);
 			_countdown2 = 48;
 		}
@@ -1716,7 +1716,7 @@ void Scene2804::update() {
 			if (_isSolved) {
 				_palette->fillBaseWhite(0, 256);
 				_palette->startFadeToPalette(18);
-				setGlobalVar(0x1860C990, 1);
+				setGlobalVar(V_KLAYMAN_SMALL, 1);
 				_countdown1 = 48;
 			}
 		} else if (_beamStatus == 6) {
@@ -1736,7 +1736,7 @@ void Scene2804::update() {
 
 void Scene2804::initCrystalColors() {
 	// TODO Maybe move this into the GameModule so all puzzle init code is together
-	if (getGlobalVar(0xDE2EC914) == 0) {
+	if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) {
 		TextResource textResource(_vm);
 		const char *textStart, *textEnd;
 		textResource.load(0x46691611);
@@ -1770,7 +1770,7 @@ void Scene2804::initCrystalColors() {
 			setSubVar(0xD4B2089C, index, correctColorNum);
 			setSubVar(0xE11A1929, index, misalignedColorNum);
 		}
-		setGlobalVar(0xDE2EC914, 1);
+		setGlobalVar(V_CRYSTAL_COLORS_INIT, 1);
 	}
 }
 
@@ -1927,7 +1927,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 3) {
 		insertKlayman<KmScene2806>(378, 423, true, _clipRects, 4);
 		setMessageList(0x004AF0A0, false);
-		setGlobalVar(0x1860C990, 0);
+		setGlobalVar(V_KLAYMAN_SMALL, 0);
 	} else {
 		insertKlayman<KmScene2806>(670, 423, false, _clipRects, 4);
 		setMessageList(0x004AF090);
@@ -2562,7 +2562,7 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which)
 	} else if (which == 3) {
 		insertKlayman<KmScene2809>(262, 423, true, _clipRects, 4);
 		setMessageList(0x004B5BA8, false);
-		setGlobalVar(0x1860C990, 0);
+		setGlobalVar(V_KLAYMAN_SMALL, 0);
 	} else {
 		insertKlayman<KmScene2809>(-30, 423, false, _clipRects, 4);
 		setMessageList(0x004B5B88);
@@ -2670,7 +2670,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[1].x2 = _sprite6->getDrawRect().x2();
 	_clipRects[1].y2 = 480;
 
-	if (getGlobalVar(0x1860C990)) {
+	if (getGlobalVar(V_KLAYMAN_SMALL)) {
 		_asTape = insertSprite<AsScene1201Tape>(this, 0, 900, 245, 429, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else {
@@ -2680,9 +2680,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_sprite1 = insertStaticSprite(0x430001C4, 1200);
 
-	if (getGlobalVar(0x0018CA22)) {
-		setGlobalVar(0xCB45DE03, 1);
-		if (getGlobalVar(0x1860C990)) {
+	if (getGlobalVar(V_LADDER_DOWN)) {
+		setGlobalVar(V_BEEN_STATUE_ROOM, 1);
+		if (getGlobalVar(V_KLAYMAN_SMALL)) {
 			_sprite4 = insertStaticSprite(0x82653808, 100);
 		} else {
 			_sprite4 = insertStaticSprite(0x82653808, 1100);
@@ -2691,7 +2691,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	if (which < 0) {
-		if (getGlobalVar(0x1860C990)) {
+		if (getGlobalVar(V_KLAYMAN_SMALL)) {
 			insertKlayman<KmScene2810Small>(240, 448);
 			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 			setMessageList(0x004AE438);
@@ -2701,7 +2701,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		} else {
 			insertKlayman<KmScene2810>(300, 424, _clipRects, 2);
 			setMessageList(0x004AE438);
-			if (getGlobalVar(0x0018CA22))
+			if (getGlobalVar(V_LADDER_DOWN))
 				loadDataResource(0x84130112);
 			else
 				loadDataResource(0x84500132);
@@ -2733,9 +2733,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_soundMan->setSoundVolume(0xC874EE6C, 50);
 		_isRopingDown = false;
 	} else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) {
-		if (getGlobalVar(0x1860C990)) {
-			insertKlayman<KmScene2810Small>((int16)getGlobalVar(0x00D30138), 448);
-			if (getGlobalVar(0xC0418A02))
+		if (getGlobalVar(V_KLAYMAN_SMALL)) {
+			insertKlayman<KmScene2810Small>((int16)getGlobalVar(V_KLAYMAN_SAVED_X), 448);
+			if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 				_klayman->setDoDeltaX(1);
 			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 			setMessageList(0x004AE6D8);
@@ -2744,9 +2744,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			_vm->_collisionMan->removeSprite(_asTape);
 		} else {
 			insertKlaymanLadder();
-			if (getGlobalVar(0x00188211)) {
+			if (getGlobalVar(V_LADDER_DOWN_ACTION)) {
 				setMessageList(0x004AE6E8);
-				setGlobalVar(0x00188211, 0);
+				setGlobalVar(V_LADDER_DOWN_ACTION, 0);
 				_isRopingDown = false;
 			} else {
 				setMessageList(0x004AE6D8);
@@ -2758,7 +2758,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AE6E0);
 		_isRopingDown = false;
 	} else if (which == 4) {
-		if (getGlobalVar(0x1860C990)) {
+		if (getGlobalVar(V_KLAYMAN_SMALL)) {
 			insertKlayman<KmScene2810Small>(473, 448);
 			_klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480);
 			setMessageList(0x004AE428);
@@ -2768,7 +2768,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		} else {
 			insertKlayman<KmScene2810>(450, 424, _clipRects, 2);
 			setMessageList(0x004AE418);
-			if (getGlobalVar(0x0018CA22))
+			if (getGlobalVar(V_LADDER_DOWN))
 				loadDataResource(0x84130112);
 			else
 				loadDataResource(0x84500132);
@@ -2789,23 +2789,23 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene2810::~Scene2810() {
-	setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0);
-	setGlobalVar(0x00D30138, _klayman->getX());
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
+	setGlobalVar(V_KLAYMAN_SAVED_X, _klayman->getX());
 	_vm->_soundMan->deleteSoundGroup(0x84400112);
 }
 
 void Scene2810::insertKlaymanLadder() {
 	Sprite *tempSprite;
 
-	if (getGlobalVar(0x00188211)) {
+	if (getGlobalVar(V_LADDER_DOWN_ACTION)) {
 		insertKlayman<KmScene2810>(430, 424, _clipRects, 2);
 		_klayman->setDoDeltaX(1);
 	} else {
-		insertKlayman<KmScene2810>((int16)getGlobalVar(0x00D30138), 424, _clipRects, 2);
-		if (getGlobalVar(0xC0418A02))
+		insertKlayman<KmScene2810>((int16)getGlobalVar(V_KLAYMAN_SAVED_X), 424, _clipRects, 2);
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 	}
-	if (getGlobalVar(0x0018CA22))
+	if (getGlobalVar(V_LADDER_DOWN))
 		loadDataResource(0x84130112);
 	else
 		loadDataResource(0x84500132);
@@ -2848,20 +2848,18 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam &param, Entit
 			setMessageList(0x004AE688);
 		break;
 	case 0x2000:
-	debug("0x2000");
 		setRectList(0x004AE800);
 		_isRopingDown = true;
 		break;
 	case 0x2001:
-	debug("0x2001");
-		if (getGlobalVar(0x0018CA22))
+		if (getGlobalVar(V_LADDER_DOWN))
 			loadDataResource(0x84130112);
 		else
 			loadDataResource(0x84500132);
 		_isRopingDown = false;
 		break;
 	case 0x4826:
-		if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_isRopingDown) {
+		if (sender == _asTape && getGlobalVar(V_KLAYMAN_SMALL) == 0 && !_isRopingDown) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004AE750);
 		}
@@ -2968,8 +2966,8 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa
 Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _paletteArea(0) {
 	
-	if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0)
-		setGlobalVar(0x13382860, 3);
+	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
+		setGlobalVar(V_KEY3_LOCATION, 3);
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2812::handleMessage);
@@ -2985,7 +2983,7 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite1 = insertStaticSprite(0x0C06C860, 1100);
 	insertMouse433(0x0060203E);
 
-	if (getGlobalVar(0x13382860) == 3) {
+	if (getGlobalVar(V_KEY3_LOCATION) == 3) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 474, 437);
 		_vm->_collisionMan->addSprite(_asKey);
 	}
@@ -3015,7 +3013,7 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2());
 	} else if (which == 2) {
 		_isRopingDown = false;
-		if (getGlobalVar(0xC0418A02)) {
+		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene2812>(554, 432);
 			_klayman->setDoDeltaX(1);
 		} else {
@@ -3153,10 +3151,10 @@ void Scene2822::update() {
 				playSound(0, 0x1384CB60);
 				_countdownStatus = 2;
 				_countdown = 12;
-			} else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) {
+			} else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) {
 				leaveScene(0);
 			}
-		} else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) {
+		} else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) {
 			if (_scrollIndex < 9) {
 				_background->getSurface()->getDrawRect().y = kScene2822BackgroundYPositions[_scrollIndex];
 				_scrollIndex++;
@@ -3180,9 +3178,9 @@ uint32 Scene2822::handleMessage(int messageNum, const MessageParam &param, Entit
 			_countdownStatus = 0;
 			_countdown = 12;
 			playSound(1, 0x44061000);
-			if (getGlobalVar(0x0018CA22) == 0) {
-				setGlobalVar(0x0018CA22, 1);
-				setGlobalVar(0x00188211, 1);
+			if (getGlobalVar(V_LADDER_DOWN) == 0) {
+				setGlobalVar(V_LADDER_DOWN, 1);
+				setGlobalVar(V_LADDER_DOWN_ACTION, 1);
 				SetMessageHandler(NULL);
 				playSound(2);
 				_mouseCursor->setVisible(false);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 88caff9..7312da7 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -47,7 +47,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 	_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 
-	_flag = getGlobalVar(0x10938830) != 0;
+	_flag = getGlobalVar(V_WALL_BROKEN) != 0;
 
 	if (_flag) {
 		_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
@@ -79,9 +79,9 @@ void Module3000::createScene(int sceneNum, int which) {
 	_vm->gameState().sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 1:
-		if (!getGlobalVar(0x01BA1A52)) {
+		if (!getGlobalVar(V_BOLT_DOOR_OPEN)) {
 			createNavigationScene(0x004B7C80, which);
-		} else if (getGlobalVar(0x10938830)) {
+		} else if (getGlobalVar(V_WALL_BROKEN)) {
 			createNavigationScene(0x004B7CE0, which);
 		} else {
 			createNavigationScene(0x004B7CB0, which);
@@ -93,22 +93,22 @@ void Module3000::createScene(int sceneNum, int which) {
 			_soundVolume = 90;
 			_vm->_soundMan->setSoundVolume(0x90F0D1C3, 90);
 		}
-		if (getGlobalVar(0x10938830)) {
+		if (getGlobalVar(V_WALL_BROKEN)) {
 			createNavigationScene(0x004B7D58, which);
 		} else {
 			createNavigationScene(0x004B7D10, which);
 		}
 		break;
 	case 3:
-		if (getGlobalVar(0x09221A62))
+		if (getGlobalVar(V_STAIRS_DOWN))
 			createNavigationScene(0x004B7E60, which);
-		else if (getGlobalVar(0x10938830))
+		else if (getGlobalVar(V_WALL_BROKEN))
 			createNavigationScene(0x004B7DA0, which);
 		else
 			createNavigationScene(0x004B7E00, which);
 		break;
 	case 4:
-		if (getGlobalVar(0x09221A62))
+		if (getGlobalVar(V_STAIRS_DOWN))
 			createNavigationScene(0x004B7F20, which);
 		else
 			createNavigationScene(0x004B7EC0, which);
@@ -149,23 +149,23 @@ void Module3000::createScene(int sceneNum, int which) {
 		break;
 	// NOTE: Newly introduced sceneNums
 	case 1001:
-		if (!getGlobalVar(0x01BA1A52))
-			if (getGlobalVar(0x10938830))
+		if (!getGlobalVar(V_BOLT_DOOR_OPEN))
+			if (getGlobalVar(V_WALL_BROKEN))
 				createSmackerScene(0x00940021, true, true, false);
 			else
 				createSmackerScene(0x01140021, true, true, false);
 		else
-			if (getGlobalVar(0x10938830))
+			if (getGlobalVar(V_WALL_BROKEN))
 				createSmackerScene(0x001011B1, true, true, false);
 			else
 				createSmackerScene(0x001021B1, true, true, false);
-		setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1);
+		setGlobalVar(V_BOLT_DOOR_OPEN, getGlobalVar(V_BOLT_DOOR_OPEN) ? 0 : 1);
 		break;
 	case 1006:
 		createSmackerScene(0x080810C5, true, true, false);
 		break;
 	case 1008:
-		createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false);
+		createSmackerScene(getGlobalVar(V_CANNON_SMACKER_NAME), true, true, false);
 		break;
 	}
 	SetUpdateHandler(&Module3000::updateScene);
@@ -176,7 +176,7 @@ void Module3000::updateScene() {
 	if (!updateChild()) {
 		switch (_vm->gameState().sceneNum) {
 		case 1:
-			if (!getGlobalVar(0x01BA1A52)) {
+			if (!getGlobalVar(V_BOLT_DOOR_OPEN)) {
 				if (_moduleResult == 0)
 					createScene(9, -1);
 				else if (_moduleResult == 1)
@@ -200,7 +200,7 @@ void Module3000::updateScene() {
 			if (_moduleResult == 0) {
 				createScene(3, 0);
 			} else if (_moduleResult == 1) {
-				setGlobalVar(0x01BA1A52, 0);
+				setGlobalVar(V_BOLT_DOOR_OPEN, 0);
 				createScene(1, 1);
 			}
 			break;
@@ -209,7 +209,7 @@ void Module3000::updateScene() {
 				createScene(4, 0);
 			else if (_moduleResult == 3)
 				createScene(10, -1);
-			else if (getGlobalVar(0x09221A62))
+			else if (getGlobalVar(V_STAIRS_DOWN))
 				createScene(5, 0);
 			else
 				createScene(2, 1);
@@ -238,11 +238,11 @@ void Module3000::updateScene() {
 			createScene(8, -1);
 			break;
 		case 8:
-			_flag = getGlobalVar(0x10938830); // CHECKME
+			_flag = getGlobalVar(V_WALL_BROKEN); // CHECKME
 			if (_moduleResult != 1) {
 				_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
 				createScene(4, 1);
-			} else if (getGlobalVar(0xF0402B0A)) {
+			} else if (getGlobalVar(V_CANNON_SMACKER_NAME)) {
 				createScene(1008, -1);
 			} else {
 				_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
@@ -265,7 +265,7 @@ void Module3000::updateScene() {
 			createScene(1, 0);
 			break;
 		case 1001:
-			if (getGlobalVar(0x01BA1A52))
+			if (getGlobalVar(V_BOLT_DOOR_OPEN))
 				createScene(1, 0);
 			else
 				createScene(12, -1);
@@ -526,7 +526,7 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
 	_drawRect.width = _spriteResource.getDimensions().width;
 	_drawRect.height = _spriteResource.getDimensions().height;
 	_needRefresh = true;
-	if (getGlobalVar(0x0C0288F4)) {
+	if (getGlobalVar(V_ROBOT_HIT)) {
 		hide();
 	} else {
 		startBlinking();
@@ -649,7 +649,7 @@ AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm,
 	: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
 
 	_x = 300;
-	_y = getGlobalVar(0x000809C2) ? 52 : 266;
+	_y = getGlobalVar(V_CANNON_RAISED) ? 52 : 266;
 	createSurface1(0xC2463913, 1200);
 	_needRefresh = true;
 	updatePosition();
@@ -681,7 +681,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message
 AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus)
 	: AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) {
 	
-	_x = getGlobalVar(0x9040018A) ? 533 : 92;
+	_x = getGlobalVar(V_CANNON_TURNED) ? 533 : 92;
 	_y = 150;
 	createSurface1(0xC0C12954, 1200);
 	_needRefresh = true;
@@ -799,12 +799,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _keepVideo(false), _moveCannonLeftFirst(false), 
 	_isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
 
-	_cannonTargetStatus = getGlobalVar(0x20580A86);
+	_cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS);
 	debug("_cannonTargetStatus = %d", _cannonTargetStatus);
 	
 	_vm->gameModule()->initScene3009Vars();
 	
-	setGlobalVar(0xF0402B0A, 0);
+	setGlobalVar(V_CANNON_SMACKER_NAME, 0);
 	_surfaceFlag = true;
 	
 	_vm->_screen->clear();
@@ -858,7 +858,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (int i = 0; i < 6; i++)
 		setSubVar(0x00000914, i, _correctSymbols[i]);
 	sendMessage(this, 0x2003, 0);
-	//setGlobalVar(0x610210B7, 1);   
+	//setGlobalVar(V_ROBOT_TARGET, 1);   
 
 }
 
@@ -914,7 +914,7 @@ void Scene3009::update() {
 	if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) {
 		for (int i = 0; i < 3; i++)
 			_asSymbols[i]->hide();
-		if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
+		if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) {
 			_ssSymbolEdges[0]->show();
 			_ssTargetLines[0]->show();
 			_asVerticalIndicator->show();
@@ -924,7 +924,7 @@ void Scene3009::update() {
 	if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) {
 		for (int i = 3; i < 6; i++)
 			_asSymbols[i]->hide();
-		if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) {
+		if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) {
 			_ssSymbolEdges[1]->show();
 			_ssTargetLines[1]->show();
 			_asHorizontalIndicator->show();
@@ -938,8 +938,8 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		// TODO: Debug stuff
-		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) {
-			setGlobalVar(0x20580A86, 0);
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) {
+			setGlobalVar(V_CANNON_TARGET_STATUS, 0);
 			leaveScene(0);
 		}
 		break;
@@ -947,19 +947,19 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 		// TODO: Debug stuff
 		break;
 	case 0x2000:
-		if (!getGlobalVar(0x000809C2)) {
-			if (!getGlobalVar(0x10938830)) {
+		if (!getGlobalVar(V_CANNON_RAISED)) {
+			if (!getGlobalVar(V_WALL_BROKEN)) {
 				_cannonTargetStatus = kCTSBreakWall;
-				setGlobalVar(0x10938830, 1);
+				setGlobalVar(V_WALL_BROKEN, 1);
 			} else {
 				_cannonTargetStatus = kCTSWall;
 			}
-		} else if (!getGlobalVar(0x9040018A)) {
+		} else if (!getGlobalVar(V_CANNON_TURNED)) {
 			_cannonTargetStatus = kCTSEmptyness;
-		} else if (!getGlobalVar(0x610210B7)) {
+		} else if (!getGlobalVar(V_ROBOT_TARGET)) {
 			_cannonTargetStatus = kCTSFireRobotNoTarget;
-		} else if (!getGlobalVar(0x0C0288F4)) {
-			setGlobalVar(0x0C0288F4, 1);
+		} else if (!getGlobalVar(V_ROBOT_HIT)) {
+			setGlobalVar(V_ROBOT_HIT, 1);
 			_cannonTargetStatus = kCTSFireRobotIsTarget;
 		} else {
 			_cannonTargetStatus = kCTSFireNoRobot;
@@ -971,13 +971,13 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2002:
 		// Raise/lower the cannon
-		if (!getGlobalVar(0x9040018A) && !_isTurning) {
-			if (getGlobalVar(0x000809C2)) {
+		if (!getGlobalVar(V_CANNON_TURNED) && !_isTurning) {
+			if (getGlobalVar(V_CANNON_RAISED)) {
 				_cannonTargetStatus = kCTSLowerCannon;
-				setGlobalVar(0x000809C2, 0);
+				setGlobalVar(V_CANNON_RAISED, 0);
 			} else {
 				_cannonTargetStatus = kCTSRaiseCannon;
-				setGlobalVar(0x000809C2, 1);
+				setGlobalVar(V_CANNON_RAISED, 1);
 			}
 			playActionVideo();
 		}
@@ -987,25 +987,25 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2004:
 		// Turn the cannon if it's raised
-		if (getGlobalVar(0x000809C2)) {
-			if (!getGlobalVar(0x9040018A)) {
+		if (getGlobalVar(V_CANNON_RAISED)) {
+			if (!getGlobalVar(V_CANNON_TURNED)) {
 				// Cannon is at the left position
-				if (!getGlobalVar(0x610210B7)) {
+				if (!getGlobalVar(V_ROBOT_TARGET)) {
 					_cannonTargetStatus = kCTSRightRobotNoTarget;
-				} else if (!getGlobalVar(0x0C0288F4)) {
+				} else if (!getGlobalVar(V_ROBOT_HIT)) {
 					_cannonTargetStatus = kCTSRightRobotIsTarget;
 				} else {
 					_cannonTargetStatus = kCTSRightNoRobot;
 				}
-				setGlobalVar(0x9040018A, 1);
+				setGlobalVar(V_CANNON_TURNED, 1);
 				_isTurning = true;
 				playActionVideo();
 			} else {
 				// Cannon is at the right position
-				if (!getGlobalVar(0x610210B7)) {
+				if (!getGlobalVar(V_ROBOT_TARGET)) {
 					_cannonTargetStatus = kCTSLeftRobotNoTarget;
 					_smackerPlayer->open(0x108A000F, false);
-				} else if (!getGlobalVar(0x0C0288F4)) {
+				} else if (!getGlobalVar(V_ROBOT_HIT)) {
 					_cannonTargetStatus = kCTSLeftRobotIsTarget;
 					_smackerPlayer->open(0x500B002F, false);
 				} else {
@@ -1016,7 +1016,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 				_moveCannonLeftFirst = true;
 				_isTurning = true;
 				_keepVideo = false;
-				setGlobalVar(0x9040018A, 0);
+				setGlobalVar(V_CANNON_TURNED, 0);
 			}
 		}
 		break;
@@ -1025,8 +1025,8 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 void Scene3009::playActionVideo() {
-	setGlobalVar(0x20580A86, _cannonTargetStatus);
-	setGlobalVar(0xF0402B0A, kScene3009CannonActionVideos[_cannonTargetStatus]);
+	setGlobalVar(V_CANNON_TARGET_STATUS, _cannonTargetStatus);
+	setGlobalVar(V_CANNON_SMACKER_NAME, kScene3009CannonActionVideos[_cannonTargetStatus]);
 	leaveScene(1);
 }
 
@@ -1378,8 +1378,8 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
 		_boltUnlocked[param.asInteger()] = true;
 		_boltUnlocking[param.asInteger()] = false;
 		if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) {
-			if (!getGlobalVar(0x00040153)) {
-				setGlobalVar(0x00040153, 1);
+			if (!getGlobalVar(V_BOLT_DOOR_UNLOCKED)) {
+				setGlobalVar(V_BOLT_DOOR_UNLOCKED, 1);
 				playSound(0);
 				_countdown = 60;
 			} else {
@@ -1539,7 +1539,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) {
 
 	// TODO _vm->gameModule()->initScene3011Vars();
-	_noisySymbolIndex = getGlobalVar(0x2414C2F2);
+	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene3011::handleMessage);
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 5594cce..5dc80c9 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -39,11 +39,11 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 	//DEBUG<<<
 
 	if (_navigationIndex < 0) {
-		_navigationIndex = (int)getGlobalVar(0x4200189E);
+		_navigationIndex = (int)getGlobalVar(V_NAVIGATION_INDEX);
 		if (_navigationIndex >= (int)_navigationList->size())
 			_navigationIndex = 0; 
 	}
-	setGlobalVar(0x4200189E, _navigationIndex);
+	setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex);
 	
 	SetUpdateHandler(&NavigationScene::update);
 	SetMessageHandler(&NavigationScene::handleMessage);
@@ -173,7 +173,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 				if (_navigationIndex < 0)
 					_navigationIndex = _navigationList->size() - 1;
 			} while (!(*_navigationList)[_navigationIndex].interactive);
-			setGlobalVar(0x4200189E, _navigationIndex);
+			setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex);
 		} else {
 			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
@@ -190,7 +190,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 				if (_navigationIndex >= (int)_navigationList->size())
 					_navigationIndex = 0;
 			} while (!(*_navigationList)[_navigationIndex].interactive);
-			setGlobalVar(0x4200189E, _navigationIndex);
+			setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex);
 		} else {
 			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, _navigationIndex);
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 9bf6549..e009ff2 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -397,6 +397,17 @@ void TextResource::load(uint32 fileHash) {
 		if (_vm->_res->getResourceType(_resourceHandle) == 6) {
 			_textData = _vm->_res->loadResource(_resourceHandle, true);
 			_count = READ_LE_UINT32(_textData);
+			
+			debug("TEXT RESOURCE %08X, count = %d:", fileHash, _count);
+			for (uint i = 0; i < _count-1; i++) {
+				const char *textEnd, *text = getString(i, textEnd);
+				while (text < textEnd) {
+					debug("[%04d] [%s]", i, text);
+					text += strlen(text) + 1;
+				}
+				debug("------------------");
+			}
+			
 		} else {
 			_vm->_res->unuseResource(_resourceHandle);
 			_resourceHandle = -1;
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 375f7f3..e96fe8a 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -32,7 +32,7 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl
 
 	// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
 	
-	if (getGlobalVar(0x06C02850)) {
+	if (getGlobalVar(V_SMACKER_CAN_ABORT)) {
 		_flag1 = true;
 		_canAbort = true;
 	}


Commit: 02c5cc75a7cb8885d2a0fa141fbc0e763c5b31a0
    https://github.com/scummvm/scummvm/commit/02c5cc75a7cb8885d2a0fa141fbc0e763c5b31a0
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-05-08T11:46:44-07:00

Commit Message:
Merge branch 'master'

Conflicts:
	configure
	base/plugins.cpp

Changed paths:
  A backends/midi/sndio.cpp
  A backends/platform/dingux/scummvm.png
  A backends/platform/gph/caanoo-bundle.mk
  A backends/platform/gph/gp2xwiz-bundle.mk
  A backends/platform/openpandora/module.mk
  A backends/platform/openpandora/op-bundle.mk
  A backends/platform/sdl/macosx/appmenu_osx.h
  A backends/platform/sdl/macosx/appmenu_osx.mm
  A common/coroutines.cpp
  A common/coroutines.h
  A common/installshield_cab.cpp
  A common/installshield_cab.h
  A devtools/create_project/msvc11/create_project.sln
  A devtools/create_project/msvc11/create_project.vcxproj
  A devtools/create_project/msvc11/create_project.vcxproj.filters
  A devtools/create_tony/create_tony.cpp
  A devtools/create_tony/create_tony.h
  A devtools/create_tony/module.mk
  A devtools/create_tony/staticdata.h
  A dists/engine-data/tony.dat
  A dists/iphone/scummvm.xcodeproj/project.pbxproj
  A dists/macosx/scummvm_osx_appcast.xml
  A dists/msvc11/create_msvc11.bat
  A dists/msvc11/readme.txt
  A doc/da/HurtigStart
  A engines/configure.engines
  A engines/dreamweb/mouse.cpp
  A engines/dreamweb/sound.h
  A engines/gob/backbuffer.cpp
  A engines/gob/backbuffer.h
  A engines/gob/cmpfile.cpp
  A engines/gob/cmpfile.h
  A engines/gob/detection/detection.cpp
  A engines/gob/detection/tables.h
  A engines/gob/detection/tables_adi2.h
  A engines/gob/detection/tables_adi4.h
  A engines/gob/detection/tables_adibou.h
  A engines/gob/detection/tables_ajworld.h
  A engines/gob/detection/tables_bargon.h
  A engines/gob/detection/tables_dynasty.h
  A engines/gob/detection/tables_fallback.h
  A engines/gob/detection/tables_fascin.h
  A engines/gob/detection/tables_geisha.h
  A engines/gob/detection/tables_gob1.h
  A engines/gob/detection/tables_gob2.h
  A engines/gob/detection/tables_gob3.h
  A engines/gob/detection/tables_inca2.h
  A engines/gob/detection/tables_lit.h
  A engines/gob/detection/tables_littlered.h
  A engines/gob/detection/tables_onceupon.h
  A engines/gob/detection/tables_playtoons.h
  A engines/gob/detection/tables_urban.h
  A engines/gob/detection/tables_ween.h
  A engines/gob/detection/tables_woodruff.h
  A engines/gob/inter_littlered.cpp
  A engines/gob/minigames/geisha/mouth.cpp
  A engines/gob/minigames/geisha/mouth.h
  A engines/gob/minigames/geisha/submarine.cpp
  A engines/gob/minigames/geisha/submarine.h
  A engines/gob/pregob/gctfile.cpp
  A engines/gob/pregob/gctfile.h
  A engines/gob/pregob/onceupon/abracadabra.cpp
  A engines/gob/pregob/onceupon/abracadabra.h
  A engines/gob/pregob/onceupon/babayaga.cpp
  A engines/gob/pregob/onceupon/babayaga.h
  A engines/gob/pregob/onceupon/brokenstrings.h
  A engines/gob/pregob/onceupon/chargenchild.cpp
  A engines/gob/pregob/onceupon/chargenchild.h
  A engines/gob/pregob/onceupon/onceupon.cpp
  A engines/gob/pregob/onceupon/onceupon.h
  A engines/gob/pregob/onceupon/palettes.h
  A engines/gob/pregob/onceupon/parents.cpp
  A engines/gob/pregob/onceupon/parents.h
  A engines/gob/pregob/onceupon/stork.cpp
  A engines/gob/pregob/onceupon/stork.h
  A engines/gob/pregob/onceupon/title.cpp
  A engines/gob/pregob/onceupon/title.h
  A engines/gob/pregob/pregob.cpp
  A engines/gob/pregob/pregob.h
  A engines/gob/pregob/seqfile.cpp
  A engines/gob/pregob/seqfile.h
  A engines/gob/pregob/txtfile.cpp
  A engines/gob/pregob/txtfile.h
  A engines/gob/save/saveload_ajworld.cpp
  A engines/gob/sound/adlplayer.cpp
  A engines/gob/sound/adlplayer.h
  A engines/gob/sound/musplayer.cpp
  A engines/gob/sound/musplayer.h
  A engines/parallaction/adlib.cpp
  A engines/pegasus/ai/ai_action.cpp
  A engines/pegasus/ai/ai_action.h
  A engines/pegasus/ai/ai_area.cpp
  A engines/pegasus/ai/ai_area.h
  A engines/pegasus/ai/ai_condition.cpp
  A engines/pegasus/ai/ai_condition.h
  A engines/pegasus/ai/ai_rule.cpp
  A engines/pegasus/ai/ai_rule.h
  A engines/pegasus/compass.cpp
  A engines/pegasus/compass.h
  A engines/pegasus/console.cpp
  A engines/pegasus/console.h
  A engines/pegasus/constants.h
  A engines/pegasus/cursor.cpp
  A engines/pegasus/cursor.h
  A engines/pegasus/detection.cpp
  A engines/pegasus/elements.cpp
  A engines/pegasus/elements.h
  A engines/pegasus/energymonitor.cpp
  A engines/pegasus/energymonitor.h
  A engines/pegasus/fader.cpp
  A engines/pegasus/fader.h
  A engines/pegasus/gamestate.cpp
  A engines/pegasus/gamestate.h
  A engines/pegasus/graphics.cpp
  A engines/pegasus/graphics.h
  A engines/pegasus/hotspot.cpp
  A engines/pegasus/hotspot.h
  A engines/pegasus/input.cpp
  A engines/pegasus/input.h
  A engines/pegasus/interaction.h
  A engines/pegasus/interface.cpp
  A engines/pegasus/interface.h
  A engines/pegasus/items/autodragger.cpp
  A engines/pegasus/items/autodragger.h
  A engines/pegasus/items/biochips/aichip.cpp
  A engines/pegasus/items/biochips/aichip.h
  A engines/pegasus/items/biochips/biochipitem.cpp
  A engines/pegasus/items/biochips/biochipitem.h
  A engines/pegasus/items/biochips/mapchip.cpp
  A engines/pegasus/items/biochips/mapchip.h
  A engines/pegasus/items/biochips/mapimage.cpp
  A engines/pegasus/items/biochips/mapimage.h
  A engines/pegasus/items/biochips/opticalchip.cpp
  A engines/pegasus/items/biochips/opticalchip.h
  A engines/pegasus/items/biochips/pegasuschip.cpp
  A engines/pegasus/items/biochips/pegasuschip.h
  A engines/pegasus/items/biochips/retscanchip.cpp
  A engines/pegasus/items/biochips/retscanchip.h
  A engines/pegasus/items/biochips/shieldchip.cpp
  A engines/pegasus/items/biochips/shieldchip.h
  A engines/pegasus/items/inventory.cpp
  A engines/pegasus/items/inventory.h
  A engines/pegasus/items/inventory/airmask.cpp
  A engines/pegasus/items/inventory/airmask.h
  A engines/pegasus/items/inventory/gascanister.cpp
  A engines/pegasus/items/inventory/gascanister.h
  A engines/pegasus/items/inventory/inventoryitem.cpp
  A engines/pegasus/items/inventory/inventoryitem.h
  A engines/pegasus/items/inventory/keycard.cpp
  A engines/pegasus/items/inventory/keycard.h
  A engines/pegasus/items/inventorypicture.cpp
  A engines/pegasus/items/inventorypicture.h
  A engines/pegasus/items/item.cpp
  A engines/pegasus/items/item.h
  A engines/pegasus/items/itemdragger.cpp
  A engines/pegasus/items/itemdragger.h
  A engines/pegasus/items/itemlist.cpp
  A engines/pegasus/items/itemlist.h
  A engines/pegasus/menu.cpp
  A engines/pegasus/menu.h
  A engines/pegasus/module.mk
  A engines/pegasus/movie.cpp
  A engines/pegasus/movie.h
  A engines/pegasus/neighborhood/caldoria/caldoria.cpp
  A engines/pegasus/neighborhood/caldoria/caldoria.h
  A engines/pegasus/neighborhood/caldoria/caldoria4dsystem.cpp
  A engines/pegasus/neighborhood/caldoria/caldoria4dsystem.h
  A engines/pegasus/neighborhood/caldoria/caldoriabomb.cpp
  A engines/pegasus/neighborhood/caldoria/caldoriabomb.h
  A engines/pegasus/neighborhood/caldoria/caldoriamessages.cpp
  A engines/pegasus/neighborhood/caldoria/caldoriamessages.h
  A engines/pegasus/neighborhood/caldoria/caldoriamirror.cpp
  A engines/pegasus/neighborhood/caldoria/caldoriamirror.h
  A engines/pegasus/neighborhood/door.cpp
  A engines/pegasus/neighborhood/door.h
  A engines/pegasus/neighborhood/exit.cpp
  A engines/pegasus/neighborhood/exit.h
  A engines/pegasus/neighborhood/extra.cpp
  A engines/pegasus/neighborhood/extra.h
  A engines/pegasus/neighborhood/hotspotinfo.cpp
  A engines/pegasus/neighborhood/hotspotinfo.h
  A engines/pegasus/neighborhood/mars/constants.h
  A engines/pegasus/neighborhood/mars/energybeam.cpp
  A engines/pegasus/neighborhood/mars/energybeam.h
  A engines/pegasus/neighborhood/mars/gravitoncannon.cpp
  A engines/pegasus/neighborhood/mars/gravitoncannon.h
  A engines/pegasus/neighborhood/mars/hermite.cpp
  A engines/pegasus/neighborhood/mars/hermite.h
  A engines/pegasus/neighborhood/mars/mars.cpp
  A engines/pegasus/neighborhood/mars/mars.h
  A engines/pegasus/neighborhood/mars/planetmover.cpp
  A engines/pegasus/neighborhood/mars/planetmover.h
  A engines/pegasus/neighborhood/mars/reactor.cpp
  A engines/pegasus/neighborhood/mars/reactor.h
  A engines/pegasus/neighborhood/mars/robotship.cpp
  A engines/pegasus/neighborhood/mars/robotship.h
  A engines/pegasus/neighborhood/mars/shuttleenergymeter.cpp
  A engines/pegasus/neighborhood/mars/shuttleenergymeter.h
  A engines/pegasus/neighborhood/mars/shuttlehud.cpp
  A engines/pegasus/neighborhood/mars/shuttlehud.h
  A engines/pegasus/neighborhood/mars/shuttleweapon.cpp
  A engines/pegasus/neighborhood/mars/shuttleweapon.h
  A engines/pegasus/neighborhood/mars/spacechase3d.cpp
  A engines/pegasus/neighborhood/mars/spacechase3d.h
  A engines/pegasus/neighborhood/mars/spacejunk.cpp
  A engines/pegasus/neighborhood/mars/spacejunk.h
  A engines/pegasus/neighborhood/mars/tractorbeam.cpp
  A engines/pegasus/neighborhood/mars/tractorbeam.h
  A engines/pegasus/neighborhood/neighborhood.cpp
  A engines/pegasus/neighborhood/neighborhood.h
  A engines/pegasus/neighborhood/norad/alpha/ecrmonitor.cpp
  A engines/pegasus/neighborhood/norad/alpha/ecrmonitor.h
  A engines/pegasus/neighborhood/norad/alpha/fillingstation.cpp
  A engines/pegasus/neighborhood/norad/alpha/fillingstation.h
  A engines/pegasus/neighborhood/norad/alpha/noradalpha.cpp
  A engines/pegasus/neighborhood/norad/alpha/noradalpha.h
  A engines/pegasus/neighborhood/norad/alpha/panorama.cpp
  A engines/pegasus/neighborhood/norad/alpha/panorama.h
  A engines/pegasus/neighborhood/norad/alpha/panoramascroll.cpp
  A engines/pegasus/neighborhood/norad/alpha/panoramascroll.h
  A engines/pegasus/neighborhood/norad/constants.h
  A engines/pegasus/neighborhood/norad/delta/globegame.cpp
  A engines/pegasus/neighborhood/norad/delta/globegame.h
  A engines/pegasus/neighborhood/norad/delta/noraddelta.cpp
  A engines/pegasus/neighborhood/norad/delta/noraddelta.h
  A engines/pegasus/neighborhood/norad/norad.cpp
  A engines/pegasus/neighborhood/norad/norad.h
  A engines/pegasus/neighborhood/norad/noradelevator.cpp
  A engines/pegasus/neighborhood/norad/noradelevator.h
  A engines/pegasus/neighborhood/norad/pressuredoor.cpp
  A engines/pegasus/neighborhood/norad/pressuredoor.h
  A engines/pegasus/neighborhood/norad/pressuretracker.cpp
  A engines/pegasus/neighborhood/norad/pressuretracker.h
  A engines/pegasus/neighborhood/norad/subcontrolroom.cpp
  A engines/pegasus/neighborhood/norad/subcontrolroom.h
  A engines/pegasus/neighborhood/norad/subplatform.cpp
  A engines/pegasus/neighborhood/norad/subplatform.h
  A engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
  A engines/pegasus/neighborhood/prehistoric/prehistoric.h
  A engines/pegasus/neighborhood/spot.cpp
  A engines/pegasus/neighborhood/spot.h
  A engines/pegasus/neighborhood/tsa/fulltsa.cpp
  A engines/pegasus/neighborhood/tsa/fulltsa.h
  A engines/pegasus/neighborhood/tsa/tinytsa.cpp
  A engines/pegasus/neighborhood/tsa/tinytsa.h
  A engines/pegasus/neighborhood/turn.cpp
  A engines/pegasus/neighborhood/turn.h
  A engines/pegasus/neighborhood/view.cpp
  A engines/pegasus/neighborhood/view.h
  A engines/pegasus/neighborhood/wsc/moleculebin.cpp
  A engines/pegasus/neighborhood/wsc/moleculebin.h
  A engines/pegasus/neighborhood/wsc/wsc.cpp
  A engines/pegasus/neighborhood/wsc/wsc.h
  A engines/pegasus/neighborhood/zoom.cpp
  A engines/pegasus/neighborhood/zoom.h
  A engines/pegasus/notification.cpp
  A engines/pegasus/notification.h
  A engines/pegasus/pegasus.cpp
  A engines/pegasus/pegasus.h
  A engines/pegasus/scoring.h
  A engines/pegasus/sound.cpp
  A engines/pegasus/sound.h
  A engines/pegasus/surface.cpp
  A engines/pegasus/surface.h
  A engines/pegasus/timers.cpp
  A engines/pegasus/timers.h
  A engines/pegasus/transition.cpp
  A engines/pegasus/transition.h
  A engines/pegasus/types.h
  A engines/pegasus/util.cpp
  A engines/pegasus/util.h
  A engines/plugins_table.h
  A engines/sci/engine/file.cpp
  A engines/sci/engine/file.h
  A engines/sci/engine/kgraphics32.cpp
  A engines/scumm/imuse/mac_m68k.cpp
  A engines/scumm/imuse/mac_m68k.h
  A engines/tony/custom.cpp
  A engines/tony/custom.h
  A engines/tony/debugger.cpp
  A engines/tony/debugger.h
  A engines/tony/detection.cpp
  A engines/tony/detection_tables.h
  A engines/tony/font.cpp
  A engines/tony/font.h
  A engines/tony/game.cpp
  A engines/tony/game.h
  A engines/tony/gfxcore.cpp
  A engines/tony/gfxcore.h
  A engines/tony/gfxengine.cpp
  A engines/tony/gfxengine.h
  A engines/tony/globals.cpp
  A engines/tony/globals.h
  A engines/tony/input.cpp
  A engines/tony/input.h
  A engines/tony/inventory.cpp
  A engines/tony/inventory.h
  A engines/tony/loc.cpp
  A engines/tony/loc.h
  A engines/tony/module.mk
  A engines/tony/mpal/expr.cpp
  A engines/tony/mpal/expr.h
  A engines/tony/mpal/loadmpc.cpp
  A engines/tony/mpal/loadmpc.h
  A engines/tony/mpal/lzo.cpp
  A engines/tony/mpal/lzo.h
  A engines/tony/mpal/memory.cpp
  A engines/tony/mpal/memory.h
  A engines/tony/mpal/mpal.cpp
  A engines/tony/mpal/mpal.h
  A engines/tony/mpal/mpaldll.h
  A engines/tony/mpal/mpalutils.cpp
  A engines/tony/mpal/mpalutils.h
  A engines/tony/resid.h
  A engines/tony/sound.cpp
  A engines/tony/sound.h
  A engines/tony/tony.cpp
  A engines/tony/tony.h
  A engines/tony/tonychar.cpp
  A engines/tony/tonychar.h
  A engines/tony/utils.cpp
  A engines/tony/utils.h
  A engines/tony/window.cpp
  A engines/tony/window.h
  A engines/wintermute/ad/ad_actor.cpp
  A engines/wintermute/ad/ad_actor.h
  A engines/wintermute/ad/ad_entity.cpp
  A engines/wintermute/ad/ad_entity.h
  A engines/wintermute/ad/ad_game.cpp
  A engines/wintermute/ad/ad_game.h
  A engines/wintermute/ad/ad_inventory.cpp
  A engines/wintermute/ad/ad_inventory.h
  A engines/wintermute/ad/ad_inventory_box.cpp
  A engines/wintermute/ad/ad_inventory_box.h
  A engines/wintermute/ad/ad_item.cpp
  A engines/wintermute/ad/ad_item.h
  A engines/wintermute/ad/ad_layer.cpp
  A engines/wintermute/ad/ad_layer.h
  A engines/wintermute/ad/ad_node_state.cpp
  A engines/wintermute/ad/ad_node_state.h
  A engines/wintermute/ad/ad_object.cpp
  A engines/wintermute/ad/ad_object.h
  A engines/wintermute/ad/ad_path.cpp
  A engines/wintermute/ad/ad_path.h
  A engines/wintermute/ad/ad_path_point.cpp
  A engines/wintermute/ad/ad_path_point.h
  A engines/wintermute/ad/ad_region.cpp
  A engines/wintermute/ad/ad_region.h
  A engines/wintermute/ad/ad_response.cpp
  A engines/wintermute/ad/ad_response.h
  A engines/wintermute/ad/ad_response_box.cpp
  A engines/wintermute/ad/ad_response_box.h
  A engines/wintermute/ad/ad_response_context.cpp
  A engines/wintermute/ad/ad_response_context.h
  A engines/wintermute/ad/ad_rot_level.cpp
  A engines/wintermute/ad/ad_rot_level.h
  A engines/wintermute/ad/ad_scale_level.cpp
  A engines/wintermute/ad/ad_scale_level.h
  A engines/wintermute/ad/ad_scene.cpp
  A engines/wintermute/ad/ad_scene.h
  A engines/wintermute/ad/ad_scene_node.cpp
  A engines/wintermute/ad/ad_scene_node.h
  A engines/wintermute/ad/ad_scene_state.cpp
  A engines/wintermute/ad/ad_scene_state.h
  A engines/wintermute/ad/ad_sentence.cpp
  A engines/wintermute/ad/ad_sentence.h
  A engines/wintermute/ad/ad_sprite_set.cpp
  A engines/wintermute/ad/ad_sprite_set.h
  A engines/wintermute/ad/ad_talk_def.cpp
  A engines/wintermute/ad/ad_talk_def.h
  A engines/wintermute/ad/ad_talk_holder.cpp
  A engines/wintermute/ad/ad_talk_holder.h
  A engines/wintermute/ad/ad_talk_node.cpp
  A engines/wintermute/ad/ad_talk_node.h
  A engines/wintermute/ad/ad_types.h
  A engines/wintermute/ad/ad_waypoint_group.cpp
  A engines/wintermute/ad/ad_waypoint_group.h
  A engines/wintermute/base/base.cpp
  A engines/wintermute/base/base.h
  A engines/wintermute/base/base_active_rect.cpp
  A engines/wintermute/base/base_active_rect.h
  A engines/wintermute/base/base_dynamic_buffer.cpp
  A engines/wintermute/base/base_dynamic_buffer.h
  A engines/wintermute/base/base_engine.cpp
  A engines/wintermute/base/base_engine.h
  A engines/wintermute/base/base_fader.cpp
  A engines/wintermute/base/base_fader.h
  A engines/wintermute/base/base_file_manager.cpp
  A engines/wintermute/base/base_file_manager.h
  A engines/wintermute/base/base_frame.cpp
  A engines/wintermute/base/base_frame.h
  A engines/wintermute/base/base_game.cpp
  A engines/wintermute/base/base_game.h
  A engines/wintermute/base/base_keyboard_state.cpp
  A engines/wintermute/base/base_keyboard_state.h
  A engines/wintermute/base/base_named_object.cpp
  A engines/wintermute/base/base_named_object.h
  A engines/wintermute/base/base_object.cpp
  A engines/wintermute/base/base_object.h
  A engines/wintermute/base/base_parser.cpp
  A engines/wintermute/base/base_parser.h
  A engines/wintermute/base/base_persistence_manager.cpp
  A engines/wintermute/base/base_persistence_manager.h
  A engines/wintermute/base/base_point.cpp
  A engines/wintermute/base/base_point.h
  A engines/wintermute/base/base_quick_msg.cpp
  A engines/wintermute/base/base_quick_msg.h
  A engines/wintermute/base/base_region.cpp
  A engines/wintermute/base/base_region.h
  A engines/wintermute/base/base_save_thumb_helper.cpp
  A engines/wintermute/base/base_save_thumb_helper.h
  A engines/wintermute/base/base_script_holder.cpp
  A engines/wintermute/base/base_script_holder.h
  A engines/wintermute/base/base_scriptable.cpp
  A engines/wintermute/base/base_scriptable.h
  A engines/wintermute/base/base_sprite.cpp
  A engines/wintermute/base/base_sprite.h
  A engines/wintermute/base/base_string_table.cpp
  A engines/wintermute/base/base_string_table.h
  A engines/wintermute/base/base_sub_frame.cpp
  A engines/wintermute/base/base_sub_frame.h
  A engines/wintermute/base/base_surface_storage.cpp
  A engines/wintermute/base/base_surface_storage.h
  A engines/wintermute/base/base_transition_manager.cpp
  A engines/wintermute/base/base_transition_manager.h
  A engines/wintermute/base/base_viewport.cpp
  A engines/wintermute/base/base_viewport.h
  A engines/wintermute/base/file/base_disk_file.cpp
  A engines/wintermute/base/file/base_disk_file.h
  A engines/wintermute/base/file/base_file.cpp
  A engines/wintermute/base/file/base_file.h
  A engines/wintermute/base/file/base_file_entry.cpp
  A engines/wintermute/base/file/base_file_entry.h
  A engines/wintermute/base/file/base_package.cpp
  A engines/wintermute/base/file/base_package.h
  A engines/wintermute/base/file/base_resources.cpp
  A engines/wintermute/base/file/base_resources.h
  A engines/wintermute/base/file/base_save_thumb_file.cpp
  A engines/wintermute/base/file/base_save_thumb_file.h
  A engines/wintermute/base/file/dcpackage.h
  A engines/wintermute/base/font/base_font.cpp
  A engines/wintermute/base/font/base_font.h
  A engines/wintermute/base/font/base_font_bitmap.cpp
  A engines/wintermute/base/font/base_font_bitmap.h
  A engines/wintermute/base/font/base_font_storage.cpp
  A engines/wintermute/base/font/base_font_storage.h
  A engines/wintermute/base/font/base_font_truetype.cpp
  A engines/wintermute/base/font/base_font_truetype.h
  A engines/wintermute/base/gfx/base_image.cpp
  A engines/wintermute/base/gfx/base_image.h
  A engines/wintermute/base/gfx/base_renderer.cpp
  A engines/wintermute/base/gfx/base_renderer.h
  A engines/wintermute/base/gfx/base_surface.cpp
  A engines/wintermute/base/gfx/base_surface.h
  A engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
  A engines/wintermute/base/gfx/osystem/base_render_osystem.h
  A engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
  A engines/wintermute/base/gfx/osystem/base_surface_osystem.h
  A engines/wintermute/base/particles/part_emitter.cpp
  A engines/wintermute/base/particles/part_emitter.h
  A engines/wintermute/base/particles/part_force.cpp
  A engines/wintermute/base/particles/part_force.h
  A engines/wintermute/base/particles/part_particle.cpp
  A engines/wintermute/base/particles/part_particle.h
  A engines/wintermute/base/saveload.cpp
  A engines/wintermute/base/saveload.h
  A engines/wintermute/base/scriptables/dcscript.h
  A engines/wintermute/base/scriptables/script.cpp
  A engines/wintermute/base/scriptables/script.h
  A engines/wintermute/base/scriptables/script_engine.cpp
  A engines/wintermute/base/scriptables/script_engine.h
  A engines/wintermute/base/scriptables/script_ext_array.cpp
  A engines/wintermute/base/scriptables/script_ext_array.h
  A engines/wintermute/base/scriptables/script_ext_date.cpp
  A engines/wintermute/base/scriptables/script_ext_date.h
  A engines/wintermute/base/scriptables/script_ext_file.cpp
  A engines/wintermute/base/scriptables/script_ext_file.h
  A engines/wintermute/base/scriptables/script_ext_math.cpp
  A engines/wintermute/base/scriptables/script_ext_math.h
  A engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp
  A engines/wintermute/base/scriptables/script_ext_mem_buffer.h
  A engines/wintermute/base/scriptables/script_ext_object.cpp
  A engines/wintermute/base/scriptables/script_ext_object.h
  A engines/wintermute/base/scriptables/script_ext_string.cpp
  A engines/wintermute/base/scriptables/script_ext_string.h
  A engines/wintermute/base/scriptables/script_stack.cpp
  A engines/wintermute/base/scriptables/script_stack.h
  A engines/wintermute/base/scriptables/script_value.cpp
  A engines/wintermute/base/scriptables/script_value.h
  A engines/wintermute/base/sound/base_sound.cpp
  A engines/wintermute/base/sound/base_sound.h
  A engines/wintermute/base/sound/base_sound_buffer.cpp
  A engines/wintermute/base/sound/base_sound_buffer.h
  A engines/wintermute/base/sound/base_sound_manager.cpp
  A engines/wintermute/base/sound/base_sound_manager.h
  A engines/wintermute/coll_templ.h
  A engines/wintermute/dcgf.h
  A engines/wintermute/dctypes.h
  A engines/wintermute/detection.cpp
  A engines/wintermute/detection_tables.h
  A engines/wintermute/graphics/transparent_surface.cpp
  A engines/wintermute/graphics/transparent_surface.h
  A engines/wintermute/math/math_util.cpp
  A engines/wintermute/math/math_util.h
  A engines/wintermute/math/matrix4.cpp
  A engines/wintermute/math/matrix4.h
  A engines/wintermute/math/rect32.h
  A engines/wintermute/math/vector2.cpp
  A engines/wintermute/math/vector2.h
  A engines/wintermute/module.mk
  A engines/wintermute/persistent.cpp
  A engines/wintermute/persistent.h
  A engines/wintermute/platform_osystem.cpp
  A engines/wintermute/platform_osystem.h
  A engines/wintermute/system/sys_class.cpp
  A engines/wintermute/system/sys_class.h
  A engines/wintermute/system/sys_class_registry.cpp
  A engines/wintermute/system/sys_class_registry.h
  A engines/wintermute/system/sys_instance.cpp
  A engines/wintermute/system/sys_instance.h
  A engines/wintermute/ui/ui_button.cpp
  A engines/wintermute/ui/ui_button.h
  A engines/wintermute/ui/ui_edit.cpp
  A engines/wintermute/ui/ui_edit.h
  A engines/wintermute/ui/ui_entity.cpp
  A engines/wintermute/ui/ui_entity.h
  A engines/wintermute/ui/ui_object.cpp
  A engines/wintermute/ui/ui_object.h
  A engines/wintermute/ui/ui_text.cpp
  A engines/wintermute/ui/ui_text.h
  A engines/wintermute/ui/ui_tiled_image.cpp
  A engines/wintermute/ui/ui_tiled_image.h
  A engines/wintermute/ui/ui_window.cpp
  A engines/wintermute/ui/ui_window.h
  A engines/wintermute/utils/convert_utf.cpp
  A engines/wintermute/utils/convert_utf.h
  A engines/wintermute/utils/crc.cpp
  A engines/wintermute/utils/crc.h
  A engines/wintermute/utils/path_util.cpp
  A engines/wintermute/utils/path_util.h
  A engines/wintermute/utils/string_util.cpp
  A engines/wintermute/utils/string_util.h
  A engines/wintermute/utils/utils.cpp
  A engines/wintermute/utils/utils.h
  A engines/wintermute/video/video_player.cpp
  A engines/wintermute/video/video_player.h
  A engines/wintermute/video/video_theora_player.cpp
  A engines/wintermute/video/video_theora_player.h
  A engines/wintermute/wintermute.cpp
  A engines/wintermute/wintermute.h
  A engines/wintermute/wintypes.h
  A graphics/decoders/bmp.cpp
  A graphics/decoders/bmp.h
  A graphics/decoders/image_decoder.h
  A graphics/decoders/jpeg.cpp
  A graphics/decoders/jpeg.h
  A graphics/decoders/pcx.cpp
  A graphics/decoders/pcx.h
  A graphics/decoders/pict.cpp
  A graphics/decoders/pict.h
  A graphics/decoders/png.cpp
  A graphics/decoders/png.h
  A graphics/decoders/tga.cpp
  A graphics/decoders/tga.h
  A gui/predictivedialog.cpp
  A gui/predictivedialog.h
  A gui/saveload-dialog.cpp
  A gui/saveload-dialog.h
  A gui/themes/scummmodern/delbtn.bmp
  A gui/themes/scummmodern/grid.bmp
  A gui/themes/scummmodern/list.bmp
  A po/eu.po
  A po/gl_ES.po
  A test/common/memorywritestream.h
  A video/codecs/svq1.cpp
  A video/codecs/svq1.h
  A video/codecs/svq1_cb.h
  A video/codecs/svq1_vlc.h
  A video/theora_decoder.cpp
  A video/theora_decoder.h
  R backends/platform/gph/caanoo-bundle.mk
  R backends/platform/gph/gp2xwiz-bundle.mk
  R backends/platform/openpandora/module.mk
  R backends/platform/openpandora/op-bundle.mk
  R backends/platform/sdl/macosx/appmenu_osx.h
  R backends/platform/sdl/macosx/appmenu_osx.mm
  R backends/platform/sdl/main.cpp
  R engines/agos/installshield_cab.cpp
  R engines/agos/installshield_cab.h
  R dists/iphone/scummvm.xcodeproj/project.pbxproj
  R dists/macosx/scummvm_osx_appcast.xml
  R engines/agi/predictive.cpp
  R engines/gob/detection.cpp
  R engines/gob/detection_tables.h
  R engines/sword25/fmv/theora_decoder.cpp
  R engines/sword25/fmv/theora_decoder.h
  R engines/tinsel/coroutine.cpp
  R engines/tinsel/coroutine.h
  R graphics/imagedec.h
  R graphics/jpeg.cpp
  R graphics/jpeg.h
  R graphics/pict.cpp
  R graphics/pict.h
  R graphics/imagedec.cpp
  R graphics/png.cpp
  R graphics/png.h
    AUTHORS
    Makefile
    NEWS
    README
    audio/audiostream.cpp
    audio/audiostream.h
    audio/decoders/adpcm.cpp
    audio/decoders/adpcm_intern.h
    audio/decoders/aiff.h
    audio/decoders/qdm2.cpp
    audio/decoders/quicktime.cpp
    audio/decoders/quicktime.h
    audio/decoders/quicktime_intern.h
    audio/decoders/voc.cpp
    audio/mididrv.cpp
    audio/midiparser.cpp
    audio/midiparser.h
    audio/midiparser_smf.cpp
    audio/midiparser_xmidi.cpp
    audio/mixer.h
    audio/mods/maxtrax.h
    audio/mods/protracker.cpp
    audio/mods/protracker.h
    audio/mods/tfmx.h
    audio/softsynth/fmtowns_pc98/towns_pc98_driver.cpp
    audio/softsynth/mt32/Part.cpp
    audio/softsynth/mt32/Partial.h
    audio/softsynth/mt32/PartialManager.cpp
    audio/softsynth/mt32/Structures.h
    audio/softsynth/mt32/Synth.cpp
    audio/softsynth/mt32/TVA.cpp
    audio/softsynth/mt32/TVF.cpp
    audio/softsynth/mt32/freeverb.cpp
    audio/softsynth/opl/mame.cpp
    backends/events/gph/gph-events.cpp
    backends/events/gph/gph-events.h
    backends/events/openpandora/op-events.cpp
    backends/events/sdl/sdl-events.cpp
    backends/events/sdl/sdl-events.h
    backends/events/webossdl/webossdl-events.h
    backends/fs/symbian/symbian-fs.cpp
    backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
    backends/graphics/gph/gph-graphics.cpp
    backends/graphics/graphics.h
    backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
    backends/graphics/null/null-graphics.h
    backends/graphics/opengl/opengl-graphics.cpp
    backends/graphics/opengl/opengl-graphics.h
    backends/graphics/openglsdl/openglsdl-graphics.cpp
    backends/graphics/openpandora/op-graphics.cpp
    backends/graphics/openpandora/op-graphics.h
    backends/graphics/surfacesdl/surfacesdl-graphics.cpp
    backends/graphics/surfacesdl/surfacesdl-graphics.h
    backends/graphics/wincesdl/wincesdl-graphics.cpp
    backends/graphics/wincesdl/wincesdl-graphics.h
    backends/keymapper/hardware-input.cpp
    backends/keymapper/hardware-input.h
    backends/keymapper/keymap.cpp
    backends/keymapper/keymap.h
    backends/keymapper/keymapper.cpp
    backends/keymapper/keymapper.h
    backends/keymapper/remap-dialog.cpp
    backends/keymapper/remap-dialog.h
    backends/midi/coreaudio.cpp
    backends/midi/stmidi.cpp
    backends/midi/timidity.cpp
    backends/mixer/sdl13/sdl13-mixer.cpp
    backends/mixer/symbiansdl/symbiansdl-mixer.cpp
    backends/modular-backend.cpp
    backends/modular-backend.h
    backends/module.mk
    backends/platform/android/android.cpp
    backends/platform/android/android.h
    backends/platform/android/android.mk
    backends/platform/android/gfx.cpp
    backends/platform/android/texture.cpp
    backends/platform/bada/application.cpp
    backends/platform/bada/sscanf.cpp
    backends/platform/bada/system.cpp
    backends/platform/dc/dc.h
    backends/platform/dc/dcmain.cpp
    backends/platform/dc/display.cpp
    backends/platform/dc/vmsave.cpp
    backends/platform/dingux/README.DINGUX
    backends/platform/dingux/dingux.mk
    backends/platform/ds/arm9/source/gbampsave.cpp
    backends/platform/ds/arm9/source/gbampsave.h
    backends/platform/ds/arm9/source/osystem_ds.cpp
    backends/platform/ds/arm9/source/osystem_ds.h
    backends/platform/gph/gph-backend.cpp
    backends/platform/gph/gph-main.cpp
    backends/platform/gph/gph.h
    backends/platform/iphone/iphone_common.h
    backends/platform/iphone/iphone_video.h
    backends/platform/iphone/iphone_video.mm
    backends/platform/iphone/osys_events.cpp
    backends/platform/iphone/osys_main.cpp
    backends/platform/iphone/osys_main.h
    backends/platform/iphone/osys_video.mm
    backends/platform/maemo/debian/changelog
    backends/platform/maemo/debian/control
    backends/platform/maemo/debian/rules
    backends/platform/maemo/maemo.cpp
    backends/platform/n64/framfs_save_manager.h
    backends/platform/n64/osys_n64.h
    backends/platform/n64/osys_n64_base.cpp
    backends/platform/n64/pakfs_save_manager.h
    backends/platform/openpandora/op-backend.cpp
    backends/platform/openpandora/op-options.cpp
    backends/platform/openpandora/op-sdl.h
    backends/platform/ps2/Gs2dScreen.cpp
    backends/platform/ps2/Gs2dScreen.h
    backends/platform/ps2/icon.h
    backends/platform/ps2/ps2time.cpp
    backends/platform/ps2/savefilemgr.cpp
    backends/platform/ps2/savefilemgr.h
    backends/platform/ps2/systemps2.cpp
    backends/platform/ps2/systemps2.h
    backends/platform/psp/README.PSP
    backends/platform/psp/default_display_client.cpp
    backends/platform/psp/default_display_client.h
    backends/platform/psp/display_manager.cpp
    backends/platform/psp/osys_psp.cpp
    backends/platform/psp/osys_psp.h
    backends/platform/psp/psp_main.cpp
    backends/platform/psp/tests.cpp
    backends/platform/psp/tests.h
    backends/platform/psp/trace.h
    backends/platform/sdl/macosx/macosx.cpp
    backends/platform/sdl/macosx/macosx.h
    backends/platform/sdl/module.mk
    backends/platform/sdl/sdl.cpp
    backends/platform/symbian/src/ScummApp.cpp
    backends/platform/symbian/src/ScummApp.h
    backends/platform/symbian/src/SymbianActions.cpp
    backends/platform/symbian/src/portdefs.h
    backends/platform/webos/webos.cpp
    backends/platform/webos/webos.h
    backends/platform/wii/osystem.cpp
    backends/platform/wii/osystem.h
    backends/platform/wii/osystem_gfx.cpp
    backends/platform/wince/wince-sdl.cpp
    backends/saves/default/default-saves.cpp
    backends/saves/default/default-saves.h
    backends/saves/windows/windows-saves.cpp
    backends/taskbar/win32/mingw-compat.h
    backends/timer/bada/timer.cpp
    backends/timer/bada/timer.h
    backends/timer/default/default-timer.cpp
    backends/timer/default/default-timer.h
    backends/timer/psp/timer.cpp
    backends/vkeybd/virtual-keyboard-gui.cpp
    backends/vkeybd/virtual-keyboard-parser.cpp
    base/commandLine.cpp
    base/internal_version.h
    base/main.cpp
    base/plugins.cpp
    base/plugins.h
    base/version.cpp
    common/EventDispatcher.cpp
    common/EventMapper.cpp
    common/array.h
    common/cosinetables.cpp
    common/cosinetables.h
    common/dct.cpp
    common/dct.h
    common/endian.h
    common/events.h
    common/fft.cpp
    common/fft.h
    common/gui_options.cpp
    common/gui_options.h
    common/keyboard.h
    common/language.cpp
    common/language.h
    common/macresman.cpp
    common/macresman.h
    common/math.h
    common/memstream.h
    common/module.mk
    common/ptr.h
    common/quicktime.cpp
    common/quicktime.h
    common/rational.h
    common/rdft.cpp
    common/rdft.h
    common/rect.h
    common/rendermode.cpp
    common/rendermode.h
    common/savefile.h
    common/scummsys.h
    common/sinetables.cpp
    common/sinetables.h
    common/singleton.h
    common/system.h
    common/taskbar.h
    common/translation.cpp
    common/unzip.cpp
    common/updates.h
    common/util.h
    common/winexe_pe.cpp
    common/xmlparser.cpp
    common/zlib.cpp
    common/zlib.h
    configure
    devtools/README
    devtools/create_drascula/staticdata.h
    devtools/create_kyradat/create_kyradat.cpp
    devtools/create_kyradat/extract.cpp
    devtools/create_kyradat/games.cpp
    devtools/create_kyradat/tables.cpp
    devtools/create_lure/create_lure_dat.h
    devtools/create_project/config.h
    devtools/create_project/create_project.cpp
    devtools/create_project/create_project.h
    devtools/create_project/msbuild.cpp
    devtools/create_project/msvc.cpp
    devtools/create_project/msvc.h
    devtools/create_project/scripts/postbuild.cmd
    devtools/create_project/visualstudio.cpp
    devtools/create_project/xcode.cpp
    devtools/create_teenagent/create_teenagent.cpp
    devtools/create_translations/cp_parser.cpp
    devtools/create_translations/po_parser.cpp
    devtools/credits.pl
    devtools/module.mk
    devtools/scumm-md5.txt
    dists/android/AndroidManifest.xml
    dists/android/plugin-manifest.xml
    dists/bada/Res/scummmobile/THEMERC
    dists/bada/Res/scummmobile/scummmobile_layout.stx
    dists/engine-data/README
    dists/engine-data/drascula.dat
    dists/engine-data/kyra.dat
    dists/engine-data/teenagent.dat
    dists/gph/README-GPH
    dists/gph/scummvm.ini
    dists/iphone/Info.plist
    dists/irix/scummvm.spec
    dists/macosx/Info.plist
    dists/openpandora/PXML.xml
    dists/openpandora/README-OPENPANDORA
    dists/openpandora/README-PND.txt
    dists/openpandora/index.html
    dists/redhat/scummvm-tools.spec
    dists/redhat/scummvm.spec
    dists/redhat/scummvm.spec.in
    dists/samsungtv/scummvm.dat
    dists/scummvm.6
    dists/scummvm.rc
    dists/scummvm.rc.in
    dists/slackware/scummvm.SlackBuild
    dists/wii/meta.xml
    dists/win32/ScummVM.iss
    dists/win32/scummvm.nsi
    doc/cz/PrectiMe
    doc/de/Liesmich
    doc/de/Neues
    doc/se/LasMig
    engines/advancedDetector.cpp
    engines/advancedDetector.h
    engines/agi/agi.cpp
    engines/agi/agi.h
    engines/agi/detection.cpp
    engines/agi/detection_tables.h
    engines/agi/keyboard.cpp
    engines/agi/loader_v1.cpp
    engines/agi/menu.cpp
    engines/agi/module.mk
    engines/agi/op_cmd.cpp
    engines/agi/op_test.cpp
    engines/agi/opcodes.cpp
    engines/agi/saveload.cpp
    engines/agi/sound_pcjr.cpp
    engines/agi/text.cpp
    engines/agi/words.cpp
    engines/agos/agos.h
    engines/agos/animation.cpp
    engines/agos/animation.h
    engines/agos/charset-fontdata.cpp
    engines/agos/event.cpp
    engines/agos/midiparser_s1d.cpp
    engines/agos/module.mk
    engines/agos/res.cpp
    engines/agos/saveload.cpp
    engines/agos/script_s1.cpp
    engines/agos/sound.cpp
    engines/cge/bitmap.cpp
    engines/cge/cge.cpp
    engines/cge/cge.h
    engines/cge/cge_main.cpp
    engines/cge/cge_main.h
    engines/cge/detection.cpp
    engines/cge/events.cpp
    engines/cge/events.h
    engines/cge/fileio.cpp
    engines/cge/sound.cpp
    engines/cge/text.cpp
    engines/cge/vga13h.cpp
    engines/cge/vga13h.h
    engines/cge/vmenu.cpp
    engines/cge/vmenu.h
    engines/cine/anim.cpp
    engines/cine/anim.h
    engines/cine/bg_list.cpp
    engines/cine/cine.cpp
    engines/cine/cine.h
    engines/cine/console.cpp
    engines/cine/detection_tables.h
    engines/cine/gfx.cpp
    engines/cine/gfx.h
    engines/cine/main_loop.cpp
    engines/cine/object.cpp
    engines/cine/pal.cpp
    engines/cine/part.cpp
    engines/cine/saveload.cpp
    engines/cine/saveload.h
    engines/cine/script.h
    engines/cine/script_fw.cpp
    engines/cine/sound.cpp
    engines/cine/sound.h
    engines/cine/texte.cpp
    engines/cine/texte.h
    engines/cine/various.cpp
    engines/cine/various.h
    engines/composer/composer.cpp
    engines/composer/resource.cpp
    engines/cruise/cruise.cpp
    engines/cruise/cruise_main.cpp
    engines/cruise/detection.cpp
    engines/cruise/menu.cpp
    engines/cruise/staticres.cpp
    engines/cruise/staticres.h
    engines/dialogs.cpp
    engines/draci/detection.cpp
    engines/drascula/detection.cpp
    engines/drascula/interface.cpp
    engines/dreamweb/detection.cpp
    engines/dreamweb/detection_tables.h
    engines/dreamweb/dreamweb.cpp
    engines/dreamweb/dreamweb.h
    engines/dreamweb/keypad.cpp
    engines/dreamweb/module.mk
    engines/dreamweb/monitor.cpp
    engines/dreamweb/newplace.cpp
    engines/dreamweb/object.cpp
    engines/dreamweb/people.cpp
    engines/dreamweb/print.cpp
    engines/dreamweb/rain.cpp
    engines/dreamweb/saveload.cpp
    engines/dreamweb/sound.cpp
    engines/dreamweb/sprite.cpp
    engines/dreamweb/stubs.cpp
    engines/dreamweb/talk.cpp
    engines/dreamweb/titles.cpp
    engines/dreamweb/use.cpp
    engines/dreamweb/vgafades.cpp
    engines/dreamweb/vgagrafx.cpp
    engines/engines.mk
    engines/gob/anifile.cpp
    engines/gob/anifile.h
    engines/gob/aniobject.cpp
    engines/gob/aniobject.h
    engines/gob/cheater.h
    engines/gob/cheater_geisha.cpp
    engines/gob/decfile.cpp
    engines/gob/decfile.h
    engines/gob/draw.cpp
    engines/gob/draw.h
    engines/gob/draw_fascin.cpp
    engines/gob/draw_playtoons.cpp
    engines/gob/draw_v1.cpp
    engines/gob/draw_v2.cpp
    engines/gob/game.cpp
    engines/gob/game.h
    engines/gob/global.cpp
    engines/gob/global.h
    engines/gob/gob.cpp
    engines/gob/gob.h
    engines/gob/hotspots.cpp
    engines/gob/hotspots.h
    engines/gob/init.cpp
    engines/gob/init.h
    engines/gob/init_fascin.cpp
    engines/gob/init_geisha.cpp
    engines/gob/init_v1.cpp
    engines/gob/init_v2.cpp
    engines/gob/inter.cpp
    engines/gob/inter.h
    engines/gob/inter_bargon.cpp
    engines/gob/inter_fascin.cpp
    engines/gob/inter_geisha.cpp
    engines/gob/inter_v1.cpp
    engines/gob/inter_v2.cpp
    engines/gob/inter_v5.cpp
    engines/gob/inter_v7.cpp
    engines/gob/minigames/geisha/diving.cpp
    engines/gob/minigames/geisha/evilfish.cpp
    engines/gob/minigames/geisha/evilfish.h
    engines/gob/minigames/geisha/meter.cpp
    engines/gob/minigames/geisha/meter.h
    engines/gob/minigames/geisha/penetration.cpp
    engines/gob/minigames/geisha/penetration.h
    engines/gob/module.mk
    engines/gob/mult.cpp
    engines/gob/mult_v2.cpp
    engines/gob/palanim.cpp
    engines/gob/resources.cpp
    engines/gob/resources.h
    engines/gob/rxyfile.cpp
    engines/gob/rxyfile.h
    engines/gob/save/saveload.h
    engines/gob/sound/adlib.cpp
    engines/gob/sound/adlib.h
    engines/gob/sound/sound.cpp
    engines/gob/sound/sound.h
    engines/gob/sound/soundblaster.cpp
    engines/gob/sound/soundblaster.h
    engines/gob/surface.cpp
    engines/gob/surface.h
    engines/gob/util.cpp
    engines/gob/util.h
    engines/gob/video.cpp
    engines/gob/video.h
    engines/gob/videoplayer.cpp
    engines/gob/videoplayer.h
    engines/groovie/cursor.cpp
    engines/groovie/detection.cpp
    engines/groovie/graphics.cpp
    engines/groovie/groovie.cpp
    engines/groovie/resource.cpp
    engines/groovie/roq.cpp
    engines/groovie/saveload.cpp
    engines/groovie/script.cpp
    engines/hugo/console.cpp
    engines/hugo/detection.cpp
    engines/hugo/dialogs.cpp
    engines/hugo/dialogs.h
    engines/hugo/display.cpp
    engines/hugo/display.h
    engines/hugo/file.cpp
    engines/hugo/file.h
    engines/hugo/file_v1d.cpp
    engines/hugo/file_v1w.cpp
    engines/hugo/file_v2d.cpp
    engines/hugo/file_v3d.cpp
    engines/hugo/game.h
    engines/hugo/hugo.cpp
    engines/hugo/hugo.h
    engines/hugo/intro.cpp
    engines/hugo/intro.h
    engines/hugo/inventory.cpp
    engines/hugo/inventory.h
    engines/hugo/mouse.cpp
    engines/hugo/mouse.h
    engines/hugo/object.cpp
    engines/hugo/object.h
    engines/hugo/object_v1d.cpp
    engines/hugo/object_v1w.cpp
    engines/hugo/object_v2d.cpp
    engines/hugo/object_v3d.cpp
    engines/hugo/parser.cpp
    engines/hugo/parser.h
    engines/hugo/parser_v1d.cpp
    engines/hugo/parser_v1w.cpp
    engines/hugo/parser_v2d.cpp
    engines/hugo/parser_v3d.cpp
    engines/hugo/route.cpp
    engines/hugo/route.h
    engines/hugo/schedule.cpp
    engines/hugo/schedule.h
    engines/hugo/sound.cpp
    engines/hugo/sound.h
    engines/kyra/animator_hof.cpp
    engines/kyra/animator_mr.cpp
    engines/kyra/detection.cpp
    engines/kyra/detection_tables.h
    engines/kyra/eobcommon.cpp
    engines/kyra/eobcommon.h
    engines/kyra/gui_eob.cpp
    engines/kyra/gui_hof.cpp
    engines/kyra/gui_lok.cpp
    engines/kyra/gui_lol.cpp
    engines/kyra/gui_mr.cpp
    engines/kyra/gui_v1.cpp
    engines/kyra/gui_v2.cpp
    engines/kyra/items_hof.cpp
    engines/kyra/items_lok.cpp
    engines/kyra/items_lol.cpp
    engines/kyra/items_mr.cpp
    engines/kyra/items_v2.cpp
    engines/kyra/kyra_hof.cpp
    engines/kyra/kyra_lok.cpp
    engines/kyra/kyra_mr.cpp
    engines/kyra/kyra_v2.cpp
    engines/kyra/lol.cpp
    engines/kyra/lol.h
    engines/kyra/screen.cpp
    engines/kyra/screen.h
    engines/kyra/screen_eob.cpp
    engines/kyra/screen_lok.cpp
    engines/kyra/screen_lol.cpp
    engines/kyra/screen_lol.h
    engines/kyra/screen_v2.cpp
    engines/kyra/script_hof.cpp
    engines/kyra/script_lok.cpp
    engines/kyra/script_lol.cpp
    engines/kyra/script_mr.cpp
    engines/kyra/sequences_hof.cpp
    engines/kyra/sequences_lok.cpp
    engines/kyra/sound_intern.h
    engines/kyra/sound_midi.cpp
    engines/kyra/sound_towns.cpp
    engines/kyra/sprites_lol.cpp
    engines/kyra/staticres.cpp
    engines/kyra/text_hof.cpp
    engines/kyra/text_lok.cpp
    engines/kyra/text_mr.cpp
    engines/kyra/timer_eob.cpp
    engines/kyra/vqa.cpp
    engines/lastexpress/data/animation.cpp
    engines/lastexpress/data/background.cpp
    engines/lastexpress/data/cursor.cpp
    engines/lastexpress/data/font.cpp
    engines/lastexpress/data/scene.cpp
    engines/lastexpress/data/sequence.cpp
    engines/lastexpress/data/sequence.h
    engines/lastexpress/data/snd.cpp
    engines/lastexpress/data/subtitle.cpp
    engines/lastexpress/debug.cpp
    engines/lastexpress/debug.h
    engines/lastexpress/detection.cpp
    engines/lastexpress/entities/abbot.cpp
    engines/lastexpress/entities/abbot.h
    engines/lastexpress/entities/alexei.cpp
    engines/lastexpress/entities/alexei.h
    engines/lastexpress/entities/alouan.cpp
    engines/lastexpress/entities/alouan.h
    engines/lastexpress/entities/anna.cpp
    engines/lastexpress/entities/anna.h
    engines/lastexpress/entities/august.cpp
    engines/lastexpress/entities/august.h
    engines/lastexpress/entities/boutarel.cpp
    engines/lastexpress/entities/boutarel.h
    engines/lastexpress/entities/chapters.cpp
    engines/lastexpress/entities/chapters.h
    engines/lastexpress/entities/cooks.cpp
    engines/lastexpress/entities/cooks.h
    engines/lastexpress/entities/coudert.cpp
    engines/lastexpress/entities/coudert.h
    engines/lastexpress/entities/entity.cpp
    engines/lastexpress/entities/entity.h
    engines/lastexpress/entities/entity39.cpp
    engines/lastexpress/entities/entity39.h
    engines/lastexpress/entities/entity_intern.h
    engines/lastexpress/entities/francois.cpp
    engines/lastexpress/entities/francois.h
    engines/lastexpress/entities/gendarmes.cpp
    engines/lastexpress/entities/gendarmes.h
    engines/lastexpress/entities/hadija.cpp
    engines/lastexpress/entities/hadija.h
    engines/lastexpress/entities/ivo.cpp
    engines/lastexpress/entities/ivo.h
    engines/lastexpress/entities/kahina.cpp
    engines/lastexpress/entities/kahina.h
    engines/lastexpress/entities/kronos.cpp
    engines/lastexpress/entities/kronos.h
    engines/lastexpress/entities/mahmud.cpp
    engines/lastexpress/entities/mahmud.h
    engines/lastexpress/entities/max.cpp
    engines/lastexpress/entities/max.h
    engines/lastexpress/entities/mertens.cpp
    engines/lastexpress/entities/mertens.h
    engines/lastexpress/entities/milos.cpp
    engines/lastexpress/entities/milos.h
    engines/lastexpress/entities/mmeboutarel.cpp
    engines/lastexpress/entities/mmeboutarel.h
    engines/lastexpress/entities/pascale.cpp
    engines/lastexpress/entities/pascale.h
    engines/lastexpress/entities/rebecca.cpp
    engines/lastexpress/entities/rebecca.h
    engines/lastexpress/entities/salko.cpp
    engines/lastexpress/entities/salko.h
    engines/lastexpress/entities/servers0.cpp
    engines/lastexpress/entities/servers0.h
    engines/lastexpress/entities/servers1.cpp
    engines/lastexpress/entities/servers1.h
    engines/lastexpress/entities/sophie.cpp
    engines/lastexpress/entities/sophie.h
    engines/lastexpress/entities/tables.cpp
    engines/lastexpress/entities/tables.h
    engines/lastexpress/entities/tatiana.cpp
    engines/lastexpress/entities/tatiana.h
    engines/lastexpress/entities/train.cpp
    engines/lastexpress/entities/train.h
    engines/lastexpress/entities/vassili.cpp
    engines/lastexpress/entities/vassili.h
    engines/lastexpress/entities/verges.cpp
    engines/lastexpress/entities/verges.h
    engines/lastexpress/entities/vesna.cpp
    engines/lastexpress/entities/vesna.h
    engines/lastexpress/entities/yasmin.cpp
    engines/lastexpress/entities/yasmin.h
    engines/lastexpress/fight/fight.cpp
    engines/lastexpress/fight/fighter.cpp
    engines/lastexpress/fight/fighter.h
    engines/lastexpress/game/action.cpp
    engines/lastexpress/game/beetle.cpp
    engines/lastexpress/game/beetle.h
    engines/lastexpress/game/entities.cpp
    engines/lastexpress/game/entities.h
    engines/lastexpress/game/inventory.cpp
    engines/lastexpress/game/inventory.h
    engines/lastexpress/game/logic.cpp
    engines/lastexpress/game/logic.h
    engines/lastexpress/game/object.cpp
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/savegame.h
    engines/lastexpress/game/savepoint.cpp
    engines/lastexpress/game/savepoint.h
    engines/lastexpress/game/scenes.cpp
    engines/lastexpress/game/scenes.h
    engines/lastexpress/game/state.cpp
    engines/lastexpress/game/state.h
    engines/lastexpress/graphics.cpp
    engines/lastexpress/helpers.h
    engines/lastexpress/lastexpress.cpp
    engines/lastexpress/menu/menu.cpp
    engines/lastexpress/resource.cpp
    engines/lastexpress/resource.h
    engines/lastexpress/shared.h
    engines/lastexpress/sound/entry.cpp
    engines/lastexpress/sound/queue.cpp
    engines/lastexpress/sound/queue.h
    engines/lastexpress/sound/sound.cpp
    engines/lure/debugger.cpp
    engines/lure/decode.cpp
    engines/lure/game.cpp
    engines/lure/hotspots.cpp
    engines/lure/hotspots.h
    engines/lure/menu.cpp
    engines/lure/res.cpp
    engines/lure/res_struct.cpp
    engines/lure/res_struct.h
    engines/lure/room.cpp
    engines/lure/sound.cpp
    engines/lure/surface.cpp
    engines/made/pmvplayer.cpp
    engines/made/screen.cpp
    engines/made/screen.h
    engines/made/screenfx.cpp
    engines/made/scriptfuncs.cpp
    engines/metaengine.h
    engines/mohawk/bitmap.cpp
    engines/mohawk/bitmap.h
    engines/mohawk/cursors.cpp
    engines/mohawk/detection.cpp
    engines/mohawk/detection_tables.h
    engines/mohawk/graphics.cpp
    engines/mohawk/livingbooks.cpp
    engines/mohawk/livingbooks.h
    engines/mohawk/myst.cpp
    engines/mohawk/myst_areas.cpp
    engines/mohawk/myst_graphics.cpp
    engines/mohawk/myst_graphics.h
    engines/mohawk/myst_scripts.cpp
    engines/mohawk/myst_stacks/dni.cpp
    engines/mohawk/myst_stacks/intro.cpp
    engines/mohawk/riven.cpp
    engines/mohawk/riven.h
    engines/mohawk/riven_external.cpp
    engines/mohawk/riven_graphics.cpp
    engines/mohawk/riven_saveload.cpp
    engines/mohawk/riven_saveload.h
    engines/mohawk/riven_vars.cpp
    engines/mohawk/video.cpp
    engines/mohawk/video.h
    engines/neverhood/smackerplayer.cpp
    engines/parallaction/callables_ns.cpp
    engines/parallaction/debug.cpp
    engines/parallaction/dialogue.cpp
    engines/parallaction/disk_br.cpp
    engines/parallaction/disk_ns.cpp
    engines/parallaction/exec.cpp
    engines/parallaction/exec_br.cpp
    engines/parallaction/exec_ns.cpp
    engines/parallaction/font.cpp
    engines/parallaction/gfxbase.cpp
    engines/parallaction/graphics.cpp
    engines/parallaction/graphics.h
    engines/parallaction/gui_ns.cpp
    engines/parallaction/input.cpp
    engines/parallaction/module.mk
    engines/parallaction/objects.cpp
    engines/parallaction/objects.h
    engines/parallaction/parallaction.cpp
    engines/parallaction/parallaction.h
    engines/parallaction/parallaction_br.cpp
    engines/parallaction/parallaction_ns.cpp
    engines/parallaction/parser_br.cpp
    engines/parallaction/parser_ns.cpp
    engines/parallaction/saveload.cpp
    engines/parallaction/sound.h
    engines/parallaction/sound_br.cpp
    engines/parallaction/sound_ns.cpp
    engines/parallaction/staticres.cpp
    engines/parallaction/walk.cpp
    engines/parallaction/walk.h
    engines/queen/display.cpp
    engines/queen/queen.cpp
    engines/queen/queen.h
    engines/saga/actor_path.cpp
    engines/saga/detection.cpp
    engines/saga/introproc_ihnm.cpp
    engines/saga/introproc_ite.cpp
    engines/saga/introproc_saga2.cpp
    engines/saga/script.cpp
    engines/saga/shorten.cpp
    engines/saga/sndres.cpp
    engines/saga/sndres.h
    engines/savestate.h
    engines/sci/console.cpp
    engines/sci/console.h
    engines/sci/detection.cpp
    engines/sci/detection_tables.h
    engines/sci/engine/features.cpp
    engines/sci/engine/features.h
    engines/sci/engine/gc.cpp
    engines/sci/engine/gc.h
    engines/sci/engine/kernel.cpp
    engines/sci/engine/kernel.h
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kevent.cpp
    engines/sci/engine/kfile.cpp
    engines/sci/engine/kgraphics.cpp
    engines/sci/engine/klists.cpp
    engines/sci/engine/kmath.cpp
    engines/sci/engine/kmenu.cpp
    engines/sci/engine/kmisc.cpp
    engines/sci/engine/kparse.cpp
    engines/sci/engine/kpathing.cpp
    engines/sci/engine/kscripts.cpp
    engines/sci/engine/ksound.cpp
    engines/sci/engine/kstring.cpp
    engines/sci/engine/kvideo.cpp
    engines/sci/engine/message.cpp
    engines/sci/engine/object.cpp
    engines/sci/engine/object.h
    engines/sci/engine/savegame.cpp
    engines/sci/engine/script.cpp
    engines/sci/engine/script.h
    engines/sci/engine/script_patches.cpp
    engines/sci/engine/scriptdebug.cpp
    engines/sci/engine/seg_manager.cpp
    engines/sci/engine/seg_manager.h
    engines/sci/engine/segment.cpp
    engines/sci/engine/segment.h
    engines/sci/engine/selector.cpp
    engines/sci/engine/selector.h
    engines/sci/engine/state.cpp
    engines/sci/engine/state.h
    engines/sci/engine/vm.cpp
    engines/sci/engine/vm.h
    engines/sci/engine/vm_types.cpp
    engines/sci/engine/vm_types.h
    engines/sci/engine/workarounds.cpp
    engines/sci/event.cpp
    engines/sci/graphics/animate.cpp
    engines/sci/graphics/controls16.cpp
    engines/sci/graphics/controls32.cpp
    engines/sci/graphics/cursor.cpp
    engines/sci/graphics/font.cpp
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/maciconbar.cpp
    engines/sci/graphics/maciconbar.h
    engines/sci/graphics/menu.cpp
    engines/sci/graphics/paint16.cpp
    engines/sci/graphics/palette.cpp
    engines/sci/graphics/palette.h
    engines/sci/graphics/ports.cpp
    engines/sci/graphics/screen.cpp
    engines/sci/graphics/screen.h
    engines/sci/graphics/text32.cpp
    engines/sci/graphics/text32.h
    engines/sci/graphics/view.cpp
    engines/sci/module.mk
    engines/sci/resource.cpp
    engines/sci/resource.h
    engines/sci/sci.cpp
    engines/sci/sci.h
    engines/sci/sound/audio.cpp
    engines/sci/sound/drivers/adlib.cpp
    engines/sci/sound/drivers/fmtowns.cpp
    engines/sci/sound/drivers/midi.cpp
    engines/sci/sound/midiparser_sci.cpp
    engines/sci/sound/midiparser_sci.h
    engines/sci/sound/music.cpp
    engines/sci/sound/soundcmd.cpp
    engines/sci/video/robot_decoder.cpp
    engines/sci/video/robot_decoder.h
    engines/sci/video/seq_decoder.cpp
    engines/sci/video/seq_decoder.h
    engines/scumm/actor.cpp
    engines/scumm/actor.h
    engines/scumm/charset.cpp
    engines/scumm/charset.h
    engines/scumm/costume.cpp
    engines/scumm/cursor.cpp
    engines/scumm/debugger.cpp
    engines/scumm/detection.cpp
    engines/scumm/detection.h
    engines/scumm/detection_tables.h
    engines/scumm/dialogs.cpp
    engines/scumm/gfx.cpp
    engines/scumm/gfx_towns.cpp
    engines/scumm/he/animation_he.cpp
    engines/scumm/he/intern_he.h
    engines/scumm/he/logic/football.cpp
    engines/scumm/he/logic/soccer.cpp
    engines/scumm/he/logic_he.cpp
    engines/scumm/he/logic_he.h
    engines/scumm/he/resource_he.cpp
    engines/scumm/he/script_v100he.cpp
    engines/scumm/he/script_v60he.cpp
    engines/scumm/he/script_v90he.cpp
    engines/scumm/he/sound_he.cpp
    engines/scumm/he/wiz_he.cpp
    engines/scumm/imuse/imuse.cpp
    engines/scumm/imuse/imuse_internal.h
    engines/scumm/imuse/imuse_part.cpp
    engines/scumm/imuse/imuse_player.cpp
    engines/scumm/imuse/instrument.cpp
    engines/scumm/imuse/instrument.h
    engines/scumm/imuse/sysex_scumm.cpp
    engines/scumm/imuse_digi/dimuse_sndmgr.h
    engines/scumm/insane/insane_scenes.cpp
    engines/scumm/midiparser_ro.cpp
    engines/scumm/module.mk
    engines/scumm/object.cpp
    engines/scumm/player_apple2.cpp
    engines/scumm/player_apple2.h
    engines/scumm/player_towns.cpp
    engines/scumm/player_v2cms.cpp
    engines/scumm/proc3ARM.s
    engines/scumm/saveload.cpp
    engines/scumm/saveload.h
    engines/scumm/script.cpp
    engines/scumm/script_v0.cpp
    engines/scumm/script_v2.cpp
    engines/scumm/script_v5.cpp
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/scumm.h
    engines/scumm/scumm_v7.h
    engines/scumm/sound.cpp
    engines/scumm/verbs.cpp
    engines/sky/control.cpp
    engines/sky/control.h
    engines/sky/detection.cpp
    engines/sword1/animation.cpp
    engines/sword1/animation.h
    engines/sword1/control.cpp
    engines/sword1/detection.cpp
    engines/sword1/logic.cpp
    engines/sword1/objectman.cpp
    engines/sword1/objectman.h
    engines/sword1/sound.cpp
    engines/sword1/sword1.cpp
    engines/sword1/sword1.h
    engines/sword1/text.cpp
    engines/sword2/animation.cpp
    engines/sword2/animation.h
    engines/sword2/function.cpp
    engines/sword2/sprite.cpp
    engines/sword2/sword2.cpp
    engines/sword25/fmv/movieplayer.cpp
    engines/sword25/fmv/movieplayer.h
    engines/sword25/gfx/graphicengine.cpp
    engines/sword25/gfx/image/art.cpp
    engines/sword25/gfx/image/art.h
    engines/sword25/gfx/image/imgloader.cpp
    engines/sword25/gfx/image/renderedimage.cpp
    engines/sword25/kernel/inputpersistenceblock.cpp
    engines/sword25/module.mk
    engines/sword25/script/luabindhelper.cpp
    engines/sword25/script/luabindhelper.h
    engines/sword25/sfx/soundengine.cpp
    engines/sword25/util/lua/luaconf.h
    engines/sword25/util/pluto/pluto.cpp
    engines/teenagent/callbacks.cpp
    engines/teenagent/detection.cpp
    engines/teenagent/resources.cpp
    engines/teenagent/scene.cpp
    engines/teenagent/teenagent.cpp
    engines/testbed/graphics.cpp
    engines/testbed/testsuite.cpp
    engines/tinsel/actors.cpp
    engines/tinsel/background.h
    engines/tinsel/bg.cpp
    engines/tinsel/bmv.cpp
    engines/tinsel/bmv.h
    engines/tinsel/detection.cpp
    engines/tinsel/detection_tables.h
    engines/tinsel/dialogs.cpp
    engines/tinsel/dialogs.h
    engines/tinsel/drives.cpp
    engines/tinsel/drives.h
    engines/tinsel/effect.cpp
    engines/tinsel/events.cpp
    engines/tinsel/events.h
    engines/tinsel/faders.cpp
    engines/tinsel/handle.cpp
    engines/tinsel/module.mk
    engines/tinsel/move.cpp
    engines/tinsel/music.cpp
    engines/tinsel/music.h
    engines/tinsel/pcode.cpp
    engines/tinsel/pcode.h
    engines/tinsel/pdisplay.cpp
    engines/tinsel/play.cpp
    engines/tinsel/play.h
    engines/tinsel/polygons.cpp
    engines/tinsel/rince.cpp
    engines/tinsel/rince.h
    engines/tinsel/saveload.cpp
    engines/tinsel/savescn.cpp
    engines/tinsel/scene.cpp
    engines/tinsel/scene.h
    engines/tinsel/sched.cpp
    engines/tinsel/sched.h
    engines/tinsel/sound.cpp
    engines/tinsel/text.h
    engines/tinsel/tinlib.cpp
    engines/tinsel/tinsel.cpp
    engines/tinsel/tinsel.h
    engines/tinsel/token.cpp
    engines/toltecs/animation.cpp
    engines/toltecs/animation.h
    engines/toltecs/detection.cpp
    engines/toltecs/menu.cpp
    engines/toltecs/menu.h
    engines/toltecs/microtiles.cpp
    engines/toltecs/movie.cpp
    engines/toltecs/movie.h
    engines/toltecs/music.cpp
    engines/toltecs/music.h
    engines/toltecs/palette.cpp
    engines/toltecs/palette.h
    engines/toltecs/render.cpp
    engines/toltecs/render.h
    engines/toltecs/resource.cpp
    engines/toltecs/saveload.cpp
    engines/toltecs/screen.cpp
    engines/toltecs/screen.h
    engines/toltecs/script.cpp
    engines/toltecs/script.h
    engines/toltecs/segmap.cpp
    engines/toltecs/segmap.h
    engines/toltecs/sound.cpp
    engines/toltecs/sound.h
    engines/toltecs/sprite.cpp
    engines/toltecs/toltecs.cpp
    engines/toltecs/toltecs.h
    engines/toon/anim.cpp
    engines/toon/anim.h
    engines/toon/audio.cpp
    engines/toon/character.cpp
    engines/toon/character.h
    engines/toon/detection.cpp
    engines/toon/drew.cpp
    engines/toon/drew.h
    engines/toon/flux.cpp
    engines/toon/flux.h
    engines/toon/font.cpp
    engines/toon/font.h
    engines/toon/hotspot.cpp
    engines/toon/hotspot.h
    engines/toon/movie.cpp
    engines/toon/movie.h
    engines/toon/path.cpp
    engines/toon/path.h
    engines/toon/picture.cpp
    engines/toon/picture.h
    engines/toon/script_func.cpp
    engines/toon/toon.cpp
    engines/toon/toon.h
    engines/touche/detection.cpp
    engines/touche/staticres.cpp
    engines/tsage/blue_force/blueforce_dialogs.cpp
    engines/tsage/blue_force/blueforce_scenes3.cpp
    engines/tsage/blue_force/blueforce_scenes7.cpp
    engines/tsage/blue_force/blueforce_scenes9.cpp
    engines/tsage/blue_force/blueforce_speakers.cpp
    engines/tsage/blue_force/blueforce_speakers.h
    engines/tsage/converse.cpp
    engines/tsage/detection.cpp
    engines/tsage/detection_tables.h
    engines/tsage/dialogs.cpp
    engines/tsage/globals.cpp
    engines/tsage/globals.h
    engines/tsage/graphics.cpp
    engines/tsage/graphics.h
    engines/tsage/ringworld/ringworld_dialogs.cpp
    engines/tsage/ringworld/ringworld_logic.cpp
    engines/tsage/ringworld/ringworld_scenes5.cpp
    engines/tsage/ringworld2/ringworld2_dialogs.cpp
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/ringworld2/ringworld2_scenes1.cpp
    engines/tsage/ringworld2/ringworld2_scenes3.cpp
    engines/tsage/ringworld2/ringworld2_speakers.h
    engines/tsage/scenes.cpp
    engines/tsage/scenes.h
    engines/tsage/sound.cpp
    engines/tsage/sound.h
    engines/tsage/tsage.cpp
    engines/tsage/user_interface.cpp
    engines/tucker/resource.cpp
    engines/tucker/sequences.cpp
    graphics/VectorRenderer.cpp
    graphics/VectorRenderer.h
    graphics/VectorRendererSpec.cpp
    graphics/conversion.cpp
    graphics/conversion.h
    graphics/cursorman.cpp
    graphics/cursorman.h
    graphics/fontman.cpp
    graphics/fontman.h
    graphics/fonts/bdf.h
    graphics/fonts/consolefont.cpp
    graphics/fonts/newfont.cpp
    graphics/fonts/newfont_big.cpp
    graphics/fonts/ttf.cpp
    graphics/fonts/ttf.h
    graphics/iff.cpp
    graphics/module.mk
    graphics/pixelformat.h
    graphics/primitives.cpp
    graphics/primitives.h
    graphics/scaler.cpp
    graphics/scaler/aspect.cpp
    graphics/sjis.h
    graphics/surface.cpp
    graphics/surface.h
    graphics/wincursor.cpp
    graphics/wincursor.h
    graphics/yuv_to_rgb.cpp
    graphics/yuv_to_rgb.h
    gui/ThemeEngine.cpp
    gui/ThemeEngine.h
    gui/ThemeParser.cpp
    gui/ThemeParser.h
    gui/Tooltip.cpp
    gui/credits.h
    gui/debugger.cpp
    gui/dialog.cpp
    gui/dialog.h
    gui/gui-manager.cpp
    gui/launcher.cpp
    gui/module.mk
    gui/options.cpp
    gui/options.h
    gui/saveload.cpp
    gui/saveload.h
    gui/themes/default.inc
    gui/themes/scummclassic.zip
    gui/themes/scummclassic/THEMERC
    gui/themes/scummclassic/classic_gfx.stx
    gui/themes/scummclassic/classic_layout.stx
    gui/themes/scummclassic/classic_layout_lowres.stx
    gui/themes/scummmodern.zip
    gui/themes/scummmodern/THEMERC
    gui/themes/scummmodern/scummmodern_gfx.stx
    gui/themes/scummmodern/scummmodern_layout.stx
    gui/themes/scummmodern/scummmodern_layout_lowres.stx
    gui/themes/translations.dat
    gui/widget.cpp
    gui/widget.h
    gui/widgets/editable.h
    gui/widgets/list.h
    po/POTFILES
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DA.po
    po/de_DE.po
    po/es_ES.po
    po/fr_FR.po
    po/hu_HU.po
    po/it_IT.po
    po/nb_NO.po
    po/nn_NO.po
    po/pl_PL.po
    po/pt_BR.po
    po/ru_RU.po
    po/scummvm.pot
    po/se_SE.po
    po/uk_UA.po
    ports.mk
    video/avi_decoder.cpp
    video/avi_decoder.h
    video/bink_decoder.cpp
    video/bink_decoder.h
    video/codecs/mjpeg.cpp
    video/codecs/mjpeg.h
    video/codecs/qtrle.cpp
    video/codecs/qtrle.h
    video/codecs/rpza.cpp
    video/codecs/rpza.h
    video/coktel_decoder.cpp
    video/coktel_decoder.h
    video/dxa_decoder.cpp
    video/dxa_decoder.h
    video/flic_decoder.cpp
    video/flic_decoder.h
    video/module.mk
    video/psx_decoder.cpp
    video/psx_decoder.h
    video/qt_decoder.cpp
    video/qt_decoder.h
    video/smk_decoder.cpp
    video/smk_decoder.h
    video/video_decoder.cpp
    video/video_decoder.h



diff --cc engines/configure.engines
index 0000000,a8eb89a..c7f142b
mode 000000,100644..100644
--- a/engines/configure.engines
+++ b/engines/configure.engines
@@@ -1,0 -1,51 +1,52 @@@
+ # This file is included from the main "configure" script
+ # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+ add_engine scumm "SCUMM" yes "scumm_7_8 he" "v0-v6 games"
+ add_engine scumm_7_8 "v7 & v8 games" yes
+ add_engine he "HE71+ games" yes
+ add_engine agi "AGI" yes
+ add_engine agos "AGOS" yes "agos2" "AGOS 1 games"
+ add_engine agos2 "AGOS 2 games" yes
+ add_engine cge "CGE" yes
+ add_engine cine "Cinematique evo 1" yes
+ add_engine composer "Magic Composer" yes
+ add_engine cruise "Cinematique evo 2" yes
+ add_engine draci "Dragon History" yes
+ add_engine drascula "Drascula: The Vampire Strikes Back" yes
+ add_engine dreamweb "Dreamweb" yes
+ add_engine gob "Gobli*ns" yes
+ add_engine groovie "Groovie" yes "groovie2" "7th Guest"
+ add_engine groovie2 "Groovie 2 games" no
+ add_engine hugo "Hugo Trilogy" yes
+ add_engine kyra "Kyra" yes "lol eob" "Legend of Kyrandia 1-3"
+ add_engine lol "Lands of Lore" yes
+ add_engine eob "Eye of the Beholder" no
+ add_engine lastexpress "The Last Express" no "" "" "16bit"
+ add_engine lure "Lure of the Temptress" yes
+ add_engine made "MADE" yes
+ add_engine mohawk "Mohawk" yes "cstime myst riven" "Living Books"
+ add_engine cstime "Where in Time is Carmen Sandiego?" no
+ add_engine riven "Riven: The Sequel to Myst" no "" "" "16bit"
+ add_engine myst "Myst" no "" "" "16bit"
++add_engine neverhood "Neverhood" no
+ add_engine parallaction "Parallaction" yes
+ add_engine pegasus "The Journeyman Project: Pegasus Prime" no "" "" "16bit"
+ add_engine queen "Flight of the Amazon Queen" yes
+ add_engine saga "SAGA" yes "ihnm saga2" "ITE"
+ add_engine ihnm "IHNM" yes
+ add_engine saga2 "SAGA 2 games" no
+ add_engine sci "SCI" yes "sci32" "SCI 0-1.1 games"
+ add_engine sci32 "SCI32 games" no
+ add_engine sky "Beneath a Steel Sky" yes
+ add_engine sword1 "Broken Sword" yes
+ add_engine sword2 "Broken Sword II" yes
+ add_engine sword25 "Broken Sword 2.5" no "" "" "png zlib 16bit"
+ add_engine teenagent "Teen Agent" yes
+ add_engine testbed "TestBed: the Testing framework" no
+ add_engine tinsel "Tinsel" yes
+ add_engine toltecs "3 Skulls of the Toltecs" no
+ add_engine toon "Toonstruck" yes
+ add_engine touche "Touche: The Adventures of the Fifth Musketeer" yes
+ add_engine tony "Tony Tough and the Night of Roasted Moths" no "" "" "16bit"
+ add_engine tsage "TsAGE" yes
+ add_engine tucker "Bud Tucker in Double Trouble" yes
+ add_engine wintermute "Wintermute" no "" "" "png zlib vorbis 16bit"
diff --cc engines/neverhood/smackerplayer.cpp
index 1b40c8f,0000000..799f04f
mode 100644,000000..100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@@ -1,230 -1,0 +1,230 @@@
 +/* 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 "graphics/palette.h"
 +#include "neverhood/smackerplayer.h"
 +#include "neverhood/palette.h"
 +#include "neverhood/resourceman.h"
 +#include "neverhood/scene.h"
 +
 +namespace Neverhood {
 +
 +// SmackerSurface
 +
 +SmackerSurface::SmackerSurface(NeverhoodEngine *vm)
 +	: BaseSurface(vm, 0, 0, 0), _smackerFrame(NULL) {
 +}
 +
 +void SmackerSurface::draw() {
 +	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0)
 +		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false);
 +}
 +
 +void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) {
 +	_drawRect.x = 0;
 +	_drawRect.y = 0;
 +	_drawRect.width = smackerFrame->w;
 +	_drawRect.height = smackerFrame->h;
 +	// TODO: Check if _sysRect is needed at all in the reimplementation...
 +	_sysRect.x = 0;
 +	_sysRect.y = 0;
 +	_sysRect.width = (smackerFrame->w + 3) & 0xFFFC; // align by 4 bytes
 +	_sysRect.height = smackerFrame->h;
 +	_smackerFrame = smackerFrame;
 +}
 +
 +// SmackerDoubleSurface
 +
 +SmackerDoubleSurface::SmackerDoubleSurface(NeverhoodEngine *vm)
 +	: SmackerSurface(vm) {
 +}
 +
 +void SmackerDoubleSurface::draw() {
 +	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0)
 +		_vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect);
 +}
 +
 +// SmackerPlayer
 +
 +SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag)
 +	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false),
 +	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true),
 +	_drawX(-1), _drawY(-1) {
 +
 +	SetUpdateHandler(&SmackerPlayer::update);
 +	open(fileHash, flag);
 +}
 +
 +SmackerPlayer::~SmackerPlayer() {
 +	close();
- }   
++}
 +
 +void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 +	debug("SmackerPlayer::open(%08X)", fileHash);
 +	
 +	_fileHash = fileHash;
 +	_keepLastFrame = keepLastFrame;
 +
 +	close();
 +
 +	if (_doubleSurface) {
 +		_smackerSurface = new SmackerDoubleSurface(_vm);
 +	} else {
 +		_smackerSurface = new SmackerSurface(_vm);
 +	}
 +
 +	_smackerFirst = true;
 +
 +	_stream = _vm->_res->createStream(fileHash);
 +
 +	// TODO: _keepLastFrame stuff
 +
- 	_smackerDecoder = new Video::SmackerDecoder(_vm->_mixer);
++	_smackerDecoder = new Video::SmackerDecoder();
 +	_smackerDecoder->loadStream(_stream);
 +	
 +	_palette = new Palette(_vm);
 +	_palette->usePalette();
 +	
 +}
 +
 +void SmackerPlayer::close() {
 +	delete _smackerDecoder;
 +	delete _palette;
 +	// NOTE: The SmackerDecoder deletes the _stream
 +	delete _smackerSurface;
 +	_smackerDecoder = NULL;
 +	_palette = NULL;
 +	_stream = NULL;
 +	_smackerSurface = NULL;
 +}
 +
 +void SmackerPlayer::gotoFrame(uint frameNumber) {
 +	// TODO?
 +}
 +
 +uint32 SmackerPlayer::getFrameCount() {
 +	return _smackerDecoder ? _smackerDecoder->getFrameCount() : 0;
 +}
 +
 +uint32 SmackerPlayer::getFrameNumber() {
 +	return _smackerDecoder ? _smackerDecoder->getCurFrame() : 0;
 +}
 +
 +uint SmackerPlayer::getStatus() {
 +	return 0;
 +}
 +
 +void SmackerPlayer::setDrawPos(int16 x, int16 y) {
 +	_drawX = x;
 +	_drawY = y;
 +	if (_smackerSurface) {
 +		_smackerSurface->getDrawRect().x = _drawX;
 +		_smackerSurface->getDrawRect().y = _drawY;
 +	}
 +}
 +
 +void SmackerPlayer::rewind() {
 +
 +	// TODO Quite dirty, try to implement this in the decoder
 +
 +	delete _smackerDecoder;
 +	_smackerDecoder = NULL;
 +	_stream = NULL;
 +
 +	_smackerFirst = true;
 +
 +	_stream = _vm->_res->createStream(_fileHash);
 +
- 	_smackerDecoder = new Video::SmackerDecoder(_vm->_mixer);
++	_smackerDecoder = new Video::SmackerDecoder();
 +	_smackerDecoder->loadStream(_stream);
 +	
 +}
 +
 +void SmackerPlayer::update() {
 +	debug(8, "SmackerPlayer::update()");
 +
 +	if (!_smackerDecoder)
 +		return;
 +
 +	if (_dirtyFlag) {
 +		// TODO _vm->_screen->resetDirtyRects();
 +		_dirtyFlag = false;
 +	}
 +
 +	if (!_smackerDecoder->endOfVideo()) {
 +		updateFrame();
 +	} else if (!_keepLastFrame) {
 +		// Inform the scene about the end of the video playback
 +		if (_scene)
 +			sendMessage(_scene, 0x3002, 0);
 +		_videoDone = true;
 +	} else {
 +		rewind();
 +		updateFrame();
 +		_videoDone = false;
 +	}
 +	
 +}
 +
 +void SmackerPlayer::updateFrame() {
 +	const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame();
 +
 +	if (_smackerFirst) {
 +		_smackerSurface->setSmackerFrame(smackerFrame);
 +		if (_drawX < 0 || _drawY < 0) {
 +			if (_doubleSurface) {
 +				_drawX = 320 - _smackerDecoder->getWidth();
 +				_drawY = 240 - _smackerDecoder->getHeight();
 +			} else {
 +				_drawX = (640 - _smackerDecoder->getWidth()) / 2;
 +				_drawY = (480 - _smackerDecoder->getHeight()) / 2;
 +			}
 +		}
 +		_smackerSurface->getDrawRect().x = _drawX;
 +		_smackerSurface->getDrawRect().y = _drawY;
 +		_smackerFirst = false;
 +	}
 +	
 +	if (_doubleSurface) {
 +		// TODO
 +	}
 +
 +	// TODO _vm->_screen->_skipUpdate = true;
 +	_dirtyFlag = true;
 +
 +	if (_smackerDecoder->hasDirtyPalette())
 +		updatePalette();
 +		
 +}
 +
 +void SmackerPlayer::updatePalette() {
 +	byte tempPalette[1024];
 +	const byte *smackerPalette = _smackerDecoder->getPalette();
 +	for (int i = 0; i < 256; i++) {
 +		tempPalette[i * 4 + 0] = smackerPalette[i * 3 + 0];
 +		tempPalette[i * 4 + 1] = smackerPalette[i * 3 + 1];
 +		tempPalette[i * 4 + 2] = smackerPalette[i * 3 + 2];
 +	}
 +	_palette->copyPalette(tempPalette, 0, 256, 0);
 +}
 +
 +} // End of namespace Neverhood
diff --cc engines/plugins_table.h
index 0000000,010de0d..152c45f
mode 000000,100644..100644
--- a/engines/plugins_table.h
+++ b/engines/plugins_table.h
@@@ -1,0 -1,112 +1,115 @@@
+ // This file is being included by "base/plugins.cpp"
+ #if PLUGIN_ENABLED_STATIC(SCUMM)
+ LINK_PLUGIN(SCUMM)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(AGI)
+ LINK_PLUGIN(AGI)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(AGOS)
+ LINK_PLUGIN(AGOS)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(CGE)
+ LINK_PLUGIN(CGE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(CINE)
+ LINK_PLUGIN(CINE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(COMPOSER)
+ LINK_PLUGIN(COMPOSER)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(CRUISE)
+ LINK_PLUGIN(CRUISE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(DRACI)
+ LINK_PLUGIN(DRACI)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(DRASCULA)
+ LINK_PLUGIN(DRASCULA)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(DREAMWEB)
+ LINK_PLUGIN(DREAMWEB)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(GOB)
+ LINK_PLUGIN(GOB)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(GROOVIE)
+ LINK_PLUGIN(GROOVIE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(HUGO)
+ LINK_PLUGIN(HUGO)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(KYRA)
+ LINK_PLUGIN(KYRA)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(LASTEXPRESS)
+ LINK_PLUGIN(LASTEXPRESS)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(LURE)
+ LINK_PLUGIN(LURE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(MADE)
+ LINK_PLUGIN(MADE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(MOHAWK)
+ LINK_PLUGIN(MOHAWK)
+ #endif
++#if PLUGIN_ENABLED_STATIC(NEVERHOOD)
++LINK_PLUGIN(NEVERHOOD)
++#endif
+ #if PLUGIN_ENABLED_STATIC(PARALLACTION)
+ LINK_PLUGIN(PARALLACTION)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(PEGASUS)
+ LINK_PLUGIN(PEGASUS)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(QUEEN)
+ LINK_PLUGIN(QUEEN)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(SAGA)
+ LINK_PLUGIN(SAGA)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(SCI)
+ LINK_PLUGIN(SCI)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(SKY)
+ LINK_PLUGIN(SKY)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(SWORD1)
+ LINK_PLUGIN(SWORD1)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(SWORD2)
+ LINK_PLUGIN(SWORD2)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(SWORD25)
+ LINK_PLUGIN(SWORD25)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TEENAGENT)
+ LINK_PLUGIN(TEENAGENT)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TESTBED)
+ LINK_PLUGIN(TESTBED)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TINSEL)
+ LINK_PLUGIN(TINSEL)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TOLTECS)
+ LINK_PLUGIN(TOLTECS)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TONY)
+ LINK_PLUGIN(TONY)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TOON)
+ LINK_PLUGIN(TOON)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TSAGE)
+ LINK_PLUGIN(TSAGE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TOUCHE)
+ LINK_PLUGIN(TOUCHE)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(TUCKER)
+ LINK_PLUGIN(TUCKER)
+ #endif
+ #if PLUGIN_ENABLED_STATIC(WINTERMUTE)
+ LINK_PLUGIN(WINTERMUTE)
+ #endif


Commit: 2e7d100a6f2834b68e4d5d18cf72f63871ddfdf9
    https://github.com/scummvm/scummvm/commit/2e7d100a6f2834b68e4d5d18cf72f63871ddfdf9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:06-07:00

Commit Message:
NEVERHOOD: Replace most of the literal digits in get/setSubVar with constants

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/klayman.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 54c33dd..65bbc0d 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -346,13 +346,13 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 
 	// DEBUG>>>: Give all disks
 	for (int i = 0; i < 20; i++) {
-		setSubVar(0x02720344, i, 1);
+		setSubVar(VA_IS_TAPE_INSERTED, i, 1);
 	}
 	// DEBUG<<<
 
 	for (int i = 0; i < 20; i++) {
 		_diskAvailable[i] = 0;
-		if (getSubVar(0x02720344, i))
+		if (getSubVar(VA_IS_TAPE_INSERTED, i))
 			availableDisksCount++;
 	}
 
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index ac20138..1b9c9f3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -88,17 +88,17 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 void GameModule::initScene1307Vars() {
 
 	// Exit if it's already initialized
-	if (getSubVar(0x40050052, 0x25400B10))
+	if (getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10))
 		return;
 
 	for (uint i = 0; i < 3; i++) {
 		bool more;
 		do {
 			more = false;
-			setSubVar(0x0C10A000, i, _vm->_rnd->getRandomNumber(16 - 1));
+			setSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
 			if (i > 0) {
 				for (uint j = 0; j < i && !more; j++) {
-					more = getSubVar(0x0C10A000, j) == getSubVar(0x0C10A000, i);
+					more = getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, j) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i);
 				}
 			}
 		} while (more);
@@ -108,18 +108,18 @@ void GameModule::initScene1307Vars() {
 		bool more;
 		do {
 			more = false;
-			setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1));
+			setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
 			if (i > 0) {
 				for (uint j = 0; j < i && !more; j++) {
-					more = getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i);
+					more = getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i);
 				}
 			}
-			if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i))
+			if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i))
 				more = true;
 		} while (more);
 	}
 
-	setSubVar(0x40050052, 0x25400B10, 1);
+	setSubVar(VA_IS_PUZZLE_INIT, 0x25400B10, 1);
 
 }
 
@@ -136,11 +136,11 @@ void GameModule::initScene1405Vars() {
 	uint32 rndIndex;
 
 	// Exit if it's already initialized
-	if (getSubVar(0x40050052, 0xC8606803))
+	if (getSubVar(VA_IS_PUZZLE_INIT, 0xC8606803))
 		return;
 
 	for (uint32 i = 0; i < 3; i++)
-		setSubVar(0x61084036, i, 1);
+		setSubVar(VA_CURR_DICE_NUMBERS, i, 1);
 
 	for (byte i = 0; i < 3; i++)
 		array44[i] = i;
@@ -153,7 +153,7 @@ void GameModule::initScene1405Vars() {
 
 	rndIndex = _vm->_rnd->getRandomNumber(3 - 1);
 
-	setSubVar(0x13100631, array44[rndIndex], 5);
+	setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex], 5);
 
 	for (byte i = 5; i < 9; i++)
 		array3C[i] = array3C[i + 1];
@@ -166,7 +166,7 @@ void GameModule::initScene1405Vars() {
 	for (int i = 0; i < 2; i++) {
 		uint32 rndIndex1 = _vm->_rnd->getRandomNumber(index2 - 1); // si
 		uint32 rndIndex2 = _vm->_rnd->getRandomNumber(index1 - 1); // di
-		setSubVar(0x13100631, array44[rndIndex2], array3C[rndIndex1]);
+		setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex2], array3C[rndIndex1]);
 		index2--;
 		while (rndIndex1 < index2) {
 			array3C[rndIndex1] = array3C[rndIndex1 + 1];
@@ -182,10 +182,10 @@ void GameModule::initScene1405Vars() {
 	for (uint32 i = 0; i < 3; i++) {
 		uint32 rndValue = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2;
 		uint32 index4 = 0;
-		setSubVar(0x7500993A, i, rndValue);
+		setSubVar(VA_GOOD_DICE_NUMBERS, i, rndValue);
 		while (index4 < rndValue) {
 			uint32 rndIndex3 = _vm->_rnd->getRandomNumber(index3 - 1);
-			setSubVar(0x0C65F80B, array30[rndIndex3], getSubVar(0x13100631, i));
+			setSubVar(VA_TILE_SYMBOLS, array30[rndIndex3], getSubVar(VA_DICE_MEMORY_SYMBOLS, i));
 			index3--;
 			while (rndIndex3 < index3) {
 				array30[rndIndex3] = array30[rndIndex3 + 1];
@@ -199,14 +199,14 @@ void GameModule::initScene1405Vars() {
 	while (index3 != 0) {
 		uint32 rndIndex4 = _vm->_rnd->getRandomNumber(index3 - 1);
 		index1 = array3C[index5];
-		setSubVar(0x0C65F80B, array30[rndIndex4], index1);
+		setSubVar(VA_TILE_SYMBOLS, array30[rndIndex4], index1);
 		index3--;
 		while (rndIndex4 < index3) {
 			array30[rndIndex4] = array30[rndIndex4 + 1];
 			rndIndex4++;
 		}
 		uint32 rndIndex5 = _vm->_rnd->getRandomNumber(index3 - 1);
-		setSubVar(0x0C65F80B, array30[rndIndex5], index1);
+		setSubVar(VA_TILE_SYMBOLS, array30[rndIndex5], index1);
 		index3--;
 		while (rndIndex5 < index3) {
 			array30[rndIndex5] = array30[rndIndex5 + 1];
@@ -218,57 +218,57 @@ void GameModule::initScene1405Vars() {
 
 	}
 
-	setSubVar(0x40050052, 0xC8606803, 1);
+	setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1);
 	
 }
 
 void GameModule::initScene2401Vars() {
 
-	if (getSubVar(0x40050052, 0x40520234))
+	if (getSubVar(VA_IS_PUZZLE_INIT, 0x40520234))
 		return;
 
-	setSubVar(0x90405038, 0, 3);
-	setSubVar(0x90405038, 1, 1);
-	setSubVar(0x90405038, 2, 2);
-	setSubVar(0x90405038, 3, 0);
-	setSubVar(0x90405038, 4, 4);
+	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 0, 3);
+	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 1, 1);
+	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 2, 2);
+	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 3, 0);
+	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 4, 4);
 		
-	setSubVar(0x40050052, 0x40520234, 1);
+	setSubVar(VA_IS_PUZZLE_INIT, 0x40520234, 1);
 
 }
 
 void GameModule::initScene2808Vars1() {
 
 	// Exit if it's already initialized
-	if (getSubVar(0x40050052, 0x20479010))
+	if (getSubVar(VA_IS_PUZZLE_INIT, 0x20479010))
 		return;
 
 	for (uint i = 0; i < 3; i++)
-		setSubVar(0x0C601058, i, _vm->_rnd->getRandomNumber(3 - 1) + 1);
+		setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1);
 
-	setSubVar(0x40050052, 0x20479010, 1);
+	setSubVar(VA_IS_PUZZLE_INIT, 0x20479010, 1);
 
 }
 
 void GameModule::initScene2808Vars2() {
 
 	// Exit if it's already initialized
-	if (getSubVar(0x40050052, 0x66059818))
+	if (getSubVar(VA_IS_PUZZLE_INIT, 0x66059818))
 		return;
 
 	for (uint i = 0; i < 3; i++)
-		setSubVar(0x40005834, i, _vm->_rnd->getRandomNumber(6 - 1) + 1);
+		setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1);
 
-	setSubVar(0x40050052, 0x66059818, 1);
+	setSubVar(VA_IS_PUZZLE_INIT, 0x66059818, 1);
 }
 
 void GameModule::initScene3009Vars() {
-	if (!getSubVar(0x40050052, 0x8C9819C2)) {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x8C9819C2)) {
 		for (int i = 0; i < 3; i++) {
-			setSubVar(0x00504B86, i, _vm->_rnd->getRandomNumber(12 - 1));
-			setSubVar(0x0A4C0A9A, i, _vm->_rnd->getRandomNumber(12 - 1));
+			setSubVar(VA_GOOD_CANNON_SYMBOLS_1, i, _vm->_rnd->getRandomNumber(12 - 1));
+			setSubVar(VA_GOOD_CANNON_SYMBOLS_2, i, _vm->_rnd->getRandomNumber(12 - 1));
 		}
-		setSubVar(0x40050052, 0x8C9819C2, 1);
+		setSubVar(VA_IS_PUZZLE_INIT, 0x8C9819C2, 1);
 	}
 }
 
@@ -313,7 +313,7 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 5;
+	_vm->gameState().sceneNum = 1;
 	createModule(2200, -1);
 #endif
 #if 0
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index a99459f..52740dc 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -30,97 +30,119 @@ namespace Neverhood {
 
 enum {
 	// Misc
-	V_MODULE_NAME			= 0x91080831,			// Currently active module name hash
-	V_DEBUG					= 0xA4014072,			// Original debug-flag, can probably be removed
-	V_SMACKER_CAN_ABORT		= 0x06C02850,			// Not set anywhere (yet), seems like a debug flag
-	V_KEY3_LOCATION			= 0x13382860,			// Location of the third key
-	V_TEXT_FLAG1			= 0x8440001F,
-	V_TEXT_INDEX			= 0x01830201,
-	V_TEXT_COUNTING_INDEX1	= 0x29408F00,
-	V_TEXT_COUNTING_INDEX2	= 0x8A140C21,
-	V_TALK_COUNTING_INDEX	= 0xA0808898,
-	V_FRUIT_COUNTING_INDEX	= 0x40040831,
-	V_NOISY_SYMBOL_INDEX	= 0x2414C2F2,
-	V_COLUMN_BACK_NAME		= 0x4CE79018,
-	V_COLUMN_TEXT_NAME		= 0xC8C28808,
-	V_CLICKED_COLUMN_INDEX	= 0x48A68852,
-	V_CLICKED_COLUMN_ROW	= 0x49C40058,
-	V_MUSIC_NAME			= 0x89A82A15,
+	V_MODULE_NAME				= 0x91080831,			// Currently active module name hash
+	V_DEBUG						= 0xA4014072,			// Original debug-flag, can probably be removed
+	V_SMACKER_CAN_ABORT			= 0x06C02850,			// Not set anywhere (yet), seems like a debug flag
+	V_KEY3_LOCATION				= 0x13382860,			// Location of the third key
+	V_TEXT_FLAG1				= 0x8440001F,
+	V_TEXT_INDEX				= 0x01830201,
+	V_TEXT_COUNTING_INDEX1		= 0x29408F00,
+	V_TEXT_COUNTING_INDEX2		= 0x8A140C21,
+	V_TALK_COUNTING_INDEX		= 0xA0808898,
+	V_FRUIT_COUNTING_INDEX		= 0x40040831,
+	V_NOISY_SYMBOL_INDEX		= 0x2414C2F2,
+	V_COLUMN_BACK_NAME			= 0x4CE79018,
+	V_COLUMN_TEXT_NAME			= 0xC8C28808,
+	V_CLICKED_COLUMN_INDEX		= 0x48A68852,
+	V_CLICKED_COLUMN_ROW		= 0x49C40058,
+	V_MUSIC_NAME				= 0x89A82A15,
 	// Klayman
-	V_KLAYMAN_SMALL			= 0x1860C990,			// Is Klayman small?
-	V_KLAYMAN_FRAMEINDEX	= 0x18288913,
-	V_KLAYMAN_IS_DELTA_X	= 0xC0418A02,
-	V_KLAYMAN_SAVED_X		= 0x00D30138,
-	V_CAR_DELTA_X			= 0x21E60190,
+	V_KLAYMAN_SMALL				= 0x1860C990,			// Is Klayman small?
+	V_KLAYMAN_FRAMEINDEX		= 0x18288913,
+	V_KLAYMAN_IS_DELTA_X		= 0xC0418A02,
+	V_KLAYMAN_SAVED_X			= 0x00D30138,
+	V_CAR_DELTA_X				= 0x21E60190,
 	// Flags
-	V_CRYSTAL_COLORS_INIT	= 0xDE2EC914,
-	V_TV_JOKE_TOLD			= 0x92603A79,
-	V_NOTES_DOOR_UNLOCKED	= 0x0045D021,
-	V_WATER_RUNNING			= 0x4E0BE910,
-	V_CREATURE_ANGRY		= 0x0A310817,			// After having played with the music box
-	V_BEEN_SHRINKING_ROOM	= 0x1C1B8A9A,
-	V_BEEN_STATUE_ROOM		= 0xCB45DE03,
-	V_MOUSE_PUZZLE_SOLVED	= 0x70A1189C,
-	V_NOTES_PUZZLE_SOLVED	= 0x86615030,
-	V_TILE_PUZZLE_SOLVED	= 0x404290D5,
-	V_STAIRS_PUZZLE_SOLVED	= 0xA9035F60,
-	V_SPIKES_RETRACTED		= 0x18890C91,
-	V_LARGE_DOOR_NUMBER		= 0x9A500914,			// Number of the currently "large" door
-	V_LIGHTS_ON				= 0x4D080E54,
-	V_SHRINK_LIGHTS_ON		= 0x190A1D18,			// Lights on in the room with the shrinking device
-	V_STAIRS_DOWN			= 0x09221A62,
-	V_LADDER_DOWN			= 0x0018CA22,			// Is the ladder in the statue room down?
-	V_LADDER_DOWN_ACTION	= 0x00188211,
-	V_WALL_BROKEN			= 0x10938830,
-	V_BOLT_DOOR_OPEN		= 0x01BA1A52,
-	V_BOLT_DOOR_UNLOCKED	= 0x00040153,
-	V_SEEN_SYMBOLS_NO_LIGHT	= 0x81890D14,
-	V_FELL_DOWN_HOLE		= 0xE7498218,
-	V_DOOR_PASSED			= 0x2090590C,			// Auto-closing door was passed
-	V_ENTRANCE_OPEN			= 0xD0A14D10,			// Is the entrance to Module1300 open (after the robot got his teddy)
-	V_WINDOW_OPEN			= 0x03C698DA,
-	V_DOOR_STATUS			= 0x52371C95,
-	V_DOOR_BUSTED			= 0xD217189D,
-	V_WORLDS_JOINED			= 0x98109F12,			// Are the worlds joined?
-	V_KEYDOOR_UNLOCKED		= 0x80455A41,			// Is the keyboard-door unlocked?
-	V_MOUSE_SUCKED_IN		= 0x01023818,			// Are mouse/cheese in Scene1308?
-	V_BALLOON_POPPED		= 0xAC00C0D0,			// Has the balloon with the key been popped?
-	V_TNT_DUMMY_BUILT		= 0x000CF819,			// Are all TNT parts on the dummy?
-	V_TNT_DUMMY_FUSE_LIT	= 0x20A0C516,
-	V_RING5_PULLED			= 0x4DE80AC0,
-	V_CREATURE_EXPLODED		= 0x2A02C07B,
+	V_CRYSTAL_COLORS_INIT		= 0xDE2EC914,
+	V_TV_JOKE_TOLD				= 0x92603A79,
+	V_NOTES_DOOR_UNLOCKED		= 0x0045D021,
+	V_WATER_RUNNING				= 0x4E0BE910,
+	V_CREATURE_ANGRY			= 0x0A310817,			// After having played with the music box
+	V_BEEN_SHRINKING_ROOM		= 0x1C1B8A9A,
+	V_BEEN_STATUE_ROOM			= 0xCB45DE03,
+	V_MOUSE_PUZZLE_SOLVED		= 0x70A1189C,
+	V_NOTES_PUZZLE_SOLVED		= 0x86615030,
+	V_TILE_PUZZLE_SOLVED		= 0x404290D5,
+	V_STAIRS_PUZZLE_SOLVED		= 0xA9035F60,
+	V_SPIKES_RETRACTED			= 0x18890C91,
+	V_LARGE_DOOR_NUMBER			= 0x9A500914,			// Number of the currently "large" door
+	V_LIGHTS_ON					= 0x4D080E54,
+	V_SHRINK_LIGHTS_ON			= 0x190A1D18,			// Lights on in the room with the shrinking device
+	V_STAIRS_DOWN				= 0x09221A62,
+	V_LADDER_DOWN				= 0x0018CA22,			// Is the ladder in the statue room down?
+	V_LADDER_DOWN_ACTION		= 0x00188211,
+	V_WALL_BROKEN				= 0x10938830,
+	V_BOLT_DOOR_OPEN			= 0x01BA1A52,
+	V_BOLT_DOOR_UNLOCKED		= 0x00040153,
+	V_SEEN_SYMBOLS_NO_LIGHT		= 0x81890D14,
+	V_FELL_DOWN_HOLE			= 0xE7498218,
+	V_DOOR_PASSED				= 0x2090590C,			// Auto-closing door was passed
+	V_ENTRANCE_OPEN				= 0xD0A14D10,			// Is the entrance to Module1300 open (after the robot got his teddy)
+	V_WINDOW_OPEN				= 0x03C698DA,
+	V_DOOR_STATUS				= 0x52371C95,
+	V_DOOR_BUSTED				= 0xD217189D,
+	V_WORLDS_JOINED				= 0x98109F12,			// Are the worlds joined?
+	V_KEYDOOR_UNLOCKED			= 0x80455A41,			// Is the keyboard-door unlocked?
+	V_MOUSE_SUCKED_IN			= 0x01023818,			// Are mouse/cheese in Scene1308?
+	V_BALLOON_POPPED			= 0xAC00C0D0,			// Has the balloon with the key been popped?
+	V_TNT_DUMMY_BUILT			= 0x000CF819,			// Are all TNT parts on the dummy?
+	V_TNT_DUMMY_FUSE_LIT		= 0x20A0C516,
+	V_RING5_PULLED				= 0x4DE80AC0,
+	V_CREATURE_EXPLODED			= 0x2A02C07B,
 	// Match
-	V_MATCH_STATUS			= 0x0112090A,
+	V_MATCH_STATUS				= 0x0112090A,
 	// Venus fly trap
-	V_FLYTRAP_RING_EATEN	= 0x2B514304,
-	V_FLYTRAP_RING_DOOR		= 0x8306F218,
-	V_FLYTRAP_RING_FENCE	= 0x80101B1E,
-	V_FLYTRAP_RING_BRIDGE	= 0x13206309,
-	V_FLYTRAP_POSITION_1	= 0x1B144052,
-	V_FLYTRAP_POSITION_2	= 0x86341E88,
+	V_FLYTRAP_RING_EATEN		= 0x2B514304,
+	V_FLYTRAP_RING_DOOR			= 0x8306F218,
+	V_FLYTRAP_RING_FENCE		= 0x80101B1E,
+	V_FLYTRAP_RING_BRIDGE		= 0x13206309,
+	V_FLYTRAP_POSITION_1		= 0x1B144052,
+	V_FLYTRAP_POSITION_2		= 0x86341E88,
 	// Navigation
-	V_NAVIGATION_INDEX		= 0x4200189E,			// Navigation scene: Current navigation index
+	V_NAVIGATION_INDEX			= 0x4200189E,			// Navigation scene: Current navigation index
 	// Cannon
-	V_CANNON_RAISED			= 0x000809C2,			// Is the cannon raised?
-	V_CANNON_TURNED			= 0x9040018A,			// Is the cannon turned?
-	V_ROBOT_HIT				= 0x0C0288F4,			// Was the robot hit by the cannon?
-	V_ROBOT_TARGET			= 0x610210B7,			// Is the robot at the cannon target position? (teddy)
-	V_CANNON_SMACKER_NAME	= 0xF0402B0A,
-	V_CANNON_TARGET_STATUS	= 0x20580A86,
+	V_CANNON_RAISED				= 0x000809C2,			// Is the cannon raised?
+	V_CANNON_TURNED				= 0x9040018A,			// Is the cannon turned?
+	V_ROBOT_HIT					= 0x0C0288F4,			// Was the robot hit by the cannon?
+	V_ROBOT_TARGET				= 0x610210B7,			// Is the robot at the cannon target position? (teddy)
+	V_CANNON_SMACKER_NAME		= 0xF0402B0A,
+	V_CANNON_TARGET_STATUS		= 0x20580A86,
 	// Projector
-	V_PROJECTOR_SLOT		= 0x04A10F33,			// Projector x slot index
-	V_PROJECTOR_LOCATION	= 0x04A105B3,			// Projector scene location
-	V_PROJECTOR_ACTIVE		= 0x12A10DB3,			// Is the projecor projecting?
+	V_PROJECTOR_SLOT			= 0x04A10F33,			// Projector x slot index
+	V_PROJECTOR_LOCATION		= 0x04A105B3,			// Projector scene location
+	V_PROJECTOR_ACTIVE			= 0x12A10DB3,			// Is the projecor projecting?
 	// Inventory
-	V_HAS_NEEDLE			= 0x31C63C51,			// Has Klayman the needle?
-	V_HAS_FINAL_KEY			= 0xC0780812,			// Has Klayman the key from the diskplayer?
-	V_HAS_TEST_TUBE			= 0x45080C38,
-#if 0
-Arrays:
-0x0800547C		Water pipes water level (index equals pipe number; 0 to 4)
-0x0090EA95		Has Klayman the key (index equals the key number; 0 to 2)
-0x08D0AB11		Has Klayman inserted the key (index equals the key number; 0 to 2)
-#endif
+	V_HAS_NEEDLE				= 0x31C63C51,			// Has Klayman the needle?
+	V_HAS_FINAL_KEY				= 0xC0780812,			// Has Klayman the key from the diskplayer?
+	V_HAS_TEST_TUBE				= 0x45080C38,
+	// Arrays
+	// NOTE "GOOD" means the solution, "CURR" is the current setup of the puzzle variables
+	VA_IS_PUZZLE_INIT			= 0x40050052,
+	VA_SMACKER_PLAYED			= 0x00800410,
+	VA_CURR_CRYSTAL_COLORS		= 0xE11A1929,
+	VA_GOOD_CRYSTAL_COLORS		= 0xD4B2089C,
+	VA_GOOD_TEST_TUBES_LEVEL_1	= 0x0C601058,
+	VA_GOOD_TEST_TUBES_LEVEL_2	= 0x40005834,
+	VA_CURR_CANNON_SYMBOLS		= 0x00000914,
+	VA_GOOD_CANNON_SYMBOLS_1	= 0x00504B86,
+	VA_GOOD_CANNON_SYMBOLS_2	= 0x0A4C0A9A,
+	VA_CURR_WATER_PIPES_LEVEL	= 0x0800547C,
+	VA_GOOD_WATER_PIPES_LEVEL	= 0x90405038,
+	VA_CURR_DICE_NUMBERS		= 0x61084036,
+	VA_GOOD_DICE_NUMBERS		= 0x7500993A,
+	VA_CURR_KEY_SLOT_NUMBERS	= 0xA010B810,
+	VA_GOOD_KEY_SLOT_NUMBERS	= 0x0C10A000,
+	VA_CUBE_POSITIONS			= 0x484498D0,
+	VA_CODE_SYMBOLS				= 0x04909A50,
+	VA_TILE_SYMBOLS				= 0x0C65F80B,
+	VA_IS_TILE_MATCH			= 0xCCE0280F,
+	VA_TNT_POSITIONS			= 0x10055D14,
+	VA_DICE_MEMORY_SYMBOLS		= 0x13100631,
+	VA_HAS_TAPE					= 0x02038314,
+	VA_IS_TAPE_INSERTED			= 0x02720344,
+	VA_HAS_KEY					= 0x0090EA95,
+	VA_IS_KEY_INSERTED			= 0x08D0AB11,
+	VA_LOCKS_DISABLED			= 0x14800353,
 	V_END_	
 };
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 0342b02..8f0a94e 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2090,9 +2090,9 @@ void Klayman::stInsertDisk() {
 		_status2 = 2;
 		_tapesToInsert = 0;
 		for (uint32 i = 0; i < 20; i++) {
-			if (getSubVar(0x02038314, i)) {
-				setSubVar(0x02720344, i, 1);
-				setSubVar(0x02038314, i, 0);
+			if (getSubVar(VA_HAS_TAPE, i)) {
+				setSubVar(VA_IS_TAPE_INSERTED, i, 1);
+				setSubVar(VA_HAS_TAPE, i, 0);
 				_tapesToInsert++;
 			}
 		}
@@ -2496,18 +2496,18 @@ void Klayman::stInsertKey() {
 		_status2 = 2;
 		_keysToInsert = 0;
 		for (uint32 i = 0; i < 3; i++) {
-			if (getSubVar(0x0090EA95, i)) {
+			if (getSubVar(VA_HAS_KEY, i)) {
 				bool more;
-				setSubVar(0x08D0AB11, i, 1);
-				setSubVar(0x0090EA95, i, 0);
+				setSubVar(VA_IS_KEY_INSERTED, i, 1);
+				setSubVar(VA_HAS_KEY, i, 0);
 				do {
 					more = false;
-					setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1));
+					setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
 					for (uint j = 0; j < i && !more; j++) {
-						if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i))
+						if (getSubVar(VA_IS_KEY_INSERTED, j) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i))
 							more = true;
 					}
-					if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i))
+					if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i))
 						more = true;
 				} while (more);
 				_keysToInsert++;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 2c52842..6cae11a 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1779,11 +1779,11 @@ uint32 Scene1005::getTextIndex1() {
 		else if (getGlobalVar(V_ROBOT_HIT)) {
 			if (!getGlobalVar(V_ENTRANCE_OPEN))
 				textIndex = 23;
-			else if (!getSubVar(0x0090EA95, 0) && !getSubVar(0x08D0AB11, 0))
+			else if (!getSubVar(VA_HAS_KEY, 0) && !getSubVar(VA_IS_KEY_INSERTED, 0))
 				textIndex = 24;
 			else if (!getGlobalVar(V_HAS_FINAL_KEY))			
 				textIndex = 26;
-			else if (!getSubVar(0x0090EA95, 1) && !getSubVar(0x08D0AB11, 1))
+			else if (!getSubVar(VA_HAS_KEY, 1) && !getSubVar(VA_IS_KEY_INSERTED, 1))
 				textIndex = 27;
 			else if (!getGlobalVar(V_HAS_FINAL_KEY)) 
 				textIndex = 28;
@@ -1817,15 +1817,15 @@ uint32 Scene1005::getTextIndex1() {
 			textIndex = 4;
 		else if (!getGlobalVar(V_HAS_TEST_TUBE))
 			textIndex = 5;
-		else if (!getSubVar(0x14800353, 0x40119852))
+		else if (!getSubVar(VA_LOCKS_DISABLED, 0x40119852))
 			textIndex = 6;
 		else if (!getGlobalVar(V_WATER_RUNNING))
 			textIndex = 7;
 		else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED))
 			textIndex = 8;
-		else if (!getSubVar(0x14800353, 0x304008D2))
+		else if (!getSubVar(VA_LOCKS_DISABLED, 0x304008D2))
 			textIndex = 9;
-		else if (!getSubVar(0x14800353, 0x01180951))
+		else if (!getSubVar(VA_LOCKS_DISABLED, 0x01180951))
 			textIndex = 10;
 		else 
 			textIndex = 11;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 44fe70e..a3e092b 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -338,7 +338,7 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p
 }
 
 void SsScene1105SymbolDie::loadSymbolSprite() {
-	load(kSsScene1105SymbolDieFileHashes[getSubVar(0x61084036, _index)], true, false);
+	load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false);
 	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
 	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
 	StaticSprite::update();
@@ -502,9 +502,9 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4807:
 		if (sender == _ssActionButton) {
-			if (getSubVar(0x7500993A, 0) == getSubVar(0x61084036, 0) &&
-				getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) &&
-				getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) {
+			if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) &&
+				getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) &&
+				getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) {
 				setGlobalVar(V_ROBOT_TARGET, 1);
 				playSound(2);
 				_flag3 = true;
@@ -522,38 +522,38 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 				_flag1 = false;
 			} else if (!getGlobalVar(V_ROBOT_TARGET)) {
 				if (sender == _ssSymbol1UpButton) {
-					if (getSubVar(0x61084036, 0) < 9) {
-						incSubVar(0x61084036, 0, +1);
+					if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) {
+						incSubVar(VA_CURR_DICE_NUMBERS, 0, +1);
 						sendMessage(_ssSymbol1UpButton, 0x480B, 0);
 						sendMessage(_ssSymbolDice[0], 0x2000, 0);
 					}
 				} else if (sender == _ssSymbol1DownButton) {
-					if (getSubVar(0x61084036, 0) > 1) {
-						incSubVar(0x61084036, 0, -1);
+					if (getSubVar(VA_CURR_DICE_NUMBERS, 0) > 1) {
+						incSubVar(VA_CURR_DICE_NUMBERS, 0, -1);
 						sendMessage(_ssSymbol1DownButton, 0x480B, 0);
 						sendMessage(_ssSymbolDice[0], 0x2000, 0);
 					}
 				} else if (sender == _ssSymbol2UpButton) {
-					if (getSubVar(0x61084036, 1) < 9) {
-						incSubVar(0x61084036, 1, +1);
+					if (getSubVar(VA_CURR_DICE_NUMBERS, 1) < 9) {
+						incSubVar(VA_CURR_DICE_NUMBERS, 1, +1);
 						sendMessage(_ssSymbol2UpButton, 0x480B, 0);
 						sendMessage(_ssSymbolDice[1], 0x2000, 0);
 					}
 				} else if (sender == _ssSymbol2DownButton) {
-					if (getSubVar(0x61084036, 1) > 1) {
-						incSubVar(0x61084036, 1, -1);
+					if (getSubVar(VA_CURR_DICE_NUMBERS, 1) > 1) {
+						incSubVar(VA_CURR_DICE_NUMBERS, 1, -1);
 						sendMessage(_ssSymbol2DownButton, 0x480B, 0);
 						sendMessage(_ssSymbolDice[1], 0x2000, 0);
 					}
 				} else if (sender == _ssSymbol3UpButton) {
-					if (getSubVar(0x61084036, 2) < 9) {
-						incSubVar(0x61084036, 2, +1);
+					if (getSubVar(VA_CURR_DICE_NUMBERS, 2) < 9) {
+						incSubVar(VA_CURR_DICE_NUMBERS, 2, +1);
 						sendMessage(_ssSymbol3UpButton, 0x480B, 0);
 						sendMessage(_ssSymbolDice[2], 0x2000, 0);
 					}
 				} else if (sender == _ssSymbol3DownButton) {
-					if (getSubVar(0x61084036, 2) > 1) {
-						incSubVar(0x61084036, 2, -1);
+					if (getSubVar(VA_CURR_DICE_NUMBERS, 2) > 1) {
+						incSubVar(VA_CURR_DICE_NUMBERS, 2, -1);
 						sendMessage(_ssSymbol3DownButton, 0x480B, 0);
 						sendMessage(_ssSymbolDice[2], 0x2000, 0);
 					}
@@ -566,9 +566,9 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 void Scene1105::createObjects() {
-	_ssSymbols[0] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(0x13100631, 0)], 161, 304);
-	_ssSymbols[1] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(0x13100631, 1)], 294, 304);
-	_ssSymbols[2] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(0x13100631, 2)], 440, 304);
+	_ssSymbols[0] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 0)], 161, 304);
+	_ssSymbols[1] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 1)], 294, 304);
+	_ssSymbols[2] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 2)], 440, 304);
 
 	_ssSymbolDice[0] = insertSprite<SsScene1105SymbolDie>(0, 206, 304);
 	_ssSymbolDice[1] = insertSprite<SsScene1105SymbolDie>(1, 339, 304);
@@ -651,9 +651,9 @@ void Scene1105::update() {
 
 	// DEBUG: Show the correct code
 	debug("(%d, %d) (%d, %d) (%d, %d)", 
-		getSubVar(0x7500993A, 0), getSubVar(0x61084036, 0),
-		getSubVar(0x7500993A, 1), getSubVar(0x61084036, 1),
-		getSubVar(0x7500993A, 2), getSubVar(0x61084036, 2));
+		getSubVar(VA_GOOD_DICE_NUMBERS, 0), getSubVar(VA_CURR_DICE_NUMBERS, 0),
+		getSubVar(VA_GOOD_DICE_NUMBERS, 1), getSubVar(VA_CURR_DICE_NUMBERS, 1),
+		getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2));
 
 	Scene::update();
 	if (_countdown != 0 && (--_countdown == 0)) {
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 041be6f..99d15b9 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -195,7 +195,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 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(0x02038314, _nameHash) && !getSubVar(0x02720344, _nameHash)) {
+	if (!getSubVar(VA_HAS_TAPE, _nameHash) && !getSubVar(VA_IS_TAPE_INSERTED, _nameHash)) {
 		SetMessageHandler(&AsScene1201Tape::handleMessage);
 	} else {
 		setVisible(false);
@@ -211,7 +211,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setSubVar(0x02038314, _nameHash, 1);
+		setSubVar(VA_HAS_TAPE, _nameHash, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 		break;
@@ -728,10 +728,10 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_surfaceFlag = true;
 
-	if (!getSubVar(0x40050052, 0xE8058B52)) {
-		setSubVar(0x40050052, 0xE8058B52, 1);
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) {
+		setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1);
 		for (uint32 index = 0; index < 18; index++) {
-			setSubVar(0x10055D14, index, kScene1201InitArray[index]);
+			setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]);
 		}
 	}
 
@@ -818,7 +818,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		
 		uint32 tntIndex = 1; 
 		while (tntIndex < 18) {
-			uint32 elemIndex = getSubVar(0x10055D14, tntIndex);
+			uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex);
 			int16 clipY2;
 			if (kScene1201PointArray[elemIndex].y < 175)
 				clipY2 = topY1;
@@ -826,15 +826,15 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 				clipY2 = topY2;
 			else
 				clipY2 = topY3;
-			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2);
-			elemIndex = getSubVar(0x10055D14, tntIndex + 1);
+			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2);
+			elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex + 1);
 			if (kScene1201PointArray[elemIndex].y < 175)
 				clipY2 = topY1;
 			else if (kScene1201PointArray[elemIndex].y < 230)
 				clipY2 = topY2;
 			else
 				clipY2 = topY3;
-			insertSprite<SsScene1201Tnt>(tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2);
+			insertSprite<SsScene1201Tnt>(tntIndex + 1, getSubVar(VA_TNT_POSITIONS, tntIndex + 1), clipY2);
 			tntIndex += 3;
 		}
 
@@ -850,7 +850,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 		uint32 tntIndex = 0;
 		while (tntIndex < 18) {
-			uint32 elemIndex = getSubVar(0x10055D14, tntIndex);
+			uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex);
 			int16 clipY2;
 			if (kScene1201PointArray[elemIndex].x < 300) {
 				clipY2 = 480;
@@ -862,7 +862,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 				else
 					clipY2 = topY3;
 			}
-			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2);
+			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2);
 			tntIndex++;
 		}
 
@@ -1023,7 +1023,7 @@ AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene,
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1202TntItem::hmShowIdle);
-	positionIndex = getSubVar(0x10055D14, _itemIndex);
+	positionIndex = getSubVar(VA_TNT_POSITIONS, _itemIndex);
 	createSurface(900, 37, 67);
 	_x = kScene1202Points[positionIndex].x;
 	_y = kScene1202Points[positionIndex].y;
@@ -1139,11 +1139,11 @@ void Scene1202::update() {
 		_soundFlag = true;
 	} else if (_clickedIndex >= 0 && _counter == 0) {
 		int destIndex = kScene1202Table[_clickedIndex];
-		sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(0x10055D14, destIndex));
-		sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(0x10055D14, _clickedIndex));
-		int temp = getSubVar(0x10055D14, destIndex);
-		setSubVar(0x10055D14, destIndex, getSubVar(0x10055D14, _clickedIndex));
-		setSubVar(0x10055D14, _clickedIndex, temp);
+		sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex));
+		sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex));
+		int temp = getSubVar(VA_TNT_POSITIONS, destIndex);
+		setSubVar(VA_TNT_POSITIONS, destIndex, getSubVar(VA_TNT_POSITIONS, _clickedIndex));
+		setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp);
 		_counter = 2;
 		_clickedIndex = -1;
 		if (_flag) {
@@ -1196,14 +1196,14 @@ uint32 Scene1202::hmSolved(int messageNum, const MessageParam &param, Entity *se
 bool Scene1202::isSolved() {
 
 	debug("isSolved() %d %d %d %d %d %d", 
-		getSubVar(0x10055D14,  0), getSubVar(0x10055D14,  3),
-		getSubVar(0x10055D14,  6), getSubVar(0x10055D14,  9),
-		getSubVar(0x10055D14,  12), getSubVar(0x10055D14,  15));
+		getSubVar(VA_TNT_POSITIONS,  0), getSubVar(VA_TNT_POSITIONS,  3),
+		getSubVar(VA_TNT_POSITIONS,  6), getSubVar(VA_TNT_POSITIONS,  9),
+		getSubVar(VA_TNT_POSITIONS,  12), getSubVar(VA_TNT_POSITIONS,  15));
 
 	return 
-		getSubVar(0x10055D14,  0) ==  0 && getSubVar(0x10055D14,  3) ==  3 && 
-		getSubVar(0x10055D14,  6) ==  6 && getSubVar(0x10055D14,  9) ==  9 &&
-		getSubVar(0x10055D14, 12) == 12 && getSubVar(0x10055D14, 15) == 15;
+		getSubVar(VA_TNT_POSITIONS,  0) ==  0 && getSubVar(VA_TNT_POSITIONS,  3) ==  3 && 
+		getSubVar(VA_TNT_POSITIONS,  6) ==  6 && getSubVar(VA_TNT_POSITIONS,  9) ==  9 &&
+		getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15;
 }
 
 void Scene1202::doPaletteEffect() {
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index e8cc843..978eb03 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1115,12 +1115,12 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind
 	_dataResource.load(0x22102142);
 	_pointList = _dataResource.getPointArray(0xAC849240);
 	
-	pt = (*_pointList)[getSubVar(0xA010B810, _index)];
+	pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)];
 	_x = pt.x;
 	_y = pt.y;
 	
-	// TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], fileHashes);
-	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], 640, 480); //TODO: Remeove once the line above is done
+	// TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], fileHashes);
+	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 640, 480); //TODO: Remeove once the line above is done
 	
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1307Key::handleMessage);
@@ -1148,7 +1148,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param,
 		_isClickable = param.asInteger() != 0;
 		break;
 	case 0x2001:
-		setSubVar(0xA010B810, _index, param.asInteger());
+		setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index, param.asInteger());
 		stMoveKey();
 		break;
 	case 0x2003:
@@ -1196,7 +1196,7 @@ void AsScene1307Key::suMoveKey() {
 		processDelta();
 		_pointIndex++;
 	} else {
-		NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)];
+		NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)];
 		_x = pt.x + kAsScene1307KeyXDelta;
 		_y = pt.y + kAsScene1307KeyYDelta;
 		stInsertKey();
@@ -1213,14 +1213,14 @@ void AsScene1307Key::stRemoveKey() {
 
 void AsScene1307Key::stInsertKey() {
 	_pointIndex = 0;
-	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]);
-	setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]);
+	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]);
+	setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]);
 	SetSpriteUpdate(&AsScene1307Key::suInsertKey);
 	_newStickFrameIndex = -2;
 }
 
 void AsScene1307Key::stMoveKey() {
-	NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)];
+	NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)];
 	int16 newX = pt.x + kAsScene1307KeyXDelta;
 	int16 newY = pt.y + kAsScene1307KeyYDelta;
 	sendMessage(_parentScene, 0x1022, 1000);
@@ -1257,9 +1257,9 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
 
 	//DEBUG>>>
-	setSubVar(0x08D0AB11, 0, 1);
-	setSubVar(0x08D0AB11, 1, 1);
-	setSubVar(0x08D0AB11, 2, 1);
+	setSubVar(VA_IS_KEY_INSERTED, 0, 1);
+	setSubVar(VA_IS_KEY_INSERTED, 1, 1);
+	setSubVar(VA_IS_KEY_INSERTED, 2, 1);
 	//DEBUG<<<
 
 	Sprite *tempSprite;
@@ -1299,7 +1299,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480);
 
 	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
-		if (getSubVar(0x08D0AB11, keyIndex)) {
+		if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) {
 			_asKeys[keyIndex] = insertSprite<AsScene1307Key>(this, keyIndex, _clipRects);
 			_vm->_collisionMan->addSprite(_asKeys[keyIndex]);
 		} else {
@@ -1345,8 +1345,8 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 						// Check if the clicked keyhole is already occupied with a key
 						bool occupied = false;
 						for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) {
-							if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex] != _asCurrKey) {
-								if (getSubVar(0xA010B810, keyIndex) == clickedKeyHoleIndex)
+							if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex] != _asCurrKey) {
+								if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, keyIndex) == clickedKeyHoleIndex)
 									occupied = true;
 							}
 						}
@@ -1366,9 +1366,9 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 	// TODO Debug stuff
 	case 0x2002:
 		// Check if all keys are in the correct keyholes
-		if (getSubVar(0x08D0AB11, 0) && getSubVar(0xA010B810, 0) == getSubVar(0x0C10A000, 0) &&
-			getSubVar(0x08D0AB11, 1) && getSubVar(0xA010B810, 1) == getSubVar(0x0C10A000, 1) &&
-			getSubVar(0x08D0AB11, 2) && getSubVar(0xA010B810, 2) == getSubVar(0x0C10A000, 2)) {
+		if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) &&
+			getSubVar(VA_IS_KEY_INSERTED, 1) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 1) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1) &&
+			getSubVar(VA_IS_KEY_INSERTED, 2) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 2) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)) {
 			// Play unlock animations for all keys
 			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 				if (_asKeys[keyIndex])
@@ -1378,11 +1378,9 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 			_isPuzzleSolved = true;
 			_countdown = 47;
 		} else {
-			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
-				if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) {
+			for (uint keyIndex = 0; keyIndex < 3; keyIndex++)
+				if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex])
 					sendMessage(_asKeys[keyIndex], 0x2000, 1);
-				}
-			}
 			sendMessage(_asCurrKey, 0x2004, 1);
 		}
 		_asCurrKey = NULL;
@@ -1390,11 +1388,9 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		_asCurrKey = (Sprite*)sender;
-		for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
-			if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) {
+		for (uint keyIndex = 0; keyIndex < 3; keyIndex++)
+			if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex])
 				sendMessage(_asKeys[keyIndex], 0x2000, 0);
-			}
-		}
 		break;
 	}
 	return messageResult;
@@ -1602,9 +1598,9 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asJaggyDoor = insertSprite<AsScene1308JaggyDoor>(this);
 	_asLightWallSymbols = insertSprite<AsScene1308LightWallSymbols>(this);
 
-	_ssNumber1 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 1)], 0);
-	_ssNumber2 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 0)], 1);
-	_ssNumber3 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 2)], 2);
+	_ssNumber1 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0);
+	_ssNumber2 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1);
+	_ssNumber3 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2);
 
 	_sprite2 = insertStaticSprite(0x40043120, 995);
 	_sprite3 = insertStaticSprite(0x43003100, 995);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index d207428..eb8f4fe 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1547,15 +1547,15 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui
 	_y = kAsScene1405TileItemPositions[_tileIndex].y;
 	createSurface1(0x844B805C, 1100);
 	setVisible(false);
-	if (getSubVar(0xCCE0280F, _tileIndex))
+	if (getSubVar(VA_IS_TILE_MATCH, _tileIndex))
 		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
 	SetUpdateHandler(&AsScene1405Tile::update);
 	SetMessageHandler(&AsScene1405Tile::handleMessage);
 	
-	debug("getSubVar(0x0C65F80B, _tileIndex) = %d", getSubVar(0x0C65F80B, _tileIndex));
+	debug("getSubVar(VA_TILE_SYMBOLS, _tileIndex) = %d", getSubVar(VA_TILE_SYMBOLS, _tileIndex));
 	
-	startAnimation(0x844B805C, getSubVar(0x0C65F80B, _tileIndex), -1);
-	_newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _tileIndex);
+	startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1);
+	_newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex);
 }
 
 void AsScene1405Tile::update() {
@@ -1570,7 +1570,7 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (getSubVar(0xCCE0280F, _tileIndex) == 0 && _parentScene->getCountdown() == 0) {
+		if (getSubVar(VA_IS_TILE_MATCH, _tileIndex) == 0 && _parentScene->getCountdown() == 0) {
 			show();
 			sendMessage(_parentScene, 0x2000, _tileIndex);
 		}
@@ -1609,12 +1609,12 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	// DEBUG>>>
 	// TODO: Some debug code: Leave two matching tiles open
 	for (int i = 0; i < 48; i++)
-		setSubVar(0xCCE0280F, i, 1);
+		setSubVar(VA_IS_TILE_MATCH, i, 1);
 	int debugIndex = 0;
-	setSubVar(0xCCE0280F, debugIndex, 0);
+	setSubVar(VA_IS_TILE_MATCH, debugIndex, 0);
 	for (int i = 0; i < 48; i++) {
-		if (i != debugIndex && getSubVar(0x0C65F80B, i) == getSubVar(0x0C65F80B, debugIndex)) {
-			setSubVar(0xCCE0280F, i, 0);
+		if (i != debugIndex && getSubVar(VA_TILE_SYMBOLS, i) == getSubVar(VA_TILE_SYMBOLS, debugIndex)) {
+			setSubVar(VA_IS_TILE_MATCH, i, 0);
 			break;
 		}
 	}
@@ -1623,7 +1623,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
 		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
 		_vm->_collisionMan->addSprite(_tiles[tileIndex]);
-		if (getSubVar(0xCCE0280F, tileIndex))
+		if (getSubVar(VA_IS_TILE_MATCH, tileIndex))
 			_tilesLeft--;
 	}
 	
@@ -1641,9 +1641,9 @@ void Scene1405::update() {
 		_tiles[_firstTileIndex]->hide();
 		_tiles[_secondTileIndex]->hide();
 		for (uint32 i = 0; i < 48; i++) {
-			if (getSubVar(0xCCE0280F, i)) {
+			if (getSubVar(VA_IS_TILE_MATCH, i)) {
 				_tiles[i]->hide();
-				setSubVar(0xCCE0280F, i, 0);
+				setSubVar(VA_IS_TILE_MATCH, i, 0);
 			}
 		}
 	}
@@ -1669,9 +1669,9 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 			_secondTileIndex = param.asInteger();
 			if (_firstTileIndex != _secondTileIndex) {
 				_selectFirstTile = true;
-				if (getSubVar(0x0C65F80B, _secondTileIndex) == getSubVar(0x0C65F80B, _firstTileIndex)) {
-					setSubVar(0xCCE0280F, _firstTileIndex, 1);
-					setSubVar(0xCCE0280F, _secondTileIndex, 1);
+				if (getSubVar(VA_TILE_SYMBOLS, _secondTileIndex) == getSubVar(VA_TILE_SYMBOLS, _firstTileIndex)) {
+					setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1);
+					setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1);
 					_tilesLeft -= 2;
 					if (_tilesLeft == 0) {
 						playSound(0);
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index f45f87f..22ffaf6 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1415,7 +1415,7 @@ void Scene1609::update() {
 			_currentSymbolIndex++;
 			if (_currentSymbolIndex >= 12)
 				_currentSymbolIndex = 0;
-			_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(0x04909A50, _noisySymbolIndex));
+			_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(VA_CODE_SYMBOLS, _noisySymbolIndex));
 			_changeCurrentSymbol = false;
 			_countdown1 = 36;
 		} else {
@@ -1468,12 +1468,12 @@ bool Scene1609::testVars() {
 	int cmpSymbolIndex = 0;
 
 	// Find the position of the first symbol
-	while ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex())
+	while ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex())
 		cmpSymbolIndex++;
 
 	// Check if the entered symbols match
 	for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) {
-		if ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex())
+		if ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex())
 			return false;
 		cmpSymbolIndex++;
 		if (cmpSymbolIndex >= 12)
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index f6d140b..adbd853 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -151,7 +151,7 @@ SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHas
 SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash)
 	: StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _tapeIndex(tapeIndex) {
 
-	if (!getSubVar(0x02038314, _tapeIndex) && !getSubVar(0x02720344, _tapeIndex)) {
+	if (!getSubVar(VA_HAS_TAPE, _tapeIndex) && !getSubVar(VA_IS_TAPE_INSERTED, _tapeIndex)) {
 		SetMessageHandler(&SsScene1705Tape::handleMessage);
 	} else {
 		setVisible(false);
@@ -173,7 +173,7 @@ uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam &param,
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setSubVar(0x02038314, _tapeIndex, 1);
+		setSubVar(VA_HAS_TAPE, _tapeIndex, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 		break;		
@@ -205,9 +205,9 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse433(0x18222039);
 
-	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0);
-	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1);
-	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2);
+	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0);
+	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1);
+	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2);
 
 	_sprite = insertStaticSprite(0x31313A22, 1100);
 
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 503a1d3..20a8559 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -504,7 +504,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
-	if (!getSubVar(0x40050052, 0x60400854)) {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x60400854)) {
 		// TODO _vm->gameModule()->initScene2201Vars();
 	}
 
@@ -525,8 +525,8 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
 	for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++)
-		if ((int16)getSubVar(0x484498D0, cubeIndex) >= 0)
-			insertSprite<SsScene2201PuzzleCube>(cubeIndex, (int16)getSubVar(0x484498D0, cubeIndex));
+		if ((int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex) >= 0)
+			insertSprite<SsScene2201PuzzleCube>(cubeIndex, (int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex));
 
 	_clipRects[0].y1 = 0;
 	_clipRects[0].x2 = 640;
@@ -799,8 +799,8 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 	_drawRect.height = _spriteResource.getDimensions().height;
 	_needRefresh = true;
 
-	setSubVar(0x484498D0, _tileIndex, (uint32)-1);
-	setSubVar(0x484498D0, newTileIndex, (uint32)_value);
+	setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1);
+	setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value);
 	
 	_tileIndex = newTileIndex;
 	
@@ -901,11 +901,11 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	//DEBUG>>>
 	for (uint32 index = 0; index < 9; index++)
-		setSubVar(0x484498D0, index, 7 - index);
+		setSubVar(VA_CUBE_POSITIONS, index, 7 - index);
 	//DEBUG<<<
 
 	for (uint32 index = 0; index < 9; index++) {
-		int16 value = (int16)getSubVar(0x484498D0, index);
+		int16 value = (int16)getSubVar(VA_CUBE_POSITIONS, index);
 		if (value >= 0) {
 			Sprite *puzzleTileSprite = insertSprite<SsScene2202PuzzleTile>(this, index, value);
 			_vm->_collisionMan->addSprite(puzzleTileSprite);
@@ -995,13 +995,13 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 int16 Scene2202::getFreeTileIndex(int16 index) {
-	if (index >= 3 && (int16)getSubVar(0x484498D0, index - 3) == -1) {
+	if (index >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 3) == -1) {
 		return index - 3;
-	} else if (index <= 5 && (int16)getSubVar(0x484498D0, index + 3) == -1) {
+	} else if (index <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 3) == -1) {
 		return index + 3;
-	} else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(0x484498D0, index - 1) == -1) {
+	} else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 1) == -1) {
 		return index - 1;
-	} else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(0x484498D0, index + 1) == -1) {
+	} else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 1) == -1) {
 		return index + 1;
 	} else
 		return -1;
@@ -1009,13 +1009,13 @@ int16 Scene2202::getFreeTileIndex(int16 index) {
 
 bool Scene2202::testIsSolved() {
 	return 
-		getSubVar(0x484498D0, 0) == 0 &&
-		getSubVar(0x484498D0, 2) == 2 &&
-		getSubVar(0x484498D0, 3) == 3 &&
-		getSubVar(0x484498D0, 4) == 4 &&
-		getSubVar(0x484498D0, 5) == 5 &&
-		getSubVar(0x484498D0, 6) == 6 &&
-		getSubVar(0x484498D0, 8) == 7;
+		getSubVar(VA_CUBE_POSITIONS, 0) == 0 &&
+		getSubVar(VA_CUBE_POSITIONS, 2) == 2 &&
+		getSubVar(VA_CUBE_POSITIONS, 3) == 3 &&
+		getSubVar(VA_CUBE_POSITIONS, 4) == 4 &&
+		getSubVar(VA_CUBE_POSITIONS, 5) == 5 &&
+		getSubVar(VA_CUBE_POSITIONS, 6) == 6 &&
+		getSubVar(VA_CUBE_POSITIONS, 8) == 7;
 }
 
 static const uint32 kAsCommonKeyFileHashes[] = {
@@ -1025,7 +1025,7 @@ static const uint32 kAsCommonKeyFileHashes[] = {
 AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y)
 	: AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) {
 
-	if (!getSubVar(0x0090EA95, _keyIndex) && !getSubVar(0x08D0AB11, _keyIndex)) {
+	if (!getSubVar(VA_HAS_KEY, _keyIndex) && !getSubVar(VA_IS_KEY_INSERTED, _keyIndex)) {
 		SetMessageHandler(&AsCommonKey::handleMessage);
 	} else {
 		// If Klayman already has the key or it's already inserted then don't show it
@@ -1042,7 +1042,7 @@ uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam &param, Ent
 		messageResult = 1;
 		break;
 	case 0x4806:
-		setSubVar(0x0090EA95, _keyIndex, 1);
+		setSubVar(VA_HAS_KEY, _keyIndex, 1);
 		setVisible(false);
 		SetMessageHandler(NULL);
 	}
@@ -2017,8 +2017,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_vm->gameModule()->initScene3009Vars();
 
-	if (!getSubVar(0x40050052, 0x88460852))
-		setSubVar(0x40050052, 0x88460852, 1);
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852))
+		setSubVar(VA_IS_PUZZLE_INIT, 0x88460852, 1);
 
 	SetMessageHandler(&Scene2207::handleMessage);
 	SetUpdateHandler(&Scene2207::update);
@@ -2069,9 +2069,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
 
-		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0);
-		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1);
-		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2);
+		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0);
+		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1);
+		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 2)], 2);
 
 		_asTape = NULL;
 		_asLever = NULL;
@@ -2162,11 +2162,11 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
-			if (getSubVar(0x14800353, 0x40119852)) {
-				setSubVar(0x14800353, 0x40119852, 0);
+			if (getSubVar(VA_LOCKS_DISABLED, 0x40119852)) {
+				setSubVar(VA_LOCKS_DISABLED, 0x40119852, 0);
 				playSound(0, calcHash("fx3LocksDisable"));
 			} else {
-				setSubVar(0x14800353, 0x40119852, 1);
+				setSubVar(VA_LOCKS_DISABLED, 0x40119852, 1);
 				playSound(1);
 			}
 		}
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 4e8d26d..d29330f 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -222,7 +222,7 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p
 	case 0x2000:
 		_x = 240;
 		_y = 447;
-		_soundIndex = getSubVar(0x0800547C, param.asInteger());
+		_soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger());
 		playSound(0, 0x48640244);
 		startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1);
 		setVisible(true);
@@ -448,9 +448,9 @@ void Scene2401::update() {
 		if (_pipeStatus >= 10) {
 			bool puzzleSolved = true, waterInside = false;
 			for (uint i = 0; i < 5; i++) {
-				if (getSubVar(0x0800547C, i) != getSubVar(0x90405038, i))
+				if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, i))
 					puzzleSolved = false;
-				if (getSubVar(0x0800547C, i) != 0)
+				if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != 0)
 					waterInside = true;
 			}
 			if (puzzleSolved) {
@@ -460,18 +460,18 @@ void Scene2401::update() {
 			} else if (waterInside) {
 				playPipeSound(0xD0431020);
 				for (uint i = 0; i < 5; i++) {
-					sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(0x0800547C, i));
-					setSubVar(0x0800547C, i, 0);
+					sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(VA_CURR_WATER_PIPES_LEVEL, i));
+					setSubVar(VA_CURR_WATER_PIPES_LEVEL, i, 0);
 				}
 			}
 		} else if (_pipeStatus >= 5) {
 			_ssWaterPipes[_pipeStatus]->setVisible(true);
 			_countdown1 = 8;
-			playPipeSound(kScene2401FileHashes3[getSubVar(0x0800547C, _pipeStatus - 5)]);
+			playPipeSound(kScene2401FileHashes3[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]);
 		} else {
 			_ssWaterPipes[_pipeStatus]->setVisible(true);
 			_countdown1 = _pipeStatus == 4 ? 16 : 8;
-			playPipeSound(kScene2401FileHashes3[getSubVar(0x90405038, _pipeStatus)]);
+			playPipeSound(kScene2401FileHashes3[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]);
 		}
 		_pipeStatus++;
 	}
@@ -534,9 +534,9 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x2001:
 		sendMessage(_asWaterSpit[_asWaterSpitIndex], 0x2000, param.asInteger());
 		_asWaterSpitIndex = (_asWaterSpitIndex + 1) & 1;
-		incSubVar(0x0800547C, param.asInteger(), 1);
-		if (getSubVar(0x0800547C, param.asInteger()) >= 5)
-			setSubVar(0x0800547C, param.asInteger(), 4);
+		incSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 1);
+		if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()) >= 5)
+			setSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 4);
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
@@ -771,10 +771,10 @@ void Scene2402::update() {
 			_ssDoorFrame->update();
 		} else if (_pipeStatus >= 5) {
 			_countdown = 8;
-			playPipeSound(kScene2402FileHashes[getSubVar(0x0800547C, _pipeStatus - 5)]);
+			playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]);
 		} else {
 			_countdown = _pipeStatus == 4 ? 16 : 8;
-			playPipeSound(kScene2402FileHashes[getSubVar(0x90405038, _pipeStatus)]);
+			playPipeSound(kScene2402FileHashes[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]);
 		}
 		_pipeStatus++;
 	}
@@ -892,11 +892,11 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
-			if (getSubVar(0x14800353, 0x304008D2)) {
-				setSubVar(0x14800353, 0x304008D2, 0);
+			if (getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) {
+				setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 0);
 				playSound(0, calcHash("fx3LocksDisable"));
 			} else {
-				setSubVar(0x14800353, 0x304008D2, 1);
+				setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 1);
 				playSound(1);
 			}
 		}
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index d6840a3..0a14fb6 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -516,7 +516,7 @@ void SsScene2504Button::update() {
 		_isSoundPlaying = false;
 	}
 	if (_countdown != 0 && (--_countdown) == 0) {
-		if (getSubVar(0x14800353, 0x01180951)) {
+		if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) {
 			playSound(0);
 		} else {
 			playSound(1);
@@ -532,10 +532,10 @@ uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam &para
 		if (_countdown == 0 && !_isSoundPlaying) {
 			setVisible(true);
 			_countdown = 2;
-			if (getSubVar(0x14800353, 0x01180951)) {
-				setSubVar(0x14800353, 0x01180951, 0);
+			if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) {
+				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0);
 			} else {
-				setSubVar(0x14800353, 0x01180951, 1);
+				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1);
 			}
 			playSound(2);
 		}
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 9603f70..080f815 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -168,9 +168,9 @@ void Module2700::createScene(int sceneNum, int which) {
 		break;
 	case 10:
 		// TODO _vm->gameModule()->initScene2808Vars2();
-		_scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(0x40005834, 2)];
-		_scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(0x40005834, 1)];
-		_scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(0x40005834, 0)];
+		_scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)];
+		_scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)];
+		_scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0)];
 		_scene2711StaticSprites[3] = 0x0261282E;
 		_scene2711StaticSprites[4] = 0x9608E5A0;
 		_scene2711StaticSprites[5] = 0;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index e664eb3..4232b79 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -658,18 +658,18 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	insertMouse433(0xA423A41A);
 	
-	if (getSubVar(0x0C601058, 0) == 0) {
+	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
 		_asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100);
 	} else {
 		_asTestTubeOne = (StaticSprite*)insertSprite<AsScene2803TestTubeOne>(
-			kScene2803FileHashes1[getSubVar(0x0C601058, 0)],
-			kScene2803FileHashes2[getSubVar(0x0C601058, 0)]);
+			kScene2803FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)],
+			kScene2803FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)]);
 	}
 	
-	if (getSubVar(0x0C601058, 1) == 3)
+	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 		_asTestTubeTwo = (StaticSprite*)insertStaticSprite(0x64330236, 100);
 
-	if (getSubVar(0x0C601058, 2) == 3)
+	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 		_asTestTubeThree = (StaticSprite*)insertStaticSprite(0x2E4A22A2, 100);
 	
 	_asLightCord = insertSprite<AsScene2803LightCord>(this, 0x8FAD5932, 0x276E1A3D, 578, 200);
@@ -842,16 +842,16 @@ void Scene2803::changeBackground() {
 		_sprite8->update();
 		_sprite9->load(0x341A0237, false, false);
 		_sprite9->update();
-		if (getSubVar(0x0C601058, 0) == 0) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
 			_asTestTubeOne->load(0x66121222, false, false);
 			_asTestTubeOne->update();
 		} else
 			sendMessage(_asTestTubeOne, 0x2000, 0);
-		if (getSubVar(0x0C601058, 1) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
 			_asTestTubeTwo->load(0x64330236, false, false);
 			_asTestTubeTwo->update();
 		}
-		if (getSubVar(0x0C601058, 2) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
 			_asTestTubeThree->load(0x2E4A22A2, false, false);
 			_asTestTubeThree->update();
 		}
@@ -877,16 +877,16 @@ void Scene2803::changeBackground() {
 		_sprite8->update();
 		_sprite9->load(0x708072E0, false, false);
 		_sprite9->update();
-		if (getSubVar(0x0C601058, 0) == 0) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
 			_asTestTubeOne->load(0x50C027A8, false, false);
 			_asTestTubeOne->update();
 		} else
 			sendMessage(_asTestTubeOne, 0x2000, 1);
-		if (getSubVar(0x0C601058, 1) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
 			_asTestTubeTwo->load(0xD48077A0, false, false);
 			_asTestTubeTwo->update();
 		}
-		if (getSubVar(0x0C601058, 2) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
 			_asTestTubeThree->load(0x30022689, false, false);
 			_asTestTubeThree->update();
 		}
@@ -951,15 +951,15 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 		_sprite6 = insertStaticSprite(0x3C42022F, 1100);
 		_sprite7 = insertStaticSprite(0x341A0237, 1100);
 
-		if (getSubVar(0x0C601058, 0) == 0)
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0)
 			insertStaticSprite(0x66121222, 100);
 		else
-			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326);
+			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326);
 
-		if (getSubVar(0x0C601058, 1) == 3)
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 			insertStaticSprite(0x64330236, 100);
 
-		if (getSubVar(0x0C601058, 2) == 3)
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 			insertStaticSprite(0x2E4A22A2, 100);
 
 	} else {
@@ -976,16 +976,16 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 		_sprite7 = insertStaticSprite(0x708072E0, 1100);
 		insertStaticSprite(0x90582EA4, 100);
 
-		setSubVar(0x0C601058, 0, 1);//DEBUG, FIXME crashes when not done?!
-		if (getSubVar(0x0C601058, 0) == 0)
+		setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0, 1);//DEBUG, FIXME crashes when not done?!
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0)
 			insertStaticSprite(0x50C027A8, 100);
 		else
-			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326);
+			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326);
 
-		if (getSubVar(0x0C601058, 1) == 3)
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 			insertStaticSprite(0xD48077A0, 100);
 
-		if (getSubVar(0x0C601058, 2) == 3)
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 			insertStaticSprite(0x30022689, 100);
 
 	}
@@ -1386,7 +1386,7 @@ AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWa
 		{470, 180}
 	};
 
-	_colorNum = (int16)getSubVar(0xE11A1929, crystalIndex);
+	_colorNum = (int16)getSubVar(VA_CURR_CRYSTAL_COLORS, crystalIndex);
 	_isLightOn = getGlobalVar(V_SHRINK_LIGHTS_ON) != 0;
 	if (_isLightOn) {
 		_x = kAsScene2804CrystalPoints[crystalIndex].x;
@@ -1441,7 +1441,7 @@ void AsScene2804Crystal::activate() {
 			startAnimation(kAsScene2804CrystalFileHashes[_crystalIndex], _colorNum, -1);
 			_newStickFrameIndex = _colorNum;
 		}
-		setSubVar(0xE11A1929, _crystalIndex, _colorNum);
+		setSubVar(VA_CURR_CRYSTAL_COLORS, _crystalIndex, _colorNum);
 	}
 }
 
@@ -1686,7 +1686,7 @@ uint32 Scene2804::handleMessage(int messageNum, const MessageParam &param, Entit
 		_isSolved = true;
 		_beamStatus = 0;
 		for (uint index = 0; index < 5; index++)
-			if (_asCrystals[index]->getColorNum() != (int16)getSubVar(0xD4B2089C, index))
+			if (_asCrystals[index]->getColorNum() != (int16)getSubVar(VA_GOOD_CRYSTAL_COLORS, index))
 				_isSolved = false;
 		_countdown2 = 48;
 		break;
@@ -1767,8 +1767,8 @@ void Scene2804::initCrystalColors() {
 			do {
 				misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1);
 			} while (misalignedColorNum == correctColorNum);
-			setSubVar(0xD4B2089C, index, correctColorNum);
-			setSubVar(0xE11A1929, index, misalignedColorNum);
+			setSubVar(VA_GOOD_CRYSTAL_COLORS, index, correctColorNum);
+			setSubVar(VA_CURR_CRYSTAL_COLORS, index, misalignedColorNum);
 		}
 		setGlobalVar(V_CRYSTAL_COLORS_INIT, 1);
 	}
@@ -1989,27 +1989,27 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2807::handleMessage);
 
-	if (getSubVar(0x0C601058, 0) == 1) {
+	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 1) {
 		insertStaticSprite(0x103021E2, 300);
-	} else if (getSubVar(0x0C601058, 0) == 2) {
+	} else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 2) {
 		insertStaticSprite(0x103022E2, 300);
-	} else if (getSubVar(0x0C601058, 0) == 3) {
+	} else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 3) {
 		insertStaticSprite(0x103024E2, 300);
 	}
 
-	if (getSubVar(0x0C601058, 1) == 1) {
+	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 1) {
 		insertStaticSprite(0x4800A52A, 200);
-	} else if (getSubVar(0x0C601058, 1) == 2) {
+	} else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 2) {
 		insertStaticSprite(0x4800A62A, 200);
-	} else if (getSubVar(0x0C601058, 1) == 3) {
+	} else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
 		insertStaticSprite(0x4800A02A, 200);
 	}
 
-	if (getSubVar(0x0C601058, 2) == 1) {
+	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 1) {
 		insertStaticSprite(0x31203430, 100);
-	} else if (getSubVar(0x0C601058, 2) == 2) {
+	} else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 2) {
 		insertStaticSprite(0x31203400, 100);
-	} else if (getSubVar(0x0C601058, 2) == 3) {
+	} else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
 		insertStaticSprite(0x31203460, 100);
 	}
 
@@ -2439,7 +2439,7 @@ void Scene2808::update() {
 
 	// DEBUG>>>: Show correct values
 	debug("---------------");
-	debug("%03d %03d %03d", getSubVar(0x0C601058, 0), getSubVar(0x0C601058, 1), getSubVar(0x0C601058, 2));
+	debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2));
 	debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel());
 	// DEBUG<<<
 	
@@ -2452,14 +2452,14 @@ void Scene2808::update() {
 bool Scene2808::isMixtureGood() {
 	if (_testTubeSetNum == 0) {
 		return
-			_asTestTubes[0]->getFillLevel() == getSubVar(0x0C601058, 0) &&
-			_asTestTubes[1]->getFillLevel() == getSubVar(0x0C601058, 1) &&
-			_asTestTubes[2]->getFillLevel() == getSubVar(0x0C601058, 2);
+			_asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) &&
+			_asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) &&
+			_asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2);
 	} else {
 		return
-			_asTestTubes[0]->getFillLevel() == getSubVar(0x40005834, 0) &&
-			_asTestTubes[1]->getFillLevel() == getSubVar(0x40005834, 1) &&
-			_asTestTubes[2]->getFillLevel() == getSubVar(0x40005834, 2);
+			_asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0) &&
+			_asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1) &&
+			_asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2);
 	}
 }
 
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 7312da7..242a00e 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -121,8 +121,8 @@ void Module3000::createScene(int sceneNum, int which) {
 		break;
 	case 7:
 		_vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0);
-		if (!getSubVar(0x40050052, 0x089809C2)) {
-			setSubVar(0x40050052, 0x089809C2, 1);
+		if (!getSubVar(VA_IS_PUZZLE_INIT, 0x089809C2)) {
+			setSubVar(VA_IS_PUZZLE_INIT, 0x089809C2, 1);
 			createSmackerScene(0x90022001, true, true, false);
 		} else
 			createSmackerScene(0x98022001, true, true, false);
@@ -138,8 +138,8 @@ void Module3000::createScene(int sceneNum, int which) {
 		break;
 	case 11:
 		_vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0);
-		if (!getSubVar(0x40050052, 0x10130993)) {
-			setSubVar(0x40050052, 0x10130993, 1);
+		if (!getSubVar(VA_IS_PUZZLE_INIT, 0x10130993)) {
+			setSubVar(VA_IS_PUZZLE_INIT, 0x10130993, 1);
 			createSmackerScene(0x31093019, true, true, false);
 		} else
 			createSmackerScene(0x20093019, true, true, false);
@@ -744,7 +744,7 @@ void AsScene3009HorizontalIndicator::stMoveRight() {
 AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _symbolPosition(symbolPosition) {
 
-	_symbolIndex = getSubVar(0x00000914, _symbolPosition);
+	_symbolIndex = getSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition);
 	
 	_x = kAsScene3009SymbolPoints[_symbolPosition].x;
 	_y = kAsScene3009SymbolPoints[_symbolPosition].y;
@@ -778,7 +778,7 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &para
 		}
 		startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1);
 		_newStickFrameIndex = _symbolIndex;
-		setSubVar(0x00000914, _symbolPosition, _symbolIndex);
+		setSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition, _symbolIndex);
 		if (_symbolPosition / 3 == 0) {
 			sendMessage(_parentScene, 0x2001, 0);
 		} else {
@@ -846,9 +846,9 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (int symbolPosition = 0; symbolPosition < 6; symbolPosition++) {
 		_asSymbols[symbolPosition] = insertSprite<AsScene3009Symbol>(this, symbolPosition);
 		if (symbolPosition < 3)
-			_correctSymbols[symbolPosition] = getSubVar(0x00504B86, symbolPosition);
+			_correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_1, symbolPosition);
 		else
-			_correctSymbols[symbolPosition] = getSubVar(0x0A4C0A9A, symbolPosition - 3);
+			_correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_2, symbolPosition - 3);
 	}
 
 	SetMessageHandler(&Scene3009::handleMessage);
@@ -856,7 +856,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	// DEBUG: Set the correct code
 	for (int i = 0; i < 6; i++)
-		setSubVar(0x00000914, i, _correctSymbols[i]);
+		setSubVar(VA_CURR_CANNON_SYMBOLS, i, _correctSymbols[i]);
 	sendMessage(this, 0x2003, 0);
 	//setGlobalVar(V_ROBOT_TARGET, 1);   
 
@@ -1032,14 +1032,14 @@ void Scene3009::playActionVideo() {
 
 bool Scene3009::isSymbolsPart1Solved() {
 	for (int i = 0; i < 3; i++)
-		if (_correctSymbols[i] != getSubVar(0x00000914, i))
+		if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i))
 			return false;
 	return true;
 }
 
 bool Scene3009::isSymbolsPart2Solved() {
 	for (int i = 3; i < 6; i++)
-		if (_correctSymbols[i] != getSubVar(0x00000914, i))
+		if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i))
 			return false;
 	return true;
 }
@@ -1091,7 +1091,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene
 
 	NDimensions dimensions1, dimensions2;
 	 
-	_buttonEnabled = getSubVar(0x14800353, kScene3010ButtonNameHashes[_buttonIndex]) != 0;
+	_buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0;
 	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
 	dimensions1 = _spriteResource.getDimensions();
 	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
@@ -1181,7 +1181,7 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene
 	_x = kAsScene3010DeadBoltPoints[_boltIndex].x;
 	_y = kAsScene3010DeadBoltPoints[_boltIndex].y;
 
-	if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) {
+	if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_boltIndex])) {
 		createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200);
 		startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 		loadSound(0, 0x46005BC4);
@@ -1293,9 +1293,9 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	int initCountdown = 0;
 
 	// DEBUG: Enable all buttons
-	setSubVar(0x14800353, kScene3010ButtonNameHashes[0], 1);
-	setSubVar(0x14800353, kScene3010ButtonNameHashes[1], 1);
-	setSubVar(0x14800353, kScene3010ButtonNameHashes[2], 1);
+	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[0], 1);
+	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1);
+	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1);
 
 	_surfaceFlag = true;
 
@@ -1306,7 +1306,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asDeadBolts[i] = insertSprite<AsScene3010DeadBolt>(this, i, which == 1);//CHECKME
 		_ssDeadBoltButtons[i] = insertSprite<SsScene3010DeadBoltButton>(this, i, initCountdown, which == 1);//CHECKME
 		_vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]);
-		if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i]))
+		if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i]))
 			initCountdown++;
 		_boltUnlocking[i] = false;
 		_boltUnlocked[i] = false;
@@ -1570,9 +1570,9 @@ void Scene3011::update() {
 					do {
 						_noisyRandomSymbolIndex = _vm->_rnd->getRandomNumber(12 - 1);
 					} while (_noisySymbolIndex == _noisyRandomSymbolIndex);
-					_asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->show(true);
+					_asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->show(true);
 				} else {
-					_asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->show(false);
+					_asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->show(false);
 				}
 				_updateStatus = 1;
 				_countdown = 24;
@@ -1593,9 +1593,9 @@ void Scene3011::update() {
 			_updateStatus = 0;
 			_countdown = 1;
 			if (_noisySymbolIndex == _currentSymbolIndex) {
-				_asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->hide();
+				_asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->hide();
 			} else {
-				_asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->hide();
+				_asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->hide();
 			}
 			_currentSymbolIndex++;
 			if (_currentSymbolIndex >= 12)
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index e96fe8a..e2cb7cd 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -77,9 +77,9 @@ void SmackerScene::nextVideo() {
 			sendMessage(_parentModule, 0x1009, 0);
 			return;
 		}
-		_fieldDF = getSubVar(0x00800410, smackerFileHash);
+		_fieldDF = getSubVar(VA_SMACKER_PLAYED, smackerFileHash);
 		if (!_fieldDF) {
-			setSubVar(0x00800410, smackerFileHash, 1);
+			setSubVar(VA_SMACKER_PLAYED, smackerFileHash, 1);
 		}
 		if (_fileHashListIndex == 0)
 			_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false));


Commit: 111b6d32c6c8e6aaafdb6e5efaeea0a0ae4aa998
    https://github.com/scummvm/scummvm/commit/111b6d32c6c8e6aaafdb6e5efaeea0a0ae4aa998
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:06-07:00

Commit Message:
NEVERHOOD: Fix Smacker framerate bug after the video decoder changes

- React to the space key which can skip some videos and navigation transitions
- Minor renaming in SmackerScene

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerscene.cpp
    engines/neverhood/smackerscene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 1b9c9f3..0c2e090 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -85,6 +85,13 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 	}				
 }
 
+void GameModule::handleSpaceKey() {
+	if (_childObject) {
+		debug(2, "GameModule::handleSpaceKey()");
+		sendMessage(_childObject, 9, 0);
+	}				
+}
+
 void GameModule::initScene1307Vars() {
 
 	// Exit if it's already initialized
@@ -314,7 +321,7 @@ void GameModule::startup() {
 #if 1
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 1;
-	createModule(2200, -1);
+	createModule(3000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index af72d53..7031bbb 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -37,6 +37,7 @@ public:
 	void startup();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
+	void handleSpaceKey();
 	void initScene1307Vars();
 	void initScene1405Vars();
 	void initScene2401Vars();
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index e5c07b5..4b75f68 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -116,6 +116,13 @@ Common::Error NeverhoodEngine::run() {
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
 				_keyState = event.kbd.keycode;
+				switch (_keyState) {
+				case Common::KEYCODE_SPACE:
+					_gameModule->handleSpaceKey();
+					break;
+				default:
+					break;
+				}
 				break;
 			case Common::EVENT_KEYUP:
 				_keyState = Common::KEYCODE_INVALID;
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 799f04f..0ed6748 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -103,10 +103,14 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 	
 	_palette = new Palette(_vm);
 	_palette->usePalette();
+
+	_smackerDecoder->start();
 	
 }
 
 void SmackerPlayer::close() {
+	if (_smackerDecoder)
+		_smackerDecoder->stop();
 	delete _smackerDecoder;
 	delete _palette;
 	// NOTE: The SmackerDecoder deletes the _stream
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index e2cb7cd..d4f65b3 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -25,7 +25,7 @@
 namespace Neverhood {
 
 SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort)
-	: Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _fieldDF(false),
+	: Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false),
 	_fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) {
 
 	debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort);
@@ -77,10 +77,9 @@ void SmackerScene::nextVideo() {
 			sendMessage(_parentModule, 0x1009, 0);
 			return;
 		}
-		_fieldDF = getSubVar(VA_SMACKER_PLAYED, smackerFileHash);
-		if (!_fieldDF) {
+		_videoPlayedBefore = getSubVar(VA_SMACKER_PLAYED, smackerFileHash);
+		if (!_videoPlayedBefore)
 			setSubVar(VA_SMACKER_PLAYED, smackerFileHash, 1);
-		}
 		if (_fileHashListIndex == 0)
 			_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false));
 		else
@@ -105,7 +104,7 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam &param, En
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0009:
-		if ((_fieldDF && _flag1) || (_canAbort && _flag1))
+		if ((_videoPlayedBefore && _flag1) || (_canAbort && _flag1))
 			_playNextVideoFlag = true;
 		break;
 	case 0x000C:
diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h
index 0523766..54de28a 100644
--- a/engines/neverhood/smackerscene.h
+++ b/engines/neverhood/smackerscene.h
@@ -40,7 +40,7 @@ protected:
 	bool _doubleSurface;
 	bool _flag1;
 	bool _canAbort;
-	bool _fieldDF;
+	bool _videoPlayedBefore;
 	bool _playNextVideoFlag;
 	int _fileHashListIndex;
 	const uint32 *_fileHashList;


Commit: b8d939a94b364a8d992a5053b527a822babccd37
    https://github.com/scummvm/scummvm/commit/b8d939a94b364a8d992a5053b527a822babccd37
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:06-07:00

Commit Message:
NEVERHOOD: Implement Scene2802 (radio tuning scene)

- Handle mouse button up events
- Use the SmackerDecoder's rewind
- Implement SmackerPlayer::gotoFrame (slow but better than nothing)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 0c2e090..a85d8a9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -46,6 +46,27 @@
 
 namespace Neverhood {
 
+static const uint32 kScene2801MusicFileHashes[] = {
+	0x82B22000,
+	0x02B22004,
+	0x42B22000,
+	0x03322008,
+	0x02B22001,
+	0x02B22008,
+	0x02B22020,
+	0x03322001,
+	0x03322002,
+	0x03322004,
+	0x03322040,
+	0x02B22002,
+	0x02B22010,
+	0x03322010,
+	0x02B22040,
+	0x43322000,
+	0x83322000,
+	0x03322020
+};
+
 GameModule::GameModule(NeverhoodEngine *vm)
 	: Module(vm, NULL), _moduleNum(-1) {
 	
@@ -85,6 +106,16 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 	}				
 }
 
+void GameModule::handleMouseUp(int16 x, int16 y) {
+	if (_childObject) {
+		NPoint mousePos;
+		mousePos.x = x;
+		mousePos.y = y;
+		debug(2, "GameModule::handleMouseUp(%d, %d)", x, y);
+		sendPointMessage(_childObject, 2, mousePos);
+	}				
+}
+
 void GameModule::handleSpaceKey() {
 	if (_childObject) {
 		debug(2, "GameModule::handleSpaceKey()");
@@ -279,6 +310,12 @@ void GameModule::initScene3009Vars() {
 	}
 }
 
+uint32 GameModule::getScene2802MusicFileHash() {
+	uint musicNum = getGlobalVar(0x08CC0828);
+	return (musicNum % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP<uint>(musicNum / 5, 0, 17)];
+}
+
+
 uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -321,7 +358,7 @@ void GameModule::startup() {
 #if 1
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 1;
-	createModule(3000, -1);
+	createModule(2800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 7031bbb..82e6fa5 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -37,6 +37,7 @@ public:
 	void startup();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
+	void handleMouseUp(int16 x, int16 y);
 	void handleSpaceKey();
 	void initScene1307Vars();
 	void initScene1405Vars();
@@ -44,6 +45,7 @@ public:
 	void initScene2808Vars1();
 	void initScene2808Vars2();
 	void initScene3009Vars();
+	uint32 getScene2802MusicFileHash();
 protected:
 	Entity *_prevChildObject;
 	bool _someFlag1;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 4232b79..1a51571 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -31,9 +31,9 @@
 namespace Neverhood {
 
 Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
+	: Module(vm, parentModule), _musicResource(NULL) {
 
-	_fileHash = 0;
+	_currentMusicFileHash = 0;
 	// TODO music stuff
 	_vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14);
 	setGlobalVar(0x28D8C940, 1);
@@ -51,7 +51,10 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Module2800::~Module2800() {
-	// TODO music stuff
+	if (_musicResource) {
+		_musicResource->unload();
+		delete _musicResource;
+	}
 	_vm->_soundMan->deleteGroup(0x64210814);
 }
 
@@ -65,6 +68,11 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 1:
 		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
+		
+		// TODO!!
+		
+		_childObject = new Scene2802(_vm, this, which);
+		
 #if 0		
 		_flag = true; // DEBUG!
 		if (_flag) {
@@ -180,10 +188,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 4);
 		break;
-	//		
 	case 1001:
+		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
+		createSmackerScene(0x00800801, true, true, false);
 		break;
-	// TODO ...		
 	}
 	SetUpdateHandler(&Module2800::updateScene);
 	_childObject->handleUpdate();
@@ -351,22 +359,51 @@ void Module2800::updateScene() {
 		case 26:
 			createScene(11, 2);
 			break;
-		//		
 		case 1001:
+			createScene(1, -1);
 			break;
 		}
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			// TODO Module2800_updateMusic(true);
+			updateMusic(true);
 			break;
 		case 1:
-			// TODO Module2800_updateMusic(false);
+			updateMusic(false);
 			break;
 		}
 	}
 }
 
+void Module2800::updateMusic(bool halfVolume) {
+
+	uint32 newMusicFileHash = _vm->_gameModule->getScene2802MusicFileHash();
+
+	if (!_musicResource)
+		_musicResource = new MusicResource(_vm);
+		
+	if (newMusicFileHash != _currentMusicFileHash) {
+		_currentMusicFileHash = newMusicFileHash;
+		if (_currentMusicFileHash != 0) {
+			_musicResource->load(_currentMusicFileHash);
+			_musicResource->setVolume(halfVolume ? 60 : 100);
+			_musicResource->play(0);
+		} else {
+			_musicResource->stop(0);
+		}
+	} else if (_currentMusicFileHash != 0) {
+		if (!_musicResource->isPlaying()) {
+			_musicResource->setVolume(halfVolume ? 60 : 100);
+			_musicResource->play(0);
+		} else {
+			_musicResource->setVolume(halfVolume ? 60 : 100);
+		}
+	} else {
+		_musicResource->stop(0);
+	}
+
+}
+
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
@@ -475,6 +512,168 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
+Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _countdownType(0), _countdown1(0), _countdown2(0) {
+
+	//DEBUG>>> Disable video
+	setGlobalVar(0x28D8C940, 0);
+	//DEBUG<<<
+		
+	_surfaceFlag = true;
+	SetMessageHandler(&Scene2802::handleMessage);
+	SetUpdateHandler(&Scene2802::update);
+	insertMouse435(0x008810A8, 20, 620);
+	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true));
+	_smackerFrameNumber = getGlobalVar(0x08CC0828);
+	_smackerPlayer->gotoFrame(_smackerFrameNumber);
+	_vm->_soundMan->addSound(0x04360A18, 0x422630C2);
+	_vm->_soundMan->addSound(0x04360A18, 0x00632252);
+	_vm->_soundMan->addSound(0x04360A18, 0x00372241);
+	_vm->_soundMan->setSoundVolume(0x00372241, 60);
+	changeCountdownType(0, 0);
+	_vm->_soundMan->playSoundLooping(0x00372241);
+}
+
+Scene2802::~Scene2802() {
+	_vm->_soundMan->deleteSoundGroup(0x04360A18);
+	if (_smackerFrameNumber == 0) {
+		setGlobalVar(0x09880D40, 1);
+		setGlobalVar(0x08180ABC, 0);
+	} else if (_smackerFrameNumber == getGlobalVar(0x88880915)) {
+		setGlobalVar(0x09880D40, 0);
+		setGlobalVar(0x08180ABC, 1);
+	} else {
+		setGlobalVar(0x09880D40, 0);
+		setGlobalVar(0x08180ABC, 0);
+	}
+	setGlobalVar(0x08CC0828, _smackerFrameNumber);
+}
+	
+void Scene2802::update() {
+	int prevCountdownType = _countdownType;
+	uint prevSmackerFrameNumber = _smackerFrameNumber;
+
+	Scene::update();
+	if (_countdown1 > 0)
+		--_countdown1;
+	else if (_countdownType == 1)
+		_countdownType = 3;
+	else if (_countdownType == 4)
+		_countdownType = 6;
+	
+	switch (_countdownType) {
+	case 2:
+		if (_smackerFrameNumber < 90)
+			incSmackerFrameNumber(+1);
+		_countdownType = 0;
+		break;
+	case 3:
+		if (_countdown2 > 0)
+			--_countdown2;
+		else if (_smackerFrameNumber < 90) {
+			incSmackerFrameNumber(+1);
+			_countdown2 = 1;
+		} else
+			_countdownType = 0;
+		break;
+	case 5:
+		if (_smackerFrameNumber > 0)
+			incSmackerFrameNumber(-1);
+		_countdownType = 0;
+		break;
+	case 6:
+		if (_countdown2 > 0)
+			--_countdown2;
+		else if (_smackerFrameNumber > 0) {
+			incSmackerFrameNumber(-1);
+			_countdown2 = 1;
+		} else
+			_countdownType = 0;
+		break;
+	
+	}
+
+	if (prevSmackerFrameNumber != _smackerFrameNumber)
+		_smackerPlayer->gotoFrame(_smackerFrameNumber);
+		
+	if (prevCountdownType != _countdownType)
+		changeCountdownType(prevCountdownType, _countdownType);
+
+	if (getGlobalVar(0x28D8C940) && prevCountdownType != _countdownType && _smackerFrameNumber != 0) {
+		setGlobalVar(0x28D8C940, 0);
+		leaveScene(1);
+	}
+	
+}
+
+uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	int prevCountdownType = _countdownType;
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			leaveScene(0);
+		} else if (_countdownType == 0) {
+			if (param.asPoint().x > 180 && param.asPoint().x < 300 &&
+				param.asPoint().y > 130 && param.asPoint().y < 310) {
+				_countdownType = 4;
+			} else if (param.asPoint().x > 300 && param.asPoint().x < 400 &&
+				param.asPoint().y > 130 && param.asPoint().y < 310) {
+				_countdownType = 1;
+			}
+			if (_countdownType == 1 || _countdownType == 4) {
+				_countdown1 = 8;
+				changeCountdownType(0, _countdownType);
+			}
+		}
+		break;
+	case 0x0002: // TODO Implement button up event
+		if (_countdown1 == 0)
+			_countdownType = 0;
+		else {
+			if (_countdownType == 1)
+				_countdownType = 2;
+			else if (_countdownType == 4)
+				_countdownType = 5;
+			else
+				_countdownType = 0;
+			_countdown1 = 0;
+		}
+		if (prevCountdownType != _countdownType)
+			changeCountdownType(prevCountdownType, _countdownType);
+		break;
+	case 0x000D:
+		// DEBUG message
+		break;
+	}
+	return 0;
+}
+
+void Scene2802::incSmackerFrameNumber(int delta) {
+	_smackerFrameNumber += delta;
+	setGlobalVar(0x08CC0828, _smackerFrameNumber);
+}
+
+void Scene2802::changeCountdownType(int prevCountdownType, int newCountdownType) {
+
+	if (prevCountdownType == 3 || prevCountdownType == 6) {
+		_vm->_soundMan->stopSound(0x422630C2);
+		_vm->_soundMan->stopSound(0x00632252);
+	}
+
+	if (newCountdownType == 0) {
+		if (_vm->_gameModule->getScene2802MusicFileHash() != 0) {
+			_vm->_soundMan->stopSound(0x00632252);
+		}
+		else
+			_vm->_soundMan->playSoundLooping(0x00632252);
+	} else if (newCountdownType == 3 || newCountdownType == 6) {
+		_vm->_soundMan->playSoundLooping(0x422630C2);
+		_vm->_soundMan->playSoundLooping(0x00632252);
+	}
+
+}
+
 AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2),
 	_isPulled(false), _isBusy(false) {
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index f0403f4..ca8b058 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -37,15 +37,17 @@ public:
 	virtual ~Module2800();
 protected:
 	bool _flag;
-	uint32 _fileHash;
+	uint32 _currentMusicFileHash;
+	MusicResource *_musicResource;
 	void createScene(int sceneNum, int which);
 	void updateScene();
+	void updateMusic(bool halfVolume);
 };
 
 class Scene2801 : public Scene {
 public:
 	Scene2801(NeverhoodEngine *vm, Module *parentModule, int which);
-	~Scene2801();
+	virtual ~Scene2801();
 protected:
 	Sprite *_sprite1;
 	Sprite *_sprite2;
@@ -54,6 +56,22 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Scene2802 : public Scene {
+public:
+	Scene2802(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~Scene2802();
+protected:
+	SmackerPlayer *_smackerPlayer;
+	uint _smackerFrameNumber;
+	int _countdownType;
+	int _countdown1;
+	int _countdown2;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void incSmackerFrameNumber(int delta);
+	void changeCountdownType(int prevCountdownType, int newCountdownType);
+};
+
 class AsScene2803LightCord : public AnimatedSprite {
 public:
 	AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 4b75f68..cfeaf92 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -136,6 +136,10 @@ Common::Error NeverhoodEngine::run() {
 			case Common::EVENT_RBUTTONDOWN:
 				_gameModule->handleMouseDown(event.mouse.x, event.mouse.y);
 				break;
+			case Common::EVENT_LBUTTONUP:
+			case Common::EVENT_RBUTTONUP:
+				_gameModule->handleMouseUp(event.mouse.x, event.mouse.y);
+				break;
 			case Common::EVENT_QUIT:
 				_system->quit();
 				break;
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 0ed6748..b491bc5 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -65,8 +65,8 @@ void SmackerDoubleSurface::draw() {
 
 // SmackerPlayer
 
-SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag)
-	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false),
+SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused)
+	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false), _paused(paused),
 	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true),
 	_drawX(-1), _drawY(-1) {
 
@@ -104,7 +104,8 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 	_palette = new Palette(_vm);
 	_palette->usePalette();
 
-	_smackerDecoder->start();
+	if (!_paused)
+		_smackerDecoder->start();
 	
 }
 
@@ -121,8 +122,14 @@ void SmackerPlayer::close() {
 	_smackerSurface = NULL;
 }
 
-void SmackerPlayer::gotoFrame(uint frameNumber) {
-	// TODO?
+void SmackerPlayer::gotoFrame(int frameNumber) {
+	// NOTE Slow as hell but only used in Scene2802
+	if (frameNumber != _smackerDecoder->getCurFrame()) {
+		if (frameNumber < _smackerDecoder->getCurFrame())
+			rewind();
+		while (_smackerDecoder->getCurFrame() != frameNumber)
+			updateFrame();
+	}
 }
 
 uint32 SmackerPlayer::getFrameCount() {
@@ -147,20 +154,8 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) {
 }
 
 void SmackerPlayer::rewind() {
-
-	// TODO Quite dirty, try to implement this in the decoder
-
-	delete _smackerDecoder;
-	_smackerDecoder = NULL;
-	_stream = NULL;
-
-	_smackerFirst = true;
-
-	_stream = _vm->_res->createStream(_fileHash);
-
-	_smackerDecoder = new Video::SmackerDecoder();
-	_smackerDecoder->loadStream(_stream);
-	
+	if (_smackerDecoder)
+		_smackerDecoder->rewind();
 }
 
 void SmackerPlayer::update() {
@@ -174,17 +169,22 @@ void SmackerPlayer::update() {
 		_dirtyFlag = false;
 	}
 
-	if (!_smackerDecoder->endOfVideo()) {
-		updateFrame();
-	} else if (!_keepLastFrame) {
-		// Inform the scene about the end of the video playback
-		if (_scene)
-			sendMessage(_scene, 0x3002, 0);
-		_videoDone = true;
+	if (_paused) {
+		if (_smackerFirst)
+			updateFrame();
 	} else {
-		rewind();
-		updateFrame();
-		_videoDone = false;
+		if (!_smackerDecoder->endOfVideo()) {
+			updateFrame();
+		} else if (!_keepLastFrame) {
+			// Inform the scene about the end of the video playback
+			if (_scene)
+				sendMessage(_scene, 0x3002, 0);
+			_videoDone = true;
+		} else {
+			rewind();
+			updateFrame();
+			_videoDone = false;
+		}
 	}
 	
 }
@@ -214,7 +214,7 @@ void SmackerPlayer::updateFrame() {
 
 	// TODO _vm->_screen->_skipUpdate = true;
 	_dirtyFlag = true;
-
+	
 	if (_smackerDecoder->hasDirtyPalette())
 		updatePalette();
 		
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index c480c2d..63c9ebb 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -49,12 +49,12 @@ public:
 
 class SmackerPlayer : public Entity {
 public:
-	SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag);
+	SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused = false);
 	~SmackerPlayer();
 	BaseSurface *getSurface() { return _smackerSurface; }
 	void open(uint32 fileHash, bool keepLastFrame);
 	void close();
-	void gotoFrame(uint frameNumber);
+	void gotoFrame(int frameNumber);
 	uint32 getFrameCount();
 	uint32 getFrameNumber(); 
 	uint getStatus();
@@ -74,6 +74,7 @@ protected:
 	bool _keepLastFrame;
 	bool _videoDone;
 	bool _dirtyFlag;
+	bool _paused;
 	int _drawX, _drawY;
 	void update();
 	void updateFrame();


Commit: a80ec8c89c4cb102a92cf5e0fa2b2871d763486a
    https://github.com/scummvm/scummvm/commit/a80ec8c89c4cb102a92cf5e0fa2b2871d763486a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:06-07:00

Commit Message:
NEVERHOOD: Implement Module2900, the teleporter

- Also fix a related bug in Module2000 (teleporter appearing animation didn't play)

Changed paths:
  A engines/neverhood/module2900.cpp
  A engines/neverhood/module2900.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.mk
    engines/neverhood/module1100.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index a85d8a9..afd01f7 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -42,6 +42,7 @@
 #include "neverhood/module2600.h"
 #include "neverhood/module2700.h"
 #include "neverhood/module2800.h"
+#include "neverhood/module2900.h"
 #include "neverhood/module3000.h"
 
 namespace Neverhood {
@@ -358,7 +359,7 @@ void GameModule::startup() {
 #if 1
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 1;
-	createModule(2800, -1);
+	createModule(2900, 1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -499,6 +500,12 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(V_MODULE_NAME, 0x64210814);
 		_childObject = new Module2800(_vm, this, which);
 		break;
+	case 2900:
+		setGlobalVar(V_MODULE_NAME, 0x81100020);
+		if (which >= 0)
+			setGlobalVar(0x0152899A, which);
+		_childObject = new Module2900(_vm, this, which);
+		break;
 	case 3000:
 		setGlobalVar(V_MODULE_NAME, 0x81293110);
 		_childObject = new Module3000(_vm, this, which);
@@ -629,6 +636,55 @@ void GameModule::updateModule() {
 				createModule(1800, 0);
 			}
 			break;
+		case 2900:
+			if (_moduleResult != 0xFFFFFFFF) {
+				switch (_moduleResult) {
+				case 0:
+					createModule(1300, 5);
+					break;
+				case 1:
+					createModule(2100, 1);
+					break;
+				case 2:
+					createModule(1100, 1);
+					break;
+				case 3:
+					setSubVar(0x2C145A98, 2, 1);
+					createModule(1700, 1);
+					break;
+				case 4:
+					createModule(2000, 0);
+					break;
+				case 5:
+				default:
+					createModule(2800, 1);
+					break;
+				}
+			} else {
+				switch (getGlobalVar(0x0152899A)) {
+				case 0:
+					createModule(1300, 6);
+					break;
+				case 1:
+					createModule(2100, 2);
+					break;
+				case 2:
+					createModule(1100, 2);
+					break;
+				case 3:
+					createModule(1700, 2);
+					break;
+				case 4:
+					createModule(2000, 1);
+					break;
+				case 5:
+				default:
+					createModule(2800, 2);
+					break;
+				}
+			}
+			setGlobalVar(0x0152899A, 0);
+			break;
 		case 3000:
 			if (_moduleResult == 1) {
 				createModule(1900, 0);
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 2ee28d2..5cd41c8 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -31,6 +31,7 @@ MODULE_OBJS = \
 	module2600.o \
 	module2700.o \
 	module2800.o \
+	module2900.o \
 	module3000.o \
 	mouse.o \
 	navigationscene.o \
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index a3e092b..3335155 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -44,9 +44,9 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 1) {
-		createScene(9, 1);
+		createScene(8, 1);
 	} else {
-		createScene(9, 3);
+		createScene(8, 3);
 	}
 
 	_vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList);
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index befcc34..75a6ebe 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -32,9 +32,9 @@ Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, -1);
 	} else if (which == 0) {
-		createScene(0, 3);
-	} else if (which == 1) {
 		createScene(0, 1);
+	} else if (which == 1) {
+		createScene(0, 3);
 	}
 
 }
diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h
index 4690913..cf7a613 100644
--- a/engines/neverhood/module2100.h
+++ b/engines/neverhood/module2100.h
@@ -71,7 +71,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-
 class Scene2101 : public Scene {
 public:
 	Scene2101(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
new file mode 100644
index 0000000..2ebdb09
--- /dev/null
+++ b/engines/neverhood/module2900.cpp
@@ -0,0 +1,484 @@
+/* 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/module2900.h"
+#include "neverhood/gamemodule.h"
+#include "neverhood/module1100.h"
+#include "neverhood/module1300.h"
+#include "neverhood/module1700.h"
+#include "neverhood/module2000.h"
+#include "neverhood/module2100.h"
+#include "neverhood/module2800.h"
+
+namespace Neverhood {
+
+Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+
+	if (which >= 0)
+		setGlobalVar(0x60826830, which);
+		
+	createScene(0, 0);
+
+}
+
+void Module2900::createScene(int sceneNum, int which) {
+	debug("Module2900::createScene(%d, %d)", sceneNum, which);
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
+	case 0:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene2901(_vm, this, getGlobalVar(0x60826830));
+		break;
+	case 1:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene2805(_vm, this, which);
+		break;
+	case 2:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene2101(_vm, this, which);
+		break;
+	case 3:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene1306(_vm, this, which);
+		break;
+	case 4:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene1705(_vm, this, which);
+		break;
+	case 5:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene1109(_vm, this, which);
+		break;
+	case 6:
+		_vm->gameState().sceneNum = 0;
+		_childObject = new Scene2001(_vm, this, which);
+		break;
+	}
+	SetUpdateHandler(&Module2900::updateScene);
+	_childObject->handleUpdate();
+}
+
+void Module2900::updateScene() {
+	if (!updateChild()) {
+		switch (_sceneNum) {
+		case 0:
+			if (_moduleResult == 0xFFFFFFFF) {
+				leaveModule(0xFFFFFFFF);
+			} else {
+				_field2C = _moduleResult;
+				switch (getGlobalVar(0x60826830)) {
+				case 0:
+					createScene(3, 4);
+					break;
+				case 1:
+					createScene(2, 2);
+					break;
+				case 2:
+					createScene(5, 2);
+					break;
+				case 3:
+					createScene(4, 2);
+					break;
+				case 4:
+					createScene(6, 2);
+					break;
+				case 5:
+					createScene(1, 2);
+					break;
+				default:
+					leaveModule(_moduleResult);
+					break;
+				}
+			}
+			break;
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+		case 5:
+		case 6:
+			leaveModule(_field2C);
+			break;
+		}
+	}
+}
+
+static const uint32 kScene2901FileHashes1[] = {
+	0x023023B4,
+	0x36204507,
+	0x046CF08E,
+	0x9313A237,
+	0xA651F246,
+	0x02108034
+};
+
+static const uint32 kScene2901FileHashes2[] = {
+	0x023B002B,
+	0x0450336A,
+	0xCF08A04E,
+	0x3A233939,
+	0x1F242A6D,
+	0x08030029
+};
+
+static const uint32 kSsScene2901LocationButtonFileHashes[] = {
+	0x2311326A,
+	0x212323AC,
+	0x10098138,
+	0x25213167,
+	0x1119A363,
+	0x94452612,
+	0x39464212,
+	0x01860450,
+	0x53002104,
+	0x58E68412,
+	0x18600300,
+	0xB650A890,
+	0x2452A7C4,
+	0xA0232748,
+	0x08862B02,
+	0x2491E648,
+	0x0010EB46,
+	0x214C8A11,
+	0x16A31921,
+	0x0AC33A00,
+	0x238028AA,
+	0x26737A21,
+	0x063039A8,
+	0x51286C60,
+	0x464006B4,
+	0x42242538,
+	0x20716010,
+	0x4A2000AE,
+	0x225124A6,
+	0x28E82E45,
+	0x58652C04,
+	0xC82210A4,
+	0x62A84060,
+	0xC0693CB4,
+	0x22212C64,
+	0x5034EA71
+};
+
+static const NPoint kSsScene2901LocationButtonPoints[] = {
+	{525, 120}, {576, 149}, {587, 205},
+	{538, 232}, {484, 205}, {479, 153}
+};
+
+static const uint32 kSsScene2901LocationButtonLightFileHashes1[] = {
+	0x03136246,
+	0x2106216E,
+	0x4025A13A,
+	0x21816927,
+	0x110B2202,
+	0xCC0522B2,
+	0x3CC24258,
+	0x59C600F0,
+	0x534A2480,
+	0x50E61019,
+	0x34400150,
+	0x225BA090,
+	0xB059AFC4,
+	0xE093A741,
+	0x0086BF09,
+	0x3281E760,
+	0xA048AB42,
+	0x20649C01,
+	0x14611904,
+	0x26E33850,
+	0x23A52A68,
+	0xA2733024,
+	0x10203880,
+	0x1B2DE860,
+	0x0644A6EC,
+	0x426E20BC,
+	0x80292014,
+	0x4360B02E,
+	0x22742664,
+	0x98682705,
+	0x0925B82C,
+	0x5C2918A4,
+	0xD2284920,
+	0x41083CA6,
+	0x6824A864,
+	0x50266B10
+};
+
+static const uint32 kSsScene2901LocationButtonLightFileHashes2[] = {
+	0x43C46D4C,
+	0x43C4AD4C,
+	0x43C52D4C,
+	0x43C62D4C,
+	0x43C02D4C,
+	0x43CC2D4C
+};
+
+static const uint32 kSsScene2901BrokenButtonFileHashes[] = {
+	0x3081BD3A,
+	0xD3443003,
+	0x0786A320,
+	0xE3A22029,
+	0x61611814,
+	0x425848E2
+};
+
+static const uint32 kSsScene2901BigButtonFileHashes[] = {
+	0x010D7748,
+	0x9D02019A,
+	0x351A2F43,
+	0x448138E5,
+	0x02788CF0,
+	0x71718024
+};
+
+SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) {
+
+	_spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]);
+	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_rect.x1 = kSsScene2901LocationButtonPoints[_index].x - 25;
+	_rect.y1 = kSsScene2901LocationButtonPoints[_index].y - 25;
+	_rect.x2 = kSsScene2901LocationButtonPoints[_index].x + 25;
+	_rect.y2 = kSsScene2901LocationButtonPoints[_index].y + 25;
+	setVisible(false);
+	_needRefresh = true;
+	loadSound(0, 0x440430C0);
+	SetUpdateHandler(&SsScene2901LocationButton::update);
+	SetMessageHandler(&SsScene2901LocationButton::handleMessage);
+}
+	
+void SsScene2901LocationButton::update() {
+	StaticSprite::update();
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		setVisible(false);
+	}
+}
+
+uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown1 == 0) {
+			playSound(0);
+			setVisible(true);
+			_countdown1 = 4;
+			sendMessage(_parentScene, 0x2001, _index);
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index)
+	: StaticSprite(vm, 900), _index(index) {
+	
+	_spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]);
+	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	setVisible(false);
+	_needRefresh = true;
+	loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]);
+}
+
+void SsScene2901LocationButtonLight::show() {
+	playSound(0);
+	setVisible(true);
+	StaticSprite::update();
+}
+
+void SsScene2901LocationButtonLight::hide() {
+	setVisible(false);
+	StaticSprite::update();
+}
+
+SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which)
+	: StaticSprite(vm, 900) {
+
+	_spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]);
+	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_needRefresh = true;
+	StaticSprite::update();
+}
+
+SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) {
+	
+	_spriteResource.load2(kSsScene2901BigButtonFileHashes[which]);
+	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+	_rect.x1 = 62;
+	_rect.y1 = 94;
+	_rect.x2 = 322;
+	_rect.y2 = 350;
+	setVisible(false);
+	_needRefresh = true;
+	loadSound(0, 0xF3D420C8);
+	SetUpdateHandler(&SsScene2901BigButton::update);
+	SetMessageHandler(&SsScene2901BigButton::handleMessage);
+}
+
+void SsScene2901BigButton::update() {
+	StaticSprite::update();
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		setVisible(false);
+		sendMessage(_parentScene, 0x2000, 0);
+	}
+}
+	
+uint32 SsScene2901BigButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown1 == 0) {
+			playSound(0);
+			setVisible(true);
+			_countdown1 = 4;
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Scene(vm, parentModule, true), _currLocationButtonNum(which), _selectedButtonNum(which),
+	_currWhirlButtonNum(0), _prevWhirlButtonNum(0), _countdown1(1), _skipCountdown(0), _blinkOn(0) {
+
+	_isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0;
+
+	//DEBUG>>> Enable all locations
+	for (int i = 0; i < 6; i++)
+		setSubVar(0x2C145A98, i, 1);
+	//DEBUG<<<
+
+	setSubVar(0x2C145A98, which, 1);
+	setSubVar(0x2C145A98, 5, 1);
+	setSubVar(0x2C145A98, 4, 1);
+
+	if (_currLocationButtonNum == 3)
+		setSubVar(0x2C145A98, 2, 1);
+
+	_surfaceFlag = true;
+	setBackground(kScene2901FileHashes1[_currLocationButtonNum]);
+	setPalette(kScene2901FileHashes1[_currLocationButtonNum]);
+	
+	for (uint i = 0; i < 6; ++i) {
+		if (i != 2 || !_isButton2Broken) {
+			_ssLocationButtons[i] = insertSprite<SsScene2901LocationButton>(this, _currLocationButtonNum, i);
+			_vm->_collisionMan->addSprite(_ssLocationButtons[i]);
+			_ssLocationButtonLights[i] = insertSprite<SsScene2901LocationButtonLight>(_currLocationButtonNum, i);
+		}
+	}
+	
+	if (_isButton2Broken)
+		insertSprite<SsScene2901BrokenButton>(_currLocationButtonNum);
+
+	_ssBigButton = insertSprite<SsScene2901BigButton>(this, _currLocationButtonNum);
+	_vm->_collisionMan->addSprite(_ssBigButton);
+
+	insertMouse435(kScene2901FileHashes2[_currLocationButtonNum], 20, 620);
+	
+	SetUpdateHandler(&Scene2901::update);
+	SetMessageHandler(&Scene2901::handleMessage);
+	
+}
+
+void Scene2901::update() {
+	Scene::update();
+	if (_countdown1 != 0 && (--_countdown1) == 0) {
+		if (_currLocationButtonNum == _selectedButtonNum) {
+			_ssLocationButtonLights[_currWhirlButtonNum]->hide();
+			++_currWhirlButtonNum;
+			while (!getSubVar(0x2C145A98, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) {
+				++_currWhirlButtonNum;
+				if (_currWhirlButtonNum >= 6)
+					_currWhirlButtonNum = 0;
+			}
+			if (_currWhirlButtonNum != _prevWhirlButtonNum || _skipCountdown == 0) {
+				_ssLocationButtonLights[_currWhirlButtonNum]->show();
+				_skipCountdown = 4;
+			}
+			_countdown1 = 2;
+			--_skipCountdown;
+			_prevWhirlButtonNum = _currWhirlButtonNum;
+		} else if (_blinkOn) {
+			_blinkOn = false;
+			_ssLocationButtonLights[_selectedButtonNum]->hide();
+			_countdown1 = 16;
+		} else {
+			_blinkOn = true;
+			_ssLocationButtonLights[_selectedButtonNum]->show();
+			_countdown1 = 4;
+		}
+	}
+}
+
+uint32 Scene2901::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0001:
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+			leaveScene(0xFFFFFFFF);
+		}
+		break;
+	case 0x2000:
+		if (_currLocationButtonNum != _selectedButtonNum) {
+			leaveScene(_selectedButtonNum);
+		}
+		break;
+	case 0x2001:
+		if (_currLocationButtonNum == _selectedButtonNum)
+			_selectedButtonNum = _currWhirlButtonNum;
+		_ssLocationButtonLights[_selectedButtonNum]->hide();
+		_selectedButtonNum = param.asInteger();
+		if (!getSubVar(0x2C145A98, _selectedButtonNum))
+			_selectedButtonNum = _currLocationButtonNum;
+		break;
+	}
+	return 0;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/module2900.h b/engines/neverhood/module2900.h
new file mode 100644
index 0000000..7d4e1e4
--- /dev/null
+++ b/engines/neverhood/module2900.h
@@ -0,0 +1,102 @@
+/* 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_MODULE2900_H
+#define NEVERHOOD_MODULE2900_H
+
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+// Module2900
+
+class Module2900 : public Module {
+public:
+	Module2900(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	int _sceneNum;
+	int _field2C;
+	void createScene(int sceneNum, int which);
+	void updateScene();
+	void updateMusic(bool halfVolume);
+};
+
+class SsScene2901LocationButton : public StaticSprite {
+public:
+	SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index);
+protected:
+	Scene *_parentScene;
+	uint _index;
+	int _countdown1;
+	void update();	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class SsScene2901LocationButtonLight : public StaticSprite {
+public:
+	SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index);
+	void show();
+	void hide();
+protected:
+	uint _index;
+};
+
+class SsScene2901BrokenButton : public StaticSprite {
+public:
+	SsScene2901BrokenButton(NeverhoodEngine *vm, int which);
+};
+
+class SsScene2901BigButton : public StaticSprite {
+public:
+	SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which);
+protected:
+	Scene *_parentScene;
+	int _which;
+	int _countdown1;
+	void update();	
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class Scene2901 : public Scene {
+public:
+	Scene2901(NeverhoodEngine *vm, Module *parentModule, int which);
+protected:
+	Sprite *_ssLocationButtons[6];
+	SsScene2901LocationButtonLight *_ssLocationButtonLights[6];
+	Sprite *_ssBigButton;
+	int _currWhirlButtonNum;
+	int _prevWhirlButtonNum;
+	int _countdown1;
+	int _currLocationButtonNum;
+	int _selectedButtonNum;
+	int _skipCountdown;
+	int _blinkOn;
+	bool _isButton2Broken;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MODULE2900_H */


Commit: fa53c0cf8350a873a3278c5debaee1562f51e15b
    https://github.com/scummvm/scummvm/commit/fa53c0cf8350a873a3278c5debaee1562f51e15b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:07-07:00

Commit Message:
NEVERHOOD: Work on the resource system:

- Remove unused stuff
- Shuffle some stuff around

Changed paths:
    engines/neverhood/blbarchive.cpp
    engines/neverhood/blbarchive.h
    engines/neverhood/navigationscene.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/resourceman.cpp
    engines/neverhood/resourceman.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index cb422a1..5551ff0 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -56,7 +56,8 @@ BlbArchive::~BlbArchive() {
 }
 
 void BlbArchive::open(const Common::String &filename) {
-	BlbHeader header; 
+	BlbHeader header;
+	uint16 *extDataOffsets;
 	
 	_entries.clear();		
 
@@ -72,7 +73,7 @@ void BlbArchive::open(const Common::String &filename) {
 	if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size())
 		error("BlbArchive::open() %s seems to be corrupt", filename.c_str());
 
-	debug(2, "fileCount = %d", header.fileCount);
+	debug(2, "%s: fileCount = %d", filename.c_str(), header.fileCount);
 
 	_entries.reserve(header.fileCount);
 
@@ -83,63 +84,80 @@ void BlbArchive::open(const Common::String &filename) {
 		_entries.push_back(entry);
 	}
 	
+	extDataOffsets = new uint16[header.fileCount];
+	
 	// Load file records
 	for (uint i = 0; i < header.fileCount; i++) {
 		BlbArchiveEntry &entry = _entries[i];
 		entry.type = _fd.readByte();
 		entry.comprType = _fd.readByte();
-		entry.extDataOfs = _fd.readUint16LE();
+		//entry.extDataOfs = _fd.readUint16LE();
+		entry.extData = NULL;
+		extDataOffsets[i] = _fd.readUint16LE(); 
 		entry.timeStamp = _fd.readUint32LE();
 		entry.offset = _fd.readUint32LE();
 		entry.diskSize = _fd.readUint32LE();
 		entry.size = _fd.readUint32LE();
 		debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
-			entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp,
+			entry.fileHash, entry.type, entry.comprType, extDataOffsets[i], entry.timeStamp,
 			entry.offset, entry.diskSize, entry.size);
 	}
-
+	
 	// Load ext data
 	if (header.extDataSize > 0) {
 		_extData = new byte[header.extDataSize];
 		_fd.read(_extData, header.extDataSize);
+		for (uint i = 0; i < header.fileCount; i++)
+			_entries[i].extData = extDataOffsets[i] > 0 ? _extData + extDataOffsets[i] - 1 : NULL;
 	}
 
+	delete[] extDataOffsets;
+
 }
 
 void BlbArchive::load(uint index, byte *buffer, uint32 size) {
+	load(&_entries[index], buffer, size);
+}
+
+void BlbArchive::load(BlbArchiveEntry *entry, byte *buffer, uint32 size) {
 	Common::StackLock lock(_mutex);
 	
-	BlbArchiveEntry &entry = _entries[index];
+	_fd.seek(entry->offset);
 	
-	_fd.seek(entry.offset);
-	
-	switch (entry.comprType) {
+	switch (entry->comprType) {
 	case 1: // Uncompressed
 		if (size == 0)
-			size = entry.diskSize;
+			size = entry->diskSize;
 		_fd.read(buffer, size);
 		break;
 	case 3: // DCL-compressed
-		if (!Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size)) {
-			debug("decompressDCL(diskSize: %d; size: %d)", entry.diskSize, entry.size);
-			debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry.fileHash, entry.type, entry.offset, entry.offset + entry.diskSize);
+		if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size)) {
+			debug("decompressDCL(diskSize: %d; size: %d)", entry->diskSize, entry->size);
+			debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry->fileHash, entry->type, entry->offset, entry->offset + entry->diskSize);
 			debug("-> fd.pos() = %08X", _fd.pos());
 		}
 		break;
 	default:
-		error("BlbArchive::load() Unknown compression type %d", entry.comprType);
+		error("BlbArchive::load() Unknown compression type %d", entry->comprType);
 	}
 
 }
 
 byte *BlbArchive::getEntryExtData(uint index) {
-	BlbArchiveEntry &entry = _entries[index];
-	return (_extData && entry.extDataOfs != 0) ? &_extData[entry.extDataOfs - 1] : NULL;
+	return getEntryExtData(&_entries[index]);
+}
+
+byte *BlbArchive::getEntryExtData(BlbArchiveEntry *entry) {
+	//return (_extData && entry->extDataOfs != 0) ? &_extData[entry->extDataOfs - 1] : NULL;
+	return entry->extData;
 }
 
 Common::SeekableReadStream *BlbArchive::createStream(uint index) {
-	const BlbArchiveEntry &entry = _entries[index];
-	return new SafeMutexedSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize,
+	return createStream(&_entries[index]);
+}
+
+Common::SeekableReadStream *BlbArchive::createStream(BlbArchiveEntry *entry) {
+	return new SafeMutexedSeekableSubReadStream(&_fd, entry->offset, entry->offset + entry->diskSize,
 		DisposeAfterUse::NO,_mutex);
 }
 
diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h
index cd2fd11..620b12b 100644
--- a/engines/neverhood/blbarchive.h
+++ b/engines/neverhood/blbarchive.h
@@ -44,7 +44,7 @@ struct BlbArchiveEntry {
 	uint32 fileHash;
 	byte type;
 	byte comprType;
-	uint16 extDataOfs;
+	byte *extData;
 	uint32 timeStamp;
 	uint32 offset;
 	uint32 diskSize;
@@ -57,11 +57,14 @@ public:
 	~BlbArchive();
 	void open(const Common::String &filename);
 	void load(uint index, byte *buffer, uint32 size);
+	void load(BlbArchiveEntry *entry, byte *buffer, uint32 size);
 	byte *getEntryExtData(uint index);
+	byte *getEntryExtData(BlbArchiveEntry *entry);
 	uint32 getSize(uint index) { return _entries[index].size; }
 	BlbArchiveEntry *getEntry(uint index) { return &_entries[index]; }
 	uint getCount() { return _entries.size(); }
 	Common::SeekableReadStream *createStream(uint index);
+	Common::SeekableReadStream *createStream(BlbArchiveEntry *entry);
 private:
 	Common::File _fd;
 	Common::Mutex _mutex;
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 5dc80c9..bf3de5d 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -80,6 +80,10 @@ void NavigationScene::update() {
 		_vm->_screen->clear();
 		_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 		_smackerDone = false;
+		/*
+		if (!_interactive)
+			_smackerDone = true;
+		*/
 		_smackerFileHash = 0;
 	} else if (_smackerDone) {
 		if (_leaveSceneAfter) {
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index cfeaf92..72fa360 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -238,11 +238,11 @@ void NeverhoodEngine::dumpAllResources() {
 
 	for (uint i = 0; i < entriesCount; i++) {
 		const ResourceFileEntry &entry = _res->getEntry(i);
-		int type = _res->getResourceTypeByHash(entry.fileHash);
-		debug("hash: %08X; type: %d", entry.fileHash, type);
+		int type = _res->getResourceTypeByHash(entry.archiveEntry->fileHash);
+		debug("hash: %08X; type: %d", entry.archiveEntry->fileHash, type);
 		if (type == 4) {
 			AnimResource anim(this);
-			anim.load(entry.fileHash);
+			anim.load(entry.archiveEntry->fileHash);
 			for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) {
 				const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex);
 				int16 width = (frameInfo.rect.width + 3) & 0xFFFC;
@@ -251,8 +251,8 @@ void NeverhoodEngine::dumpAllResources() {
 				anim.draw(frameIndex, pixels, width, false, false);
 				Common::String filename = 
 					frameInfo.frameHash != 0
-					? Common::String::format("%08X_%03d_%08X.tga", entry.fileHash, frameIndex, frameInfo.frameHash) 
-					: Common::String::format("%08X_%03d.tga", entry.fileHash, frameIndex);
+					? Common::String::format("%08X_%03d_%08X.tga", entry.archiveEntry->fileHash, frameIndex, frameInfo.frameHash) 
+					: Common::String::format("%08X_%03d.tga", entry.archiveEntry->fileHash, frameIndex);
 				writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height);
 				delete[] pixels;
 			}
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 28cef36..eb6aa01 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -32,49 +32,40 @@ ResourceMan::~ResourceMan() {
 
 void ResourceMan::addArchive(const Common::String &filename) {
 	BlbArchive *archive = new BlbArchive();
-	uint archiveIndex = _archives.size();
 	archive->open(filename);
 	_archives.push_back(archive);
 	debug(3, "ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount());
-	_entries.reserve(_entries.size() + archive->getCount());
 	for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) {
 		BlbArchiveEntry *archiveEntry = archive->getEntry(archiveEntryIndex);
 		ResourceFileEntry *entry = findEntrySimple(archiveEntry->fileHash);
 		if (entry) {
-			if (archiveEntry->timeStamp > _archives[entry->archiveIndex]->getEntry(entry->entryIndex)->timeStamp) {
-				entry->archiveIndex = archiveIndex;
-				entry->entryIndex = archiveEntryIndex;
+			if (archiveEntry->timeStamp > entry->archiveEntry->timeStamp) {
+				entry->archive = archive;
+				entry->archiveEntry = archiveEntry;
 			} 
 		} else {
 			ResourceFileEntry newEntry;
-			newEntry.fileHash = archiveEntry->fileHash;
 			newEntry.resourceHandle = -1;
-			newEntry.archiveIndex = archiveIndex;
-			newEntry.entryIndex = archiveEntryIndex;
-			_entries.push_back(newEntry);
+			newEntry.archive = archive;
+			newEntry.archiveEntry = archiveEntry;
+			_entries[archiveEntry->fileHash] = newEntry;
 		}
 	}
+	debug("_entries.size() = %d", _entries.size());
 }
 
 ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) {
-	for (uint i = 0; i < _entries.size(); i++) {
-		if (_entries[i].fileHash == fileHash)
-			return &_entries[i];
-	}
-	return NULL;
+	EntriesMap::iterator p = _entries.find(fileHash);
+	return p != _entries.end() ? &(*p)._value : NULL;
 }
 
 ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntrySimple(fileHash);
-	for (; entry && getArchiveEntry(entry)->comprType == 0x65; fileHash = getArchiveEntry(entry)->diskSize)
+	for (; entry && entry->archiveEntry->comprType == 0x65; fileHash = entry->archiveEntry->diskSize)
 		entry = findEntrySimple(fileHash);
 	return entry;
 }
 
-BlbArchiveEntry *ResourceMan::getArchiveEntry(ResourceFileEntry *entry) const {
-	return _archives[entry->archiveIndex]->getEntry(entry->entryIndex);
-}
-
 int ResourceMan::useResource(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntry(fileHash);
 	if (!entry)
@@ -83,11 +74,7 @@ int ResourceMan::useResource(uint32 fileHash) {
 		_resources[entry->resourceHandle]->useRefCount++;
 	} else {
 		Resource *resource = new Resource();
-		resource->fileHash = entry->fileHash;
-		resource->archiveIndex = entry->archiveIndex;
-		resource->entryIndex = entry->entryIndex;
-		resource->data = NULL;
-		resource->dataRefCount = 0;
+		resource->entry = entry;
 		resource->useRefCount = 1;
 		entry->resourceHandle = (int)_resources.size();
 		_resources.push_back(resource);
@@ -103,86 +90,68 @@ void ResourceMan::unuseResource(int resourceHandle) {
 		resource->useRefCount--;
 }
 
-void ResourceMan::unuseResourceByHash(uint32 fileHash) {
-	ResourceFileEntry *entry = findEntry(fileHash);
-	if (entry->resourceHandle != -1)
-		unuseResource(entry->resourceHandle);
-}
-
-int ResourceMan::getResourceHandleByHash(uint32 fileHash) {
-	ResourceFileEntry *entry = findEntry(fileHash);
-	return entry->resourceHandle;
-}
-
-bool ResourceMan::isResourceDataValid(int resourceHandle) const {
-	if (resourceHandle < 0)
-		return false;
-	return _resources[resourceHandle]->data != NULL;
-}
-
 uint32 ResourceMan::getResourceSize(int resourceHandle) const {
 	if (resourceHandle < 0)
 		return 0;
 	Resource *resource = _resources[resourceHandle];
-	return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->size;
+	return resource->entry->archiveEntry->size;
 }
 
 byte ResourceMan::getResourceType(int resourceHandle) {
 	if (resourceHandle < 0)
 		return 0;
 	Resource *resource = _resources[resourceHandle];
-	return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->type;
+	return resource->entry->archiveEntry->type;
 }
 
 byte ResourceMan::getResourceTypeByHash(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntry(fileHash);
-	return getArchiveEntry(entry)->type;
+	return entry->archiveEntry->type;
 }
 
 byte *ResourceMan::getResourceExtData(int resourceHandle) {
 	if (resourceHandle < 0)
 		return NULL;
 	Resource *resource = _resources[resourceHandle];
-	return _archives[resource->archiveIndex]->getEntryExtData(resource->entryIndex);
+	return resource->entry->archive->getEntryExtData(resource->entry->archiveEntry);
 }
 
 byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntrySimple(fileHash);
-	return entry ? _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex) : NULL;
+	return entry ? entry->archive->getEntryExtData(entry->archiveEntry) : NULL;
 }
 
 byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) {
 	if (resourceHandle < 0)
 		return NULL;
 	Resource *resource = _resources[resourceHandle];
-	if (resource->data != NULL) {
-		resource->dataRefCount++;
+	ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash];
+	if (!resourceData) {
+		resourceData = new ResourceData();
+		_data[resource->entry->archiveEntry->fileHash] = resourceData;
+	}
+	if (resourceData->data != NULL) {
+		resourceData->dataRefCount++;
 	} else {
-		BlbArchive *archive = _archives[resource->archiveIndex];
-		BlbArchiveEntry *archiveEntry = archive->getEntry(resource->entryIndex);
-		resource->data = new byte[archiveEntry->size];
-		archive->load(resource->entryIndex, resource->data, 0);
-		resource->dataRefCount = 1;
+		resourceData->data = new byte[resource->entry->archiveEntry->size];
+		resource->entry->archive->load(resource->entry->archiveEntry, resourceData->data, 0);
+		resourceData->dataRefCount = 1;
 	}
-	return resource->data;
+	return resourceData->data;
 }
 
 void ResourceMan::unloadResource(int resourceHandle) {
 	if (resourceHandle < 0)
 		return;
 	Resource *resource = _resources[resourceHandle];
-	if (resource->dataRefCount > 0)
-		resource->dataRefCount--;
-}
-
-void ResourceMan::freeResource(Resource *resource) {
-	delete[] resource->data;
-	resource->data = NULL;
+	ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash];
+	if (resourceData && resourceData->dataRefCount > 0)
+		resourceData->dataRefCount--;
 }
 
 Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntry(fileHash);
-	return _archives[entry->archiveIndex]->createStream(entry->entryIndex);
+	return entry->archive->createStream(entry->archiveEntry);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index ed5bffa..5ca8fa2 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -25,26 +25,43 @@
 
 #include "common/array.h"
 #include "common/file.h"
+#include "common/hashmap.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
 
 namespace Neverhood {
 
 struct ResourceFileEntry {
-	uint32 fileHash;
 	int resourceHandle;
-	uint archiveIndex;
-	uint entryIndex;
+	BlbArchive *archive;
+	BlbArchiveEntry *archiveEntry;
 };
 
 struct Resource {
-	uint32 fileHash;
-	uint archiveIndex;
-	uint entryIndex;
+	ResourceFileEntry *entry;
+	int useRefCount;
+};
+
+struct ResourceData {
 	byte *data;
 	int dataRefCount;
-	int useRefCount;
+	ResourceData() : data(NULL), dataRefCount() {}
+};
+
+#if 0
+class ResourceMan;
+
+struct ResourceHandle {
+public:
+	ResourceHandle();
+	~ResourceHandle();
+	const byte *data();
+	uint32 size() const { return _archiveEntry ? _archiveEntry->size : 0 };
+protected:
+	ResourceMan *_res;
+	ResourceFileEntry *_resourceFileEntry;
 };
+#endif
 
 class ResourceMan {
 public:
@@ -53,12 +70,8 @@ public:
 	void addArchive(const Common::String &filename);
 	ResourceFileEntry *findEntrySimple(uint32 fileHash);
 	ResourceFileEntry *findEntry(uint32 fileHash);
-	BlbArchiveEntry *getArchiveEntry(ResourceFileEntry *entry) const;
 	int useResource(uint32 fileHash);
 	void unuseResource(int resourceHandle);
-	void unuseResourceByHash(uint32 fileHash);
-	int getResourceHandleByHash(uint32 fileHash);
-	bool isResourceDataValid(int resourceHandle) const;
 	uint32 getResourceSize(int resourceHandle) const;
 	byte getResourceType(int resourceHandle);
 	byte getResourceTypeByHash(uint32 fileHash);
@@ -66,13 +79,17 @@ public:
 	byte *getResourceExtDataByHash(uint32 fileHash);
 	byte *loadResource(int resourceHandle, bool moveToFront = false);
 	void unloadResource(int resourceHandle);
-	void freeResource(Resource *resource);
 	Common::SeekableReadStream *createStream(uint32 fileHash);
 	const ResourceFileEntry& getEntry(uint index) { return _entries[index]; }
 	uint getEntryCount() { return _entries.size(); }
-private:
+#if 0	
+	ResourceHandle getResource(uint32 fileHash);
+#endif
+protected:
+	typedef Common::HashMap<uint32, ResourceFileEntry> EntriesMap;
 	Common::Array<BlbArchive*> _archives;
-	Common::Array<ResourceFileEntry> _entries;
+	EntriesMap _entries;
+	Common::HashMap<uint32, ResourceData*> _data;
 	Common::Array<Resource*> _resources;
 };
 


Commit: a724e603dace28b1fc4d1f9036849c119712c93a
    https://github.com/scummvm/scummvm/commit/a724e603dace28b1fc4d1f9036849c119712c93a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:07-07:00

Commit Message:
NEVERHOOD: Use CursorMan

- Only update entities according to the current frame rate but run the actual game loop at a faster rate so the mouse cursor movement doesn't get choppy

Changed paths:
    engines/neverhood/mouse.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 03b1478..a1c4a9a 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -21,11 +21,10 @@
  */
 
 #include "neverhood/mouse.h"
+#include "graphics/cursorman.h"
 
 namespace Neverhood {
 
-// TODO: Use CursorMan
-
 Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect)
 	: StaticSprite(vm, 2000), _mouseType(kMouseType433), 
 	_mouseCursorResource(vm), _frameNum(0) {
@@ -95,64 +94,59 @@ void Mouse::update() {
 
 uint32 Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	debug(7, "Mouse::handleMessage(%04X)", messageNum);
-	uint32 messageResult = 0;
-	if (messageNum != 5) {
-		messageResult = Sprite::handleMessage(messageNum, param, sender);
-		switch (messageNum) {
-		case 0x2064:
-			_x = param.asPoint().x;
-			_y = param.asPoint().y;
-			switch (_type) {
-			case 1:
-				if (_x >= 320)
-					messageResult = 1;
-				else				
-					messageResult = 0;
-				break;
-			case 2:
-			default:
-				if (_x < 100)
-					messageResult = 0;
-				else if (_x > 540)				
-					messageResult = 1;
-				else				
-					messageResult = 2;
-				break;
-			case 3:
-				if (_x < 100)
-					messageResult = 0;
-				else if (_x > 540)				
-					messageResult = 1;
-				else				
-					messageResult = 4;
-				break;
-			case 4:
-				if (_x < 100)
-					messageResult = 0;
-				else if (_x > 540)				
-					messageResult = 1;
-				else if (_y >= 150)				
-					messageResult = 2;
-				else				
-					messageResult = 3;
-				break;
-			case 5:
-				if (_y >= 240)
-					messageResult = 4;
-				else				
-					messageResult = 3;
-				break;
-			}
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2064:
+		_x = param.asPoint().x;
+		_y = param.asPoint().y;
+		switch (_type) {
+		case 1:
+			if (_x >= 320)
+				messageResult = 1;
+			else				
+				messageResult = 0;
+			break;
+		case 2:
+		default:
+			if (_x < 100)
+				messageResult = 0;
+			else if (_x > 540)				
+				messageResult = 1;
+			else				
+				messageResult = 2;
+			break;
+		case 3:
+			if (_x < 100)
+				messageResult = 0;
+			else if (_x > 540)				
+				messageResult = 1;
+			else				
+				messageResult = 4;
+			break;
+		case 4:
+			if (_x < 100)
+				messageResult = 0;
+			else if (_x > 540)				
+				messageResult = 1;
+			else if (_y >= 150)				
+				messageResult = 2;
+			else				
+				messageResult = 3;
 			break;
-		case 0x4002:
-			_x = param.asPoint().x;
-			_y = param.asPoint().y;
-			updateCursorNum();
-			processDelta();
+		case 5:
+			if (_y >= 240)
+				messageResult = 4;
+			else				
+				messageResult = 3;
 			break;
 		}
-	} else {
-		// TODO: Debug stuff
+		break;
+	case 0x4002:
+		_x = param.asPoint().x;
+		_y = param.asPoint().y;
+		updateCursorNum();
+		processDelta();
+		break;
 	}
 	return messageResult;
 }
@@ -178,6 +172,9 @@ void Mouse::updateCursor() {
 		_needRefresh = false;
 		_drawRect = _mouseCursorResource.getRect();
 		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
+		Graphics::Surface *cursorSurface = _surface->getSurface();
+		CursorMan.replaceCursor((const byte*)cursorSurface->pixels,
+			cursorSurface->w, cursorSurface->h, -_drawRect.x, -_drawRect.y, 0);
 	}
 
 }
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 72fa360..5152def 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -106,6 +106,8 @@ Common::Error NeverhoodEngine::run() {
 	_gameModule = new GameModule(this);
 	
 	_gameModule->startup();
+	
+	uint32 nextFrameTime = 0;
 
 	// Preliminary main loop, needs some more work but works for testing
 	while (!shouldQuit()) {
@@ -148,13 +150,16 @@ Common::Error NeverhoodEngine::run() {
 			}
 		}
 
-		//debug("millis %d", _system->getMillis());		
-		_gameModule->handleUpdate();
-		_gameModule->draw();
+		if (_system->getMillis() >= nextFrameTime) {
+			_gameModule->handleUpdate();
+			_gameModule->draw();
+			nextFrameTime = _screen->getNextFrameTime();
+		};
+		
 		_soundMan->update();
 		_audioResourceMan->update();
-		_screen->wait();
 		_screen->update();
+		_system->delayMillis(10);
 		
 		debug(0, "---------------------------------------");
 	
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 1678296..b49ee88 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -114,7 +114,7 @@ public:
 	NDrawRect& getRect();
 	void draw(int frameNum, byte *dest, int destPitch);
 	int getCursorNum() const { return _cursorNum; }
-	void setCursorNum(int value) { _cursorNum = value; }
+	void setCursorNum(int cursorNum) { _cursorNum = cursorNum; }
 protected:
 	int _cursorNum;
 	SpriteResource _cursorSprite;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 318a0df..bec399a 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -209,17 +209,17 @@ void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) {
 	if (mouseRect)
 		rect = *mouseRect;
 	_mouseCursor = new Mouse(_vm, 0x0820C408, rect);
-	addSprite(_mouseCursor);
+	addEntity(_mouseCursor);
 }
 
 void Scene::insertMouse435(uint32 fileHash, int16 x1, int16 x2) {
 	_mouseCursor = new Mouse(_vm, fileHash, x1, x2);
-	addSprite(_mouseCursor);
+	addEntity(_mouseCursor);
 }
 
 void Scene::insertNavigationMouse(uint32 fileHash, int type) {
 	_mouseCursor = new Mouse(_vm, fileHash, type);
-	addSprite(_mouseCursor);
+	addEntity(_mouseCursor);
 }
 
 void Scene::showMouse(bool visible) {
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 4689d3b..f9e8d49 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -41,20 +41,19 @@ Screen::~Screen() {
 }
 
 void Screen::update() {
+	_ticks = _vm->_system->getMillis();
 	updatePalette();
 	// TODO: Implement actual code
 	_vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480);
 	_vm->_system->updateScreen();
 }
 
-void Screen::wait() {
+uint32 Screen::getNextFrameTime() {
 	int32 frameDelay = _frameDelay;
 	if (_smackerDecoder && _smackerDecoder->isVideoLoaded() && !_smackerDecoder->endOfVideo())
 		frameDelay = _smackerDecoder->getTimeToNextFrame();
 	int32 waitTicks = frameDelay - (_vm->_system->getMillis() - _ticks);
-	if (waitTicks > 0)
-		_vm->_system->delayMillis(waitTicks);
-	_ticks = _vm->_system->getMillis();
+	return _vm->_system->getMillis() + waitTicks;
 }
 
 void Screen::setFps(int fps) {
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 56a2567..e3a2bfb 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -35,7 +35,7 @@ public:
 	Screen(NeverhoodEngine *vm);
 	~Screen();
 	void update();
-	void wait();
+	uint32 getNextFrameTime();
 	void setFps(int fps);
 	int getFps();
 	void setPaletteData(byte *paletteData);


Commit: 676c7569f67c8205b701f1b71202e226899ef036
    https://github.com/scummvm/scummvm/commit/676c7569f67c8205b701f1b71202e226899ef036
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:07-07:00

Commit Message:
NEVERHOOD: Fix a very stupid bug in Scene::insertMouse433

Changed paths:
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index bec399a..b75515f 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -208,7 +208,7 @@ void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) {
 	NRect rect(-1, -1, -1, -1);
 	if (mouseRect)
 		rect = *mouseRect;
-	_mouseCursor = new Mouse(_vm, 0x0820C408, rect);
+	_mouseCursor = new Mouse(_vm, fileHash, rect);
 	addEntity(_mouseCursor);
 }
 


Commit: 9858705772f88af82a811979831aa46b107330cd
    https://github.com/scummvm/scummvm/commit/9858705772f88af82a811979831aa46b107330cd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:07-07:00

Commit Message:
NEVERHOOD: Graphics related changes/fixes:

- Add BitmapFlags enum
- Merge unpackSpriteRle and unpackSpriteRleRepl
- Implement Y flipping in unpackSpriteRle
- Fix Y flipping in AsScene2804CrystalWaves

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module2800.cpp
    engines/neverhood/resource.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index afd01f7..ca22c01 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -358,8 +358,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 1;
-	createModule(2900, 1);
+	_vm->gameState().sceneNum = 2;
+	createModule(2800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 84aa3d6..c5b136f 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -207,6 +207,14 @@ int16 TextSurface::getStringWidth(const byte *string, int stringLen) {
 
 // Misc
 
+enum BitmapFlags {
+	BF_RLE				= 1,
+	BF_HAS_DIMENSIONS	= 2,
+	BF_HAS_POSITION		= 4,
+	BF_HAS_PALETTE		= 8,
+	BF_HAS_IMAGE		= 16
+};
+
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
 
 	uint16 flags;
@@ -215,9 +223,9 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 	sprite += 2;
 
 	if (rle)
-		*rle = flags & 1;
+		*rle = flags & BF_RLE;
 
-	if (flags & 2) {
+	if (flags & BF_HAS_DIMENSIONS) {
 		if (dimensions) {
 			dimensions->width = READ_LE_UINT16(sprite);
 			dimensions->height = READ_LE_UINT16(sprite + 2);
@@ -228,7 +236,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 		dimensions->height = 1;
 	}
 
-	if (flags & 4) {
+	if (flags & BF_HAS_POSITION) {
 		if (position) {
 			position->x = READ_LE_UINT16(sprite);
 			position->y = READ_LE_UINT16(sprite + 2);
@@ -239,14 +247,14 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 		position->y = 0;
 	}
 
-	if (flags & 8) {
+	if (flags & BF_HAS_PALETTE) {
 		if (palette)
 			*palette = sprite;
 		sprite += 1024;
 	} else if (palette)
 		*palette = NULL;
 
-	if (flags & 0x10) {
+	if (flags & BF_HAS_IMAGE) {
 		if (pixels)
 			*pixels = sprite;
 	} else if (pixels)
@@ -254,17 +262,22 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 
 }
 
-void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
+void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor, byte newColor) {
 
-	// TODO: Flip Y
+	const bool replaceColors = oldColor != newColor;
 
 	int16 rows, chunks;
 	int16 skip, copy;
 
+	if (flipY) {
+		dest += destPitch * (height - 1);
+		destPitch = -destPitch;
+	}
+
 	rows = READ_LE_UINT16(source);
 	chunks = READ_LE_UINT16(source + 2);
 	source += 4;
-
+	
 	do {
 		if (chunks == 0) {
 			dest += rows * destPitch;
@@ -286,49 +299,10 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 					source += copy;
 				}
 				dest += destPitch;
-			}
-		}
-		rows = READ_LE_UINT16(source);
-		chunks = READ_LE_UINT16(source + 2);
-		source += 4;
-	} while (rows > 0);
-
-}
-
-void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY) {
-
-	// TODO: Flip Y
-	
-	int16 rows, chunks;
-	int16 skip, copy;
-
-	rows = READ_LE_UINT16(source);
-	chunks = READ_LE_UINT16(source + 2);
-	source += 4;
-
-	do {
-		if (chunks == 0) {
-			dest += rows * destPitch;
-		} else {
-			while (rows-- > 0) {
-				uint16 rowChunks = chunks;
-				while (rowChunks-- > 0) {
-					skip = READ_LE_UINT16(source);
-					copy = READ_LE_UINT16(source + 2);
-					source += 4;
-					if (!flipX) {
-						for (int xc = 0; xc < copy; xc++) {
-							dest[skip + xc] = source[xc] == oldColor ? newColor : source[xc];
-						}
-					} else {
-						byte *flipDest = dest + width - skip - 1;
-						for (int xc = 0; xc < copy; xc++) {
-							*flipDest-- = source[xc] == oldColor ? newColor : source[xc];
-						}
-					}
-					source += copy;
-				}
-				dest += destPitch;
+				if (replaceColors)
+					for (int xc = 0; xc < width; xc++)
+						if (dest[xc] == oldColor)
+							dest[xc] = newColor;
 			}
 		}
 		rows = READ_LE_UINT16(source);
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 57c2250..08357ea 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -160,8 +160,7 @@ protected:
 // Misc
 
 void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels);
-void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
-void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY);
+void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor = 0, byte newColor = 0);
 void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2);
 
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 1a51571..28a0eb8 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -416,6 +416,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene::update);
 
 	if (getGlobalVar(V_RING5_PULLED) == 0) {
+		// Display the disabled radio; only possible when the left door is open
 		insertStaticSprite(0x0001264C, 100);
 	}
 
@@ -627,7 +628,7 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 		}
 		break;
-	case 0x0002: // TODO Implement button up event
+	case 0x0002:
 		if (_countdown1 == 0)
 			_countdownType = 0;
 		else {
@@ -1545,7 +1546,7 @@ AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint cryst
 	_y = kAsScene2804CrystalWavesPoints[crystalIndex].y;
 	createSurface1(0x840C41F0, 1200);
 	if (crystalIndex & 1)
-		setDoDeltaX(1);
+		setDoDeltaY(1);
 	setVisible(false);
 	_needRefresh = true;
 	SetUpdateHandler(&AnimatedSprite::update);
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index e009ff2..aff3528 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -42,11 +42,10 @@ SpriteResource::~SpriteResource() {
 
 void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) {
 	if (_pixels) {
-		if (_rle) {
+		if (_rle)
 			unpackSpriteRle(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY);
-		} else {
+		else
 			unpackSpriteNormal(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY);
-		}
 	}
 }
 
@@ -164,7 +163,7 @@ void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX,
 	_width = frameInfo.rect.width;
 	_height = frameInfo.rect.height;
 	if (_replEnabled && _replOldColor != _replNewColor)
-		unpackSpriteRleRepl(_currSpriteData, _width, _height, dest, destPitch, _replOldColor, _replNewColor, flipX, flipY);
+		unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY, _replOldColor, _replNewColor);
 	else
 		unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY);
 }


Commit: 6df8fccf6b90399490543b142bb88976565aae2f
    https://github.com/scummvm/scummvm/commit/6df8fccf6b90399490543b142bb88976565aae2f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:07-07:00

Commit Message:
NEVERHOOD: Implement GameModule::createModuleByHash

This is used later when restoring savegames

- Rename V_RING5_PULLED to V_RADIO_ENABLED
- Implement Palette::fillBaseBlack and use it in Scene2803Small
- Fix Scene2802 (show disabled radio if it's not enabled)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index ca22c01..da432c5 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -517,6 +517,76 @@ void GameModule::createModule(int moduleNum, int which) {
 	_childObject->handleUpdate();
 }
 
+void GameModule::createModuleByHash(uint32 nameHash) {
+	switch (nameHash) {
+	case 0x03294419:
+		createModule(1000, -1);
+		break;
+	case 0x0002C818:
+		createModule(1100, -1);
+		break;
+	case 0x00478311:
+		createModule(1200, -1);
+		break;
+	case 0x0061C090:
+		createModule(1300, -1);
+		break;
+	case 0x00AD0012:
+		createModule(1400, -1);
+		break;
+	case 0x00F10114:
+		createModule(1500, -1);
+		break;
+	case 0x01A008D8:
+		createModule(1600, -1);
+		break;
+	case 0x04212331:
+		createModule(1700, -1);
+		break;
+	case 0x04A14718:
+		createModule(1800, -1);
+		break;
+	case 0x04E1C09C:
+		createModule(1900, -1);
+		break;
+	case 0x08250000:
+		createModule(2000, -1);
+		break;
+	case 0x10A10C14:
+		createModule(2100, -1);
+		break;
+	case 0x11391412:
+		createModule(2200, -1);
+		break;
+	case 0x1A214010:
+		createModule(2300, -1);
+		break;
+	case 0x202D1010:
+		createModule(2400, -1);
+		break;
+	case 0x29220120:
+		createModule(2500, -1);
+		break;
+	case 0x40271018:
+		createModule(2600, -1);
+		break;
+	case 0x42212411:
+		createModule(2700, -1);
+		break;
+	case 0x64210814:
+		createModule(2800, -1);
+		break;
+	case 0x81100020:
+		createModule(2900, -1);
+		break;
+	case 0x81293110:
+		createModule(3000, -1);
+		break;
+	default:
+		error("GameModule::createModuleByHash() Unknown module name %08X", nameHash);
+	}
+}
+
 void GameModule::updateModule() {
 	if (!updateChild()) {
 		switch (_moduleNum) {
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 82e6fa5..94fafc8 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -54,6 +54,7 @@ protected:
 	int _moduleNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createModule(int moduleNum, int which);
+	void createModuleByHash(uint32 nameHash);
 	void updateModule();
 };
 
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 52740dc..19a8a85 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -87,7 +87,7 @@ enum {
 	V_BALLOON_POPPED			= 0xAC00C0D0,			// Has the balloon with the key been popped?
 	V_TNT_DUMMY_BUILT			= 0x000CF819,			// Are all TNT parts on the dummy?
 	V_TNT_DUMMY_FUSE_LIT		= 0x20A0C516,
-	V_RING5_PULLED				= 0x4DE80AC0,
+	V_RADIO_ENABLED				= 0x4DE80AC0,
 	V_CREATURE_EXPLODED			= 0x2A02C07B,
 	// Match
 	V_MATCH_STATUS				= 0x0112090A,
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 6cae11a..e718904 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1475,21 +1475,21 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_parentModule, 0x1024, 2);
 		_flag1BE = true;
 		if (sender == _asRing1) {
-			setGlobalVar(V_RING5_PULLED, 0);
+			setGlobalVar(V_RADIO_ENABLED, 0);
 			playSound(0, 0x665198C0);
 		} else if (sender == _asRing2) {
-			setGlobalVar(V_RING5_PULLED, 0);
+			setGlobalVar(V_RADIO_ENABLED, 0);
 			playSound(0, 0xE2D389C0);
 		} else if (sender == _asRing3) {
-			setGlobalVar(V_RING5_PULLED, 0);
+			setGlobalVar(V_RADIO_ENABLED, 0);
 			playSound(1);
 			sendMessage(_asDoor, 0x4808, 0);
 			sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		} else if (sender == _asRing4) {
-			setGlobalVar(V_RING5_PULLED, 0);
+			setGlobalVar(V_RADIO_ENABLED, 0);
 			playSound(0, 0xE0558848);
 		} else if (sender == _asRing5) {
-			setGlobalVar(V_RING5_PULLED, 1);
+			setGlobalVar(V_RADIO_ENABLED, 1);
 			playSound(0, 0x44014282);
 		}
 		break;
@@ -1508,7 +1508,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendEntityMessage(_klayman, 0x1014, _asDoorSpy);
 		break;				
 	case 0x480F:
-		setGlobalVar(V_RING5_PULLED, 0);
+		setGlobalVar(V_RADIO_ENABLED, 0);
 		playSound(1);
 		sendMessage(_asDoor, 0x4808, 0);
 		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
@@ -1800,7 +1800,7 @@ uint32 Scene1005::getTextIndex1() {
 			textIndex = 12;
 		else if (!getGlobalVar(0x2050861A))
 			textIndex = 13;
-		else if (!getGlobalVar(V_RING5_PULLED))
+		else if (!getGlobalVar(V_RADIO_ENABLED))
 			textIndex = 50;
 		else if (!getGlobalVar(0x89C669AA))
 			textIndex = 14;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 28a0eb8..a47d9cb 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -34,7 +34,6 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule), _musicResource(NULL) {
 
 	_currentMusicFileHash = 0;
-	// TODO music stuff
 	_vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14);
 	setGlobalVar(0x28D8C940, 1);
 	
@@ -68,19 +67,10 @@ void Module2800::createScene(int sceneNum, int which) {
 		break;
 	case 1:
 		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
-		
-		// TODO!!
-		
-		_childObject = new Scene2802(_vm, this, which);
-		
-#if 0		
-		_flag = true; // DEBUG!
-		if (_flag) {
+		if (getGlobalVar(V_RADIO_ENABLED))
 			_childObject = new Scene2802(_vm, this, which);
-		} else {
+		else
 			createStaticScene(0x000C6444, 0xC6440008);
-		}
-#endif		
 		break;
 	case 2:
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
@@ -202,7 +192,12 @@ void Module2800::updateScene() {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
 			if (_moduleResult != 2) {
-				// TODO music stuff
+				if (_musicResource) {
+					_musicResource->unload();
+					delete _musicResource;
+					_musicResource = NULL;
+				}
+				_currentMusicFileHash = 0;
 			}			
 			if (_moduleResult == 1) {
 				createScene(2, 0);
@@ -407,15 +402,13 @@ void Module2800::updateMusic(bool halfVolume) {
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	// TODO Weird palette glitches in the mouse cursor and sprite, check this later
-
 	// TODO _vm->gameModule()->initScene2801Vars();
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2801::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
-	if (getGlobalVar(V_RING5_PULLED) == 0) {
+	if (getGlobalVar(V_RADIO_ENABLED) == 0) {
 		// Display the disabled radio; only possible when the left door is open
 		insertStaticSprite(0x0001264C, 100);
 	}
@@ -1357,7 +1350,7 @@ void Scene2803Small::updatePaletteArea(bool instantly) {
 			_palette->addBasePalette(0xB103B604, 0, 64, 0);
 			break;
 		case 3:
-			// TODO _palette->sub_47BFB0(0, 64);
+			_palette->fillBaseBlack(0, 64);
 			break;
 		default:
 			_palette->addBasePalette(0x412A423E, 0, 64, 0);
@@ -1369,7 +1362,7 @@ void Scene2803Small::updatePaletteArea(bool instantly) {
 			_palette->addBasePalette(0x0263D144, 0, 64, 0);
 			break;
 		case 3:
-			// TODO _palette->sub_47BFB0(0, 64);
+			_palette->fillBaseBlack(0, 64);
 			break;
 		default:
 			_palette->addBasePalette(0x29800A01, 0, 64, 0);
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index c27bd86..16ef31d 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -150,6 +150,17 @@ void Palette::fillBaseWhite(int index, int count) {
 	}
 }
 
+void Palette::fillBaseBlack(int index, int count) {
+	if (index + count > 256)
+		count = 256 - index;
+	for (int i = 0; i < count; i++) {
+		_basePalette[(i + index) * 4 + 0] = 0;
+		_basePalette[(i + index) * 4 + 1] = 0;
+		_basePalette[(i + index) * 4 + 2] = 0;
+		_basePalette[(i + index) * 4 + 3] = 0;
+	}
+}
+
 void Palette::update() {
 	debug(2, "Palette::update() _status = %d", _status);
 	if (_status == 1) {
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 27f4816..4b0747b 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -50,6 +50,7 @@ public:
 	void startFadeToWhite(int counter);
 	void startFadeToPalette(int counter);
 	void fillBaseWhite(int index, int count);
+	void fillBaseBlack(int index, int count);
 protected:
 	int _status;
 	byte *_palette;


Commit: 682d15fce443223b306366ef9b1ad71f94b6cfed
    https://github.com/scummvm/scummvm/commit/682d15fce443223b306366ef9b1ad71f94b6cfed
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:07-07:00

Commit Message:
NEVERHOOD: Cleanup and fixes

- Implement GameModule::initScene2801Vars()
- Fix Scene1201::~Scene1201() which does some game logic stuff
- Rename some stuff
- Add more game variable constants

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h
    engines/neverhood/module2900.cpp
    engines/neverhood/module2900.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index da432c5..1c8a2d9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -276,29 +276,31 @@ void GameModule::initScene2401Vars() {
 
 }
 
-void GameModule::initScene2808Vars1() {
-
-	// Exit if it's already initialized
-	if (getSubVar(VA_IS_PUZZLE_INIT, 0x20479010))
-		return;
-
-	for (uint i = 0; i < 3; i++)
-		setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1);
-
-	setSubVar(VA_IS_PUZZLE_INIT, 0x20479010, 1);
+void GameModule::initScene2801Vars() {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x08C80800)) {
+		int currMusicIndex = _vm->_rnd->getRandomNumber(5 - 1) + 3;
+		setGlobalVar(V_GOOD_RADIO_MUSIC_INDEX, 5 * currMusicIndex);
+		setGlobalVar(V_GOOD_RADIO_MUSIC_NAME, kScene2801MusicFileHashes[currMusicIndex]);
+		setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1);
+		setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0);
+		setSubVar(VA_IS_PUZZLE_INIT, 0x08C80800, 1);
+  	}
+}
 
+void GameModule::initScene2808Vars1() {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x20479010)) {
+		for (uint i = 0; i < 3; i++)
+			setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1);
+		setSubVar(VA_IS_PUZZLE_INIT, 0x20479010, 1);
+	}
 }
 
 void GameModule::initScene2808Vars2() {
-
-	// Exit if it's already initialized
-	if (getSubVar(VA_IS_PUZZLE_INIT, 0x66059818))
-		return;
-
-	for (uint i = 0; i < 3; i++)
-		setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1);
-
-	setSubVar(VA_IS_PUZZLE_INIT, 0x66059818, 1);
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x66059818)) {
+		for (uint i = 0; i < 3; i++)
+			setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1);
+		setSubVar(VA_IS_PUZZLE_INIT, 0x66059818, 1);
+	}
 }
 
 void GameModule::initScene3009Vars() {
@@ -312,8 +314,8 @@ void GameModule::initScene3009Vars() {
 }
 
 uint32 GameModule::getScene2802MusicFileHash() {
-	uint musicNum = getGlobalVar(0x08CC0828);
-	return (musicNum % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP<uint>(musicNum / 5, 0, 17)];
+	uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
+	return (musicIndex % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP<uint>(musicIndex / 5, 0, 17)];
 }
 
 
@@ -347,19 +349,21 @@ void GameModule::startup() {
 	// DEBUG>>>
 	/*
 	setGlobalVar(V_SEEN_MUSIC_BOX, 1);
-	setGlobalVar(0x0A18CA33, 0);
-	setGlobalVar(0x0112090A, 0);
-	//setGlobalVar(0x000CF819, 1);
+	setGlobalVar(V_CREATURE_EXPLODED, 0);
+	setGlobalVar(V_MATCH_STATUS, 0);
 	setGlobalVar(V_PROJECTOR_LOCATION, 2);
 	*/
 	//setGlobalVar(V_ENTRANCE_OPEN, 0);
 	//setGlobalVar(V_DOOR_SPIKES_OPEN, 1);
+	setGlobalVar(V_CREATURE_ANGRY, 1);
+	setGlobalVar(V_RADIO_ENABLED, 1);
+	setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 	// <<<DEBUG
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 2;
-	createModule(2800, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(1200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -503,7 +507,7 @@ void GameModule::createModule(int moduleNum, int which) {
 	case 2900:
 		setGlobalVar(V_MODULE_NAME, 0x81100020);
 		if (which >= 0)
-			setGlobalVar(0x0152899A, which);
+			setGlobalVar(V_TELEPORTER_CURR_LOCATION, which);
 		_childObject = new Module2900(_vm, this, which);
 		break;
 	case 3000:
@@ -719,7 +723,7 @@ void GameModule::updateModule() {
 					createModule(1100, 1);
 					break;
 				case 3:
-					setSubVar(0x2C145A98, 2, 1);
+					setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1);
 					createModule(1700, 1);
 					break;
 				case 4:
@@ -731,7 +735,7 @@ void GameModule::updateModule() {
 					break;
 				}
 			} else {
-				switch (getGlobalVar(0x0152899A)) {
+				switch (getGlobalVar(V_TELEPORTER_CURR_LOCATION)) {
 				case 0:
 					createModule(1300, 6);
 					break;
@@ -753,7 +757,7 @@ void GameModule::updateModule() {
 					break;
 				}
 			}
-			setGlobalVar(0x0152899A, 0);
+			setGlobalVar(V_TELEPORTER_CURR_LOCATION, 0);
 			break;
 		case 3000:
 			if (_moduleResult == 1) {
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 94fafc8..275e8d3 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -42,6 +42,7 @@ public:
 	void initScene1307Vars();
 	void initScene1405Vars();
 	void initScene2401Vars();
+	void initScene2801Vars();
 	void initScene2808Vars1();
 	void initScene2808Vars2();
 	void initScene3009Vars();
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 19a8a85..3e32803 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -45,7 +45,6 @@ enum {
 	V_COLUMN_TEXT_NAME			= 0xC8C28808,
 	V_CLICKED_COLUMN_INDEX		= 0x48A68852,
 	V_CLICKED_COLUMN_ROW		= 0x49C40058,
-	V_MUSIC_NAME				= 0x89A82A15,
 	// Klayman
 	V_KLAYMAN_SMALL				= 0x1860C990,			// Is Klayman small?
 	V_KLAYMAN_FRAMEINDEX		= 0x18288913,
@@ -64,10 +63,12 @@ enum {
 	V_NOTES_PUZZLE_SOLVED		= 0x86615030,
 	V_TILE_PUZZLE_SOLVED		= 0x404290D5,
 	V_STAIRS_PUZZLE_SOLVED		= 0xA9035F60,
+	V_CODE_SYMBOLS_SOLVED		= 0x2C531AF8,
 	V_SPIKES_RETRACTED			= 0x18890C91,
 	V_LARGE_DOOR_NUMBER			= 0x9A500914,			// Number of the currently "large" door
 	V_LIGHTS_ON					= 0x4D080E54,
 	V_SHRINK_LIGHTS_ON			= 0x190A1D18,			// Lights on in the room with the shrinking device
+	V_STAIRS_DOWN_ONCE			= 0x2050861A,			// Stairs have been down once before
 	V_STAIRS_DOWN				= 0x09221A62,
 	V_LADDER_DOWN				= 0x0018CA22,			// Is the ladder in the statue room down?
 	V_LADDER_DOWN_ACTION		= 0x00188211,
@@ -88,7 +89,16 @@ enum {
 	V_TNT_DUMMY_BUILT			= 0x000CF819,			// Are all TNT parts on the dummy?
 	V_TNT_DUMMY_FUSE_LIT		= 0x20A0C516,
 	V_RADIO_ENABLED				= 0x4DE80AC0,
-	V_CREATURE_EXPLODED			= 0x2A02C07B,
+	V_SEEN_CREATURE_EXPLODE_VID	= 0x2A02C07B,
+	V_CREATURE_EXPLODED			= 0x0A18CA33,
+	V_UNUSED					= 0x89C669AA,			// Seems to be unused, confirmed by checking the exe for this constant value (still left in atm)
+	// Radio
+	V_RADIO_ROOM_LEFT_DOOR		= 0x09880D40,
+	V_RADIO_ROOM_RIGHT_DOOR		= 0x08180ABC,
+	V_CURR_RADIO_MUSIC_INDEX	= 0x08CC0828,
+	V_GOOD_RADIO_MUSIC_INDEX	= 0x88880915,
+	V_GOOD_RADIO_MUSIC_NAME		= 0x89A82A15,
+	V_RADIO_MOVE_DISH_VIDEO		= 0x28D8C940,
 	// Match
 	V_MATCH_STATUS				= 0x0112090A,
 	// Venus fly trap
@@ -111,6 +121,10 @@ enum {
 	V_PROJECTOR_SLOT			= 0x04A10F33,			// Projector x slot index
 	V_PROJECTOR_LOCATION		= 0x04A105B3,			// Projector scene location
 	V_PROJECTOR_ACTIVE			= 0x12A10DB3,			// Is the projecor projecting?
+	// Teleporter
+	V_TELEPORTER_CURR_LOCATION	= 0x0152899A,
+	V_TELEPORTER_WHICH			= 0x60826830,
+	V_TELEPORTER_DEST_AVAILABLE	= 0x2C145A98,
 	// Inventory
 	V_HAS_NEEDLE				= 0x31C63C51,			// Has Klayman the needle?
 	V_HAS_FINAL_KEY				= 0xC0780812,			// Has Klayman the key from the diskplayer?
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index e718904..461f873 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1798,11 +1798,11 @@ uint32 Scene1005::getTextIndex1() {
 	} else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) {
 		if (!getGlobalVar(V_WALL_BROKEN))
 			textIndex = 12;
-		else if (!getGlobalVar(0x2050861A))
+		else if (!getGlobalVar(V_STAIRS_DOWN_ONCE))
 			textIndex = 13;
 		else if (!getGlobalVar(V_RADIO_ENABLED))
 			textIndex = 50;
-		else if (!getGlobalVar(0x89C669AA))
+		else if (!getGlobalVar(V_UNUSED))
 			textIndex = 14;
 		else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM))
 			textIndex = 15;
@@ -1812,7 +1812,7 @@ uint32 Scene1005::getTextIndex1() {
 			textIndex = 17;
 	} else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) {
 		textIndex = 0;
-	} else if (getGlobalVar(0x0A18CA33)) {
+	} else if (getGlobalVar(V_CREATURE_EXPLODED)) {
 		if (!getGlobalVar(V_TILE_PUZZLE_SOLVED))
 			textIndex = 4;
 		else if (!getGlobalVar(V_HAS_TEST_TUBE))
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 99d15b9..d106a85 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -60,7 +60,7 @@ void Module1200::createScene(int sceneNum, int which) {
 	case 2:
 		_vm->_soundMan->stopMusic(0x62222CAE, 0, 0);
 		createSmackerScene(0x31890001, true, true, false);
-		setGlobalVar(V_CREATURE_EXPLODED, 1);
+		setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1);
 		break;
 	}
 	SetUpdateHandler(&Module1200::updateScene);
@@ -74,7 +74,7 @@ void Module1200::updateScene() {
 			if (_moduleResult == 1) {
 				createScene(1, 0);
 			} else if (_moduleResult == 2) {
-				if (getGlobalVar(0x0A18CA33) && !getGlobalVar(V_CREATURE_EXPLODED)) {
+				if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) {
 					createScene(2, -1);
 				} else {
 					leaveModule(1);
@@ -714,7 +714,7 @@ void AsScene1201LeftDoor::stCloseDoor() {
 }
 
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag(false), _asMatch(NULL), _asTntMan(NULL),
+	: Scene(vm, parentModule, true), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL),
 	_asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) {
 
 	int16 topY1, topY2, topY3, topY4;
@@ -772,7 +772,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1201>(400, 329);
 		setMessageList(0x004AEC08);
 	} else if (which == 2) {
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
 			insertKlayman<KmScene1201>(374, 333);
 			setMessageList(0x004AEC08);
 		} else {
@@ -795,7 +795,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setClipRect(x1, 0, x2, 480);
 	_klayman->setRepl(64, 0);
 	
-	if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
+	if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
 		setBackground(0x4019A2C4);
 		setPalette(0x4019A2C4);
 		_asRightDoor = NULL;
@@ -807,7 +807,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
 		insertStaticSprite(0x10002ED8, 500);
-		if (!getGlobalVar(0x0A18CA33)) {
+		if (!getGlobalVar(V_CREATURE_EXPLODED)) {
 			_asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1);
 			_asTntMan->setClipRect(x1, 0, x2, 480);
 			_asTntMan->setRepl(64, 0);
@@ -838,7 +838,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			tntIndex += 3;
 		}
 
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
 			setRectList(0x004AEE58);
 		} else {
 			setRectList(0x004AEDC8);
@@ -866,7 +866,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			tntIndex++;
 		}
 
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
 			setRectList(0x004AEE18);
 		} else {
 			setRectList(0x004AED88);
@@ -890,7 +890,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asMatch);
 	}
 
-	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(0x0A18CA33) == 0) {
+	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) {
 		_asCreature = insertSprite<AsScene1201Creature>(this, _klayman);
 		_asCreature->setClipRect(x1, 0, x2, 480);
 	}
@@ -898,6 +898,9 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1201::~Scene1201() {
+	if (_creatureExploded)
+		setGlobalVar(V_CREATURE_EXPLODED, 1);
+	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0);
 }
 
 void Scene1201::update() {
@@ -911,7 +914,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x07053000) {
-			_flag = true;
+			_creatureExploded = true;
 			sendMessage(_asCreature, 0x2004, 0);
 		} else if (param.asInteger() == 0x140E5744) {
 			sendMessage(_asCreature, 0x2005, 0);
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index bc3281c..7d4e224 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -172,7 +172,7 @@ protected:
 	Sprite *_asRightDoor;
 	Sprite *_asTape;
 	Sprite *_asKlaymanHead;
-	bool _flag;
+	bool _creatureExploded;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index eb8f4fe..b5489a3 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -917,15 +917,15 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (_asPuzzleBox)
 		_asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2());
 
-	if (getGlobalVar(0x4A105B3) == 1) {
+	if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_asProjector);
-		if (getGlobalVar(0x4A10F33) == 4) {
+		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
 			_klayman->processDelta();
 			setMessageList(0x004B0BD0);
-		} else if (getGlobalVar(0x4A10F33) == 0) {
+		} else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
 			_klayman->processDelta();
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 22ffaf6..b6df706 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1448,7 +1448,7 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (_symbolPosition >= 12) {
 				if (testVars()) {
 					playSound(0);
-					setGlobalVar(0x2C531AF8, 1);
+					setGlobalVar(V_CODE_SYMBOLS_SOLVED, 1);
 					_isSolved = true;
 				} else {
 					_symbolPosition = 0;
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 7925c46..d90074c 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -105,7 +105,7 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertStaticSprite(0x40A40168, 100);
 	} else if (getGlobalVar(V_STAIRS_DOWN)) {
 		insertStaticSprite(0x124404C4, 100);
-		setGlobalVar(0x2050861A, 1);
+		setGlobalVar(V_STAIRS_DOWN_ONCE, 1);
 	} else {
 		insertStaticSprite(0x02840064, 100);
 	}
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 75a6ebe..bd5597d 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -55,7 +55,7 @@ void Module2000::createScene(int sceneNum, int which) {
 		break;
 	case 2:
 		setGlobalVar(V_WORLDS_JOINED, 1);
-		setSubVar(0x2C145A98, 1, 1);
+		setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1);
 		createSmackerScene(0x204B2031, true, true, false);
 		break;
 	}
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 080f815..19bf9be 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -458,8 +458,8 @@ void Module2700::updateScene() {
 		case 21:
 			if (!_flag1) {
 				_vm->_soundMan->stopMusic(0x04020210, 0, 1);
-				// TODO _vm->gameModule()->initScene2801Vars();
-				_musicFileHash = getGlobalVar(V_MUSIC_NAME);
+				_vm->gameModule()->initScene2801Vars();
+				_musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME);
 				// TODO? GameState_sub_469C50(&field_52, 0);
 				// TODO MusicMan_create(); // Why?
 				_vm->_soundMan->addMusic(0x42212411, _musicFileHash);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index a47d9cb..b6f5694 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -35,7 +35,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_currentMusicFileHash = 0;
 	_vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14);
-	setGlobalVar(0x28D8C940, 1);
+	setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 1);
 	
 	if (which < 0) {
 		createScene(_vm->gameState().sceneNum, which);
@@ -402,7 +402,7 @@ void Module2800::updateMusic(bool halfVolume) {
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	// TODO _vm->gameModule()->initScene2801Vars();
+	_vm->gameModule()->initScene2801Vars();
 
 	_surfaceFlag = true;
 	SetMessageHandler(&Scene2801::handleMessage);
@@ -432,7 +432,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004B6BB0);
 	}
 
-	if (getGlobalVar(0x09880D40)) {
+	if (getGlobalVar(V_RADIO_ROOM_LEFT_DOOR)) {
 		setRectList(0x004B6CE0);
 		setBackground(0x01400666);
 		setPalette(0x01400666);
@@ -444,7 +444,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertMouse433(0x0066201C);
 		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape); 
-	} else if (getGlobalVar(0x08180ABC)) {
+	} else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) {
 		setRectList(0x004B6CD0);
 		setBackground(0x11E00684);
 		setPalette(0x11E00684);
@@ -507,10 +507,10 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdownType(0), _countdown1(0), _countdown2(0) {
+	: Scene(vm, parentModule, true), _currTuneStatus(0), _countdown1(0), _countdown2(0) {
 
 	//DEBUG>>> Disable video
-	setGlobalVar(0x28D8C940, 0);
+	setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0);
 	//DEBUG<<<
 		
 	_surfaceFlag = true;
@@ -518,123 +518,127 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2802::update);
 	insertMouse435(0x008810A8, 20, 620);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true));
-	_smackerFrameNumber = getGlobalVar(0x08CC0828);
-	_smackerPlayer->gotoFrame(_smackerFrameNumber);
+	_currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
+	_smackerPlayer->gotoFrame(_currRadioMusicIndex);
 	_vm->_soundMan->addSound(0x04360A18, 0x422630C2);
 	_vm->_soundMan->addSound(0x04360A18, 0x00632252);
 	_vm->_soundMan->addSound(0x04360A18, 0x00372241);
 	_vm->_soundMan->setSoundVolume(0x00372241, 60);
-	changeCountdownType(0, 0);
+	changeTuneStatus(0, 0);
 	_vm->_soundMan->playSoundLooping(0x00372241);
 }
 
 Scene2802::~Scene2802() {
 	_vm->_soundMan->deleteSoundGroup(0x04360A18);
-	if (_smackerFrameNumber == 0) {
-		setGlobalVar(0x09880D40, 1);
-		setGlobalVar(0x08180ABC, 0);
-	} else if (_smackerFrameNumber == getGlobalVar(0x88880915)) {
-		setGlobalVar(0x09880D40, 0);
-		setGlobalVar(0x08180ABC, 1);
+	if (_currRadioMusicIndex == 0) {
+		setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1);
+		setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0);
+	} else if (_currRadioMusicIndex == getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)) {
+		setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0);
+		setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 1);
 	} else {
-		setGlobalVar(0x09880D40, 0);
-		setGlobalVar(0x08180ABC, 0);
+		setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0);
+		setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0);
 	}
-	setGlobalVar(0x08CC0828, _smackerFrameNumber);
+	setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex);
 }
 	
 void Scene2802::update() {
-	int prevCountdownType = _countdownType;
-	uint prevSmackerFrameNumber = _smackerFrameNumber;
+	int prevTuneStatus = _currTuneStatus;
+	uint prevRadioMusicIndex = _currRadioMusicIndex;
 
 	Scene::update();
 	if (_countdown1 > 0)
 		--_countdown1;
-	else if (_countdownType == 1)
-		_countdownType = 3;
-	else if (_countdownType == 4)
-		_countdownType = 6;
+	else if (_currTuneStatus == 1)
+		_currTuneStatus = 3;
+	else if (_currTuneStatus == 4)
+		_currTuneStatus = 6;
 	
-	switch (_countdownType) {
+	switch (_currTuneStatus) {
 	case 2:
-		if (_smackerFrameNumber < 90)
-			incSmackerFrameNumber(+1);
-		_countdownType = 0;
+		if (_currRadioMusicIndex < 90)
+			incRadioMusicIndex(+1);
+		_currTuneStatus = 0;
 		break;
 	case 3:
 		if (_countdown2 > 0)
 			--_countdown2;
-		else if (_smackerFrameNumber < 90) {
-			incSmackerFrameNumber(+1);
+		else if (_currRadioMusicIndex < 90) {
+			incRadioMusicIndex(+1);
 			_countdown2 = 1;
 		} else
-			_countdownType = 0;
+			_currTuneStatus = 0;
 		break;
 	case 5:
-		if (_smackerFrameNumber > 0)
-			incSmackerFrameNumber(-1);
-		_countdownType = 0;
+		if (_currRadioMusicIndex > 0)
+			incRadioMusicIndex(-1);
+		_currTuneStatus = 0;
 		break;
 	case 6:
 		if (_countdown2 > 0)
 			--_countdown2;
-		else if (_smackerFrameNumber > 0) {
-			incSmackerFrameNumber(-1);
+		else if (_currRadioMusicIndex > 0) {
+			incRadioMusicIndex(-1);
 			_countdown2 = 1;
 		} else
-			_countdownType = 0;
+			_currTuneStatus = 0;
 		break;
 	
 	}
 
-	if (prevSmackerFrameNumber != _smackerFrameNumber)
-		_smackerPlayer->gotoFrame(_smackerFrameNumber);
+	if (prevRadioMusicIndex != _currRadioMusicIndex)
+		_smackerPlayer->gotoFrame(_currRadioMusicIndex);
 		
-	if (prevCountdownType != _countdownType)
-		changeCountdownType(prevCountdownType, _countdownType);
+	if (prevTuneStatus != _currTuneStatus)
+		changeTuneStatus(prevTuneStatus, _currTuneStatus);
+		
+	//DEBUG>>>
+	debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX));
+	//DEBUG<<<
 
-	if (getGlobalVar(0x28D8C940) && prevCountdownType != _countdownType && _smackerFrameNumber != 0) {
-		setGlobalVar(0x28D8C940, 0);
+	if (getGlobalVar(V_RADIO_MOVE_DISH_VIDEO) && prevTuneStatus != _currTuneStatus && _currRadioMusicIndex != 0) {
+		setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0);
 		leaveScene(1);
 	}
 	
 }
 
 uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	int prevCountdownType = _countdownType;
+	int prevTuneStatus = _currTuneStatus;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 			leaveScene(0);
-		} else if (_countdownType == 0) {
+		} else if (_currTuneStatus == 0) {
 			if (param.asPoint().x > 180 && param.asPoint().x < 300 &&
 				param.asPoint().y > 130 && param.asPoint().y < 310) {
-				_countdownType = 4;
+				_currTuneStatus = 4;
 			} else if (param.asPoint().x > 300 && param.asPoint().x < 400 &&
 				param.asPoint().y > 130 && param.asPoint().y < 310) {
-				_countdownType = 1;
+				_currTuneStatus = 1;
 			}
-			if (_countdownType == 1 || _countdownType == 4) {
+			if (_currTuneStatus == 1 || _currTuneStatus == 4) {
 				_countdown1 = 8;
-				changeCountdownType(0, _countdownType);
+				changeTuneStatus(0, _currTuneStatus);
 			}
 		}
 		break;
 	case 0x0002:
 		if (_countdown1 == 0)
-			_countdownType = 0;
+			_currTuneStatus = 0;
 		else {
-			if (_countdownType == 1)
-				_countdownType = 2;
-			else if (_countdownType == 4)
-				_countdownType = 5;
+			if (_currTuneStatus == 1)
+				_currTuneStatus = 2;
+			else if (_currTuneStatus == 4)
+				_currTuneStatus = 5;
 			else
-				_countdownType = 0;
+				_currTuneStatus = 0;
 			_countdown1 = 0;
 		}
-		if (prevCountdownType != _countdownType)
-			changeCountdownType(prevCountdownType, _countdownType);
+		if (prevTuneStatus != _currTuneStatus)
+			changeTuneStatus(prevTuneStatus, _currTuneStatus);
 		break;
 	case 0x000D:
 		// DEBUG message
@@ -643,25 +647,25 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-void Scene2802::incSmackerFrameNumber(int delta) {
-	_smackerFrameNumber += delta;
-	setGlobalVar(0x08CC0828, _smackerFrameNumber);
+void Scene2802::incRadioMusicIndex(int delta) {
+	_currRadioMusicIndex += delta;
+	setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex);
 }
 
-void Scene2802::changeCountdownType(int prevCountdownType, int newCountdownType) {
+void Scene2802::changeTuneStatus(int prevTuneStatus, int newTuneStatus) {
 
-	if (prevCountdownType == 3 || prevCountdownType == 6) {
+	if (prevTuneStatus == 3 || prevTuneStatus == 6) {
 		_vm->_soundMan->stopSound(0x422630C2);
 		_vm->_soundMan->stopSound(0x00632252);
 	}
 
-	if (newCountdownType == 0) {
+	if (newTuneStatus == 0) {
 		if (_vm->_gameModule->getScene2802MusicFileHash() != 0) {
 			_vm->_soundMan->stopSound(0x00632252);
 		}
 		else
 			_vm->_soundMan->playSoundLooping(0x00632252);
-	} else if (newCountdownType == 3 || newCountdownType == 6) {
+	} else if (newTuneStatus == 3 || newTuneStatus == 6) {
 		_vm->_soundMan->playSoundLooping(0x422630C2);
 		_vm->_soundMan->playSoundLooping(0x00632252);
 	}
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index ca8b058..bdcb1ee 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -62,14 +62,14 @@ public:
 	virtual ~Scene2802();
 protected:
 	SmackerPlayer *_smackerPlayer;
-	uint _smackerFrameNumber;
-	int _countdownType;
+	uint _currRadioMusicIndex;
+	int _currTuneStatus;
 	int _countdown1;
 	int _countdown2;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void incSmackerFrameNumber(int delta);
-	void changeCountdownType(int prevCountdownType, int newCountdownType);
+	void incRadioMusicIndex(int delta);
+	void changeTuneStatus(int prevTuneStatus, int newTuneStatus);
 };
 
 class AsScene2803LightCord : public AnimatedSprite {
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 2ebdb09..0a033a8 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -35,7 +35,7 @@ Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 
 	if (which >= 0)
-		setGlobalVar(0x60826830, which);
+		setGlobalVar(V_TELEPORTER_WHICH, which);
 		
 	createScene(0, 0);
 
@@ -47,7 +47,7 @@ void Module2900::createScene(int sceneNum, int which) {
 	switch (_sceneNum) {
 	case 0:
 		_vm->gameState().sceneNum = 0;
-		_childObject = new Scene2901(_vm, this, getGlobalVar(0x60826830));
+		_childObject = new Scene2901(_vm, this, getGlobalVar(V_TELEPORTER_WHICH));
 		break;
 	case 1:
 		_vm->gameState().sceneNum = 0;
@@ -85,8 +85,8 @@ void Module2900::updateScene() {
 			if (_moduleResult == 0xFFFFFFFF) {
 				leaveModule(0xFFFFFFFF);
 			} else {
-				_field2C = _moduleResult;
-				switch (getGlobalVar(0x60826830)) {
+				_teleporterModuleResult = _moduleResult;
+				switch (getGlobalVar(V_TELEPORTER_WHICH)) {
 				case 0:
 					createScene(3, 4);
 					break;
@@ -117,7 +117,7 @@ void Module2900::updateScene() {
 		case 4:
 		case 5:
 		case 6:
-			leaveModule(_field2C);
+			leaveModule(_teleporterModuleResult);
 			break;
 		}
 	}
@@ -391,15 +391,15 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	//DEBUG>>> Enable all locations
 	for (int i = 0; i < 6; i++)
-		setSubVar(0x2C145A98, i, 1);
+		setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1);
 	//DEBUG<<<
 
-	setSubVar(0x2C145A98, which, 1);
-	setSubVar(0x2C145A98, 5, 1);
-	setSubVar(0x2C145A98, 4, 1);
+	setSubVar(V_TELEPORTER_DEST_AVAILABLE, which, 1);
+	setSubVar(V_TELEPORTER_DEST_AVAILABLE, 5, 1);
+	setSubVar(V_TELEPORTER_DEST_AVAILABLE, 4, 1);
 
 	if (_currLocationButtonNum == 3)
-		setSubVar(0x2C145A98, 2, 1);
+		setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1);
 
 	_surfaceFlag = true;
 	setBackground(kScene2901FileHashes1[_currLocationButtonNum]);
@@ -432,7 +432,7 @@ void Scene2901::update() {
 		if (_currLocationButtonNum == _selectedButtonNum) {
 			_ssLocationButtonLights[_currWhirlButtonNum]->hide();
 			++_currWhirlButtonNum;
-			while (!getSubVar(0x2C145A98, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) {
+			while (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) {
 				++_currWhirlButtonNum;
 				if (_currWhirlButtonNum >= 6)
 					_currWhirlButtonNum = 0;
@@ -474,7 +474,7 @@ uint32 Scene2901::handleMessage(int messageNum, const MessageParam &param, Entit
 			_selectedButtonNum = _currWhirlButtonNum;
 		_ssLocationButtonLights[_selectedButtonNum]->hide();
 		_selectedButtonNum = param.asInteger();
-		if (!getSubVar(0x2C145A98, _selectedButtonNum))
+		if (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _selectedButtonNum))
 			_selectedButtonNum = _currLocationButtonNum;
 		break;
 	}
diff --git a/engines/neverhood/module2900.h b/engines/neverhood/module2900.h
index 7d4e1e4..1951439 100644
--- a/engines/neverhood/module2900.h
+++ b/engines/neverhood/module2900.h
@@ -36,7 +36,7 @@ public:
 	Module2900(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
 	int _sceneNum;
-	int _field2C;
+	int _teleporterModuleResult;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	void updateMusic(bool halfVolume);


Commit: f5c7070ace26b95a52303ceb51893d2032ad8241
    https://github.com/scummvm/scummvm/commit/f5c7070ace26b95a52303ceb51893d2032ad8241
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Add mouse cursor hiding/showing

Changed paths:
    engines/neverhood/mouse.cpp
    engines/neverhood/mouse.h



diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index a1c4a9a..bce6646 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -42,7 +42,7 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect)
 
 Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
 	: StaticSprite(vm, 2000), _mouseType(kMouseType435),
-	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
+	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(true) {
 	
 	init(fileHash);
 	if (_x <= _x1) {
@@ -85,6 +85,13 @@ void Mouse::load(uint32 fileHash) {
 }
 
 void Mouse::update() {
+	if (_visible && !_surface->getVisible()) {
+		CursorMan.showMouse(false);
+		_visible = false;
+	} else if (!_visible && _surface->getVisible()) {
+		CursorMan.showMouse(true);
+		_visible = true;
+	}
 	updateCursor();
 	_frameNum++;
 	if (_frameNum >= 6)
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index 0b4f6b8..a163a7a 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -51,6 +51,7 @@ protected:
 	int16 _x1;
 	int16 _x2;
 	int _type;
+	bool _visible;
 	void init(uint32 fileHash);	
 	void update();
 	void updateCursorNum();


Commit: 2c4f0b70fe4103891f8ffd99e0ea3f8788a90b31
    https://github.com/scummvm/scummvm/commit/2c4f0b70fe4103891f8ffd99e0ea3f8788a90b31
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Add Entity::setSoundPan and use it in the DiskplayerScene

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 65bbc0d..ac51ea1 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -265,7 +265,7 @@ DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerS
 		_appearSlot->setVisible(false);
 		_activeSlot->setVisible(false);
 		loadSound(0, 0x46210074);
-		// TODO sound panning stuff
+		setSoundPan(0, elementIndex * 100 / 19);
 	} else if (elementIndex != 20) {
 		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100));
 		_activeSlot->setVisible(false);
diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index f66d129..36137a6 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -150,6 +150,10 @@ void Entity::setSoundVolume(uint index, int volume) {
 	getSoundResource(index)->setVolume(volume);
 }
 
+void Entity::setSoundPan(uint index, int pan) {
+	getSoundResource(index)->setPan(pan);
+}
+
 void Entity::deleteSoundResources() {
 	if (_soundResources) {
 		for (uint i = 0; i < kMaxSoundResources; ++i)
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 4bcd0c4..0b3e32c 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -111,6 +111,7 @@ protected:
 	void stopSound(uint index);
 	bool isSoundPlaying(uint index);
 	void setSoundVolume(uint index, int volume);
+	void setSoundPan(uint index, int pan);
 	void deleteSoundResources();
 };
 


Commit: 963b76007650eb3e9d55333120ca6a824759ff98
    https://github.com/scummvm/scummvm/commit/963b76007650eb3e9d55333120ca6a824759ff98
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Remove TODOs concerning the original engine's debug code

- Add Scene1202 palette effect
- Add AsScene1405Tile sound panning
- Clean up some old comments

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/palette.cpp
    engines/neverhood/palette.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index ac51ea1..d69182b 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -379,7 +379,6 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	addEntity(_diskSmackerPlayer);
 	addSurface(_diskSmackerPlayer->getSurface());
 	_diskSmackerPlayer->setDrawPos(154, 86);
-	// TODO _diskSmackerPlayer->gotoFrame(0);
 	_vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder());
 
 	_palette->usePalette();
@@ -469,7 +468,6 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 	if (!_inputDisabled) {
 		switch (messageNum) {
 		case 0x0001:
-			// TODO: Debug/Cheat
 			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 				sendMessage(_parentModule, 0x1009, 0);
 			} else if (!_dropKey &&
@@ -488,7 +486,6 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 				}
 			}
 			break;
-		// case 0x000D: TODO: Debug/Cheat
 		case 0x2000:
 			tuneIn();
 			break;			
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 3335155..e46ed26 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -476,7 +476,6 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO Debug stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 			if (!_flag2 && _backgroundIndex == 0) {
 				if (_flag1) {
@@ -489,7 +488,6 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 		}
 		break;
-	// TODO Debug stuff
 	case 0x2001:
 		showMouse(false);
 		_backgroundIndex = 24;
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index d106a85..fecb66a 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -1137,7 +1137,8 @@ void Scene1202::update() {
 		_clickedIndex = 0;
 		SetMessageHandler(&Scene1202::hmSolved);
 		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
-		doPaletteEffect();
+		_palette->copyToBasePalette(_paletteData);
+		_palette->startFadeToPalette(24);
 		playSound(3);
 		_soundFlag = true;
 	} else if (_clickedIndex >= 0 && _counter == 0) {
@@ -1163,17 +1164,10 @@ uint32 Scene1202::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO: Debug/Cheat stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) {
 			leaveScene(0);
 		}
 		break;
-	case 0x000D:
-		if (param.asInteger() == 0x14210006) {
-			// TODO: Debug/Cheat stuff
-			messageResult = 1;
-		}
-		break;
 	case 0x2000:
 		_clickedIndex = (int)param.asInteger();
 		break;
@@ -1209,8 +1203,4 @@ bool Scene1202::isSolved() {
 		getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15;
 }
 
-void Scene1202::doPaletteEffect() {
-	// TODO
-}
-
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index 7d4e224..a0e9c9f 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -209,7 +209,6 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmSolved(int messageNum, const MessageParam &param, Entity *sender);
 	bool isSolved();
-	void doPaletteEffect();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 978eb03..c81cbaa 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1329,7 +1329,6 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO Debug stuff
 		if (!_isPuzzleSolved) {
 			if (param.asPoint().x > 20 && param.asPoint().x < 620) {
 				if (_asCurrKey && !_isInsertingKey) {
@@ -1363,7 +1362,6 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 		}
 		break;
-	// TODO Debug stuff
 	case 0x2002:
 		// Check if all keys are in the correct keyholes
 		if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) &&
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index b5489a3..82ac01d 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1278,7 +1278,6 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (_puzzleSolvedCountdown == 0) {
-			// TODO: Debug/Cheat stuff
 			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 				// Exit scene
 				leaveScene(0);
@@ -1295,9 +1294,6 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 		}
 		break;
-	case 0x000D:
-		// TODO: Debug/Cheat stuff
-		break;
 	case 0x2000:
 		// The mouse got the cheese (nomnom)
 		setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1);
@@ -1542,7 +1538,7 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) {
 
 	loadSound(0, 0x05308101);
-	// TODO _soundResource.setPan
+	setSoundPan(0, (tileIndex % 8 * 4 + 4) * 25 / 8);
 	_x = kAsScene1405TileItemPositions[_tileIndex].x;
 	_y = kAsScene1405TileItemPositions[_tileIndex].y;
 	createSurface1(0x844B805C, 1100);
@@ -1653,14 +1649,10 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO: Debug/Cheat stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 			leaveScene(0);
 		}
 		break;
-	case 0x000D:
-		// TODO: Debug/Cheat stuff
-		break;
 	case 0x2000:
 		if (_selectFirstTile) {
 			_firstTileIndex = param.asInteger();
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index a46b8fc..b62ff01 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -106,9 +106,6 @@ void Scene1501::update() {
 
 	Scene::update();
 
-	// TODO: Since these countdowns are used a lot, maybe these can be wrapped in a class/struct
-	// so the code gets a little cleaner.
-
 	if (_countdown1 != 0) {
 		_countdown1--;
 		if (_countdown1 == 0) {
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index b6df706..568f957 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1064,10 +1064,6 @@ void AsCommonCarConnector::update() {
 Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _asCar(NULL), _countdown1(0) {
 
-	/* TODO: Find out which of the message/update handlers are used for
-		the upper/lower floors and rename them accordingly.
-	*/
-	
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	
 	_surfaceFlag = true;
@@ -1434,11 +1430,9 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO: Debug stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
 			leaveScene(0);
 		break;
-	// TODO: Debug stuff
 	case 0x2000:
 		if (!_isSolved) {
 			if (_changeCurrentSymbol)
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index d90074c..9db1503 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -390,7 +390,6 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
 void AsScene1907Symbol::stFallOffHitGround() {
 	playSound(1);
 	sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex);
-	// TODO: Meh...
 	Entity::_priority = 1000 - _newPositionIndex;
 	_vm->_collisionMan->removeSprite(this);
 	_vm->_collisionMan->addSprite(this);
@@ -632,13 +631,11 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO DEBUG stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) &&
 			!_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) {
 			leaveScene(0);
 		}
 		break;
-	// TODO Debug stuff
 	case 0x2000:
 		if (getGlobalVar(V_STAIRS_DOWN)) {
 			playSound(0);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 20a8559..1b07890 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -967,14 +967,10 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO Debug stuff
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 			leaveScene(0);
 		}
 		break;
-	case 0x000D:
-		// TODO Debug stuff
-		break;
 	case 0x2000:
 		_movingTileIndex = (int16)param.asInteger();
 		_ssMovingTile = (Sprite*)sender;
@@ -1127,8 +1123,6 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setHitRects(0x004B8320);
 
-	//DEBUG setGlobalVar(V_KEY3_LOCATION, 1);//###//TODO CHECK IF Below...
-
 	if (getGlobalVar(V_KEY3_LOCATION) == 1) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 282, 432);
 		_vm->_collisionMan->addSprite(_asKey);
@@ -2391,7 +2385,6 @@ void Scene2208::drawRow(int16 rowIndex) {
 		_background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true);
 		if (rowIndex < (int)_strings.size()) {
 			const char *text = _strings[rowIndex];
-			// TODO/CHECKME: Use temporary string up to '{' character (see above)
 			_fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text);
 		}
 	}
@@ -2667,7 +2660,6 @@ Scene2247::~Scene2247() {
 uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
-	// TODO: Debug stuff
 	case 0x100D:
 		if (param.asInteger() == 0x800C6694) {
 			readClickedColumn();
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index d29330f..c75e85b 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -487,8 +487,6 @@ void Scene2401::update() {
 uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
-	// case 0x0001: TODO DEBUG
-	// case 0x000D: TODO DEBUG
 	case 0x100D:
 		if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 0a14fb6..c9bffe5 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -92,7 +92,9 @@ void Module2500::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B01B8, 220);
 		break;
 	case 2:
-		setGlobalVar(V_WORLDS_JOINED, 1);// TODO DEBUG! Join the tracks.
+		//DEBUG>>>Join the tracks.
+		setGlobalVar(V_WORLDS_JOINED, 1);
+		//DEBUG<<< 
 		_vm->gameState().which = which;
 		if (getGlobalVar(V_WORLDS_JOINED))
 			createScene2704(which, 0x004B01E0, 150);
@@ -213,7 +215,6 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam &param, Enti
 }
 			
 void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
-	// TODO Move to module class?
 	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
 }
 
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 19bf9be..9bac035 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -411,8 +411,6 @@ void Module2700::updateScene() {
 			createScene(19, 3);
 			break;
 		case 21:
-			// TODO? GameState_sub_469C50(&field_52, 0);
-			// TODO MusicMan_stopAll (if field_52 above = 1)
 			_vm->_soundMan->deleteMusic(_musicFileHash);
 			_vm->_soundMan->startMusic(0x04020210, 0, 2);
 			_vm->_soundMan->deleteSoundGroup(0x42212411);
@@ -460,8 +458,6 @@ void Module2700::updateScene() {
 				_vm->_soundMan->stopMusic(0x04020210, 0, 1);
 				_vm->gameModule()->initScene2801Vars();
 				_musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME);
-				// TODO? GameState_sub_469C50(&field_52, 0);
-				// TODO MusicMan_create(); // Why?
 				_vm->_soundMan->addMusic(0x42212411, _musicFileHash);
 				_vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */);
 				_vm->_soundMan->addSound(0x42212411, 0x44014282);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index b6f5694..a1a93bd 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -487,7 +487,6 @@ Scene2801::~Scene2801() {
 uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
-	// TODO: case 0x000D:
 	case 0x4826:
 		if (sender == _asTape) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
@@ -1862,14 +1861,10 @@ uint32 Scene2804::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO DEBUG
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
 			leaveScene(0);
 		}
 		break;
-	case 0x000D:
-		// TODO DEBUG
-		break;
 	case 0x2000:
 		_isWorking = true;
 		sendMessage(_asCoil, 0x2002, 0);
@@ -2377,53 +2372,23 @@ uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam &pa
 void AsScene2808TestTube::fill() {
 
 
-	if ((int)_fillLevel >= _testTubeSetNum * 3 + 3)
+	if ((int)_fillLevel < _testTubeSetNum * 3 + 3)
 		return;
 		
-	// TODO Remove the two switches
-
 	if (_testTubeSetNum == 0) {
-		switch (_fillLevel) {
-		case 0:
-			playSound(0);
-			break;
-		case 1:
-			playSound(1);
-			break;
-		case 2:
-			playSound(2);
-			break;
-		}
+		playSound(_fillLevel);
 		setVisible(true);
 		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]);
 		_newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1];
 	} else {
-		switch (_fillLevel) {
-		case 0:
-			playSound(3);
-			break;
-		case 1:
-			playSound(4);
-			break;
-		case 2:
-			playSound(5);
-			break;
-		case 3:
-			playSound(6);
-			break;
-		case 4:
-			playSound(7);
-			break;
-		case 5:
-			playSound(8);
-			break;
-		}
+		playSound(3 + _fillLevel);
 		setVisible(true);
 		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]);
 		_newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1];
 	}
 	_ssDispenser->startCountdown(_fillLevel);
 	_fillLevel++;
+
 }
 
 void AsScene2808TestTube::flush() {
@@ -2599,14 +2564,10 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO DEBUG Stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) {
 			leaveScene(1);
 		}
 		break;
-	case 0x000D:
-		// TODO DEBUG Stuff
-		break;
 	case 0x2000:
 		if (!_isFlowing)
 			_asTestTubes[param.asInteger()]->fill();
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 242a00e..6d394a8 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -937,15 +937,11 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO: Debug stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) {
 			setGlobalVar(V_CANNON_TARGET_STATUS, 0);
 			leaveScene(0);
 		}
 		break;
-	case 0x000D:
-		// TODO: Debug stuff
-		break;
 	case 0x2000:
 		if (!getGlobalVar(V_CANNON_RAISED)) {
 			if (!getGlobalVar(V_WALL_BROKEN)) {
@@ -1347,7 +1343,6 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		// TODO: Debug stuff
 		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) {
 			if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) {
 				showMouse(false);
@@ -1365,9 +1360,6 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 		}
 		break;
-	case 0x000D:
-		// TODO: Debug stuff
-		break;
 	case 0x2000:
 		if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) {
 			_asDeadBolts[param.asInteger()]->unlock(false);
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index bf3de5d..96d33c0 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -140,7 +140,6 @@ void NavigationScene::createMouseCursor() {
 	}
 
 	mouseCursorFileHash = navigationItem.mouseCursorFileHash;
-	// TODO: Check the resource...
 	if (mouseCursorFileHash == 0)
 		mouseCursorFileHash = 0x63A40028;
 		
diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp
index 16ef31d..d4b9b67 100644
--- a/engines/neverhood/palette.cpp
+++ b/engines/neverhood/palette.cpp
@@ -161,6 +161,10 @@ void Palette::fillBaseBlack(int index, int count) {
 	}
 }
 
+void Palette::copyToBasePalette(byte *palette) {
+	memcpy(_basePalette, palette, 256 * 4);
+}
+
 void Palette::update() {
 	debug(2, "Palette::update() _status = %d", _status);
 	if (_status == 1) {
diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h
index 4b0747b..c83207c 100644
--- a/engines/neverhood/palette.h
+++ b/engines/neverhood/palette.h
@@ -51,6 +51,7 @@ public:
 	void startFadeToPalette(int counter);
 	void fillBaseWhite(int index, int count);
 	void fillBaseBlack(int index, int count);
+	void copyToBasePalette(byte *palette);
 protected:
 	int _status;
 	byte *_palette;


Commit: 692edf40c737e88fdfb1b3d5a9515a85207dbafd
    https://github.com/scummvm/scummvm/commit/692edf40c737e88fdfb1b3d5a9515a85207dbafd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Try to give the AsCommonCar identifiers better names

- Implement AsCommonCar::updateSound()
- Fix a bug in Scene1608 (the Klaymen animation got stuck when trying to get back into the car)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 1c8a2d9..3d19a59 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -361,9 +361,9 @@ void GameModule::startup() {
 	// <<<DEBUG
 
 #if 1
-	_vm->gameState().which = 0;
+	_vm->gameState().which = 1;
 	_vm->gameState().sceneNum = 0;
-	createModule(1200, -1);
+	createModule(2500, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 568f957..ae8fd7f 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -191,23 +191,23 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	_x = x;
 	_y = y;
 	
-	_field100 = 0;
+	_inMainArea = false;
 	_exitDirection = 0;
 	_currPointIndex = 0;
-	_againDestPtFlag = 0;
+	_hasAgainDestPoint = false;
 	_stepError = 0;
-	_againDestPointFlag = 0;
+	_hasAgainDestPointIndex = false;
 	_steps = 0;
-	_flag10E = 0;
-	_moreY = 0;
-	_flag10F = 0;
-	_flag113 = 0;
-	_flag114 = 1;
-	_flag11A = 0;
+	_isBraking = false;
+	_yMoveTotalSteps = 0;
+	_isBusy = false;
+	_isIdle = false;
+	_isMoving = true;
+	_rectFlag = false;
 	_newDeltaXType = -1;
-	_field11E = 0;
+	_soundCounter = 0;
 	_pathPoints = NULL;
-	_rectList = NULL;
+	_rectList = NULL; // TODO Check if this is used
 	
 	startAnimation(0xD4220027, 0, -1);
 	setDoDeltaX(getGlobalVar(V_CAR_DELTA_X));
@@ -215,7 +215,7 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 }
 
 AsCommonCar::~AsCommonCar() {
-	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::sub45D620)) {
+	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) {
 		setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X));
 	}
 }
@@ -230,23 +230,23 @@ void AsCommonCar::update() {
 		_newDeltaXType = -1;
 	}
 	AnimatedSprite::update();
-	if (_againDestPtFlag && _moreY == 0 && !_flag10F) {
-		_againDestPtFlag = 0;
-		_againDestPointFlag = 0;
-		sendPointMessage(this, 0x2004, _againDestPt);
-	} else if (_againDestPointFlag && _moreY == 0 && !_flag10F) {
-		_againDestPointFlag = 0;
+	if (_hasAgainDestPoint && _yMoveTotalSteps == 0 && !_isBusy) {
+		_hasAgainDestPoint = false;
+		_hasAgainDestPointIndex = false;
+		sendPointMessage(this, 0x2004, _againDestPoint);
+	} else if (_hasAgainDestPointIndex && _yMoveTotalSteps == 0 && !_isBusy) {
+		_hasAgainDestPointIndex = false;
 		sendMessage(this, 0x2003, _againDestPointIndex);
 	}
-	sub45CE10();
-	sub45E0A0();
+	updateMovement();
+	updateSound();
 }
 
-void AsCommonCar::update45C790() {
-	AsCommonCar::update();
+void AsCommonCar::upIdle() {
+	update();
 	if (++_idleCounter >= _idleCounterMax)
-		sub45D050();
-	sub45E0A0();
+		stIdleBlink();
+	updateSound();
 }
 
 uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -255,10 +255,6 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
 	case 0x1019:
 		SetSpriteUpdate(NULL);
 		break;
-	/* NOTE: Implemented in setPathPoints
-	case 0x2000:
-	case 0x2001:
-	*/
 	case 0x2002:
 		// Set the current position without moving
 		_currPointIndex = param.asInteger();
@@ -270,24 +266,24 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
 		// Move to a point by its index
 		{
 			int newPointIndex = param.asInteger();
-			if (_moreY <= 0 && !_flag10F) {
-				_someX = pathPoint(newPointIndex).x;
-				_someY = pathPoint(newPointIndex).y;
+			if (_yMoveTotalSteps <= 0 && !_isBusy) {
+				_destX = pathPoint(newPointIndex).x;
+				_destY = pathPoint(newPointIndex).y;
 				if (_currPointIndex < newPointIndex) {
 					moveToNextPoint();
 				} else if (_currPointIndex == newPointIndex && _stepError == 0) {
 					if (_currPointIndex == 0) {
-						_moreY = 0;
+						_yMoveTotalSteps = 0;
 						sendMessage(_parentScene, 0x2005, 0);
 					} else if (_currPointIndex == (int)_pathPoints->size()) {
-						_moreY = 0;
+						_yMoveTotalSteps = 0;
 						sendMessage(_parentScene, 0x2006, 0);
 					}
 				} else {
 					moveToPrevPoint();
 				}
 			} else {
-				_againDestPointFlag = 1;
+				_hasAgainDestPointIndex = true;
 				_againDestPointIndex = newPointIndex;
 			}
 		}
@@ -298,25 +294,25 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
 			int minMatchIndex = -1;
 			int minMatchDistance, distance;
 			NPoint pt = param.asPoint();
-			if (_moreY <= 0 && !_flag10F) {
+			if (_yMoveTotalSteps <= 0 && !_isBusy) {
 				// Check if we're already exiting (or something)
 				if ((pt.x <= 20 && _exitDirection == 1) ||
 					(pt.x >= 620 && _exitDirection == 3) ||
 					(pt.y <= 20 && _exitDirection == 2) ||
 					(pt.y >= 460 && _exitDirection == 4))
 					break;
-				_someX = pt.x;
-				_someY = pt.y;
-				minMatchDistance = calcDistance(_someX, _someY, _x, _y) + 1;
+				_destX = pt.x;
+				_destY = pt.y;
+				minMatchDistance = calcDistance(_destX, _destY, _x, _y) + 1;
 				for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) {
-					distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y);
+					distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y);
 					if (distance >= minMatchDistance)
 						break;
 					minMatchDistance = distance;
 					minMatchIndex = i;
 				}
 				for (int i = _currPointIndex; i >= 0; i--) {
-					distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y);
+					distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y);
 					if (distance >= minMatchDistance)
 						break;
 					minMatchDistance = distance;
@@ -336,53 +332,48 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
 					}
 				}
 			} else {
-				_againDestPtFlag = 1;
-				_againDestPt = pt;
+				_hasAgainDestPoint = true;
+				_againDestPoint = pt;
 			}
 		}
 		break;
 	case 0x2007:
-		_moreY = param.asInteger();
+		_yMoveTotalSteps = param.asInteger();
 		_steps = 0;
-		_flag10E = 0;
+		_isBraking = false;
 		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 		_lastDistance = 640;
 		break;
 	case 0x2008:
-		_moreY = param.asInteger();
+		_yMoveTotalSteps = param.asInteger();
 		_steps = 0;
-		_flag10E = 0;
+		_isBraking = false;
 		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 		_lastDistance = 640;
 		break;
 	case 0x2009:
-		sub45CF80();
+		stEnterCar();
 		break;
 	case 0x200A:
-		sub45CFB0();
+		stLeaveCar();
 		break;
-	/* NOTE: Implemented in setRectList
-	case 0x200B:
-	case 0x200C:
-	*/
 	case 0x200E:
-		sub45D180();
+		stTurnCar();
 		break;
 	case 0x200F:
-		sub45CD00();
+		stCarAtHome();
 		_newDeltaXType = param.asInteger();
 		break;
 	}
 	return messageResult;
 }
 
-uint32 AsCommonCar::handleMessage45CC30(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (_flag10F && param.asInteger() == 0x025424A2) {
+		if (_isBusy && param.asInteger() == 0x025424A2)
 			gotoNextState();
-		}
 		break;
 	case 0x3002:
 		gotoNextState();
@@ -391,10 +382,10 @@ uint32 AsCommonCar::handleMessage45CC30(int messageNum, const MessageParam &para
 	return messageResult;
 }
 
-uint32 AsCommonCar::handleMessage45CCA0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 AsCommonCar::hmLeaveCar(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x2009:
-		sub45CF80();
+		stEnterCar();
 		break;
 	case 0x3002:
 		sendMessage(_parentScene, 0x200A, 0);
@@ -404,23 +395,22 @@ uint32 AsCommonCar::handleMessage45CCA0(int messageNum, const MessageParam &para
 	return 0;
 }
 
-void AsCommonCar::sub45CD00() {
+void AsCommonCar::stCarAtHome() {
 	bool doDeltaX = _doDeltaX;
 	SetSpriteUpdate(NULL);
-	_againDestPtFlag = 0;
-	_againDestPointFlag = 0;
-	_flag10E = 0;
-	_flag10F = 0;
-	_flag113 = 0;
-	_flag114 = 0;
-	_flag11A = 0;
+	_hasAgainDestPoint = false;
+	_hasAgainDestPointIndex = false;
+	_isBraking = false;
+	_isBusy = false;
+	_isIdle = false;
+	_isMoving = false;
+	_rectFlag = false;
 	_rectList = NULL;
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
-	NextState(&AsCommonCar::sub45CFE0);
+	NextState(&AsCommonCar::stLeanForwardIdle);
 	startAnimation(0x35698F78, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
-	SetUpdateHandler(&AsCommonCar::update45C790);
-	FinalizeState(&AsCommonCar::sub45D040);
+	SetMessageHandler(&AsCommonCar::handleMessage);
+	SetUpdateHandler(&AsCommonCar::upIdle);
+	FinalizeState(&AsCommonCar::evIdleDone);
 	setDoDeltaX(doDeltaX ? 1 : 0);
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
@@ -429,36 +419,36 @@ void AsCommonCar::sub45CD00() {
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void AsCommonCar::sub45CDC0() {
-	if (_value112 == 1) {
+void AsCommonCar::updateTurnMovement() {
+	if (_turnMoveStatus == 1) {
 		_lastDistance = 640;
-		_flag113 = 0;
-		_flag10E = 0;
+		_isIdle = false;
+		_isBraking = false;
 		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
-	} else if (_value112 == 2) {
+	} else if (_turnMoveStatus == 2) {
 		_lastDistance = 640;
-		_flag113 = 0;
-		_flag10E = 0;
+		_isIdle = false;
+		_isBraking = false;
 		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 	}
 }
 
-void AsCommonCar::sub45CE10() {
-	if (_flag10E && !_flag113 && !_flag10F) {
+void AsCommonCar::updateMovement() {
+	if (_isBraking && !_isIdle && !_isBusy) {
 		gotoNextState();
-		_flag114 = 0;
-		_flag113 = 1;
+		_isMoving = false;
+		_isIdle = true;
 		startAnimation(0x192ADD30, 0, -1);
-		SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+		SetMessageHandler(&AsCommonCar::hmAnimation);
 		SetUpdateHandler(&AsCommonCar::update);
-		NextState(&AsCommonCar::sub45CFE0);
-	} else if (!_flag10E && _steps && _flag113) {
+		NextState(&AsCommonCar::stLeanForwardIdle);
+	} else if (!_isBraking && _steps && _isIdle) {
 		gotoNextState();
-		_flag113 = 0;
+		_isIdle = false;
 		startAnimation(0x9966B138, 0, -1);
-		SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+		SetMessageHandler(&AsCommonCar::hmAnimation);
 		SetUpdateHandler(&AsCommonCar::update);
-		NextState(&AsCommonCar::sub45D100);
+		NextState(&AsCommonCar::stUpdateMoveDirection);
 	} else {
 		bool flag = false;
 		uint index = 0;
@@ -468,103 +458,92 @@ void AsCommonCar::sub45CE10() {
 				if (_x >= r.x1 && _x <= r.x2 && _y >= r.y1 && _y <= r.y2)
 					break;
 			}
-			if (index < _rectList->size() && !_flag11A)
+			if (index < _rectList->size() && !_rectFlag)
 				flag = true;
-			_flag11A = index < _rectList->size();
+			_rectFlag = index < _rectList->size();
 		}
 		if (flag) {
 			gotoNextState();
-			sub45D0A0();
-		} else if (_newMoveDirection != _currMoveDirection && _flag114 && !_flag10F) {
+			stHandleRect();
+		} else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) {
 			gotoNextState();
 			_currMoveDirection = _newMoveDirection;
-			sub45D100();
+			stUpdateMoveDirection();
 		}
 	}
 }
 
-void AsCommonCar::sub45CF80() {
+void AsCommonCar::stEnterCar() {
 	startAnimation(0xA86A9538, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
-	NextState(&AsCommonCar::sub45CFE0);
+	NextState(&AsCommonCar::stLeanForwardIdle);
 }
 
-void AsCommonCar::sub45CFB0() {
+void AsCommonCar::stLeaveCar() {
 	startAnimation(0xA86A9538, -1, -1);
 	_playBackwards = true;
-	SetMessageHandler(&AsCommonCar::handleMessage45CCA0);
+	SetMessageHandler(&AsCommonCar::hmLeaveCar);
 	SetUpdateHandler(&AsCommonCar::update);
 }
 
-void AsCommonCar::sub45CFE0() {
+void AsCommonCar::stLeanForwardIdle() {
 	startAnimation(0x35698F78, 0, -1);
 	SetMessageHandler(&AsCommonCar::handleMessage);
-	SetUpdateHandler(&AsCommonCar::update45C790);
-	FinalizeState(&AsCommonCar::sub45D040);
-	_idleCounter = 0;
+	SetUpdateHandler(&AsCommonCar::upIdle);
+	FinalizeState(&AsCommonCar::evIdleDone);
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
 	_steps = 0;
+	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void AsCommonCar::sub45D040() {
+void AsCommonCar::evIdleDone() {
 	SetUpdateHandler(&AsCommonCar::update);
 }
 
-void AsCommonCar::sub45D050() {
+void AsCommonCar::stIdleBlink() {
 	startAnimation(0xB579A77C, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
-	NextState(&AsCommonCar::sub45CFE0);
+	NextState(&AsCommonCar::stLeanForwardIdle);
 	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-void AsCommonCar::sub45D0A0() {
-	_flag10F = 1;
+void AsCommonCar::stHandleRect() {
+	_isBusy = true;
 	gotoNextState();
 	startAnimation(0x9C220DA4, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
-	FinalizeState(&AsCommonCar::sub45D0E0);
+	FinalizeState(&AsCommonCar::evHandleRectDone);
 }
 
-void AsCommonCar::sub45D0E0() {
-	_flag10F = 0;
+void AsCommonCar::evHandleRectDone() {
+	_isBusy = false;
 	_newMoveDirection = 0;
-	sub45D100();
+	stUpdateMoveDirection();
 }
 
-void AsCommonCar::sub45D100() {
-	_flag114 = 1;
+void AsCommonCar::stUpdateMoveDirection() {
+	_isMoving = true;
 	if (_currMoveDirection == 1) {
 		startAnimation(0xD4AA03A4, 0, -1);
 	} else if (_currMoveDirection == 3) {
 		startAnimation(0xD00A1364, 0, -1);
 	} else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) {
-		sub45D180();
+		stTurnCar();
 	} else {
 		startAnimation(0xD4220027, 0, -1);
 	}
 	setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0);
 }
 
-void AsCommonCar::sub45D180() {
-	_flag10F = 1;
-	gotoNextState();
-	startAnimation(0xF46A0324, 0, -1);
-	_value112 = 0;
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
-	SetUpdateHandler(&AsCommonCar::update);
-	FinalizeState(&AsCommonCar::sub45D620);
-	sub45CDC0();
-}
-
 void AsCommonCar::moveToNextPoint() {
 	if (_currPointIndex >= (int)_pathPoints->size() - 1) {
-		_moreY = 0;
+		_yMoveTotalSteps = 0;
 		sendMessage(this, 0x1019, 0);
 		sendMessage(_parentScene, 0x2006, 0);
 	} else {
@@ -576,50 +555,75 @@ void AsCommonCar::moveToNextPoint() {
 				_currMoveDirection = 2;
 			else if (_currMoveDirection == 2)
 				_currMoveDirection = 4;
-			if (_flag113)
-				sub45D390();
+			if (_isIdle)
+				stTurnCarMoveToNextPoint();
 			else
-				sub45D350();
+				stBrakeMoveToNextPoint();
 		} else {
 			if (_steps == 0) {
 				gotoNextState();
-				_flag113 = 0;
+				_isIdle = false;
 				startAnimation(0x9966B138, 0, -1);
-				SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+				SetMessageHandler(&AsCommonCar::hmAnimation);
 				SetUpdateHandler(&AsCommonCar::update);
-				NextState(&AsCommonCar::sub45D100);
+				NextState(&AsCommonCar::stUpdateMoveDirection);
 			}
-			_flag10E = 0;
+			_isBraking = false;
 			SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 			_lastDistance = 640;
 		}
 	}
 }
 
-void AsCommonCar::sub45D350() {
+void AsCommonCar::stBrakeMoveToNextPoint() {
 	gotoNextState();
-	_flag10F = 1;
-	_flag10E = 1;
+	_isBusy = true;
+	_isBraking = true;
 	startAnimation(0x192ADD30, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
+	SetUpdateHandler(&AsCommonCar::update);
+	NextState(&AsCommonCar::stTurnCarMoveToNextPoint);
+}
+
+void AsCommonCar::stTurnCar() {
+	// Turn to left/right #1
+	gotoNextState();
+	_isBusy = true;
+	startAnimation(0xF46A0324, 0, -1);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
-	NextState(&AsCommonCar::sub45D390);
+	FinalizeState(&AsCommonCar::evTurnCarDone);
+	_turnMoveStatus = 0;
+	updateTurnMovement();
 }
 
-void AsCommonCar::sub45D390() {
+void AsCommonCar::stTurnCarMoveToNextPoint() {
+	// Turn to left/right #2
 	gotoNextState();
-	_flag10F = 1;
+	_isBusy = true;
 	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
-	FinalizeState(&AsCommonCar::sub45D620);
-	_value112 = 1;
-	sub45CDC0();
+	FinalizeState(&AsCommonCar::evTurnCarDone);
+	_turnMoveStatus = 1;
+	updateTurnMovement();
+}
+
+void AsCommonCar::stTurnCarMoveToPrevPoint() {
+	// Turn to left/right #3
+	FinalizeState(NULL);
+	_isBusy = true;
+	startAnimation(0xF46A0324, 0, -1);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
+	SetUpdateHandler(&AsCommonCar::update);
+	FinalizeState(&AsCommonCar::evTurnCarDone);
+	_turnMoveStatus = 2;
+	updateTurnMovement();
 }
 
 void AsCommonCar::moveToPrevPoint() {
 	if (_currPointIndex == 0 && _stepError == 0) {
-		_moreY = 0;
+		_yMoveTotalSteps = 0;
 		sendMessage(this, 0x1019, 0);
 		sendMessage(_parentScene, 0x2005, 0);
 	} else {
@@ -638,65 +642,54 @@ void AsCommonCar::moveToPrevPoint() {
 				_currMoveDirection = 4;
 			else if (_currMoveDirection == 4)
 				_currMoveDirection = 2;
-			if (_flag113)
-				sub45D5D0();
+			if (_isIdle)
+				stTurnCarMoveToPrevPoint();
 			else
-				sub45D580();
+				stBrakeMoveToPrevPoint();
 		} else {
 			if (_steps == 0) {
 				gotoNextState();
-				_flag113 = 0;
+				_isIdle = false;
 				startAnimation(0x9966B138, 0, -1);
-				SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+				SetMessageHandler(&AsCommonCar::hmAnimation);
 				SetUpdateHandler(&AsCommonCar::update);
-				NextState(&AsCommonCar::sub45D100);
+				NextState(&AsCommonCar::stUpdateMoveDirection);
 			}
-			_flag10E = 0;
+			_isBraking = false;
 			SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 			_lastDistance = 640;
 		}
 	}
 }
 
-void AsCommonCar::sub45D580() {
-	_flag10F = 1;
-	_flag10E = 1;
+void AsCommonCar::stBrakeMoveToPrevPoint() {
 	FinalizeState(NULL);
+	_isBusy = true;
+	_isBraking = true;
 	startAnimation(0x192ADD30, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
-	SetUpdateHandler(&AsCommonCar::update);
-	NextState(&AsCommonCar::sub45D5D0);
-}
-
-void AsCommonCar::sub45D5D0() {
-	_flag10F = 1;
-	FinalizeState(NULL);
-	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage45CC30);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
-	FinalizeState(&AsCommonCar::sub45D620);
-	_value112 = 2;
-	sub45CDC0();
+	NextState(&AsCommonCar::stTurnCarMoveToPrevPoint);
 }
 
-void AsCommonCar::sub45D620() {
-	_flag10F = 0;
+void AsCommonCar::evTurnCarDone() {
+	_isBusy = false;
 	_newMoveDirection = 0;
 	setDoDeltaX(2);
-	sub45D100();
+	stUpdateMoveDirection();
 }
 
 void AsCommonCar::suMoveToNextPoint() {
 	int16 newX = _x, newY = _y;
 
 	if (_currPointIndex >= (int)_pathPoints->size()) {
-		_moreY = 0;
+		_yMoveTotalSteps = 0;
 		sendMessage(this, 0x1019, 0);
 		sendMessage(_parentScene, 0x2006, 0);
 		return;
 	}
 
-	if (_flag10E) {
+	if (_isBraking) {
 		if (_steps <= 0) {
 			sendMessage(this, 0x1019, 0);
 			return;
@@ -708,7 +701,7 @@ void AsCommonCar::suMoveToNextPoint() {
 	}
 
 	bool firstTime = true;
-	_anotherY = _steps;
+	_ySteps = _steps;
 	int stepsCtr = _steps;
 	
 	while (stepsCtr > 0) {
@@ -757,7 +750,7 @@ void AsCommonCar::suMoveToNextPoint() {
 					if (stepsCtr < 0)
 						stepsCtr = 0;
 				}
-				_anotherY = stepsCtr;
+				_ySteps = stepsCtr;
 			}
 			if (stepsCtr + _stepError >= deltaY) {
 				stepsCtr -= deltaY;
@@ -784,25 +777,25 @@ void AsCommonCar::suMoveToNextPoint() {
 		firstTime = false;		
 	}
 
-	if (_moreY != 0) {
+	if (_yMoveTotalSteps != 0) {
 		_x = newX;
 		_y = newY;
-		_moreY -= _anotherY;
-		if (_moreY <= 0) {
-			_flag10E = 1;
-			_moreY = 0;
+		_yMoveTotalSteps -= _ySteps;
+		if (_yMoveTotalSteps <= 0) {
+			_isBraking = true;
+			_yMoveTotalSteps = 0;
 		}
 	} else {
-		int distance = calcDistance(_someX, _someY, _x, _y);
+		int distance = calcDistance(_destX, _destY, _x, _y);
 		_x = newX;
 		_y = newY;
 		if (newX > 20 && newX < 620 && newY > 20 && newY < 460) {
 			_exitDirection = 0;
-			_field100 = 1;
-		} else if (_field100) {
-			_someX = pathPoint(_pathPoints->size() - 1).x;
-			_someY = pathPoint(_pathPoints->size() - 1).y;
-			_field100 = 0;
+			_inMainArea = true;
+		} else if (_inMainArea) {
+			_destX = pathPoint(_pathPoints->size() - 1).x;
+			_destY = pathPoint(_pathPoints->size() - 1).y;
+			_inMainArea = false;
 			if (_x <= 20)
 				_exitDirection = 1;
 			else if (_x >= 620)
@@ -811,19 +804,19 @@ void AsCommonCar::suMoveToNextPoint() {
 				_exitDirection = 2;
 			else if (_y >= 460)
 				_exitDirection = 4;
-			if (_exitDirection != 0 && _flag10E) {
-				_flag10E = 0;
+			if (_exitDirection != 0 && _isBraking) {
+				_isBraking = false;
 				_steps = 11;
 			}
 		}
 		if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) ||
 			(_exitDirection == 0 && _lastDistance + 20 < distance))
-			_flag10E = 1;
+			_isBraking = true;
 		if (distance < _lastDistance)
 			_lastDistance = distance;
 		if (_currPointIndex == (int)_pathPoints->size() - 1) {
-			_flag10E = 1;
-			_moreY = 0;
+			_isBraking = true;
+			_yMoveTotalSteps = 0;
 			sendMessage(this, 0x1019, 0);
 			sendMessage(_parentScene, 0x2006, 0);
 		}
@@ -835,13 +828,13 @@ void AsCommonCar::suMoveToPrevPoint() {
 	int16 newX = _x, newY = _y;
 
 	if (_currPointIndex == 0 && _stepError == 0) {
-		_moreY = 0;
+		_yMoveTotalSteps = 0;
 		sendMessage(this, 0x1019, 0);
 		sendMessage(_parentScene, 0x2005, 0);
 		return;
 	}
 
-	if (_flag10E) {
+	if (_isBraking) {
 		if (_steps <= 0) {
 			sendMessage(this, 0x1019, 0);
 			return;
@@ -853,7 +846,7 @@ void AsCommonCar::suMoveToPrevPoint() {
 	}
 
 	bool firstTime = true;
-	_anotherY = _steps;
+	_ySteps = _steps;
 	int stepsCtr = _steps;
 	
 	while (stepsCtr > 0) {
@@ -904,7 +897,7 @@ void AsCommonCar::suMoveToPrevPoint() {
 				} else {
 					stepsCtr += 7;
 				}
-				_anotherY = stepsCtr;
+				_ySteps = stepsCtr;
 			}
 			if (_stepError == 0)
 				_stepError = deltaY;
@@ -931,25 +924,25 @@ void AsCommonCar::suMoveToPrevPoint() {
 		firstTime = false;		
 	}
 
-	if (_moreY != 0) {
+	if (_yMoveTotalSteps != 0) {
 		_x = newX;
 		_y = newY;
-		_moreY -= _anotherY;
-		if (_moreY <= 0) {
-			_flag10E = 1;
-			_moreY = 0;
+		_yMoveTotalSteps -= _ySteps;
+		if (_yMoveTotalSteps <= 0) {
+			_isBraking = true;
+			_yMoveTotalSteps = 0;
 		}
 	} else {
-		int distance = calcDistance(_someX, _someY, _x, _y);
+		int distance = calcDistance(_destX, _destY, _x, _y);
 		_x = newX;
 		_y = newY;
 		if (newX > 20 && newX < 620 && newY > 20 && newY < 460) {
 			_exitDirection = 0;
-			_field100 = 1;
-		} else if (_field100) {
-			_someX = pathPoint(0).x;
-			_someY = pathPoint(0).y;
-			_field100 = 0;
+			_inMainArea = true;
+		} else if (_inMainArea) {
+			_destX = pathPoint(0).x;
+			_destY = pathPoint(0).y;
+			_inMainArea = false;
 			if (_x <= 20)
 				_exitDirection = 1;
 			else if (_x >= 620)
@@ -958,19 +951,19 @@ void AsCommonCar::suMoveToPrevPoint() {
 				_exitDirection = 2;
 			else if (_y >= 460)
 				_exitDirection = 4;
-			if (_exitDirection != 0 && _flag10E) {
-				_flag10E = 0;
+			if (_exitDirection != 0 && _isBraking) {
+				_isBraking = false;
 				_steps = 11;
 			}
 		}
 		if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) ||
 			(_exitDirection == 0 && _lastDistance + 20 < distance))
-			_flag10E = 1;
+			_isBraking = true;
 		if (distance < _lastDistance)
 			_lastDistance = distance;
 		if (_currPointIndex == 0 && _stepError == 0) {
-			_flag10E = 1;
-			_moreY = 0;
+			_isBraking = true;
+			_yMoveTotalSteps = 0;
 			sendMessage(this, 0x1019, 0);
 			sendMessage(_parentScene, 0x2005, 0);
 		}
@@ -978,8 +971,26 @@ void AsCommonCar::suMoveToPrevPoint() {
 
 }
 
-void AsCommonCar::sub45E0A0() {
-	// TODO
+void AsCommonCar::updateSound() {
+	int maxSoundCounter = 0;
+	_soundCounter++;
+	if (_steps != 0 && !_isIdle) {
+		if (_currMoveDirection == 1)
+			maxSoundCounter = 18 - _steps;
+		else if (_currMoveDirection == 3) {
+			maxSoundCounter = 5 - _steps;
+			if (maxSoundCounter < 1)
+				maxSoundCounter = 1;
+		} else {
+			maxSoundCounter = 14 - _steps;
+		}
+	} else {
+		maxSoundCounter = 21;
+	}
+	if (_soundCounter >= maxSoundCounter) {
+		sendMessage(_parentScene, 0x200D, 0);
+		_soundCounter = 0;
+	}
 }
 
 AsScene1608Door::AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene)
@@ -1261,7 +1272,7 @@ void Scene1608::upGettingOutOfCar() {
 		addSprite(_klayman);
 		_klaymanInCar = false;
 		SetMessageHandler(&Scene1608::hmUpperFloor);
-		SetUpdateHandler(&Scene1608::update);
+		SetUpdateHandler(&Scene1608::upUpperFloor);
 		setRectList(0x004B4810);
 		_asIdleCarLower->setVisible(true);
 		_asIdleCarFull->setVisible(true);
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 8c794e0..a2d5464 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -54,55 +54,55 @@ protected:
 	int _currMoveDirection;
 	int _exitDirection;
 	int _currPointIndex;
-	NPoint _againDestPt;
-	int _againDestPtFlag;
-	int _steps;
-	int _stepError;
+	bool _hasAgainDestPoint;
+	NPoint _againDestPoint;
+	bool _hasAgainDestPointIndex;
+	int _againDestPointIndex;
+	bool _inMainArea;
+	bool _isBraking;
+	bool _isBusy;
+	bool _isIdle;
+	bool _isMoving;
+	bool _rectFlag;
 	int _idleCounter;
 	int _idleCounterMax;
+	int _steps;
+	int _stepError;
 	int _lastDistance;
-	int _field100;
-	int _againDestPointFlag;
-	int _flag10E;
-	int _moreY;
-	int _flag10F;
-	int _flag113;
-	int _flag114;
-	int _flag11A;
+	int _yMoveTotalSteps;
+	int _ySteps;
 	int _newDeltaXType;
-	int _field11E;
-	int _againDestPointIndex;
-	int _value112;
-	int _anotherY;
-	int16 _someX, _someY;
+	int _soundCounter;
+	int _turnMoveStatus;
+	int16 _destX, _destY;
 	NPoint pathPoint(uint index) { return (*_pathPoints)[index]; }
 	void update();
-	void update45C790();
+	void upIdle();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage45CC30(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 handleMessage45CCA0(int messageNum, const MessageParam &param, Entity *sender);
-	void sub45CD00();
-	void sub45CDC0();
-	void sub45CE10();
-	void sub45CF80();
-	void sub45CFB0();
-	void sub45CFE0();
-	void sub45D040();
-	void sub45D050();
-	void sub45D0A0();
-	void sub45D0E0();
-	void sub45D100();
-	void sub45D180();
+	uint32 hmAnimation(int messageNum, const MessageParam &param, Entity *sender);
+	uint32 hmLeaveCar(int messageNum, const MessageParam &param, Entity *sender);
+	void stCarAtHome();
+	void updateTurnMovement();
+	void updateMovement();
+	void stEnterCar();
+	void stLeaveCar();
+	void stLeanForwardIdle();
+	void evIdleDone();
+	void stIdleBlink();
+	void stHandleRect();
+	void evHandleRectDone();
+	void stUpdateMoveDirection();
+	void stTurnCar();
 	void moveToNextPoint();
-	void sub45D350();
-	void sub45D390();
+	void stBrakeMoveToNextPoint();
+	void stTurnCarMoveToNextPoint();
 	void moveToPrevPoint();
-	void sub45D580();
-	void sub45D5D0();
-	void sub45D620();
+	void stBrakeMoveToPrevPoint();
+	void stTurnCarMoveToPrevPoint();
+	void evTurnCarDone();
 	void suMoveToNextPoint();
 	void suMoveToPrevPoint();
-	void sub45E0A0();
+	void updateSound();
 };
 
 class AsScene1608Door : public AnimatedSprite {


Commit: c09c0b899820d7b0c3fdb5a26b4b6d9d894f68f4
    https://github.com/scummvm/scummvm/commit/c09c0b899820d7b0c3fdb5a26b4b6d9d894f68f4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Implement an experimental "render queue" to only draw and update what's actually changed; it works surprisingly well so far and only needs a few more changes here and there

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h
    engines/neverhood/smackerplayer.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 3d19a59..a3c88c2 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -358,12 +358,13 @@ void GameModule::startup() {
 	setGlobalVar(V_CREATURE_ANGRY, 1);
 	setGlobalVar(V_RADIO_ENABLED, 1);
 	setGlobalVar(V_TNT_DUMMY_BUILT, 1);
+	setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
 	// <<<DEBUG
 
 #if 1
-	_vm->gameState().which = 1;
-	_vm->gameState().sceneNum = 0;
-	createModule(2500, -1);
+	_vm->gameState().which = 0;
+	_vm->gameState().sceneNum = 3;
+	createModule(1300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index c5b136f..cd2234d 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -28,7 +28,7 @@ namespace Neverhood {
 
 BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height)
 	: _vm(vm), _priority(priority), _visible(true), _transparent(true),
-	_clipRects(NULL), _clipRectsCount(0) {
+	_clipRects(NULL), _clipRectsCount(0), _version(0) {
 	
 	_drawRect.x = 0;
 	_drawRect.y = 0;
@@ -54,11 +54,11 @@ BaseSurface::~BaseSurface() {
 void BaseSurface::draw() {
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
 		if (_clipRects && _clipRectsCount) {
-			_vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent);
+			_vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent, _version);
 		} else if (_sysRect.x == 0 && _sysRect.y == 0) {
-			_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent);
+			_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _version);
 		} else {
-			_vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent);
+			_vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent, _version);
 		}
 	}
 }
@@ -69,6 +69,7 @@ void BaseSurface::addDirtyRect() {
 
 void BaseSurface::clear() {
 	_surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), 0);
+	++_version;
 }
 
 void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
@@ -76,6 +77,7 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
 		spriteResource.getDimensions().height <= _drawRect.height) {
 		clear();
 		spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false);
+		++_version;
 	}
 }
 
@@ -89,6 +91,7 @@ void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flip
 		if (_surface) {
 			clear();
 			spriteResource.draw((byte*)_surface->pixels, _surface->pitch, flipX, flipY);
+			++_version;
 		}
 	}
 }
@@ -102,6 +105,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex,
 		clear();
 		if (frameIndex < animResource.getFrameCount()) {
 			animResource.draw(frameIndex, (byte*)_surface->pixels, _surface->pitch, flipX, flipY);
+			++_version;
 		}
 	}
 }
@@ -109,6 +113,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex,
 void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum) {
 	if (frameNum < 3) {
 		mouseCursorResource.draw(frameNum, (byte*)_surface->pixels, _surface->pitch);
+		++_version;
 	}
 }
 
@@ -132,6 +137,7 @@ void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, N
 			dest += _surface->pitch;
 		}
 	}
+	++_version;
 }
 
 // ShadowSurface
@@ -143,7 +149,7 @@ ShadowSurface::ShadowSurface(NeverhoodEngine *vm, int priority, int16 width, int
 
 void ShadowSurface::draw() {
 	if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) {
-		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _shadowSurface->getSurface());
+		_vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _version, _shadowSurface->getSurface());
 	}
 }
 
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 08357ea..f27ee62 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -118,6 +118,7 @@ protected:
 	NRect *_clipRects;
 	uint _clipRectsCount;
 	bool _transparent;
+	byte _version;
 };
 
 class ShadowSurface : public BaseSurface {
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 5152def..6a06ad6 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -153,12 +153,14 @@ Common::Error NeverhoodEngine::run() {
 		if (_system->getMillis() >= nextFrameTime) {
 			_gameModule->handleUpdate();
 			_gameModule->draw();
+			_screen->update();
 			nextFrameTime = _screen->getNextFrameTime();
 		};
 		
 		_soundMan->update();
 		_audioResourceMan->update();
-		_screen->update();
+		//_screen->update();
+		_system->updateScreen();
 		_system->delayMillis(10);
 		
 		debug(0, "---------------------------------------");
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index f9e8d49..a5f7b4d 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -33,9 +33,14 @@ Screen::Screen(NeverhoodEngine *vm)
 	_backScreen = new Graphics::Surface();
 	_backScreen->create(640, 480, Graphics::PixelFormat::createFormatCLUT8());
 	
+	_renderQueue = new RenderQueue();
+	_prevRenderQueue = new RenderQueue();
+	
 }
 
 Screen::~Screen() {
+	delete _renderQueue;
+	delete _prevRenderQueue;
 	_backScreen->free();
 	delete _backScreen;
 }
@@ -43,9 +48,65 @@ Screen::~Screen() {
 void Screen::update() {
 	_ticks = _vm->_system->getMillis();
 	updatePalette();
-	// TODO: Implement actual code
-	_vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480);
-	_vm->_system->updateScreen();
+
+	if (_fullRefresh) {
+		// NOTE When playing a fullscreen/doubled Smacker video usually a full screen refresh is needed
+		_vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480);
+		_fullRefresh = false;
+		return;
+	}
+
+	// NOTE This is more or less experimental code for a smart "render queue".
+	// It works well so far but needs some optimizing, e.g. reducing overdraw.
+	// Maybe I'll use my microtiles code from the Toltecs engine.
+	// Also better move this to a separate method or even class.
+	
+	Common::Array<Common::Rect> updateRects;
+
+	for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt)
+		(*jt)._refresh = true;
+	
+	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
+		RenderItem &renderItem = (*it);
+		renderItem._refresh = true;
+		for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) {
+			RenderItem &prevRenderItem = (*jt);
+			if (prevRenderItem == renderItem) {
+				prevRenderItem._refresh = false;
+				renderItem._refresh = false;
+			}
+		}
+	}
+	
+	for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) {
+		RenderItem &prevRenderItem = (*jt);
+		if (prevRenderItem._refresh)
+			updateRects.push_back(Common::Rect(prevRenderItem._destX, prevRenderItem._destY, prevRenderItem._destX + prevRenderItem._width, prevRenderItem._destY + prevRenderItem._height));
+	}
+	
+	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
+		RenderItem &renderItem = (*it);
+		if (renderItem._refresh)
+			updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height));
+	}
+
+	/*
+	for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
+		debug("## (%d, %d, %d, %d)", (*ri).left, (*ri).top, (*ri).right, (*ri).bottom);
+	*/
+	
+	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
+		RenderItem &renderItem = (*it);
+		for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
+			blitRenderItem(renderItem, *ri);
+	}
+	
+	SWAP(_renderQueue, _prevRenderQueue);
+	_renderQueue->clear();
+
+	for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
+		_vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr((*ri).left, (*ri).top), _backScreen->pitch, (*ri).left, (*ri).top, (*ri).width(), (*ri).height());
+		
 }
 
 uint32 Screen::getNextFrameTime() {
@@ -99,7 +160,7 @@ void Screen::clear() {
 	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
 }
 
-void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent,
+void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version,
 	const Graphics::Surface *shadowSurface) {
 
 	int16 destX, destY;
@@ -133,7 +194,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 	
 	//debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
 
-	blit(surface, destX, destY, ddRect, transparent, shadowSurface);
+	queueBlit(surface, destX, destY, ddRect, transparent, version, shadowSurface);
 
 	// Useful for debugging	
 	//_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); 
@@ -142,7 +203,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 
 }
 
-void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent) {
+void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version) {
 
 	int16 destX, destY;
 	NRect ddRect;
@@ -173,7 +234,7 @@ void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, ND
 		ddRect.y1 = drawRect.y;
 	}
 	
-	blit(surface, destX, destY, ddRect, transparent);
+	queueBlit(surface, destX, destY, ddRect, transparent, version);
 
 }
 
@@ -220,7 +281,7 @@ void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &dra
 
 	const byte *source = (const byte*)surface->getBasePtr(0, 0);
 	byte *dest = (byte*)_backScreen->getBasePtr(drawRect.x, drawRect.y);
-	
+
 	for (int16 yc = 0; yc < surface->h; yc++) {
 		byte *row = dest;
 		for (int16 xc = 0; xc < surface->w; xc++) {
@@ -231,10 +292,12 @@ void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &dra
 		dest += _backScreen->pitch;
 		dest += _backScreen->pitch;
 	}
+	
+	_fullRefresh = true; // See Screen::update
 
 }
 
-void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent) {
+void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version) {
 	
 	int16 x, y;
 	bool xflag, yflag;
@@ -271,7 +334,7 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra
 		newDrawRect.height = drawRect.height;
 	}
 	
-	drawSurface3(surface, drawRect.x, drawRect.y, newDrawRect, clipRect, transparent);
+	drawSurface3(surface, drawRect.x, drawRect.y, newDrawRect, clipRect, transparent, version);
   
 	if (!xflag) {
 		newDrawRect.x = 0;
@@ -280,7 +343,7 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra
 		newDrawRect.height = sysRect.height - y;
 		if (drawRect.height < newDrawRect.height)
 			newDrawRect.height = drawRect.height;
-		drawSurface3(surface, sysRect.width + drawRect.x - x, drawRect.y, newDrawRect, clipRect, transparent);
+		drawSurface3(surface, sysRect.width + drawRect.x - x, drawRect.y, newDrawRect, clipRect, transparent, version);
 	}
   
 	if (!yflag) {
@@ -290,7 +353,7 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra
 		newDrawRect.height = y + drawRect.height - sysRect.height;
 		if (drawRect.width < newDrawRect.width)
 			newDrawRect.width = drawRect.width;
-		drawSurface3(surface, drawRect.x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent);
+		drawSurface3(surface, drawRect.x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent, version);
 	}
   
 	if (!xflag && !yflag) {
@@ -298,15 +361,84 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra
 		newDrawRect.y = 0;
 		newDrawRect.width = x + drawRect.width - sysRect.width;
 		newDrawRect.height = y + drawRect.height - sysRect.height;
-		drawSurface3(surface, sysRect.width + drawRect.x - x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent);
+		drawSurface3(surface, sysRect.width + drawRect.x - x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent, version);
 	}
 
 }
 
-void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent) {
+void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version) {
 	NDrawRect clipDrawRect(0, 0, drawRect.width, drawRect.height);
 	for (uint i = 0; i < clipRectsCount; i++)
-		drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent);
+		drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent, version);
+}
+
+void Screen::queueBlit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, byte version,
+	const Graphics::Surface *shadowSurface) {
+	
+	int width = ddRect.x2 - ddRect.x1;
+	int height = ddRect.y2 - ddRect.y1;
+
+	if (width <= 0 || height <= 0)
+		return;
+	
+	RenderItem renderItem;
+	renderItem._surface = surface;
+	renderItem._shadowSurface = shadowSurface;
+	renderItem._destX = destX;
+	renderItem._destY = destY;
+	renderItem._srcX = ddRect.x1;
+	renderItem._srcY = ddRect.y1;
+	renderItem._width = width;
+	renderItem._height = height;
+	renderItem._transparent = transparent;
+	renderItem._version = version;
+	_renderQueue->push_back(renderItem);
+	
+}
+
+void Screen::blitRenderItem(const RenderItem &renderItem, const Common::Rect &clipRect) {
+
+	const Graphics::Surface *surface = renderItem._surface;
+	const Graphics::Surface *shadowSurface = renderItem._shadowSurface;
+	const int16 x0 = MAX<int16>(clipRect.left, renderItem._destX);
+	const int16 y0 = MAX<int16>(clipRect.top, renderItem._destY);
+	const int16 x1 = MIN<int16>(clipRect.right, renderItem._destX + renderItem._width);
+	const int16 y1 = MIN<int16>(clipRect.bottom, renderItem._destY + renderItem._height);
+	int16 width = x1 - x0;
+	int16 height = y1 - y0;
+
+	if (width < 0 || height < 0)
+		return;
+
+	const byte *source = (const byte*)surface->getBasePtr(renderItem._srcX + x0 - renderItem._destX, renderItem._srcY + y0 - renderItem._destY);
+	byte *dest = (byte*)_backScreen->getBasePtr(x0, y0);
+
+	if (shadowSurface) {
+		const byte *shadowSource = (const byte*)shadowSurface->getBasePtr(x0, y0);
+		while (height--) {
+			for (int xc = 0; xc < width; xc++)
+				if (source[xc] != 0)
+					dest[xc] = shadowSource[xc];
+			source += surface->pitch;
+			shadowSource += shadowSurface->pitch;
+			dest += _backScreen->pitch;
+		}
+	} else if (!renderItem._transparent) {
+		while (height--) {
+			memcpy(dest, source, width);
+			source += surface->pitch;
+			dest += _backScreen->pitch;
+		}
+	} else {
+		while (height--) {
+			for (int xc = 0; xc < width; xc++)
+				if (source[xc] != 0)
+					dest[xc] = source[xc];
+			source += surface->pitch;
+			dest += _backScreen->pitch;
+		}
+	}
+
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index e3a2bfb..bbf4f5f 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -23,6 +23,7 @@
 #ifndef NEVERHOOD_SCREEN_H
 #define NEVERHOOD_SCREEN_H
 
+#include "common/array.h"
 #include "graphics/surface.h"
 #include "video/smk_decoder.h"
 #include "neverhood/neverhood.h"
@@ -30,6 +31,31 @@
 
 namespace Neverhood {
 
+struct RenderItem {
+	const Graphics::Surface *_surface;
+	const Graphics::Surface *_shadowSurface;
+	int16 _destX, _destY;
+	int16 _srcX, _srcY, _width, _height;
+	bool _transparent;
+	byte _version;
+	bool _refresh;
+	bool operator==(const RenderItem &second) const {
+		return
+			_surface == second._surface &&
+			_shadowSurface == second._shadowSurface &&
+			_destX == second._destX &&
+			_destY == second._destY &&
+			_srcX == second._srcX &&
+			_srcY == second._srcY &&
+			_width == second._width &&
+			_height == second._height &&
+			_transparent == second._transparent &&
+			_version == second._version;
+	}
+};
+
+typedef Common::Array<RenderItem> RenderQueue;
+
 class Screen {
 public:
 	Screen(NeverhoodEngine *vm);
@@ -43,16 +69,19 @@ public:
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();
-	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent,
+	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version,
 		const Graphics::Surface *shadowSurface = NULL);
-	void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent);
+	void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version);
 	void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect);
 	void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent,
 		const Graphics::Surface *shadowSurface = NULL);
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
-	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent);
-	void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent);
+	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version);
+	void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version);
 	void setSmackerDecoder(Video::SmackerDecoder *smackerDecoder) { _smackerDecoder = smackerDecoder; }
+	void queueBlit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, byte version,
+		const Graphics::Surface *shadowSurface = NULL);
+	void blitRenderItem(const RenderItem &renderItem, const Common::Rect &clipRect);
 protected:
 	NeverhoodEngine *_vm;
 	Graphics::Surface *_backScreen;
@@ -61,6 +90,9 @@ protected:
 	int32 _frameDelay;
 	byte *_paletteData;
 	bool _paletteChanged;
+	//
+	bool _fullRefresh;
+	RenderQueue *_renderQueue, *_prevRenderQueue;
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index b491bc5..d7a244b 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -36,7 +36,7 @@ SmackerSurface::SmackerSurface(NeverhoodEngine *vm)
 
 void SmackerSurface::draw() {
 	if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0)
-		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false);
+		_vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false, ++_version);
 }
 
 void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) {


Commit: 4295991d194404b6e2bbbddb1de2f82eae685739
    https://github.com/scummvm/scummvm/commit/4295991d194404b6e2bbbddb1de2f82eae685739
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Use hardcoded values as width/height of several sprites (in the original the values were loaded from the entry's extData but since all values are constant anyway it shouldn't matter)

Changed paths:
    engines/neverhood/module1100.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp



diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index e46ed26..b825ced 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -353,8 +353,7 @@ void SsScene1105SymbolDie::hide() {
 AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
-	// TODO createSurface3(100, dword_4AF4C0);
-	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(100, 556, 328);
 	_x = 320;
 	_y = 240;
 	SetUpdateHandler(&AnimatedSprite::update);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index c81cbaa..3f606e7 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -581,8 +581,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
-	// TODO createSurface3(200, dword_4AF9F8);
-	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(200, 128, 315);
 	_x = 289;
 	_y = 390;
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -1119,8 +1118,7 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind
 	_x = pt.x;
 	_y = pt.y;
 	
-	// TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], fileHashes);
-	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 640, 480); //TODO: Remeove once the line above is done
+	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 190, 148);
 	
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1307Key::handleMessage);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 82ac01d..e4e2550 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -137,8 +137,7 @@ void Module1400::updateScene() {
 AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) {
 	
-	// TODO createSurface3(900, dword_4B6768);
-	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(900, 152, 147);
 	_x = 454;
 	_y = 217;
 	SetMessageHandler(&AsScene1401Pipe::handleMessage);
@@ -224,8 +223,7 @@ void AsScene1401Pipe::stSuckInProjector() {
 AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100) {
 	
-	// TODO createSurface3(100, dword_4B6778);
-	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(100, 71, 41);
 	_x = 478;
 	_y = 433;
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -271,8 +269,7 @@ void AsScene1401Mouse::stSuckedIn() {
 AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100) {
 
-	// TODO createSurface3(200, dword_4B6768);
-	createSurface(200, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(200, 152, 147);
 	_x = 427;
 	_y = 433;
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -388,8 +385,7 @@ AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sp
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) {
 
 	_asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)];
-	// TODO createSurface3(990, dword_4B26D8);
-	createSurface(990, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(990, 101, 182);
 	startAnimation(0x10E3042B, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsCommonProjector::handleMessage);
@@ -803,8 +799,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas
 AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 
-	// TODO createSurface3(900, dword_4B6768);
-	createSurface(900, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(900, 152, 147);
 
 	SetFilterY(&Sprite::defFilterY);
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -1105,8 +1100,7 @@ static const struct {
 AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) {
 	
-	// TODO createSurface3(100, dword_4B05B0);
-	createSurface(100, 640, 480); //TODO: Remeove once the line above is done
+	createSurface(100, 117, 45);
 
 	SetUpdateHandler(&AnimatedSprite::update);
 	_x = 108;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index ae8fd7f..a69b8d0 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -186,8 +186,7 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	SetMessageHandler(&AsCommonCar::handleMessage);
 	SetSpriteUpdate(NULL);
 
-	// TODO createSurface2(200, dword_4AF4C0);
-	createSurface(200, 640, 480); //TODO: Remove once the line above is done
+	createSurface(200, 556, 328);
 	_x = x;
 	_y = y;
 	
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 700f0cd..950b64d 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -80,8 +80,7 @@ void Module2100::updateScene() {
 AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag)
 	: AnimatedSprite(vm, 1100) {
 
-	// TODO createSurface3(100, dword_4B9018);
-	createSurface(100, 640, 480); //TODO: Remove once the line above is done
+	createSurface(100, 328, 347);
 	_x = 320;
 	_y = 240;
 	SetUpdateHandler(&AnimatedSprite::update);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index c75e85b..f791c8e 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -635,7 +635,7 @@ void AsScene2402Door::stDoorClosingFinished() {
 AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) {
 
-	createSurface(100, 640, 480); // TODO Use correct size	from the two hashes
+	createSurface(100, 127, 90);
 	SetMessageHandler(&Sprite::handleMessage);
 	_x = 260;
 	_y = 210;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 9bac035..9ff0da1 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -523,7 +523,7 @@ AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar,
 	: AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) {
 
 	SetUpdateHandler(&AsCommonCarShadow::update);
-	createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource
+	createShadowSurface(shadowSurface, 211, 147, 100);
 	updateShadow();
 } 
 
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index a1a93bd..1b03968 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -675,7 +675,7 @@ AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentSce
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2),
 	_isPulled(false), _isBusy(false) {
 
-	createSurface(1010, 640, 480); // TODO Use correct size	from the two hashes
+	createSurface(1010, 28, 379);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 	_x = x;


Commit: a238f57805880b63a753d68abe726d2a6dfad21b
    https://github.com/scummvm/scummvm/commit/a238f57805880b63a753d68abe726d2a6dfad21b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:31-07:00

Commit Message:
NEVERHOOD: Remove DirtyBackground which became obsolete after the renderqueue stuff

Changed paths:
    engines/neverhood/background.cpp
    engines/neverhood/background.h
    engines/neverhood/module2800.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp
index 03c531f..0a80bd8 100644
--- a/engines/neverhood/background.cpp
+++ b/engines/neverhood/background.cpp
@@ -57,37 +57,4 @@ void Background::load(uint32 fileHash) {
 		_surface->drawSpriteResource(_spriteResource);
 }
 
-// DirtyBackground
-
-DirtyBackground::DirtyBackground(NeverhoodEngine *vm, int objectPriority)
-	: Background(vm, objectPriority) {
-	// Empty
-}
-
-DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority)
-	: Background(vm, objectPriority) {
-	
-	_spriteResource.load(calcHash(fileName));
-	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_surface->drawSpriteResource(_spriteResource);
-}
-
-DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority)
-	: Background(vm, objectPriority) {
-
-	_spriteResource.load(fileHash);
-	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_surface->drawSpriteResource(_spriteResource);
-}
-
-void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 height) {
-
-	// TODO: Later use a DirtySurface once it is implemented
-	_surface = new BaseSurface(_vm, surfacePriority, width, height);
-	_surface->setTransparent(false);
-	_spriteResource.getPosition().x = width;
-	_spriteResource.getPosition().y = height;
-
-}
-
 } // End of namespace Neverhood
diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h
index d8f624b..ef88be2 100644
--- a/engines/neverhood/background.h
+++ b/engines/neverhood/background.h
@@ -44,15 +44,6 @@ protected:
 	SpriteResource _spriteResource;
 };
 
-class DirtyBackground : public Background {
-public:
-	DirtyBackground(NeverhoodEngine *vm, int objectPriority);
-	DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority);
-	DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority);
-	void createSurface(int surfacePriority, int16 width, int16 height);
-
-};
-
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_BACKGROUND_H */
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 1b03968..140e112 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -845,7 +845,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_surfaceFlag = true;
 
-	_background = new DirtyBackground(_vm, 0);
+	_background = new Background(_vm, 0);
 	_background->createSurface(0, 640, 480);
 	addBackground(_background);
 	
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index b75515f..c706ecc 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -183,8 +183,8 @@ Background *Scene::addBackground(Background *background) {
 	return background;
 }
 
-void Scene::setBackground(uint32 fileHash, bool dirtyBackground) {
-	_background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0));
+void Scene::setBackground(uint32 fileHash) {
+	_background = addBackground(new Background(_vm, fileHash, 0, 0));
 }
 
 void Scene::changeBackground(uint32 fileHash) {
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index a0f7dafd..11c00d9 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -52,7 +52,7 @@ public:
 	void setSpriteSurfacePriority(Sprite *sprite, int priority);
 	void deleteSprite(Sprite **sprite);
 	Background *addBackground(Background *background);
-	void setBackground(uint32 fileHash, bool dirtyBackground = true);
+	void setBackground(uint32 fileHash);
 	void changeBackground(uint32 fileHash);
 	void setBackgroundY(int16 y) { _background->getSurface()->getDrawRect().y = y; }
 	int16 getBackgroundY() { return _background->getSurface()->getDrawRect().y; }


Commit: a6e9475a3fd49bab9ff463f87734d27782297cdb
    https://github.com/scummvm/scummvm/commit/a6e9475a3fd49bab9ff463f87734d27782297cdb
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Remove Scene::_surfaceFlag which also is obsolete now

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index d69182b..0371903 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -334,8 +334,6 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 
 	int availableDisksCount = 0;
 	
-	_surfaceFlag = true;
-
 	setBackground(0x8A000044);
 	setPalette(kDiskplayerPaletteFileHashes[paletteIndex]);
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 461f873..8e6b56b 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -339,7 +339,6 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1001::handleMessage);
 	
 	setHitRects(0x004B4860);
-	_surfaceFlag = false;
 	setBackground(0x4086520E);
 	setPalette(0x4086520E);
 	insertMouse433(0x6520A400);
@@ -1279,8 +1278,6 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setHitRects(0x004B4138);
 
-	_surfaceFlag = true;
-
 	setBackground(0x12C23307);
 	setPalette(0x12C23307);
 
@@ -1530,8 +1527,6 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
 	: Scene(vm, parentModule, true) {
 
-	_surfaceFlag = false;
-
 	SetMessageHandler(&StaticScene::handleMessage);
 	
 	setBackground(backgroundFileHash);
@@ -1588,8 +1583,6 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 	
-	_surfaceFlag = true;
-	
 	SetUpdateHandler(&Scene1004::update);
 	SetMessageHandler(&Scene1004::handleMessage);
 
@@ -1687,8 +1680,6 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene1005::handleMessage);
 
-	_surfaceFlag = true;
-	
 	if (getGlobalVar(V_ENTRANCE_OPEN)) {
 		setBackground(0x2800E011);
 		setPalette(0x2800E011);
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index b825ced..9bd7b88 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -452,7 +452,6 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_vm->gameModule()->initScene1405Vars();
 	
-	_surfaceFlag = true;
 	SetUpdateHandler(&Scene1105::update);
 	SetMessageHandler(&Scene1105::handleMessage);
 	
@@ -668,7 +667,6 @@ void Scene1105::update() {
 Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, which) {
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1109::handleMessage);
 	
 	setBackground(0x8449E02F);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index fecb66a..c0bab71 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -726,8 +726,6 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setHitRects(0x004AEBD0);
 	
-	_surfaceFlag = true;
-
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) {
 		setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1);
 		for (uint32 index = 0; index < 18; index++) {
@@ -1091,8 +1089,6 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1202::handleMessage);
 	SetUpdateHandler(&Scene1202::update);
 
-	_surfaceFlag = true;
-
 	setBackground(0x60210ED5);
 
 	setPalette(0x60210ED5);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 3f606e7..f718d1e 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -630,7 +630,6 @@ void AsScene1303Balloon::stPopBalloon() {
 Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1303::handleMessage);
 	setRectList(0x004AF9E8);
 	
@@ -694,7 +693,6 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &para
 Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1304::handleMessage);
 	setRectList(0x004B91A8);
 
@@ -761,7 +759,6 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1305::handleMessage);
 	setRectList(0x004B6E98);
 
@@ -876,7 +873,6 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 4);
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1306::handleMessage);
 
 	setBackground(0x05303114);
@@ -1275,7 +1271,6 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 		_keyHoleRects[i].y2 = pt.y + 15;
 	}
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1307::handleMessage);
 	SetUpdateHandler(&Scene1307::update);
 
@@ -1575,7 +1570,6 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_vm->gameModule()->initScene1307Vars();
 
-	_surfaceFlag = true;		
 	SetMessageHandler(&Scene1308::handleMessage);
 	
 	setBackground(0x41024202);
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index e4e2550..1bb0548 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -647,7 +647,6 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1401::handleMessage);
 	SetUpdateHandler(&Scene1401::update);
 	setRectList(0x004B6758);
-	_surfaceFlag = true;
 
 	setBackground(0x08221FA5);
 	setPalette(0x08221FA5);
@@ -1243,8 +1242,6 @@ void AsScene1407Mouse::stArriveAtHole() {
 Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _puzzleSolvedCountdown(0),	_resetButtonCountdown(0) {
 
-	_surfaceFlag = true;
-
 	SetMessageHandler(&Scene1407::handleMessage);
 	SetUpdateHandler(&Scene1407::update);
 
@@ -1307,7 +1304,6 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1403::handleMessage);
 	
 	setRectList(0x004B1FF8);
-	_surfaceFlag = true;
 
 	setBackground(0x2110A234);
 	setPalette(0x2110A234);
@@ -1418,7 +1414,6 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		setGlobalVar(V_KEY3_LOCATION, 5);
 	
 	SetMessageHandler(&Scene1404::handleMessage);
-	_surfaceFlag = true;
 
 	setRectList(0x004B8D80);
 
@@ -1590,7 +1585,6 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
 
 	_vm->gameModule()->initScene1405Vars();
-	_surfaceFlag = true;
 	
 	setBackground(0x0C0C007D);
 	setPalette(0x0C0C007D);
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index b62ff01..0b55209 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -88,8 +88,6 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
 	
-	_surfaceFlag = true;
-
 	setBackground(backgroundFileHash);
 
 	setPalette();
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index a69b8d0..382aedd 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1076,7 +1076,6 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1608::hmLowerFloor);
 	
 	_asKey = insertSprite<AsCommonKey>(this, 1, 1100, 198, 220);
@@ -1396,7 +1395,6 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO _vm->gameModule()->initScene3011Vars();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene1609::handleMessage);
 	SetUpdateHandler(&Scene1609::update);
 	
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index adbd853..ae97c15 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -194,8 +194,6 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setHitRects(0x004B69D8);
 
-	_surfaceFlag = true;
-
 	setBackground(0x03118226);
 
 	setPalette(0x03118226);
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 9db1503..c4a0904 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -91,8 +91,6 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	Sprite *tempSprite;
 
-	_surfaceFlag = true;
-	
 	setRectList(0x004B34C8);
 
 	setBackground(0x01303227);
@@ -559,7 +557,6 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), 
 	_moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) {
 	
-	_surfaceFlag = true;
 	setBackground(0x20628E05);
 	setPalette(0x20628E05);
 
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index bd5597d..a97cbaa 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -100,7 +100,6 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2001::handleMessage);
 
 	setBackground(0xA6417244);
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 950b64d..58f87d9 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -203,7 +203,6 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	Sprite *tempSprite;
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2101::handleMessage);
 	SetUpdateHandler(&Scene2101::update);
 	
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 1b07890..1159c0b 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -508,7 +508,6 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 		// TODO _vm->gameModule()->initScene2201Vars();
 	}
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2201::handleMessage);
 	SetUpdateHandler(&Scene2201::update);
 	
@@ -892,8 +891,6 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2202::handleMessage);
 	SetUpdateHandler(&Scene2202::update);
 
-	_surfaceFlag = true;
-
 	setBackground(0x08100A0C);
 	setPalette(0x08100A0C);
 	addEntity(_palette);
@@ -1115,7 +1112,6 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 		setGlobalVar(V_KEY3_LOCATION, 1);
 
 	SetMessageHandler(&Scene2203::handleMessage);
-	_surfaceFlag = true;
 
 	setBackground(0x82C80334);
 	setPalette(0x82C80334);
@@ -1268,7 +1264,6 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2205::update);
 	
 	setHitRects(0x004B0620);
-	_surfaceFlag = true;
 
 	if (getGlobalVar(V_LIGHTS_ON)) {
 		_isLightOn = true;
@@ -1520,7 +1515,6 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	SetUpdateHandler(&Scene::update);
 	SetMessageHandler(&Scene2206::handleMessage);
-	_surfaceFlag = true;
 	
 	if (getGlobalVar(V_LIGHTS_ON)) {
 		fileHash = 0x41983216;
@@ -2016,7 +2010,6 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene2207::handleMessage);
 	SetUpdateHandler(&Scene2207::update);
-	_surfaceFlag = true;
 
 	insertKlayman<KmScene2207>(0, 0);
 	_klayman->setRepl(64, 0);
@@ -2405,7 +2398,6 @@ static const uint32 kScene2242MessageListIds1[] = {
 Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _isKlaymanInLight(false) {
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2242::handleMessage);
 	SetUpdateHandler(&Scene2242::update);
 	
@@ -2525,7 +2517,6 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 	
 	_sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id);
 
-	_surfaceFlag = true;
 	SetMessageHandler(&HallOfRecordsScene::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
@@ -2617,7 +2608,6 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	//DEBUG
 	setGlobalVar(V_LIGHTS_ON, 1);
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2247::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index f791c8e..94937bf 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -392,7 +392,6 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water
 	setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2401::handleMessage);
 	SetUpdateHandler(&Scene2401::update);
 
@@ -721,7 +720,6 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2402::handleMessage);
 	SetUpdateHandler(&Scene2402::update);
 
@@ -825,7 +823,6 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	Sprite *tempSprite1, *tempSprite2, *tempSprite3;
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2403::handleMessage);
 	setBackground(0x0C05060C);
 	setPalette(0x0C05060C);
@@ -922,7 +919,6 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 2);
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2406::handleMessage);
 	
 	setRectList(0x004B78C8);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index c9bffe5..19779c3 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -227,7 +227,6 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	SetUpdateHandler(&Scene2501::update);
-	_surfaceFlag = true;
 	setBackground(0x1B8E8115);
 	setPalette(0x1B8E8115);
 	_palette->addPalette(0x00128842, 65, 31, 65);
@@ -551,7 +550,6 @@ Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	Sprite *ssButton;
 	
-	_surfaceFlag = true;
 	setBackground(0x90791B80);
 	setPalette(0x90791B80);
 	ssButton = insertSprite<SsScene2504Button>();
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 6eebd40..37e4406 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -306,7 +306,6 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _isBusy(false) {
 	
-	_surfaceFlag = true;
 	setBackground(0x51409A16);
 	setPalette(0x51409A16);
 	_asWater = insertSprite<AsScene2609Water>();
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 9ff0da1..870c14c 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -592,8 +592,6 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240);
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	
-	_surfaceFlag = true;
-	
 	setBackground(sceneInfo->bgFilename);
 	setPalette(sceneInfo->bgFilename);
 
@@ -705,7 +703,6 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 		for (int j = 0; j < 3; j++)
 			_sceneInfos[i][j] = _vm->_staticData->getSceneInfo2700(kScene2702Infos[i][j]);
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2702::handleMessage);
 	SetUpdateHandler(&Scene2702::update);
 	
@@ -875,7 +872,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2704::handleMessage);
 	SetUpdateHandler(&Scene2704::update);
 	
@@ -988,7 +984,6 @@ static const struct { const char *pointListName; int which1, which2; } kSceneInf
 Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _newTrackIndex(-1) {
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2706::handleMessage);
 	
 	setBackground(0x18808B88);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 140e112..c1e1790 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -404,7 +404,6 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_vm->gameModule()->initScene2801Vars();
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2801::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
@@ -512,7 +511,6 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
 	setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0);
 	//DEBUG<<<
 		
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2802::handleMessage);
 	SetUpdateHandler(&Scene2802::update);
 	insertMouse435(0x008810A8, 20, 620);
@@ -843,8 +841,6 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	loadDataResource(0x00900849);
 	
-	_surfaceFlag = true;
-
 	_background = new Background(_vm, 0);
 	_background->createSurface(0, 640, 480);
 	addBackground(_background);
@@ -1126,7 +1122,6 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 		0, 0x286800D4, 0x286806D4, 0x28680AD4
 	};
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2803Small::handleMessage);
 
 	loadDataResource(0x81120132);
@@ -1818,7 +1813,6 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	initCrystalColors();
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2804::handleMessage);
 	SetUpdateHandler(&Scene2804::update);
 
@@ -1969,7 +1963,6 @@ void Scene2804::initCrystalColors() {
 Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2805::handleMessage);
 
 	setBackground(0x08021E04);
@@ -2058,7 +2051,6 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2806::handleMessage);
 	SetUpdateHandler(&Scene2806::update);
 	
@@ -2178,7 +2170,6 @@ void Scene2806::findClosestPoint() {
 Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2807::handleMessage);
 
 	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 1) {
@@ -2205,7 +2196,6 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertStaticSprite(0x31203460, 100);
 	}
 
-	_surfaceFlag = true;
 	setBackground(0x3E049A95);
 	setPalette(0x3E049A95);
 	insertMouse435(0x49A913E8, 20, 620);
@@ -2536,7 +2526,6 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->gameModule()->initScene2808Vars2();
 	}
 	
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2808::handleMessage);
 	SetUpdateHandler(&Scene2808::update);
 
@@ -2661,7 +2650,6 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 		
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2809::handleMessage);
 	SetUpdateHandler(&Scene2809::update);
 	
@@ -2809,7 +2797,6 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2810::handleMessage);
 	
 	setBackground(0x26508804);
@@ -3127,7 +3114,6 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 3);
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene2812::handleMessage);
 	SetUpdateHandler(&Scene2812::update);
 	
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 0a033a8..976cf5d 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -401,7 +401,6 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (_currLocationButtonNum == 3)
 		setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1);
 
-	_surfaceFlag = true;
 	setBackground(kScene2901FileHashes1[_currLocationButtonNum]);
 	setPalette(kScene2901FileHashes1[_currLocationButtonNum]);
 	
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 6d394a8..c3eb9e4 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -805,7 +805,6 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->gameModule()->initScene3009Vars();
 	
 	setGlobalVar(V_CANNON_SMACKER_NAME, 0);
-	_surfaceFlag = true;
 	
 	_vm->_screen->clear();
 	
@@ -1293,8 +1292,6 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1);
 	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1);
 
-	_surfaceFlag = true;
-
 	setBackground(0x80802626);
 	setPalette(0x80802626);
 
@@ -1533,7 +1530,6 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	// TODO _vm->gameModule()->initScene3011Vars();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
 
-	_surfaceFlag = true;
 	SetMessageHandler(&Scene3011::handleMessage);
 	SetUpdateHandler(&Scene3011::update);
 	
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index c706ecc..ac08c14 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -48,7 +48,6 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_vm->_screen->setSmackerDecoder(NULL);
 	// TODO g_screen->resetDirtyRects();	
 	_canAcceptInput = true;
-	_surfaceFlag = false;
 	_messageList2 = NULL;
 	_smackerPlayer = NULL;
 	_isMessageListBusy = false;
@@ -75,25 +74,11 @@ Scene::~Scene() {
 
 void Scene::draw() {
 	if (_smackerPlayer) {
-		if (_surfaceFlag) {
-			// TODO g_screen->resetDirtyRects();
-			// TODO g_screen->copyDirtyRects();
-			// TODO g_screen->addDirtyRects();
-		}
 		if (_smackerPlayer->getSurface())
 			_smackerPlayer->getSurface()->draw();
 	} else {
-#if 0	
-		if (_surfaceFlag) {
-			// TODO g_screen->copyDirtyRects();
-			for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
-				(*iter)->addDirtyRect();
-			// TODO g_screen->addDirtyRects();
-		}
-#endif		
-		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
+		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++)
 			(*iter)->draw();
-		}
 	}	
 }
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 11c00d9..c9e27f7 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -160,8 +160,6 @@ protected:
 	Common::Array<Entity*> _entities;
 	Common::Array<BaseSurface*> _surfaces;
 
-	bool _surfaceFlag;
-
 	Klayman *_klayman;
 	Background *_background;
 	Palette *_palette;


Commit: c7ad09c6856cc5e3be805866623d94258360fd60
    https://github.com/scummvm/scummvm/commit/c7ad09c6856cc5e3be805866623d94258360fd60
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Remove BaseSurface::addDirtyRect() which is obsolete as well

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index cd2234d..b87c447 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -63,10 +63,6 @@ void BaseSurface::draw() {
 	}
 }
 
-void BaseSurface::addDirtyRect() {
-	// TODO
-}
-
 void BaseSurface::clear() {
 	_surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), 0);
 	++_version;
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index f27ee62..3ca3339 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -88,7 +88,6 @@ public:
 	BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height);
 	virtual ~BaseSurface();
 	virtual void draw();
-	virtual void addDirtyRect();
 	void clear();
 	void drawSpriteResource(SpriteResource &spriteResource);
 	void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height);
@@ -118,6 +117,7 @@ protected:
 	NRect *_clipRects;
 	uint _clipRectsCount;
 	bool _transparent;
+	// Version changes each time the pixels are touched in any way
 	byte _version;
 };
 


Commit: 9b7354dacb343a1618f8329c660fcba170f86ede
    https://github.com/scummvm/scummvm/commit/9b7354dacb343a1618f8329c660fcba170f86ede
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Fix mouse cursor visibility by starting out invisible when the Mouse object is created and hiding the cursor when it's destroyed

Changed paths:
    engines/neverhood/mouse.cpp
    engines/neverhood/mouse.h



diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index bce6646..8cd5e60 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -42,7 +42,7 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect)
 
 Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
 	: StaticSprite(vm, 2000), _mouseType(kMouseType435),
-	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(true) {
+	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(false) {
 	
 	init(fileHash);
 	if (_x <= _x1) {
@@ -63,6 +63,10 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int type)
 	_mouseCursorResource.setCursorNum(0);
 }
 
+Mouse::~Mouse() {
+	CursorMan.showMouse(false);
+}
+
 void Mouse::init(uint32 fileHash) {
 	_mouseCursorResource.load(fileHash);
 	_x = _vm->getMouseX();	
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index a163a7a..2b0e8b7 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -41,6 +41,7 @@ public:
 	Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect);
 	Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2);
 	Mouse(NeverhoodEngine *vm, uint32 fileHash, int _type);
+	virtual ~Mouse();
 	void load(uint32 fileHash);
 	void updateCursor();
 protected:


Commit: 533eb5d61d6d3f0b7f229648cf186ba1b54e5388
    https://github.com/scummvm/scummvm/commit/533eb5d61d6d3f0b7f229648cf186ba1b54e5388
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Rename puzzle initialization methods and give them better names

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module1100.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index a3c88c2..80e6fbe 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -47,7 +47,7 @@
 
 namespace Neverhood {
 
-static const uint32 kScene2801MusicFileHashes[] = {
+static const uint32 kRadioMusicFileHashes[] = {
 	0x82B22000,
 	0x02B22004,
 	0x42B22000,
@@ -124,7 +124,7 @@ void GameModule::handleSpaceKey() {
 	}				
 }
 
-void GameModule::initScene1307Vars() {
+void GameModule::initKeySlotsPuzzle() {
 
 	// Exit if it's already initialized
 	if (getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10))
@@ -162,7 +162,7 @@ void GameModule::initScene1307Vars() {
 
 }
 
-void GameModule::initScene1405Vars() {
+void GameModule::initMemoryPuzzle() {
 
 	// TODO: Give better names
 
@@ -261,33 +261,29 @@ void GameModule::initScene1405Vars() {
 	
 }
 
-void GameModule::initScene2401Vars() {
-
-	if (getSubVar(VA_IS_PUZZLE_INIT, 0x40520234))
-		return;
-
-	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 0, 3);
-	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 1, 1);
-	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 2, 2);
-	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 3, 0);
-	setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 4, 4);
-		
-	setSubVar(VA_IS_PUZZLE_INIT, 0x40520234, 1);
-
+void GameModule::initWaterPipesPuzzle() {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x40520234)) {
+		setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 0, 3);
+		setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 1, 1);
+		setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 2, 2);
+		setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 3, 0);
+		setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 4, 4);
+		setSubVar(VA_IS_PUZZLE_INIT, 0x40520234, 1);
+	}
 }
 
-void GameModule::initScene2801Vars() {
+void GameModule::initRadioPuzzle() {
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x08C80800)) {
 		int currMusicIndex = _vm->_rnd->getRandomNumber(5 - 1) + 3;
 		setGlobalVar(V_GOOD_RADIO_MUSIC_INDEX, 5 * currMusicIndex);
-		setGlobalVar(V_GOOD_RADIO_MUSIC_NAME, kScene2801MusicFileHashes[currMusicIndex]);
+		setGlobalVar(V_GOOD_RADIO_MUSIC_NAME, kRadioMusicFileHashes[currMusicIndex]);
 		setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1);
 		setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0);
 		setSubVar(VA_IS_PUZZLE_INIT, 0x08C80800, 1);
   	}
 }
 
-void GameModule::initScene2808Vars1() {
+void GameModule::initTestTubes1Puzzle() {
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x20479010)) {
 		for (uint i = 0; i < 3; i++)
 			setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1);
@@ -295,7 +291,7 @@ void GameModule::initScene2808Vars1() {
 	}
 }
 
-void GameModule::initScene2808Vars2() {
+void GameModule::initTestTubes2Puzzle() {
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x66059818)) {
 		for (uint i = 0; i < 3; i++)
 			setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1);
@@ -303,7 +299,7 @@ void GameModule::initScene2808Vars2() {
 	}
 }
 
-void GameModule::initScene3009Vars() {
+void GameModule::initCannonSymbolsPuzzle() {
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x8C9819C2)) {
 		for (int i = 0; i < 3; i++) {
 			setSubVar(VA_GOOD_CANNON_SYMBOLS_1, i, _vm->_rnd->getRandomNumber(12 - 1));
@@ -313,9 +309,9 @@ void GameModule::initScene3009Vars() {
 	}
 }
 
-uint32 GameModule::getScene2802MusicFileHash() {
+uint32 GameModule::getCurrRadioMusicFileHash() {
 	uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
-	return (musicIndex % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP<uint>(musicIndex / 5, 0, 17)];
+	return (musicIndex % 5 != 0) ? 0 : kRadioMusicFileHashes[CLIP<uint>(musicIndex / 5, 0, 17)];
 }
 
 
@@ -324,20 +320,18 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 	switch (messageNum) {
 	case 0x0800:
 		_someFlag1 = true;
-		return messageResult;		
+		break;		
 	case 0x1009:
 		_moduleResult = param.asInteger();
 		_done = true;
-		return messageResult;
+		break;		
 	case 0x100A:
-		// Unused resource preloading message
-		return messageResult;
+	case 0x1023:
+		// Unused resource preloading messages
+		break;		
 	case 0x101F:
 		_field2C = true;		
-		return messageResult;
-	case 0x1023:
-		// Unused resource preloading message
-		return messageResult;
+		break;		
 	}
 	return messageResult;
 }
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 275e8d3..eb043cb 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -39,14 +39,14 @@ public:
 	void handleMouseDown(int16 x, int16 y);
 	void handleMouseUp(int16 x, int16 y);
 	void handleSpaceKey();
-	void initScene1307Vars();
-	void initScene1405Vars();
-	void initScene2401Vars();
-	void initScene2801Vars();
-	void initScene2808Vars1();
-	void initScene2808Vars2();
-	void initScene3009Vars();
-	uint32 getScene2802MusicFileHash();
+	void initKeySlotsPuzzle();
+	void initMemoryPuzzle();
+	void initWaterPipesPuzzle();
+	void initRadioPuzzle();
+	void initTestTubes1Puzzle();
+	void initTestTubes2Puzzle();
+	void initCannonSymbolsPuzzle();
+	uint32 getCurrRadioMusicFileHash();
 protected:
 	Entity *_prevChildObject;
 	bool _someFlag1;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 9bd7b88..6bf6140 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -450,7 +450,7 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	Sprite *ssOpenButton;
 	
-	_vm->gameModule()->initScene1405Vars();
+	_vm->gameModule()->initMemoryPuzzle();
 	
 	SetUpdateHandler(&Scene1105::update);
 	SetMessageHandler(&Scene1105::handleMessage);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index f718d1e..d92cd66 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1258,7 +1258,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 	
-	_vm->gameModule()->initScene1307Vars();
+	_vm->gameModule()->initKeySlotsPuzzle();
 	
 	_dataResource.load(0x22102142);
 	_keyHolePoints = _dataResource.getPointArray(0xAC849240);
@@ -1568,7 +1568,7 @@ uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam &param
 Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _flag1(false) {
 	
-	_vm->gameModule()->initScene1307Vars();
+	_vm->gameModule()->initKeySlotsPuzzle();
 
 	SetMessageHandler(&Scene1308::handleMessage);
 	
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 1bb0548..f25efe2 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1584,7 +1584,7 @@ void AsScene1405Tile::hide() {
 Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
 
-	_vm->gameModule()->initScene1405Vars();
+	_vm->gameModule()->initMemoryPuzzle();
 	
 	setBackground(0x0C0C007D);
 	setPalette(0x0C0C007D);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index ae97c15..7df162c 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -187,7 +187,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	Sprite *tempSprite;
 	
 	setGlobalVar(V_FELL_DOWN_HOLE, 1);
-	_vm->gameModule()->initScene3009Vars();
+	_vm->gameModule()->initCannonSymbolsPuzzle();
 
 	SetMessageHandler(&Scene1705::handleMessage);
 	SetUpdateHandler(&Scene1705::update);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 1159c0b..028c883 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2003,7 +2003,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	//setGlobalVar(V_LIGHTS_ON, 1);
 	//DEBUG<<<
 
-	_vm->gameModule()->initScene3009Vars();
+	_vm->gameModule()->initCannonSymbolsPuzzle();
 
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852))
 		setSubVar(VA_IS_PUZZLE_INIT, 0x88460852, 1);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 94937bf..770a5c3 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -387,7 +387,7 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false),
 	_soundToggle(false), _asWaterSpitIndex(0) {
 
-	_vm->gameModule()->initScene2401Vars();
+	_vm->gameModule()->initWaterPipesPuzzle();
 
 	setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water
 	setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 870c14c..60cc581 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -83,7 +83,7 @@ static const uint32 kScene2725StaticSprites[] = {
 };
 
 Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule), _soundIndex(0), _flag1(false) {
+	: Module(vm, parentModule), _soundIndex(0), _raidoMusicInitialized(false) {
 	
 	_vm->_soundMan->addMusic(0x42212411, 0x04020210);
 	_vm->_soundMan->startMusic(0x04020210, 24, 2);
@@ -454,15 +454,15 @@ void Module2700::updateScene() {
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 21:
-			if (!_flag1) {
+			if (!_raidoMusicInitialized) {
 				_vm->_soundMan->stopMusic(0x04020210, 0, 1);
-				_vm->gameModule()->initScene2801Vars();
+				_vm->gameModule()->initRadioPuzzle();
 				_musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME);
 				_vm->_soundMan->addMusic(0x42212411, _musicFileHash);
 				_vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */);
 				_vm->_soundMan->addSound(0x42212411, 0x44014282);
 				_vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0);
-				_flag1 = true;
+				_raidoMusicInitialized = true;
 			}
 			break;
 		}
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index d11586e..4973211 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -38,7 +38,7 @@ public:
 	virtual ~Module2700();
 protected:
 	int _soundIndex;
-	bool _flag1;
+	bool _raidoMusicInitialized;
 	uint32 _scene2711StaticSprites[6];
 	uint32 _musicFileHash;
 	void createScene(int sceneNum, int which);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index c1e1790..174e5e0 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -372,7 +372,7 @@ void Module2800::updateScene() {
 
 void Module2800::updateMusic(bool halfVolume) {
 
-	uint32 newMusicFileHash = _vm->_gameModule->getScene2802MusicFileHash();
+	uint32 newMusicFileHash = _vm->_gameModule->getCurrRadioMusicFileHash();
 
 	if (!_musicResource)
 		_musicResource = new MusicResource(_vm);
@@ -402,7 +402,7 @@ void Module2800::updateMusic(bool halfVolume) {
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	_vm->gameModule()->initScene2801Vars();
+	_vm->gameModule()->initRadioPuzzle();
 
 	SetMessageHandler(&Scene2801::handleMessage);
 	SetUpdateHandler(&Scene::update);
@@ -657,9 +657,8 @@ void Scene2802::changeTuneStatus(int prevTuneStatus, int newTuneStatus) {
 	}
 
 	if (newTuneStatus == 0) {
-		if (_vm->_gameModule->getScene2802MusicFileHash() != 0) {
+		if (_vm->_gameModule->getCurrRadioMusicFileHash() != 0)
 			_vm->_soundMan->stopSound(0x00632252);
-		}
 		else
 			_vm->_soundMan->playSoundLooping(0x00632252);
 	} else if (newTuneStatus == 3 || newTuneStatus == 6) {
@@ -835,7 +834,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	};
 
 	setGlobalVar(V_BEEN_SHRINKING_ROOM, 1);
-	_vm->gameModule()->initScene2808Vars1();
+	_vm->gameModule()->initTestTubes1Puzzle();
 	
 	SetMessageHandler(&Scene2803::handleMessage);
 	
@@ -2521,9 +2520,9 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 	Sprite *tempSprite;
 
 	if (which == 0) {
-		_vm->gameModule()->initScene2808Vars1();
+		_vm->gameModule()->initTestTubes1Puzzle();
 	} else {
-		_vm->gameModule()->initScene2808Vars2();
+		_vm->gameModule()->initTestTubes2Puzzle();
 	}
 	
 	SetMessageHandler(&Scene2808::handleMessage);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index c3eb9e4..a6bc6eb 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -802,7 +802,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	_cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS);
 	debug("_cannonTargetStatus = %d", _cannonTargetStatus);
 	
-	_vm->gameModule()->initScene3009Vars();
+	_vm->gameModule()->initCannonSymbolsPuzzle();
 	
 	setGlobalVar(V_CANNON_SMACKER_NAME, 0);
 	


Commit: 126a306c899924cf774dfc0db1111728f9ac366b
    https://github.com/scummvm/scummvm/commit/126a306c899924cf774dfc0db1111728f9ac366b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Some cleanup:

- Remove _name field from Entity (wasn't really maintained by me and
  became useless)
- Remove obsolete TODOs
- Add STICK_LAST_FRAME constant for better readability
- Remove commented out callbackList TODOs (these were so far never
  used with over 90% of the game implemented)

Changed paths:
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/klayman.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index 36137a6..29524f8 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -52,8 +52,7 @@ Entity *MessageParam::asEntity() const {
 #define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
 
 Entity::Entity(NeverhoodEngine *vm, int priority)
-	: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL),
-	_name("Entity") {
+	: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL) {
 }
 
 Entity::~Entity() {
@@ -64,7 +63,6 @@ void Entity::draw() {
 }
 
 void Entity::handleUpdate() {
-	//debug("Entity(%s).handleUpdate", _name.c_str());
 	debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str());
 	if (_updateHandlerCb)
 		(this->*_updateHandlerCb)();
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 0b3e32c..89a1a42 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -53,10 +53,8 @@ protected:
 		uint32 _integer;
 		NPoint _point;
 		Entity *_entity;
-		// TODO: Other types...
 	};
 	MessageParamType _type;
-	// TODO: Constructors for the param types...
 };
 
 // TODO: Disable heavy debug stuff in release mode
@@ -75,7 +73,6 @@ const uint kMaxSoundResources = 16;
 
 class Entity {
 public:
-	Common::String _name; // Entity name for debugging purposes
 	Common::String _updateHandlerCbName;
 	Common::String _messageHandlerCbName;
 	Entity(NeverhoodEngine *vm, int priority);
@@ -105,7 +102,6 @@ protected:
 	int _priority;
 	SoundResource **_soundResources;
 	SoundResource *getSoundResource(uint index);
-	// TODO Add other sound stuff
 	void loadSound(uint index, uint32 fileHash);
 	void playSound(uint index, uint32 fileHash = 0);
 	void stopSound(uint index);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 8f0a94e..f06ce40 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -62,7 +62,6 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int
 	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
 	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
 	
-	// TODO DirtySurface
 	createSurface(surfacePriority, 320, 200);
 	_x = x;
 	_y = y;
@@ -475,10 +474,6 @@ void Klayman::gotoNextStateExt() {
 		AnimationCb cb = _nextStateCb;
 		_nextStateCb = NULL;
 		(this->*cb)();
-#if 0 // TODO (So far, with almost all Klayman subclasses implemented, _callbackList and related code seems unused)
-	} else if (_callbackList) {
-		removeCallbackList();
-#endif		
 	} else {
 		// Inform the scene that the current Klayman animation sequence has finished
 		sendMessage(_parentScene, 0x1006, 0);
@@ -2927,7 +2922,6 @@ void Klayman::stFalling() {
 	SetMessageHandler(&Klayman::hmLowLevelAnimation);
 	NextState(&Klayman::stFallTouchdown);
 	sendMessage(_parentScene, 0x2002, 0);
-	// TODO _callbackList = NULL; (See comment above)
 	_attachedSprite = NULL;
 	sendMessage(_parentScene, 0x8001, 0);
 }
@@ -3338,7 +3332,6 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		// TODO: It's not really a point but an x1/x2 pair
 		if (param.asPoint().y != 0) {
 			sub41CC40(param.asPoint().y, param.asPoint().x);
 		} else {
@@ -3575,9 +3568,11 @@ KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2000:
 		_isSittingInTeleporter = param.asInteger() != 0;
+		messageResult = 1;		
 		break;
 	case 0x4001:
 	case 0x4800:
@@ -3629,7 +3624,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		teleporterDisappear(0x3C2E4245);
 		break;
 	}
-	return 0;
+	return messageResult;
 }
 
 // KmScene1201
@@ -3816,6 +3811,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 	switch (messageNum) {
 	case 0x2000:
 		_isSittingInTeleporter = param.asInteger() != 0;
+		messageResult = 1;
 		break;
 	case 0x4001:
 	case 0x4800:
@@ -4270,9 +4266,11 @@ KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2032:
 		_isSittingInTeleporter = param.asInteger() != 0;
+		messageResult = 1;
 		break;
 	case 0x4001:
 	case 0x4800:
@@ -4349,7 +4347,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		startSpecialWalkLeft(param.asInteger());
 		break;
 	}
-	return 0;
+	return messageResult;
 }
 
 // KmScene1705
@@ -4493,9 +4491,11 @@ KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2000:
 		_isSittingInTeleporter = param.asInteger() != 0;
+		messageResult = 1;
 		break;
 	case 0x4001:
 	case 0x4800:
@@ -4547,7 +4547,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		teleporterDisappear(0x18AB4ED4);
 		break;
 	}
-	return 0;
+	return messageResult;
 }
 
 KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
@@ -5758,9 +5758,11 @@ KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 }
 
 uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
+	uint32 messageResult = 0;
 	switch (messageNum) {
 	case 0x2000:
 		_isSittingInTeleporter = param.asInteger() != 0;
+		messageResult = 1;
 		break;
 	case 0x4001:
 	case 0x4800:
@@ -5804,7 +5806,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 		teleporterDisappear(0xD82A4094);
 		break;
 	}
-	return 0;
+	return messageResult;
 }
 
 KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
@@ -5815,7 +5817,6 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	_surface->setClipRects(clipRects, clipRectsCount);
 
 	if (flag) {
-		// TODO Maybe? Don't know. Set Klayman clip rects
 		loadSound(3, 0x58E0C341);
 		loadSound(4, 0x40A00342);
 		loadSound(5, 0xD0A1C348);
@@ -5875,7 +5876,6 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	_surface->setClipRects(clipRects, clipRectsCount);
 
 	if (flag) {
-		// TODO Maybe? Don't know. Set Klayman clip rects
 		loadSound(3, 0x58E0C341);
 		loadSound(4, 0x40A00342);
 		loadSound(5, 0xD0A1C348);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 8e6b56b..4f8f584 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -200,7 +200,7 @@ AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
 	_y = 206;
 	createSurface(900, 177, 192);
 	startAnimation(0x022C90D4, -1, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1001Hammer::handleMessage);
 }
@@ -218,7 +218,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 	case 0x2000:
 		startAnimation(0x022C90D4, 1, -1);
 		playSound(0, 0xE741020A);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		break;
 	}
 	return 0;
@@ -332,8 +332,6 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
-	_name = "Scene1001";
-
 	Sprite *tempSprite;
 
 	SetMessageHandler(&Scene1001::handleMessage);
@@ -1130,7 +1128,7 @@ AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngi
 	_y = 240;
 	if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 		startAnimation(0x004A4495, -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
 		setVisible(false);
 	}
@@ -1177,7 +1175,7 @@ uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const Messa
 void AsScene1002OutsideDoorBackground::stOpenDoor() {
 	startAnimation(0x004A4495, 0, -1);
 	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	setVisible(true);
 }
 
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index c0bab71..768e781 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -229,7 +229,7 @@ AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag)
 	_y = -32;
 	if (flag) {
 		startAnimation(0x928F0C10, 15, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
 		startAnimation(0x928F0C10, 0, -1);
 		_newStickFrameIndex = 0;
@@ -246,7 +246,7 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &
 		break;
 	case 0x2006:
 		startAnimation(0x928F0C10, 1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		break;
 	}
 	return messageResult;
@@ -260,10 +260,10 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 	_y = 240;
 	SetUpdateHandler(&AsScene1201RightDoor::update);
 	SetMessageHandler(&AsScene1201RightDoor::handleMessage);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	if (flag) {
 		startAnimation(0xD088AC30, -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		_countdown = 25;
 	} else {
 		stopAnimation();
@@ -293,7 +293,7 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p
 
 void AsScene1201RightDoor::stOpenDoor() {
 	startAnimation(0xD088AC30, 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	setVisible(true);
 	playSound(0, calcHash("fxDoorOpen20"));
 }
@@ -419,7 +419,7 @@ void AsScene1201TntMan::stMoving() {
 	startAnimation(0x85084190, 0, -1);
 	SetMessageHandler(&AsScene1201TntMan::handleMessage);
 	SetSpriteUpdate(&AsScene1201TntMan::suMoving);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan)
@@ -687,11 +687,11 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
 	createSurface(800, 55, 199);
 	if (_klayman->getX() < 100) {
 		startAnimation(0x508A111B, 0, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		playSound(0, calcHash("fxDoorOpen03"));
 	} else {
 		startAnimation(0x508A111B, -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	}
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1201LeftDoor::handleMessage);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index d92cd66..945d7a9 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -310,7 +310,7 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 		_newStickFrameIndex = 0;
 	} else {
 		startAnimation(0x88148150, -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	}
 	loadSound(0, 0x68895082);
 	loadSound(1, 0x689BD0C1);
@@ -348,7 +348,7 @@ void AsScene1302Bridge::stRaiseBridge() {
 void AsScene1302Bridge::cbLowerBridgeEvent() {
 	sendMessage(_parentScene, 0x2032, 0);
 	startAnimation(0x88148150, -1, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
@@ -1210,7 +1210,7 @@ void AsScene1307Key::stInsertKey() {
 	sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]);
 	setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]);
 	SetSpriteUpdate(&AsScene1307Key::suInsertKey);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 void AsScene1307Key::stMoveKey() {
@@ -1237,13 +1237,13 @@ void AsScene1307Key::stMoveKey() {
 void AsScene1307Key::stUnlock() {
 	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
 	startAnimation(fileHashes[1], 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 void AsScene1307Key::stInsert() {
 	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
 	startAnimation(fileHashes[2], 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -1515,7 +1515,7 @@ uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageP
 void AsScene1308LightWallSymbols::stFadeIn() {
 	startAnimation(0x80180A10, 0, -1);
 	setVisible(true);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 void AsScene1308LightWallSymbols::stFadeOut() {
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index f25efe2..cfa1614 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -311,7 +311,7 @@ AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, b
 	createSurface1(0x04551900, 100);
 	SetUpdateHandler(&AsScene1401BackDoor::update);
 	SetMessageHandler(&AsScene1401BackDoor::handleMessage);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	if (isOpen) {
 		_isOpen = true;
 		startAnimation(0x04551900, -1,- 1);
@@ -355,7 +355,7 @@ void AsScene1401BackDoor::stOpenDoor() {
 	_isOpen = true;
 	setVisible(true);
 	startAnimation(0x04551900, 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	playSound(0, calcHash("fxDoorOpen24"));
 }
 
@@ -820,7 +820,7 @@ AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentSce
 		// Puzzle box is here
 		startAnimation(0x20060259, 0, -1);
 		loadSound(1, 0x61901C29);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	}
 }
 
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 382aedd..09bb375 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1062,7 +1062,7 @@ AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asC
 	SetUpdateHandler(&AsCommonCarConnector::update);
 	createSurface1(0x60281C10, 150);
 	startAnimation(0x60281C10, -1, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 void AsCommonCarConnector::update() {
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index c4a0904..0a02d85 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -205,7 +205,7 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 		}
 		createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex);
 		startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
 		_isPluggedIn = false;
 		_currPositionIndex = positionIndex;
@@ -377,7 +377,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) {
 	_someY = _y;
 	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0);
 	_playBackwards = true;
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	_currStep = 0;
 	_yAccel = 1;
 	SetUpdateHandler(&AsScene1907Symbol::update);
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 58f87d9..879250a 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -87,7 +87,7 @@ AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag)
 	SetMessageHandler(&AsScene2101Door::handleMessage);
 	if (flag) {
 		startAnimation(0x0C202B9C, -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
 		setVisible(false);
 	}
@@ -111,14 +111,14 @@ uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam &param,
 
 void AsScene2101Door::stOpenDoor() {
 	startAnimation(0x0C202B9C, 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	setVisible(true);
 	playSound(0, calcHash("fxDoorOpen32"));
 }
 
 void AsScene2101Door::stCloseDoor() {
 	startAnimation(0xC222A8D4, 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	setVisible(true);
 	NextState(&AsScene2101Door::stCloseDoorDone);
 	playSound(0, calcHash("fxDoorClose32"));
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 028c883..d82bf8c 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -426,7 +426,7 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *
 	if (_doorOpen) {
 		startAnimation(0xE2CB0412, -1, -1);
 		_countdown = 48;
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
 		startAnimation(0xE2CB0412, 0, -1);
 		_newStickFrameIndex = 0;
@@ -473,7 +473,7 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 void AsScene2201Door::stOpenDoor() {
 	_doorOpen = true;
 	startAnimation(0xE2CB0412, 0, -1);
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	playSound(0, calcHash("fxDoorOpen33"));
 }
 
@@ -1056,7 +1056,7 @@ AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint d
 	createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900);
 	if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) {
 		startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
 		startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1);
 		_newStickFrameIndex = 0;
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 770a5c3..7cc97f7 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -328,7 +328,7 @@ AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
 	createSurface1(0x44687810, 100);
 	_x = 320;
 	_y = 240;
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	SetUpdateHandler(&AsScene2401Door::update);
 	SetMessageHandler(&AsScene2401Door::handleMessage);
 	if (_isOpen) {
@@ -581,7 +581,7 @@ AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool i
 	createSurface1(0x80495831, 100);
 	_x = 320;
 	_y = 240;
-	_newStickFrameIndex = -2;
+	_newStickFrameIndex = STICK_LAST_FRAME;
 	if (_isOpen) {
 		startAnimation(0x80495831, -1, -1);
 		_countdown = 48;
@@ -619,7 +619,7 @@ uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam &param,
 		_isOpen = true;
 		setVisible(true);
 		startAnimation(0x80495831, 0, -1);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		playSound(0, calcHash("fxDoorOpen38"));
 		break;
 	}
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 60cc581..b0983de 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -559,7 +559,7 @@ AsCommonCarConnectorShadow::AsCommonCarConnectorShadow(NeverhoodEngine *vm, Spri
 	SetUpdateHandler(&AsCommonCarConnectorShadow::update);
 	createShadowSurface1(shadowSurface, 0x60281C10, 150);
 	startAnimation(0x60281C10, -1, -1);
-	_newStickFrameIndex = -2;	
+	_newStickFrameIndex = STICK_LAST_FRAME;	
 } 
 
 void AsCommonCarConnectorShadow::update() {
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 174e5e0..268b2c6 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -3101,7 +3101,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa
 	case 0x2000:
 		startAnimation(0x805D0029, 0, -1);
 		playSound(0, 0xEA005F40);
-		_newStickFrameIndex = -2;
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index a6bc6eb..7695248 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1227,7 +1227,7 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) {
 		setVisible(true);
 		if (skipAnim) {
 			startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0);
-			_newStickFrameIndex = -2;
+			_newStickFrameIndex = STICK_LAST_FRAME;
 		} else {
 			startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1);
 			SetMessageHandler(&AsScene3010DeadBolt::hmAnimation);
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 66f1178..f81be07 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -30,7 +30,6 @@ Sprite::Sprite(NeverhoodEngine *vm, int objectPriority)
 	: Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL),   
 	_dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0), _surface(NULL) {
 
-	_name = "Sprite"; 
 	SetMessageHandler(&Sprite::handleMessage);
 	
 }
@@ -119,21 +118,17 @@ void Sprite::setClipRect(NDrawRect& drawRect) {
 StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
 	: Sprite(vm, objectPriority), _spriteResource(vm) {
 
-	_name = "StaticSprite"; 
-
 }
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
 	: Sprite(vm, 0), _spriteResource(vm) {
 
-	_name = "StaticSprite"; 
 	init(calcHash(filename), surfacePriority, x, y, width, height);
-
 }
 
 StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
 	: Sprite(vm, 0), _spriteResource(vm) {
-	_name = "StaticSprite"; 
+
 	init(fileHash, surfacePriority, x, y, width, height);
 }
 
@@ -227,13 +222,11 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface
 }
 
 void AnimatedSprite::init() {
-	_name = "AnimatedSprite"; 
 	_currFrameTicks = 0;
 	_newAnimFileHash = 0;
 	_deltaX = 0;
 	_deltaY = 0;
 	_nextAnimFileHash = 0;
-	// TODO _callbackList = 0;
 	_plFirstFrameIndex = 0;
 	_currFrameIndex = 0;
 	_currStickFrameIndex = -1;
@@ -289,7 +282,7 @@ void AnimatedSprite::updateAnim() {
 
 	if (_newAnimFileHash == 0) {
 		if (_newStickFrameIndex != -1) {
-			_currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex;
+			_currStickFrameIndex = _newStickFrameIndex == STICK_LAST_FRAME ? _animResource.getFrameCount() - 1 : _newStickFrameIndex;
 			_newStickFrameIndex = -1;
 		} else if (_newStickFrameHash != 0) {
 			_currStickFrameIndex = MAX<int16>(0, _animResource.getFrameIndex(_newStickFrameHash));
@@ -360,7 +353,7 @@ void AnimatedSprite::updateAnim() {
 		}
 
 		if (_newStickFrameIndex != -1) {
-			_currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex;
+			_currStickFrameIndex = _newStickFrameIndex == STICK_LAST_FRAME ? _animResource.getFrameCount() - 1 : _newStickFrameIndex;
 			_newStickFrameIndex = -1;
 		} else if (_newStickFrameHash != 0) {
 			_currStickFrameIndex = MAX<int16>(0, _animResource.getFrameIndex(_newStickFrameHash));
@@ -428,9 +421,8 @@ void AnimatedSprite::updateFrameInfo() {
 	_currFrameTicks = frameInfo.counter;
 	processDelta();
 	_needRefresh = true;
-	if (frameInfo.frameHash != 0) {
+	if (frameInfo.frameHash != 0)
 		sendMessage(this, 0x100D, frameInfo.frameHash);
-	}
 }
 
 void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) {
@@ -499,7 +491,6 @@ void AnimatedSprite::gotoState(AnimationCb currStateCb) {
 		_finalizeStateCb = NULL;
 		(this->*cb)();
 	}
-	// TODO _callbackList = NULL;
 	_nextStateCb = NULL;
 	_currStateCb = currStateCb;
 	if (_currStateCb)
@@ -517,10 +508,6 @@ void AnimatedSprite::gotoNextState() {
 		_nextStateCb = NULL;
 		//debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str());
 		(this->*_currStateCb)();
-#if 0 // TODO		
-	} else if (_callbackList) {
-		removeCallbackList();
-#endif		
 	} else {
 		_currStateCb = NULL;
 	}
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index d34704d..358a37b 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -113,6 +113,8 @@ protected:
 #define NextState(callback) _nextStateCb = static_cast <void (AnimatedSprite::*)(void)> (callback); debug(2, "NextState(" #callback ")"); _nextStateCbName = #callback
 #define FinalizeState(callback) setFinalizeState(static_cast <void (AnimatedSprite::*)()> (callback));
 
+const int STICK_LAST_FRAME = -2;
+
 class AnimatedSprite : public Sprite {
 public:
 	AnimatedSprite(NeverhoodEngine *vm, int objectPriority);
@@ -140,11 +142,6 @@ protected:
 	int16 _deltaX, _deltaY;
 	byte _replOldColor, _replNewColor;
 	bool _playBackwards, _frameChanged;
-	/* TODO
-	callbackListIndex dw ?
-	callbackListCount dw ?
-	callbackList	dd ?
-	*/
 	AnimationCb _finalizeStateCb;
 	AnimationCb _currStateCb;
 	AnimationCb _nextStateCb;


Commit: ef8f0215cfa6287c5d45fef54f040276d95de9b2
    https://github.com/scummvm/scummvm/commit/ef8f0215cfa6287c5d45fef54f040276d95de9b2
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Add GameVars::dumpVars() for debugging

Changed paths:
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index eb043cb..40834ce 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -20,8 +20,6 @@
  *
  */
 
-// TODO: I couldn't come up with a better name than 'Module' so far
-
 #ifndef NEVERHOOD_GAMEMODULE_H
 #define NEVERHOOD_GAMEMODULE_H
 
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index 3e4e604..e56ec1e 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -32,41 +32,32 @@ GameVars::~GameVars() {
 }
 
 uint32 GameVars::getGlobalVar(uint32 nameHash) {
-	//debug("GameVars::getGlobalVar(%08X)", nameHash);
 	int16 varIndex = findSubVarIndex(0, nameHash);
 	return varIndex != -1 ? _vars[varIndex].value : 0;
 }
 
 void GameVars::setGlobalVar(uint32 nameHash, uint32 value) {
-	//debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value);
 	_vars[getSubVarIndex(0, nameHash)].value = value;
 }
 
 uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) {
-	//debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash);
 	uint32 value = 0;
 	int16 varIndex = findSubVarIndex(0, nameHash);
 	if (varIndex != -1) {
 		int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
-		if (subVarIndex != -1) {
+		if (subVarIndex != -1)
 			value = _vars[subVarIndex].value;
-		}
 	} 
 	return value;
 }
 
 void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) {
-	//debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value);
 	int16 varIndex = getSubVarIndex(0, nameHash);
-	//debug("  varIndex = %d", varIndex);
 	int16 subVarIndex = getSubVarIndex(varIndex, subNameHash);
-	//debug("  subVarIndex = %d", subVarIndex);
 	_vars[subVarIndex].value = value;
-	//_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value;
 }
 
 int16 GameVars::addVar(uint32 nameHash, uint32 value) {
-	//debug("GameVars::addVar(%08X, %d)", nameHash, value);
 	GameVar gameVar;
 	gameVar.nameHash = nameHash;
 	gameVar.value = value;
@@ -77,16 +68,13 @@ int16 GameVars::addVar(uint32 nameHash, uint32 value) {
 }
 
 int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) {
-	//debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash);
-	for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) {
+	for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex)
 		if (_vars[nextIndex].nameHash == subNameHash)
 			return nextIndex;
-	}
 	return -1;
 }
 
 int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
-	//debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value);
 	int16 nextIndex = _vars[varIndex].firstIndex;
 	int16 subVarIndex;
 	if (nextIndex == -1) {
@@ -102,13 +90,17 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) {
 }
 
 int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) {
-	//debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash);
 	int16 subVarIndex = findSubVarIndex(varIndex, subNameHash);
-	if (subVarIndex == -1) {
+	if (subVarIndex == -1)
 		subVarIndex = addSubVar(varIndex, subNameHash, 0);
-		debug("need to create: subVarIndex = %d", subVarIndex);
-	}
 	return subVarIndex;
 }
 
+void GameVars::dumpVars() {
+	for (Common::Array<GameVar>::iterator it = _vars.begin(); it != _vars.end(); ++it) {
+		GameVar gameVar = *it;
+		debug("%08X %08X %3d %3d", gameVar.nameHash, gameVar.value, gameVar.firstIndex, gameVar.nextIndex);
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 3e32803..623e5b5 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -176,6 +176,7 @@ public:
 	void setGlobalVar(uint32 nameHash, uint32 value);
 	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
 	void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value);
+	void dumpVars();
 protected:
 	Common::Array<GameVar> _vars;
 	int16 addVar(uint32 nameHash, uint32 value);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 6a06ad6..76c2bc09 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -155,6 +155,7 @@ Common::Error NeverhoodEngine::run() {
 			_gameModule->draw();
 			_screen->update();
 			nextFrameTime = _screen->getNextFrameTime();
+			//_gameVars->dumpVars();
 		};
 		
 		_soundMan->update();


Commit: 2e32b32808304a172844d835934e7aae6b8cd76f
    https://github.com/scummvm/scummvm/commit/2e32b32808304a172844d835934e7aae6b8cd76f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Start with the MenuModule

Changed paths:
  A engines/neverhood/menumodule.cpp
  A engines/neverhood/menumodule.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module.mk
    engines/neverhood/neverhood.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 80e6fbe..d87096d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -23,6 +23,7 @@
 #include "neverhood/gamemodule.h"
 
 #include "neverhood/graphics.h"
+#include "neverhood/menumodule.h"
 #include "neverhood/module1000.h"
 #include "neverhood/module1100.h"
 #include "neverhood/module1200.h"
@@ -68,8 +69,13 @@ static const uint32 kRadioMusicFileHashes[] = {
 	0x03322020
 };
 
+enum {
+	MENU_MODULE			= 9999
+};
+
 GameModule::GameModule(NeverhoodEngine *vm)
-	: Module(vm, NULL), _moduleNum(-1) {
+	: Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1),
+	_mainMenuRequested(false), _gameWasLoaded(false) {
 	
 	// Other initializations moved to actual engine class
 	// TODO
@@ -117,6 +123,13 @@ void GameModule::handleMouseUp(int16 x, int16 y) {
 	}				
 }
 
+void GameModule::handleEscapeKey() {
+	if (!_prevChildObject /* && _canRequestMainMenu TODO?*/)
+		_mainMenuRequested = true;
+	else
+		sendMessage(_childObject, 0x000C, 0);
+}
+
 void GameModule::handleSpaceKey() {
 	if (_childObject) {
 		debug(2, "GameModule::handleSpaceKey()");
@@ -418,6 +431,11 @@ void GameModule::startup() {
 #endif
 }
 
+void GameModule::checkMainMenu() {
+	if (_mainMenuRequested)
+		openMainMenu();
+}
+
 void GameModule::createModule(int moduleNum, int which) {
 	debug("GameModule::createModule(%d, %d)", moduleNum, which);
 	_moduleNum = moduleNum;
@@ -771,4 +789,49 @@ void GameModule::updateModule() {
 	}
 }
 
+void GameModule::openMainMenu() {
+	if (_childObject) {
+		sendMessage(_childObject, 0x101D, 0);
+		_childObject->draw();
+	} else {
+		// If there's no module, create one so there's something to return to
+		createModule(1000, 0);
+	}
+	// TODO Save FPS, Smacker handle, screen offsets, collisition sprites
+	_mainMenuRequested = false;
+	createMenuModule();
+}
+
+void GameModule::createMenuModule() {
+	if (!_prevChildObject) {
+		_prevChildObject = _childObject;
+		_prevModuleNum = _moduleNum;
+		_childObject = new MenuModule(_vm, this, 0);
+		_childObject->handleUpdate();
+		SetUpdateHandler(&GameModule::updateMenuModule);
+	}
+}
+
+void GameModule::updateMenuModule() {
+	if (!updateChild()) {
+		// TODO Restore FPS?
+		_childObject = _prevChildObject;
+		// TODO Restore Smacker handle, screen offsets, collision sprites
+		sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed?
+		_prevChildObject = NULL;
+		_moduleNum = _prevModuleNum;
+		SetUpdateHandler(&GameModule::updateModule);
+	} else if (_gameWasLoaded) {
+		debug("_gameWasLoaded!");
+		_gameWasLoaded = false;
+		delete _childObject;
+		delete _prevChildObject;
+		_childObject = NULL;
+		_prevChildObject = NULL;
+		_prevModuleNum = 0;
+		// TODO Create module from savegame values...
+		 // TODO createModuleByHash(...);
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 40834ce..3f66138 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -33,9 +33,11 @@ public:
 	GameModule(NeverhoodEngine *vm);
 	virtual ~GameModule();
 	void startup();
+	void checkMainMenu();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
 	void handleMouseUp(int16 x, int16 y);
+	void handleEscapeKey();
 	void handleSpaceKey();
 	void initKeySlotsPuzzle();
 	void initMemoryPuzzle();
@@ -47,6 +49,9 @@ public:
 	uint32 getCurrRadioMusicFileHash();
 protected:
 	Entity *_prevChildObject;
+	int _prevModuleNum;
+	bool _gameWasLoaded;
+	bool _mainMenuRequested;
 	bool _someFlag1;
 	bool _field2C;
 	uint32 _counter;
@@ -55,6 +60,9 @@ protected:
 	void createModule(int moduleNum, int which);
 	void createModuleByHash(uint32 nameHash);
 	void updateModule();
+	void openMainMenu();
+	void createMenuModule();
+	void updateMenuModule();
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
new file mode 100644
index 0000000..372dac1
--- /dev/null
+++ b/engines/neverhood/menumodule.cpp
@@ -0,0 +1,242 @@
+/* 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/menumodule.h"
+
+namespace Neverhood {
+
+enum {
+	MAIN_MENU		= 0
+};
+
+MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
+	
+	SetMessageHandler(&MenuModule::handleMessage);
+	
+	// TODO Check if the background actually needs to be saved
+	_savedBackground = new Background(_vm, 0);
+	_savedBackground->createSurface(0, 640, 480);
+	// TODO Save current palette
+	// TODO Stop all sounds and music
+
+	_savedPaletteData = _vm->_screen->getPaletteData();
+
+	createScene(MAIN_MENU, -1);
+}
+
+MenuModule::~MenuModule() {
+	_vm->_screen->setPaletteData(_savedPaletteData);
+}
+
+void MenuModule::createScene(int sceneNum, int which) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
+	case MAIN_MENU:
+		_childObject = new MainMenu(_vm, this);
+		break;
+	}
+	SetUpdateHandler(&MenuModule::updateScene);
+	_childObject->handleUpdate();
+}
+
+void MenuModule::updateScene() {
+	if (!updateChild()) {
+		switch (_sceneNum) {
+		case MAIN_MENU:
+			// TODO
+			switch (_moduleResult) {
+			case 0:
+				// 0048A2A5
+				debug("RESTART GAME");
+				break;
+			case 1:
+				debug("LOAD GAME");
+				// TODO createLoadGameMenu();
+				break;
+			case 2:
+				debug("SAVE GAME");
+				// TODO createSaveGameMenu();
+				break;
+			case 3:
+				debug("RESUME GAME");
+				leaveModule(0);
+				break;
+			case 4:
+				debug("QUIT GAME");
+				leaveModule(0);
+				// TODO _gameState->quitGame = true;
+				break;
+			case 5:
+				debug("CREDITS");
+				// TODO createCreditsScene();
+				break;
+			case 6:
+				debug("MAKING OF");
+				// TODO playMakingOf();
+				break;
+			case 7:
+				debug("TOGGLE MUSIC");
+				// TODO Toggle music 0048A367
+				createScene(MAIN_MENU, -1);
+				break;
+			case 8:
+				debug("DELETE GAME");
+				// TODO createDeleteGameMenu();
+				break;
+			default:
+				createScene(MAIN_MENU, -1);
+				break;
+			}
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+uint32 MenuModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	// TODO CHECKME Handles 0x101F, possibly just a debug/cache message which can be ignored?
+	return Module::handleMessage(messageNum, param, sender);;
+}
+
+static const uint32 kMainMenuButtonFileHashes[] = {
+	0x36C62120,
+	0x56C62120,
+	0x96C62120,
+	0x16C62121,
+	0x16C62122,
+	0x16C62124,
+	0x16C62128,
+	0x16C62130,
+	0x16C62100
+};
+
+MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) {
+
+	_spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]);
+	createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
+	_x = _spriteResource.getPosition().x;
+	_y = _spriteResource.getPosition().y;
+
+	// TODO Move to const array
+	switch (_buttonIndex) {
+	case 0:
+		_rect.set(52, 121, 110, 156);
+		break;
+	case 1:
+		_rect.set(52, 192, 109, 222);
+		break;
+	case 2:
+		_rect.set(60, 257, 119, 286);
+		break;
+	case 3:
+		_rect.set(67, 326, 120, 354);
+		break;
+	case 4:
+		_rect.set(70, 389, 128, 416);
+		break;
+	case 5:
+		_rect.set(523, 113, 580, 144);
+		break;
+	case 6:
+		_rect.set(525, 176, 577, 206);
+		break;
+	case 7:
+		_rect.set(527, 384, 580, 412);
+		break;
+	case 8:
+		_rect.set(522, 255, 580, 289);
+		break;
+	}
+	
+	setVisible(false);
+	_needRefresh = true;
+
+	SetUpdateHandler(&MainMenuButton::update);
+	SetMessageHandler(&MainMenuButton::handleMessage);
+
+}
+
+void MainMenuButton::update() {
+	StaticSprite::update();
+	if (_countdown != 0 && (--_countdown) == 0) {
+		setVisible(false);
+		sendMessage(_parentScene, 0x2000, _buttonIndex);
+	}
+}
+
+uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		if (_countdown == 0) {
+			setVisible(true);
+			_countdown = 4;
+		}
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
+MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
+	: Scene(vm, parentModule, true) {
+	
+	setBackground(0x08C0020C);
+	setPalette(0x08C0020C);
+	insertMouse433(0x00208084);
+	
+	insertStaticSprite(0x41137051, 100);
+	insertStaticSprite(0xC10B2015, 100);
+	
+	// TODO Only is music is disabled
+	_musicOnButton = insertStaticSprite(0x0C24C0EE, 100);
+
+	for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) {
+		Sprite *mainMenuButton = insertSprite<MainMenuButton>(this, buttonIndex);
+		_vm->_collisionMan->addSprite(mainMenuButton);
+	}
+	
+	SetUpdateHandler(&Scene::update);	
+	SetMessageHandler(&MainMenu::handleMessage);	
+
+}
+
+uint32 MainMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		leaveScene(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
new file mode 100644
index 0000000..c60698c
--- /dev/null
+++ b/engines/neverhood/menumodule.h
@@ -0,0 +1,71 @@
+/* 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.
+ *
+ */
+
+// TODO: I couldn't come up with a better name than 'Module' so far
+
+#ifndef NEVERHOOD_MENUMODULE_H
+#define NEVERHOOD_MENUMODULE_H
+
+#include "common/str.h"
+#include "neverhood/neverhood.h"
+#include "neverhood/module.h"
+#include "neverhood/scene.h"
+
+namespace Neverhood {
+
+class MenuModule : public Module {
+public:
+	MenuModule(NeverhoodEngine *vm, Module *parentModule, int which);
+	virtual ~MenuModule();
+protected:
+	int _sceneNum;
+	Common::String _savegameName;
+	Background *_savedBackground;
+	byte *_savedPaletteData;
+	// TODO _savegameList (list of strings?)
+	void createScene(int sceneNum, int which);
+	void updateScene();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class MainMenuButton : public StaticSprite {
+public:
+	MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex);
+protected:
+	Scene *_parentScene;
+	int _countdown;
+	uint _buttonIndex;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class MainMenu : public Scene {
+public:
+	MainMenu(NeverhoodEngine *vm, Module *parentModule);
+protected:
+	Sprite *_musicOnButton;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+} // End of namespace Neverhood
+
+#endif /* NEVERHOOD_MENUMODULE_H */
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 5cd41c8..224dfb5 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -11,6 +11,7 @@ MODULE_OBJS = \
 	gamevars.o \
 	graphics.o \
 	klayman.o \
+	menumodule.o \
 	module.o \
 	module1000.o \
 	module1100.o \
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 76c2bc09..631b050 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -85,12 +85,6 @@ Common::Error NeverhoodEngine::run() {
 	_res->addArchive("t.blb");
 
 	CursorMan.showMouse(true);
-	{
-		// DEBUG: Dummy cursor
-		byte buffer[2*2];
-		memset(buffer, 255, 4);
-		CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0);
-	}
 
 #if 0
 	// TODO: This should probably be implemented as debug command later 
@@ -119,6 +113,9 @@ Common::Error NeverhoodEngine::run() {
 			case Common::EVENT_KEYDOWN:
 				_keyState = event.kbd.keycode;
 				switch (_keyState) {
+				case Common::KEYCODE_ESCAPE:
+					_gameModule->handleEscapeKey();
+					break;
 				case Common::KEYCODE_SPACE:
 					_gameModule->handleSpaceKey();
 					break;
@@ -151,6 +148,7 @@ Common::Error NeverhoodEngine::run() {
 		}
 
 		if (_system->getMillis() >= nextFrameTime) {
+			_gameModule->checkMainMenu();
 			_gameModule->handleUpdate();
 			_gameModule->draw();
 			_screen->update();
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index a5f7b4d..a2437ba 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -90,11 +90,6 @@ void Screen::update() {
 			updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height));
 	}
 
-	/*
-	for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
-		debug("## (%d, %d, %d, %d)", (*ri).left, (*ri).top, (*ri).right, (*ri).bottom);
-	*/
-	
 	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
 		RenderItem &renderItem = (*it);
 		for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index bbf4f5f..69329fd 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -66,6 +66,7 @@ public:
 	int getFps();
 	void setPaletteData(byte *paletteData);
 	void unsetPaletteData(byte *paletteData);
+	byte *getPaletteData() { return _paletteData; }
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();


Commit: c43253bd6a0a4bdf7e7cecb872bfad86f400e7b5
    https://github.com/scummvm/scummvm/commit/c43253bd6a0a4bdf7e7cecb872bfad86f400e7b5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:32-07:00

Commit Message:
NEVERHOOD: Implement CreditsScene

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 372dac1..4ba6d32 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -25,7 +25,8 @@
 namespace Neverhood {
 
 enum {
-	MAIN_MENU		= 0
+	MAIN_MENU		= 0,
+	CREDITS_SCENE	= 1
 };
 
 MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -54,6 +55,9 @@ void MenuModule::createScene(int sceneNum, int which) {
 	case MAIN_MENU:
 		_childObject = new MainMenu(_vm, this);
 		break;
+	case CREDITS_SCENE:
+		_childObject = new CreditsScene(_vm, this, true);
+		break;
 	}
 	SetUpdateHandler(&MenuModule::updateScene);
 	_childObject->handleUpdate();
@@ -88,7 +92,7 @@ void MenuModule::updateScene() {
 				break;
 			case 5:
 				debug("CREDITS");
-				// TODO createCreditsScene();
+				createScene(CREDITS_SCENE, -1);
 				break;
 			case 6:
 				debug("MAKING OF");
@@ -108,6 +112,9 @@ void MenuModule::updateScene() {
 				break;
 			}
 			break;
+		case CREDITS_SCENE:
+			createScene(MAIN_MENU, -1);
+			break;
 		default:
 			break;
 		}
@@ -238,5 +245,102 @@ uint32 MainMenu::handleMessage(int messageNum, const MessageParam &param, Entity
 	return 0;
 }
 
+static const uint32 kCreditsSceneFileHashes[] = {
+	0x6081128C,
+	0x608112BC,
+	0x608112DC,
+	0x6081121C,
+	0x6081139C,
+	0x6081109C,
+	0x6081169C,
+	0x60811A9C,
+	0x6081029C,
+	0x0081128C,
+	0x008112BC,
+	0x008012BC,
+	0x008112DC,
+	0x0081121C,
+	0x0081139C,
+	0x0081109C,
+	0x0081169C,
+	0x00811A9C,
+	0x0081029C,
+	0x0081329C,
+	0xC08112BC,
+	0xC08112DC,
+	0xC081121C,
+	0xC081139C,
+	0
+};
+
+CreditsScene::CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAbort)
+	: Scene(vm, parentModule, true), _canAbort(canAbort), _screenIndex(0), _ticksDuration(0),
+	_countdown(216) {
+
+	SetUpdateHandler(&CreditsScene::update);	
+	SetMessageHandler(&CreditsScene::handleMessage);
+	
+	setBackground(0x6081128C);
+	setPalette(0x6081128C);
+
+	_ticksTime = _vm->_system->getMillis() + 202100;
+		
+	_musicResource = new MusicResource(_vm);
+	_musicResource->load(0x30812225);
+	_musicResource->play(0);
+	
+}
+
+CreditsScene::~CreditsScene() {
+	_musicResource->unload();
+	delete _musicResource;
+}
+
+void CreditsScene::update() {
+	Scene::update();
+	if (_countdown != 0) {
+		if (_screenIndex == 23 && _vm->_system->getMillis() > _ticksTime)
+			leaveScene(0);
+		else if ((--_countdown) == 0) {
+			++_screenIndex;
+			if (kCreditsSceneFileHashes[_screenIndex] == 0)
+				leaveScene(0);
+			else {
+				_background->load(kCreditsSceneFileHashes[_screenIndex]);
+				_palette->addPalette(kCreditsSceneFileHashes[_screenIndex], 0, 256, 0);
+				if (_screenIndex < 5)
+					_countdown = 192;
+				else if (_screenIndex < 15)
+					_countdown = 144;
+				else if (_screenIndex < 16)
+					_countdown = 216;
+				else if (_screenIndex < 23)
+					_countdown = 144;
+				else
+					_countdown = 1224;
+			}
+		}
+	}
+}
+
+uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x0009:
+		leaveScene(0);
+		break;
+	case 0x000B://TODO Implement this message
+		if (param.asInteger() == 27 && _canAbort)
+			leaveScene(0);
+		break;
+	case 0x101D:
+		_ticksDuration = _ticksTime - _vm->_system->getMillis();
+		break;
+	case 0x101E:
+		_ticksTime = _ticksDuration + _vm->_system->getMillis();
+		break;
+	}
+	return 0;
+}
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index c60698c..4805f67 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -66,6 +66,21 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class CreditsScene : public Scene {
+public:
+	CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAbort);
+	virtual ~CreditsScene();
+protected:
+	int _screenIndex;
+	int _countdown;
+	MusicResource *_musicResource;
+	uint32 _ticksTime;
+	uint32 _ticksDuration;
+	bool _canAbort;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MENUMODULE_H */


Commit: 5ba8f2e9c8f94f7f72dd32755975258007cbfca6
    https://github.com/scummvm/scummvm/commit/5ba8f2e9c8f94f7f72dd32755975258007cbfca6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Add making of video to the main menu

- Clear render queue at each scene initiailization
- Fix mouse cursor visibility (again :)
- Fix SmackerScene screen clearing

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h
    engines/neverhood/mouse.cpp
    engines/neverhood/mouse.h
    engines/neverhood/scene.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d87096d..a574fa5 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -109,7 +109,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) {
 		mousePos.x = x;
 		mousePos.y = y;
 		debug(2, "GameModule::handleMouseDown(%d, %d)", x, y);
-		sendPointMessage(_childObject, 1, mousePos);
+		sendPointMessage(_childObject, 0x0001, mousePos);
 	}				
 }
 
@@ -119,7 +119,7 @@ void GameModule::handleMouseUp(int16 x, int16 y) {
 		mousePos.x = x;
 		mousePos.y = y;
 		debug(2, "GameModule::handleMouseUp(%d, %d)", x, y);
-		sendPointMessage(_childObject, 2, mousePos);
+		sendPointMessage(_childObject, 0x0002, mousePos);
 	}				
 }
 
@@ -133,7 +133,7 @@ void GameModule::handleEscapeKey() {
 void GameModule::handleSpaceKey() {
 	if (_childObject) {
 		debug(2, "GameModule::handleSpaceKey()");
-		sendMessage(_childObject, 9, 0);
+		sendMessage(_childObject, 0x0009, 0);
 	}				
 }
 
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 4ba6d32..9748919 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -26,7 +26,25 @@ namespace Neverhood {
 
 enum {
 	MAIN_MENU		= 0,
-	CREDITS_SCENE	= 1
+	CREDITS_SCENE	= 1,
+	MAKING_OF		= 2
+};
+
+static const uint32 kMakingOfSmackerFileHashList[] = {
+	0x21082409,
+	0x21082809,
+	0x21083009,
+	0x21080009,
+	0x21086009,
+	0x2108A009,
+	0x21092009,
+	0x210A2009,
+	0x210C2009,
+	0x21082411,
+	0x21082811,
+	0x21083011,
+	0x21080011,
+	0
 };
 
 MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -58,6 +76,9 @@ void MenuModule::createScene(int sceneNum, int which) {
 	case CREDITS_SCENE:
 		_childObject = new CreditsScene(_vm, this, true);
 		break;
+	case MAKING_OF:
+		createSmackerScene(kMakingOfSmackerFileHashList, false, true, true);
+		break;
 	}
 	SetUpdateHandler(&MenuModule::updateScene);
 	_childObject->handleUpdate();
@@ -88,7 +109,7 @@ void MenuModule::updateScene() {
 			case 4:
 				debug("QUIT GAME");
 				leaveModule(0);
-				// TODO _gameState->quitGame = true;
+				_vm->quitGame();
 				break;
 			case 5:
 				debug("CREDITS");
@@ -96,7 +117,7 @@ void MenuModule::updateScene() {
 				break;
 			case 6:
 				debug("MAKING OF");
-				// TODO playMakingOf();
+				createScene(MAKING_OF, -1);
 				break;
 			case 7:
 				debug("TOGGLE MUSIC");
@@ -113,6 +134,7 @@ void MenuModule::updateScene() {
 			}
 			break;
 		case CREDITS_SCENE:
+		case MAKING_OF:
 			createScene(MAIN_MENU, -1);
 			break;
 		default:
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 4805f67..77cef44 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -20,8 +20,6 @@
  *
  */
 
-// TODO: I couldn't come up with a better name than 'Module' so far
-
 #ifndef NEVERHOOD_MENUMODULE_H
 #define NEVERHOOD_MENUMODULE_H
 
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 8cd5e60..105d170 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -42,7 +42,7 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect)
 
 Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
 	: StaticSprite(vm, 2000), _mouseType(kMouseType435),
-	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(false) {
+	_mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
 	
 	init(fileHash);
 	if (_x <= _x1) {
@@ -81,6 +81,7 @@ void Mouse::init(uint32 fileHash) {
 	_deltaRect = _drawRect;
 	processDelta();
 	_needRefresh = true;
+	CursorMan.showMouse(false);
 }
 
 void Mouse::load(uint32 fileHash) {
@@ -89,12 +90,10 @@ void Mouse::load(uint32 fileHash) {
 }
 
 void Mouse::update() {
-	if (_visible && !_surface->getVisible()) {
+	if (CursorMan.isVisible() && !_surface->getVisible()) {
 		CursorMan.showMouse(false);
-		_visible = false;
-	} else if (!_visible && _surface->getVisible()) {
+	} else if (!CursorMan.isVisible() && _surface->getVisible()) {
 		CursorMan.showMouse(true);
-		_visible = true;
 	}
 	updateCursor();
 	_frameNum++;
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index 2b0e8b7..0b927de 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -52,7 +52,6 @@ protected:
 	int16 _x1;
 	int16 _x2;
 	int _type;
-	bool _visible;
 	void init(uint32 fileHash);	
 	void update();
 	void updateCursorNum();
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index ac08c14..9e49c6b 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -55,6 +55,8 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	
 	SetUpdateHandler(&Scene::update);
 	SetMessageHandler(&Scene::handleMessage);
+	
+	_vm->_screen->clearRenderQueue();
 }
 
 Scene::~Scene() {
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index a2437ba..7321ddb 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -153,6 +153,13 @@ void Screen::updatePalette() {
 
 void Screen::clear() {
 	memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h);
+	_fullRefresh = true;
+	clearRenderQueue();
+}
+
+void Screen::clearRenderQueue() {
+	_renderQueue->clear();
+	_prevRenderQueue->clear();
 }
 
 void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version,
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 69329fd..4e7618b 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -70,6 +70,7 @@ public:
 	void testPalette(byte *paletteData);
 	void updatePalette();
 	void clear();
+	void clearRenderQueue();
 	void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version,
 		const Graphics::Surface *shadowSurface = NULL);
 	void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version);
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index d4f65b3..0ed6890 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -37,9 +37,8 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl
 		_canAbort = true;
 	}
 	
-	if (_doubleSurface) {
+	if (!_doubleSurface)
 		_vm->_screen->clear();
-	}
 
 	_fileHash[0] = 0; 
 	_fileHash[1] = 0;


Commit: f8ff1cc12f06592890a2c0c791ef4de94b4603e8
    https://github.com/scummvm/scummvm/commit/f8ff1cc12f06592890a2c0c791ef4de94b4603e8
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Add CreditsScene to Module1300 and Module1800 (played after the game end and after jumping into the hole...)

Changed paths:
    engines/neverhood/module1300.cpp
    engines/neverhood/module1800.cpp



diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 945d7a9..79eda7f 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -27,6 +27,7 @@
 #include "neverhood/module2200.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/diskplayerscene.h"
+#include "neverhood/menumodule.h"
 #include "neverhood/navigationscene.h"
 #include "neverhood/smackerscene.h"
 
@@ -45,7 +46,7 @@ static const uint32 kModule1300SoundList[] = {
 Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	_vm->_soundMan->addMusic(0x61C090, 0x203197);
+	_vm->_soundMan->addMusic(0x61C090, 0x00203197);
 	_vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList);
 	_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150);
 	_vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0);
@@ -113,86 +114,89 @@ void Module1300::createScene(int sceneNum, int which) {
 	switch (_vm->gameState().sceneNum) {
 	case 1:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x203197, 0, 2);
+		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1302(_vm, this, which);
 		break;
 	case 2:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new Scene1303(_vm, this, which);
 		break;
 	case 3:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new Scene1304(_vm, this, which);
 		break;
 	case 4:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x203197, 0, 2);
+		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1305(_vm, this, which);
 		break;
 	case 5:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x203197, 0, 2);
+		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1306(_vm, this, which);
 		break;
 	case 6:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x203197, 0, 2);
+		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1307(_vm, this, which);
 		break;
 	case 7:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x203197, 0, 2);
+		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1308(_vm, this, which);
 		break;
 	case 8:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 1);
 		break;
 	case 9:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createSmackerScene(0x20082818, true, true, false);
 		break;
 	case 10:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createSmackerScene(0x20082828, true, true, false);
 		break;
 	case 11:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B27A8, which);
 		break;
 	case 12:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B2718, which);
 		break;
 	case 13:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B27D8, which);
 		break;
 	case 14:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B2808, which);
 		break;
 	case 15:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B2838, which);
 		break;
 	case 16:
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x203197, 0, 2);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new Scene1317(_vm, this, which);
 		break;
 	case 17:
 		// TODO: Credits scene
+		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
+		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
+		_childObject = new CreditsScene(_vm, this, false);
 		break;
 	}
 	SetUpdateHandler(&Module1300::updateScene);
@@ -291,7 +295,7 @@ void Module1300::updateScene() {
 			createScene(17, -1);
 			break;
 		case 17:
-			// TODO
+			leaveModule(1);
 			break;
 		}
 	}
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index ea6182d..e4b189b 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -22,6 +22,7 @@
 
 #include "neverhood/module1800.h"
 #include "neverhood/navigationscene.h"
+#include "neverhood/menumodule.h"
 
 namespace Neverhood {
 
@@ -91,7 +92,7 @@ void Module1800::createScene(int sceneNum, int which) {
 		createSmackerScene(0x0168B121, true, true, false);
 		break;
 	case 8:
-		// TODO _childObject = new CreditsScene(_vm, this, 0);
+		_childObject = new CreditsScene(_vm, this, false);
 		break;
 	case 9:
 		// NOTE: Newly introduced sceneNum 9 (was duplicate 3 with own update handler)


Commit: 8d97f26cef90f5db41c4153b68eff48700f7501d
    https://github.com/scummvm/scummvm/commit/8d97f26cef90f5db41c4153b68eff48700f7501d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Fix AsScene2402Door animation

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2400.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index a574fa5..2a7de46 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -366,12 +366,13 @@ void GameModule::startup() {
 	setGlobalVar(V_RADIO_ENABLED, 1);
 	setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 	setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
+	setGlobalVar(V_TV_JOKE_TOLD, 1);
 	// <<<DEBUG
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 3;
-	createModule(1300, -1);
+	_vm->gameState().sceneNum = 1;
+	createModule(2400, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 7cc97f7..a017c11 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -574,16 +574,16 @@ static const uint32 kScene2402FileHashes[] = {
 };
 
 AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen) {
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) {
 
 	SetUpdateHandler(&AsScene2402Door::update);
 	SetMessageHandler(&AsScene2402Door::handleMessage);
 	createSurface1(0x80495831, 100);
 	_x = 320;
 	_y = 240;
-	_newStickFrameIndex = STICK_LAST_FRAME;
 	if (_isOpen) {
 		startAnimation(0x80495831, -1, -1);
+		_newStickFrameIndex = STICK_LAST_FRAME;
 		_countdown = 48;
 	} else {
 		stopAnimation();
@@ -749,7 +749,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x081A60A8, 1100);
 	_ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100);
 	_klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2());
-	_asDoor = insertSprite<AsScene2402Door>(this, which == 1/*CHECKME or != ?*/);
+	_asDoor = insertSprite<AsScene2402Door>(this, which == 0);
 	insertSprite<AsScene2402TV>(_klayman);
 	insertStaticSprite(0x3A01A020, 200);
 


Commit: 54c83924ce072c2d472b4c5c1c5f1748df579257
    https://github.com/scummvm/scummvm/commit/54c83924ce072c2d472b4c5c1c5f1748df579257
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Add class NonRepeatingRandomNumbers

- Simplify GameModule::initKeySlotsPuzzle()

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 2a7de46..f5f7e4c 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -138,41 +138,14 @@ void GameModule::handleSpaceKey() {
 }
 
 void GameModule::initKeySlotsPuzzle() {
-
-	// Exit if it's already initialized
-	if (getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10))
-		return;
-
-	for (uint i = 0; i < 3; i++) {
-		bool more;
-		do {
-			more = false;
-			setSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
-			if (i > 0) {
-				for (uint j = 0; j < i && !more; j++) {
-					more = getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, j) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i);
-				}
-			}
-		} while (more);
-	}
-
-	for (uint i = 0; i < 3; i++) {
-		bool more;
-		do {
-			more = false;
-			setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
-			if (i > 0) {
-				for (uint j = 0; j < i && !more; j++) {
-					more = getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i);
-				}
-			}
-			if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i))
-				more = true;
-		} while (more);
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) {
+		NonRepeatingRandomNumbers keySlots(_vm->_rnd, 16);
+		for (uint i = 0; i < 3; i++) {
+			setSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i, keySlots.getNumber());
+			setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, keySlots.getNumber());
+		}
+		setSubVar(VA_IS_PUZZLE_INIT, 0x25400B10, 1);
 	}
-
-	setSubVar(VA_IS_PUZZLE_INIT, 0x25400B10, 1);
-
 }
 
 void GameModule::initMemoryPuzzle() {
@@ -371,8 +344,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 1;
-	createModule(2400, -1);
+	_vm->gameState().sceneNum = 6;
+	createModule(1300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -835,4 +808,21 @@ void GameModule::updateMenuModule() {
 	}
 }
 
+NonRepeatingRandomNumbers::NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count)
+	: _rnd(rnd) {
+	for (int i = 0; i < count; i++)
+		_numbers.push_back(i);
+}
+
+int NonRepeatingRandomNumbers::getNumber() {
+	int number;
+	if (!empty()) {
+		uint index = _rnd->getRandomNumber(_numbers.size() - 1);
+		number = _numbers[index];
+		_numbers.remove_at(index);
+	} else
+		number = 0;
+	return number;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 3f66138..6aa711d 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -65,6 +65,16 @@ protected:
 	void updateMenuModule();
 };
 
+class NonRepeatingRandomNumbers {
+public:
+	NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count);
+	int getNumber();
+	bool empty() const { return _numbers.empty(); }
+protected:
+	Common::RandomSource *_rnd;
+	Common::Array<int> _numbers;
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE_H */


Commit: 5af2de503ecf4e621370bf51a16472e162e543ac
    https://github.com/scummvm/scummvm/commit/5af2de503ecf4e621370bf51a16472e162e543ac
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Rewrite GameModule::initMemoryPuzzle() to use NonRepeatingRandomNumbers

- Change NonRepeatingRandomNumbers

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f5f7e4c..ddbd4d9 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -149,102 +149,36 @@ void GameModule::initKeySlotsPuzzle() {
 }
 
 void GameModule::initMemoryPuzzle() {
-
-	// TODO: Give better names
-
-	byte array44[3];
-	byte array3C[10];
-	byte array30[48];
-	uint32 index3 = 48;
-	uint32 index2 = 9;
-	uint32 index1 = 2;
-	uint32 rndIndex;
-
-	// Exit if it's already initialized
-	if (getSubVar(VA_IS_PUZZLE_INIT, 0xC8606803))
-		return;
-
-	for (uint32 i = 0; i < 3; i++)
-		setSubVar(VA_CURR_DICE_NUMBERS, i, 1);
-
-	for (byte i = 0; i < 3; i++)
-		array44[i] = i;
-
-	for (byte i = 0; i < 10; i++)
-		array3C[i] = i;
-
-	for (byte i = 0; i < 48; i++)
-		array30[i] = i;
-
-	rndIndex = _vm->_rnd->getRandomNumber(3 - 1);
-
-	setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex], 5);
-
-	for (byte i = 5; i < 9; i++)
-		array3C[i] = array3C[i + 1];
-
-	while (rndIndex < 2) {
-		array44[rndIndex] = array44[rndIndex + 1];
-		rndIndex++;
-	}
-
-	for (int i = 0; i < 2; i++) {
-		uint32 rndIndex1 = _vm->_rnd->getRandomNumber(index2 - 1); // si
-		uint32 rndIndex2 = _vm->_rnd->getRandomNumber(index1 - 1); // di
-		setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex2], array3C[rndIndex1]);
-		index2--;
-		while (rndIndex1 < index2) {
-			array3C[rndIndex1] = array3C[rndIndex1 + 1];
-			rndIndex1++;
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0xC8606803)) {
+		NonRepeatingRandomNumbers diceIndices(_vm->_rnd, 3);	
+		NonRepeatingRandomNumbers availableTiles(_vm->_rnd, 48);
+		NonRepeatingRandomNumbers tileSymbols(_vm->_rnd, 10);
+		for (uint32 i = 0; i < 3; i++)
+			setSubVar(VA_CURR_DICE_NUMBERS, i, 1);
+		// Set special symbols
+		// Symbol 5 is always one the three special symbols
+		setSubVar(VA_DICE_MEMORY_SYMBOLS, diceIndices.getNumber(), 5);
+		tileSymbols.removeNumber(5);
+		for (int i = 0; i < 2; i++)
+			setSubVar(VA_DICE_MEMORY_SYMBOLS, diceIndices.getNumber(), tileSymbols.getNumber());
+		// Insert special symbols tiles
+		for (uint32 i = 0; i < 3; ++i) {
+			int tileSymbolOccurence = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2;
+			setSubVar(VA_GOOD_DICE_NUMBERS, i, tileSymbolOccurence);
+			while (tileSymbolOccurence--)
+				setSubVar(VA_TILE_SYMBOLS, availableTiles.getNumber(), getSubVar(VA_DICE_MEMORY_SYMBOLS, i));
 		}
-		index1--;
-		while (rndIndex2 < index1) {
-			array44[rndIndex2] = array44[rndIndex2 + 1];
-			rndIndex2++;
+		// Fill the remaining tiles
+		uint32 tileSymbolIndex = 0;
+		while (!availableTiles.empty()) {
+			setSubVar(VA_TILE_SYMBOLS, availableTiles.getNumber(), tileSymbols[tileSymbolIndex]);
+			setSubVar(VA_TILE_SYMBOLS, availableTiles.getNumber(), tileSymbols[tileSymbolIndex]);
+			tileSymbolIndex++;
+			if (tileSymbolIndex >= tileSymbols.size())
+				tileSymbolIndex = 0;
 		}
+		setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1);
 	}
-
-	for (uint32 i = 0; i < 3; i++) {
-		uint32 rndValue = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2;
-		uint32 index4 = 0;
-		setSubVar(VA_GOOD_DICE_NUMBERS, i, rndValue);
-		while (index4 < rndValue) {
-			uint32 rndIndex3 = _vm->_rnd->getRandomNumber(index3 - 1);
-			setSubVar(VA_TILE_SYMBOLS, array30[rndIndex3], getSubVar(VA_DICE_MEMORY_SYMBOLS, i));
-			index3--;
-			while (rndIndex3 < index3) {
-				array30[rndIndex3] = array30[rndIndex3 + 1];
-				rndIndex3++;
-			}
-			index4++;
-		}
-	}
-
-	uint32 index5 = 0;
-	while (index3 != 0) {
-		uint32 rndIndex4 = _vm->_rnd->getRandomNumber(index3 - 1);
-		index1 = array3C[index5];
-		setSubVar(VA_TILE_SYMBOLS, array30[rndIndex4], index1);
-		index3--;
-		while (rndIndex4 < index3) {
-			array30[rndIndex4] = array30[rndIndex4 + 1];
-			rndIndex4++;
-		}
-		uint32 rndIndex5 = _vm->_rnd->getRandomNumber(index3 - 1);
-		setSubVar(VA_TILE_SYMBOLS, array30[rndIndex5], index1);
-		index3--;
-		while (rndIndex5 < index3) {
-			array30[rndIndex5] = array30[rndIndex5 + 1];
-			rndIndex5++;
-		}
-		index5++;
-		if (index5 >= index2)
-			index5 = 0;
-
-	}
-
-	setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1);
-	
 }
 
 void GameModule::initWaterPipesPuzzle() {
@@ -344,8 +278,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 6;
-	createModule(1300, -1);
+	_vm->gameState().sceneNum = 4;
+	createModule(1100, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -811,18 +745,26 @@ void GameModule::updateMenuModule() {
 NonRepeatingRandomNumbers::NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count)
 	: _rnd(rnd) {
 	for (int i = 0; i < count; i++)
-		_numbers.push_back(i);
+		push_back(i);
 }
 
 int NonRepeatingRandomNumbers::getNumber() {
 	int number;
 	if (!empty()) {
-		uint index = _rnd->getRandomNumber(_numbers.size() - 1);
-		number = _numbers[index];
-		_numbers.remove_at(index);
+		uint index = _rnd->getRandomNumber(size() - 1);
+		number = (*this)[index];
+		remove_at(index);
 	} else
 		number = 0;
 	return number;
 }
 
+void NonRepeatingRandomNumbers::removeNumber(int number) {
+	for (uint i = 0; i < size(); ++i)
+		if ((*this)[i] == number) {
+			remove_at(i);
+			break;
+		}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 6aa711d..8fafe2b 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -65,14 +65,13 @@ protected:
 	void updateMenuModule();
 };
 
-class NonRepeatingRandomNumbers {
+class NonRepeatingRandomNumbers : public Common::Array<int> {
 public:
 	NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count);
 	int getNumber();
-	bool empty() const { return _numbers.empty(); }
+	void removeNumber(int number);
 protected:
 	Common::RandomSource *_rnd;
-	Common::Array<int> _numbers;
 };
 
 } // End of namespace Neverhood


Commit: 47994441cd5432df0c75953ea7d998c4b87c5443
    https://github.com/scummvm/scummvm/commit/47994441cd5432df0c75953ea7d998c4b87c5443
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Move setting of debug variables to the GameModule

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/navigationscene.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 0371903..0ffb0b0 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -342,12 +342,6 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 
 	_asKey = insertSprite<AsDiskplayerSceneKey>();
 
-	// DEBUG>>>: Give all disks
-	for (int i = 0; i < 20; i++) {
-		setSubVar(VA_IS_TAPE_INSERTED, i, 1);
-	}
-	// DEBUG<<<
-
 	for (int i = 0; i < 20; i++) {
 		_diskAvailable[i] = 0;
 		if (getSubVar(VA_IS_TAPE_INSERTED, i))
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index ddbd4d9..38d8b99 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -178,6 +178,21 @@ void GameModule::initMemoryPuzzle() {
 				tileSymbolIndex = 0;
 		}
 		setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1);
+
+		// DEBUG>>>
+		// TODO: Some debug code: Leave two matching tiles open
+		for (int i = 0; i < 48; i++)
+			setSubVar(VA_IS_TILE_MATCH, i, 1);
+		int debugIndex = 0;
+		setSubVar(VA_IS_TILE_MATCH, debugIndex, 0);
+		for (int i = 0; i < 48; i++) {
+			if (i != debugIndex && getSubVar(VA_TILE_SYMBOLS, i) == getSubVar(VA_TILE_SYMBOLS, debugIndex)) {
+				setSubVar(VA_IS_TILE_MATCH, i, 0);
+				break;
+			}
+		}
+		// <<<DEBUG
+
 	}
 }
 
@@ -274,6 +289,20 @@ void GameModule::startup() {
 	setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 	setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
 	setGlobalVar(V_TV_JOKE_TOLD, 1);
+	// Give all disks
+	for (int i = 0; i < 20; i++)
+		setSubVar(VA_IS_TAPE_INSERTED, i, 1);
+	setSubVar(VA_IS_KEY_INSERTED, 0, 1);
+	setSubVar(VA_IS_KEY_INSERTED, 1, 1);
+	setSubVar(VA_IS_KEY_INSERTED, 2, 1);
+	for (uint32 index = 0; index < 9; index++)
+		setSubVar(VA_CUBE_POSITIONS, index, 7 - index);
+	setGlobalVar(V_WALL_BROKEN, 0);
+	setGlobalVar(V_WORLDS_JOINED, 1);
+	setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0);
+	// Enable all locations
+	for (int i = 0; i < 6; i++)
+		setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1);
 	// <<<DEBUG
 
 #if 1
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 79eda7f..ab63c29 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1254,12 +1254,6 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL),
 	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
 
-	//DEBUG>>>
-	setSubVar(VA_IS_KEY_INSERTED, 0, 1);
-	setSubVar(VA_IS_KEY_INSERTED, 1, 1);
-	setSubVar(VA_IS_KEY_INSERTED, 2, 1);
-	//DEBUG<<<
-
 	Sprite *tempSprite;
 	
 	_vm->gameModule()->initKeySlotsPuzzle();
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index cfa1614..7373172 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1590,20 +1590,6 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x0C0C007D);
 	insertMouse435(0xC00790C8, 20, 620);
 	
-	// DEBUG>>>
-	// TODO: Some debug code: Leave two matching tiles open
-	for (int i = 0; i < 48; i++)
-		setSubVar(VA_IS_TILE_MATCH, i, 1);
-	int debugIndex = 0;
-	setSubVar(VA_IS_TILE_MATCH, debugIndex, 0);
-	for (int i = 0; i < 48; i++) {
-		if (i != debugIndex && getSubVar(VA_TILE_SYMBOLS, i) == getSubVar(VA_TILE_SYMBOLS, debugIndex)) {
-			setSubVar(VA_IS_TILE_MATCH, i, 0);
-			break;
-		}
-	}
-	// <<<DEBUG
-	
 	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
 		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
 		_vm->_collisionMan->addSprite(_tiles[tileIndex]);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index d82bf8c..b3798d2 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -896,11 +896,6 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	addEntity(_palette);
 	insertMouse435(0x00A08089, 20, 620);
 
-	//DEBUG>>>
-	for (uint32 index = 0; index < 9; index++)
-		setSubVar(VA_CUBE_POSITIONS, index, 7 - index);
-	//DEBUG<<<
-
 	for (uint32 index = 0; index < 9; index++) {
 		int16 value = (int16)getSubVar(VA_CUBE_POSITIONS, index);
 		if (value >= 0) {
@@ -1999,10 +1994,6 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
 Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
-	//DEBUG>>>
-	//setGlobalVar(V_LIGHTS_ON, 1);
-	//DEBUG<<<
-
 	_vm->gameModule()->initCannonSymbolsPuzzle();
 
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852))
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index c2cf0df..9b1945a 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -36,10 +36,6 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList);
 	_vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150);
 
-	//DEBUG>>>
-	setGlobalVar(V_WALL_BROKEN, 0);
-	//DEBUG<<<
-
 	_flag = getGlobalVar(V_WALL_BROKEN) == 0;
 	
 	if (_flag) {
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 19779c3..f67d1a6 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -92,9 +92,6 @@ void Module2500::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B01B8, 220);
 		break;
 	case 2:
-		//DEBUG>>>Join the tracks.
-		setGlobalVar(V_WORLDS_JOINED, 1);
-		//DEBUG<<< 
 		_vm->gameState().which = which;
 		if (getGlobalVar(V_WORLDS_JOINED))
 			createScene2704(which, 0x004B01E0, 150);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 268b2c6..8712cc3 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -507,10 +507,6 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _currTuneStatus(0), _countdown1(0), _countdown2(0) {
 
-	//DEBUG>>> Disable video
-	setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0);
-	//DEBUG<<<
-		
 	SetMessageHandler(&Scene2802::handleMessage);
 	SetUpdateHandler(&Scene2802::update);
 	insertMouse435(0x008810A8, 20, 620);
@@ -2583,7 +2579,7 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam &param, Entit
 
 void Scene2808::update() {
 
-	// DEBUG>>>: Show correct values
+	// DEBUG>>> Show correct values
 	debug("---------------");
 	debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2));
 	debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel());
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 976cf5d..7dc8a9c 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -389,11 +389,6 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0;
 
-	//DEBUG>>> Enable all locations
-	for (int i = 0; i < 6; i++)
-		setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1);
-	//DEBUG<<<
-
 	setSubVar(V_TELEPORTER_DEST_AVAILABLE, which, 1);
 	setSubVar(V_TELEPORTER_DEST_AVAILABLE, 5, 1);
 	setSubVar(V_TELEPORTER_DEST_AVAILABLE, 4, 1);
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 96d33c0..8e167dd 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -31,13 +31,6 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint
 
 	_navigationList = _vm->_staticData->getNavigationList(navigationListId);
 	
-	//DEBUG>>>
-	for (NavigationList::iterator it = _navigationList->begin(); it != _navigationList->end(); it++) {
-		debug("%08X %08X %08X %08X %d %d %08X",	(*it).fileHash,	(*it).leftSmackerFileHash, (*it).rightSmackerFileHash,
-		(*it).middleSmackerFileHash, (*it).interactive, (*it).middleFlag, (*it).mouseCursorFileHash);
-	}
-	//DEBUG<<<
-
 	if (_navigationIndex < 0) {
 		_navigationIndex = (int)getGlobalVar(V_NAVIGATION_INDEX);
 		if (_navigationIndex >= (int)_navigationList->size())


Commit: eb054471e0814768571c550a4d268e73e1ea6b65
    https://github.com/scummvm/scummvm/commit/eb054471e0814768571c550a4d268e73e1ea6b65
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Fix _drawRects in AsScene1002Door and SsCommonPressButton

Changed paths:
    engines/neverhood/module1000.cpp



diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 4f8f584..6a81918 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -618,10 +618,10 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 		_y = 239; 
 	}
 
-	_surface->getDrawRect().x = 0;
-	_surface->getDrawRect().y = 0;
-	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-	_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
 
 	_needRefresh = true;
 	
@@ -771,10 +771,10 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene
 	_spriteResource.load2(fileHash1);
 	createSurface(surfacePriority, 40, 40);
 	
-	_surface->getDrawRect().x = 0;
-	_surface->getDrawRect().y = 0;
-	_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-	_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+	_drawRect.x = 0;
+	_drawRect.y = 0;
+	_drawRect.width = _spriteResource.getDimensions().width;
+	_drawRect.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 
@@ -791,20 +791,20 @@ void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHashes[1] = fileHash2;
 	if (_status == 2) {
 		_spriteResource.load2(fileHash2);
-		_surface->getDrawRect().x = 0;
-		_surface->getDrawRect().y = 0;
-		_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-		_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+		_drawRect.x = 0;
+		_drawRect.y = 0;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
 		StaticSprite::update();
 	} else {
 		_spriteResource.load2(fileHash1);
-		_surface->getDrawRect().x = 0;
-		_surface->getDrawRect().y = 0;
-		_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-		_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+		_drawRect.x = 0;
+		_drawRect.y = 0;
+		_drawRect.width = _spriteResource.getDimensions().width;
+		_drawRect.height = _spriteResource.getDimensions().height;
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
@@ -817,10 +817,10 @@ void SsCommonPressButton::update() {
 		if (_status == 1) {
 			_status = 2;
 			_spriteResource.load2(_fileHashes[1]);
-			_surface->getDrawRect().x = 0;
-			_surface->getDrawRect().y = 0;
-			_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-			_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+			_drawRect.x = 0;
+			_drawRect.y = 0;
+			_drawRect.width = _spriteResource.getDimensions().width;
+			_drawRect.height = _spriteResource.getDimensions().height;
 			_x = _spriteResource.getPosition().x;
 			_y = _spriteResource.getPosition().y;
 			_needRefresh = true;
@@ -829,10 +829,10 @@ void SsCommonPressButton::update() {
 		} else if (_status == 2) {
 			_status = 3;
 			_spriteResource.load2(_fileHashes[0]);
-			_surface->getDrawRect().x = 0;
-			_surface->getDrawRect().y = 0;
-			_surface->getDrawRect().width = _spriteResource.getDimensions().width;
-			_surface->getDrawRect().height = _spriteResource.getDimensions().height;
+			_drawRect.x = 0;
+			_drawRect.y = 0;
+			_drawRect.width = _spriteResource.getDimensions().width;
+			_drawRect.height = _spriteResource.getDimensions().height;
 			_x = _spriteResource.getPosition().x;
 			_y = _spriteResource.getPosition().y;
 			_needRefresh = true;


Commit: 9ba7a7f1a143e20eefdc47555840d4175103986b
    https://github.com/scummvm/scummvm/commit/9ba7a7f1a143e20eefdc47555840d4175103986b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Rename stuff in Sprite:

- processDelta() to updateBounds()
- getRect() to getCollisionBounds()
- _drawRect to _drawOffset
- _rect to _collisionBounds
- _deltaRect to _collisionBoundsOffset

Changed paths:
    engines/neverhood/collisionman.cpp
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1100.h
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/mouse.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index bacf18b..973c0fe 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -94,7 +94,7 @@ void CollisionMan::clearSprites() {
 void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) {
 	for (Common::Array<Sprite*>::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) {
 		Sprite *collSprite = *iter;
-		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getRect())) {
+		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) {
 			sprite->sendMessage(collSprite, messageNum, messageParam);
 		}
 	}	
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 0ffb0b0..e9813e6 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -198,14 +198,14 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene
 	
 	_spriteResource.load2(0x24A4A664);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect = _drawRect;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
+	_collisionBoundsOffset = _drawOffset;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 	StaticSprite::update();
 	_surface->setVisible(false);
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index f06ce40..9e9f136 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -707,7 +707,7 @@ void Klayman::suAction() {
 			_x = _destX;				
 	}
 	
-	processDelta();
+	updateBounds();
 	
 }
 
@@ -753,7 +753,7 @@ void Klayman::suSneaking() {
 				}
 			}
 		}
-		processDelta();
+		updateBounds();
 	}
 	
 }
@@ -932,7 +932,7 @@ void Klayman::suWalkingTestExit() {
 				}
 			}
 		}
-		processDelta();
+		updateBounds();
 	}
 	
 }
@@ -1409,7 +1409,7 @@ void Klayman::suLargeStep() {
 				_y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
 			}
 		}
-		processDelta();
+		updateBounds();
 	}
 }
 
@@ -2175,7 +2175,7 @@ void Klayman::suJumpToGrab() {
 	updateDeltaXY();
 	if (_y >= _destY) {
 		_y = _destY;
-		processDelta();
+		updateBounds();
 		gotoNextStateExt();
 	}
 }
@@ -2856,7 +2856,7 @@ void Klayman::suFallDown() {
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
-		processDelta();
+		updateBounds();
 		sendMessage(this, 0x1019, 0);
 	}
 	_vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0);
@@ -3016,7 +3016,7 @@ void Klayman::suFallSkipJump() {
 	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
-		processDelta();
+		updateBounds();
 		sendMessage(this, 0x1019, 0);
 	}
 }
@@ -3222,7 +3222,7 @@ void Klayman::stContSpitIntoPipe() {
 void Klayman::suRidePlatform() {
 	_x = _attachedSprite->getX() - 20;
 	_y = _attachedSprite->getY() + 46;
-	processDelta();
+	updateBounds();
 }
 
 void Klayman::stRidePlatform() {
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 9748919..e22a668 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -166,41 +166,41 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but
 	_spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]);
 	createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 
 	// TODO Move to const array
 	switch (_buttonIndex) {
 	case 0:
-		_rect.set(52, 121, 110, 156);
+		_collisionBounds.set(52, 121, 110, 156);
 		break;
 	case 1:
-		_rect.set(52, 192, 109, 222);
+		_collisionBounds.set(52, 192, 109, 222);
 		break;
 	case 2:
-		_rect.set(60, 257, 119, 286);
+		_collisionBounds.set(60, 257, 119, 286);
 		break;
 	case 3:
-		_rect.set(67, 326, 120, 354);
+		_collisionBounds.set(67, 326, 120, 354);
 		break;
 	case 4:
-		_rect.set(70, 389, 128, 416);
+		_collisionBounds.set(70, 389, 128, 416);
 		break;
 	case 5:
-		_rect.set(523, 113, 580, 144);
+		_collisionBounds.set(523, 113, 580, 144);
 		break;
 	case 6:
-		_rect.set(525, 176, 577, 206);
+		_collisionBounds.set(525, 176, 577, 206);
 		break;
 	case 7:
-		_rect.set(527, 384, 580, 412);
+		_collisionBounds.set(527, 384, 580, 412);
 		break;
 	case 8:
-		_rect.set(522, 255, 580, 289);
+		_collisionBounds.set(522, 255, 580, 289);
 		break;
 	}
 	
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 6a81918..72cf0ed 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -618,10 +618,10 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 		_y = 239; 
 	}
 
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 
 	_needRefresh = true;
 	
@@ -771,10 +771,10 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene
 	_spriteResource.load2(fileHash1);
 	createSurface(surfacePriority, 40, 40);
 	
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 
@@ -791,20 +791,20 @@ void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHashes[1] = fileHash2;
 	if (_status == 2) {
 		_spriteResource.load2(fileHash2);
-		_drawRect.x = 0;
-		_drawRect.y = 0;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = 0;
+		_drawOffset.y = 0;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
 		StaticSprite::update();
 	} else {
 		_spriteResource.load2(fileHash1);
-		_drawRect.x = 0;
-		_drawRect.y = 0;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = 0;
+		_drawOffset.y = 0;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
@@ -817,10 +817,10 @@ void SsCommonPressButton::update() {
 		if (_status == 1) {
 			_status = 2;
 			_spriteResource.load2(_fileHashes[1]);
-			_drawRect.x = 0;
-			_drawRect.y = 0;
-			_drawRect.width = _spriteResource.getDimensions().width;
-			_drawRect.height = _spriteResource.getDimensions().height;
+			_drawOffset.x = 0;
+			_drawOffset.y = 0;
+			_drawOffset.width = _spriteResource.getDimensions().width;
+			_drawOffset.height = _spriteResource.getDimensions().height;
 			_x = _spriteResource.getPosition().x;
 			_y = _spriteResource.getPosition().y;
 			_needRefresh = true;
@@ -829,10 +829,10 @@ void SsCommonPressButton::update() {
 		} else if (_status == 2) {
 			_status = 3;
 			_spriteResource.load2(_fileHashes[0]);
-			_drawRect.x = 0;
-			_drawRect.y = 0;
-			_drawRect.width = _spriteResource.getDimensions().width;
-			_drawRect.height = _spriteResource.getDimensions().height;
+			_drawOffset.x = 0;
+			_drawOffset.y = 0;
+			_drawOffset.width = _spriteResource.getDimensions().width;
+			_drawOffset.height = _spriteResource.getDimensions().height;
 			_x = _spriteResource.getPosition().x;
 			_y = _spriteResource.getPosition().y;
 			_needRefresh = true;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 6bf6140..e746be7 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -267,10 +267,10 @@ static const uint32 kSsScene1105SymbolDieFileHashes[] = {
 	0x10098414
 };
 
-SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect)
+SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds)
 	: StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) {
 	
-	_rect = rect;
+	_collisionBounds = collisionBounds;
 	SetMessageHandler(&SsScene1105Button::handleMessage);
 	SetUpdateHandler(&SsScene1105Button::update);
 	setVisible(false);
@@ -306,8 +306,8 @@ SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16
 
 	_x = x;
 	_y = y;
-	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
 	StaticSprite::update();
 }
 
@@ -339,8 +339,8 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p
 
 void SsScene1105SymbolDie::loadSymbolSprite() {
 	load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false);
-	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
 	StaticSprite::update();
 }
 
@@ -406,13 +406,13 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect = _drawRect;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
+	_collisionBoundsOffset = _drawOffset;
 	_needRefresh = true;
-	processDelta();
+	updateBounds();
 	setVisible(false);
 	loadSound(0, 0x44045140);
 	SetUpdateHandler(&SsScene1105OpenButton::update);
diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h
index 98d1ae6..126d149 100644
--- a/engines/neverhood/module1100.h
+++ b/engines/neverhood/module1100.h
@@ -43,7 +43,7 @@ protected:
 
 class SsScene1105Button : public StaticSprite {
 public:
-	SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect);
+	SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds);
 protected:
 	Scene *_parentScene;
 	int _countdown;
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 768e781..bf4f1df 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -172,18 +172,18 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 		_spriteResource.load2(kScene1201TntFileHashList1[elemIndex]);
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
-		_drawRect.x = 0;
-		_drawRect.y = 0;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = 0;
+		_drawOffset.y = 0;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 	} else {
 		_spriteResource.load2(kScene1201TntFileHashList2[elemIndex]);
 		_x = x;
 		_y = y;
-		_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-		_drawRect.y = -_spriteResource.getDimensions().height;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+		_drawOffset.y = -_spriteResource.getDimensions().height;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 	
 	}
 	createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index ab63c29..b623af0 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1165,7 +1165,7 @@ void AsScene1307Key::suRemoveKey() {
 	if (_pointIndex < kAsScene1307KeyPointsCount) {
 		_x += kAsScene1307KeyPoints[_pointIndex].x;
 		_y += kAsScene1307KeyPoints[_pointIndex].y;
-		processDelta();
+		updateBounds();
 		_pointIndex++;
 	} else {
 		SetSpriteUpdate(NULL);
@@ -1176,7 +1176,7 @@ void AsScene1307Key::suInsertKey() {
 	if (_pointIndex < kAsScene1307KeyPointsCount) {
 		_x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x;
 		_y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y;
-		processDelta();
+		updateBounds();
 		_pointIndex++;
 		if (_pointIndex == 7)
 			playSound(0);
@@ -1191,7 +1191,7 @@ void AsScene1307Key::suMoveKey() {
 		_frameIndex += kAsScene1307KeyFrameIndices[_pointIndex];
 		_x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue;
 		_y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue;
-		processDelta();
+		updateBounds();
 		_pointIndex++;
 	} else {
 		NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)];
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 7373172..cedb283 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -252,7 +252,7 @@ uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam &param
 
 void AsScene1401Mouse::suSuckedIn() {
 	AnimatedSprite::updateDeltaXY();
-	if (_rect.y1 <= 150) {
+	if (_collisionBounds.y1 <= 150) {
 		playSound(0, 0x0E32247F);
 		stopAnimation();
 		SetSpriteUpdate(NULL);
@@ -289,7 +289,7 @@ uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam &para
 
 void AsScene1401Cheese::suSuckedIn() {
 	AnimatedSprite::updateDeltaXY();
-	if (_rect.y1 <= 150) {
+	if (_collisionBounds.y1 <= 150) {
 		playSound(0, 0x18020439);
 		stopAnimation();
 		SetSpriteUpdate(NULL);
@@ -522,7 +522,7 @@ void AsCommonProjector::suMoving() {
 			setGlobalVar(V_PROJECTOR_SLOT, 0);
 		}
 	}
-	Sprite::processDelta();
+	Sprite::updateBounds();
 }
 
 void AsCommonProjector::moveProjector() {
@@ -558,7 +558,7 @@ void AsCommonProjector::moveProjector() {
 
 void AsCommonProjector::stSuckedIn() {
 	AnimatedSprite::updateDeltaXY();
-	if (_rect.y1 <= 150) {
+	if (_collisionBounds.y1 <= 150) {
 		sendMessage(_asPipe, 0x483A, 0);
 		stopAnimation();
 		SetMessageHandler(&Sprite::handleMessage);
@@ -691,12 +691,12 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 6) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			setMessageList(0x004B6670);
 		} else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			setMessageList(0x004B6670);
 		}
 		_asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480);
@@ -917,12 +917,12 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			setMessageList(0x004B0BD0);
 		} else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			setMessageList(0x004B0BD0);
 		}
 		_asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2());
@@ -1118,7 +1118,7 @@ void AsScene1407Mouse::suWalkTo() {
 		sendMessage(this, 0x1019, 0);
 	} else {
 		_x += xdelta;
-		processDelta();
+		updateBounds();
 	}
 }
 
@@ -1339,7 +1339,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			setMessageList(0x004B1F70);
 		}
 		_asProjector->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2());
@@ -1457,7 +1457,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			setMessageList(0x004B8CB8);
 		}
 		_asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index 7df162c..f6dea96 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -157,12 +157,12 @@ SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32
 		setVisible(false);
 		SetMessageHandler(NULL);
 	}
-	_deltaRect = _drawRect;
-	_deltaRect.x -= 4;
-	_deltaRect.y -= 8;
-	_deltaRect.width += 8;
-	_deltaRect.height += 16;
-	Sprite::processDelta();
+	_collisionBoundsOffset = _drawOffset;
+	_collisionBoundsOffset.x -= 4;
+	_collisionBoundsOffset.y -= 8;
+	_collisionBoundsOffset.width += 8;
+	_collisionBoundsOffset.height += 16;
+	Sprite::updateBounds();
 }
 
 uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 0a02d85..fb98c2e 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -219,8 +219,8 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 		startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
 		_newStickFrameIndex = 0;
 	}
-	_deltaRect.set(0, 0, 80, 80);
-	Sprite::processDelta();
+	_collisionBoundsOffset.set(0, 0, 80, 80);
+	Sprite::updateBounds();
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 
@@ -413,7 +413,7 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() {
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteUpdate(NULL);
-	processDelta();
+	updateBounds();
 	playSound(2);
 }
 
@@ -458,11 +458,11 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
 	_spriteResource.load2(0x64516424);
 	createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	setVisible(false);
-	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_deltaRect = _drawRect;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_collisionBoundsOffset = _drawOffset;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 	loadSound(0, 0x44061000);
 	SetUpdateHandler(&SsScene1907UpDownButton::update);
@@ -500,13 +500,13 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
 
 void SsScene1907UpDownButton::setToUpPosition() {
 	_y = _spriteResource.getPosition().y;
-	Sprite::processDelta();
+	Sprite::updateBounds();
 	StaticSprite::update();
 }
 
 void SsScene1907UpDownButton::setToDownPosition() {
 	_y = _spriteResource.getPosition().y + 174;
-	Sprite::processDelta();
+	Sprite::updateBounds();
 	StaticSprite::update();
 }
 
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index b3798d2..b746d51 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -490,10 +490,10 @@ SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positio
 	
 	_spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]);
 	createSurface(100, 16, 16);
-	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = kSsScene2201PuzzleCubePoints[positionIndex].x;
 	_y = kSsScene2201PuzzleCubePoints[positionIndex].y;
 	_needRefresh = true;
@@ -683,14 +683,14 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS
 	} else {
 		createSurface(500, 128, 128);
 	}
-	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect = _drawRect;
+	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
+	_collisionBoundsOffset = _drawOffset;
 	_x = kSsScene2202PuzzleTilePoints[_tileIndex].x;
 	_y = kSsScene2202PuzzleTilePoints[_tileIndex].y;
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 	StaticSprite::update();
 	loadSound(0, 0x40958621);
@@ -750,7 +750,7 @@ void SsScene2202PuzzleTile::suMoveTileX() {
 		stopMoving();			
 	}
 
-	processDelta();
+	updateBounds();
 
 }
 
@@ -785,17 +785,17 @@ void SsScene2202PuzzleTile::suMoveTileY() {
 		stopMoving();			
 	}
 
-	processDelta();
+	updateBounds();
 
 }
 
 void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 
 	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]);
-	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_needRefresh = true;
 
 	setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1);
@@ -873,10 +873,10 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 
 void SsScene2202PuzzleTile::stopMoving() {
 	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
-	_drawRect.x = -(_spriteResource.getDimensions().width / 2);
-	_drawRect.y = -(_spriteResource.getDimensions().height / 2);
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
+	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_needRefresh = true;
 	SetSpriteUpdate(NULL);
 	_isMoving = false;
@@ -1225,10 +1225,10 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
 	SetMessageHandler(&SsScene2205DoorFrame::handleMessage);
 	_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
 	createSurface(1100, 45, 206);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_needRefresh = true;
@@ -1240,10 +1240,10 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x2000:
 		_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
-		_drawRect.x = 0;
-		_drawRect.y = 0;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = 0;
+		_drawOffset.y = 0;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
@@ -1483,8 +1483,8 @@ SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene
 	} else {
 		SetMessageHandler(&SsScene2206TestTube::handleMessage);
 	}
-	_deltaRect = _drawRect;
-	processDelta();
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 }
 
 uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1749,7 +1749,7 @@ void AsScene2207Elevator::update() {
 void AsScene2207Elevator::suSetPosition() {
 	_x = (*_pointArray)[_pointIndex].x;
 	_y = (*_pointArray)[_pointIndex].y - 60;
-	processDelta();
+	updateBounds();
 }
 
 uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index f67d1a6..bb9e10b 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -487,14 +487,14 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x070220D9);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_deltaRect = _drawRect;
-	processDelta();
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	_needRefresh = true;
 	setVisible(false);
 	loadSound(0, 0x4600204C);
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 37e4406..7008a90 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -213,11 +213,11 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 	if (!getGlobalVar(V_WATER_RUNNING))
 		setVisible(false);
 
-	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_deltaRect = _drawRect;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_collisionBoundsOffset = _drawOffset;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 
 	loadSound(0, 0x10267160);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index b0983de..c5524fa 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -514,7 +514,7 @@ SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm
 	createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_needRefresh = true;
 	StaticSprite::update();
 }
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 8712cc3..7c895e9 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -1226,7 +1226,7 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam &param,
 			NPoint pt = _dataResource.getPoint(0x0D84A1AD);
 			_klayman->setX(pt.x);
 			_klayman->setY(pt.y);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			klaymanFloor();
 			_klayman->setClipRect(517, 401, 536, 480);
 			setMessageList(0x004B6198);
@@ -1240,7 +1240,7 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam &param,
 			_klayman->setClipRect(0, 0, 560, 315);
 			_klayman->setX(560);
 			_klayman->setY(315);
-			_klayman->processDelta();
+			_klayman->updateBounds();
 			klaymanSlope();
 			setMessageList(0x004B61A0);
 		} else if (param.asInteger() == 0x002CAA68) {
@@ -1373,14 +1373,14 @@ SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *paren
 	else
 		_spriteResource.load2(0x11814A21);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_deltaRect = _drawRect;
-	processDelta();
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	setVisible(false);
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene2804RedButton::update);
@@ -1416,10 +1416,10 @@ SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x8889B008);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1450,10 +1450,10 @@ SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x06092132);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1484,10 +1484,10 @@ SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x211003A0);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1507,10 +1507,10 @@ SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x9A816000);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1656,14 +1656,14 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280
 		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]);
 
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_deltaRect = _drawRect;
-	processDelta();
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	setVisible(false);
 	loadSound(0, 0x44045140);
 	_needRefresh = true;
@@ -2262,14 +2262,14 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce
 	
 	_spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]);
 	createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_deltaRect = _drawRect;
-	processDelta();
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	SetUpdateHandler(&SsScene2808Dispenser::update);
 	SetMessageHandler(&SsScene2808Dispenser::handleMessage);
 	setVisible(false);
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 7dc8a9c..7abab12 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -256,16 +256,16 @@ SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene
 
 	_spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]);
 	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_rect.x1 = kSsScene2901LocationButtonPoints[_index].x - 25;
-	_rect.y1 = kSsScene2901LocationButtonPoints[_index].y - 25;
-	_rect.x2 = kSsScene2901LocationButtonPoints[_index].x + 25;
-	_rect.y2 = kSsScene2901LocationButtonPoints[_index].y + 25;
+	_collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25;
+	_collisionBounds.y1 = kSsScene2901LocationButtonPoints[_index].y - 25;
+	_collisionBounds.x2 = kSsScene2901LocationButtonPoints[_index].x + 25;
+	_collisionBounds.y2 = kSsScene2901LocationButtonPoints[_index].y + 25;
 	setVisible(false);
 	_needRefresh = true;
 	loadSound(0, 0x440430C0);
@@ -301,10 +301,10 @@ SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *
 	
 	_spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]);
 	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -328,10 +328,10 @@ SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which)
 
 	_spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]);
 	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_needRefresh = true;
@@ -343,16 +343,16 @@ SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentSce
 	
 	_spriteResource.load2(kSsScene2901BigButtonFileHashes[which]);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_rect.x1 = 62;
-	_rect.y1 = 94;
-	_rect.x2 = 322;
-	_rect.y2 = 350;
+	_collisionBounds.x1 = 62;
+	_collisionBounds.y1 = 94;
+	_collisionBounds.x2 = 322;
+	_collisionBounds.y2 = 350;
 	setVisible(false);
 	_needRefresh = true;
 	loadSound(0, 0xF3D420C8);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 7695248..8005c62 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -475,16 +475,16 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect.x = 0;
-	_deltaRect.y = 0;
-	_deltaRect.width = _spriteResource.getDimensions().width;
-	_deltaRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
+	_collisionBoundsOffset.x = 0;
+	_collisionBoundsOffset.y = 0;
+	_collisionBoundsOffset.width = _spriteResource.getDimensions().width;
+	_collisionBoundsOffset.height = _spriteResource.getDimensions().height;
 	setVisible(false);
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3009FireCannonButton::update);
 	SetMessageHandler(&SsScene3009FireCannonButton::handleMessage);
@@ -521,10 +521,10 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
 	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	_needRefresh = true;
 	if (getGlobalVar(V_ROBOT_HIT)) {
 		hide();
@@ -573,10 +573,10 @@ SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
 	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
 	setVisible(false);
 	_needRefresh = true;
 }
@@ -595,12 +595,12 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy
 	createSurface(1200, 33, 31);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = 33;
-	_drawRect.height = 31;
-	_deltaRect = _drawRect;
-	processDelta();
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = 33;
+	_drawOffset.height = 31;
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3009SymbolArrow::update);
 	SetMessageHandler(&SsScene3009SymbolArrow::handleMessage);
@@ -617,10 +617,10 @@ void SsScene3009SymbolArrow::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		_spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
 		_needRefresh = true;
-		_drawRect.x = 0;
-		_drawRect.y = 0;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = 0;
+		_drawOffset.y = 0;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 	}
 }
 
@@ -632,10 +632,10 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
 			_countdown = 2;
 			_spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]);
 			_needRefresh = true;
-			_drawRect.x = 0;
-			_drawRect.y = 0;
-			_drawRect.width = _spriteResource.getDimensions().width;
-			_drawRect.height = _spriteResource.getDimensions().height;
+			_drawOffset.x = 0;
+			_drawOffset.y = 0;
+			_drawOffset.width = _spriteResource.getDimensions().width;
+			_drawOffset.height = _spriteResource.getDimensions().height;
 			playSound(0);
 			sendMessage(_asSymbol, 0x2005, _incrDecr);
 		}
@@ -1155,12 +1155,12 @@ void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
 	_spriteResource.load(fileHash);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect = _drawRect;
-	processDelta();
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	_needRefresh = true;
 	StaticSprite::update();
 }
@@ -1430,13 +1430,13 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = _spriteResource.getDimensions().width;
-	_drawRect.height = _spriteResource.getDimensions().height;
-	_deltaRect = _drawRect;
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = _spriteResource.getDimensions().width;
+	_drawOffset.height = _spriteResource.getDimensions().height;
+	_collisionBoundsOffset = _drawOffset;
 	setVisible(false);
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 	SetUpdateHandler(&SsScene3011Button::update);
 	SetMessageHandler(&SsScene3011Button::handleMessage);
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 105d170..632f56f 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -74,12 +74,12 @@ void Mouse::init(uint32 fileHash) {
 	createSurface(2000, 32, 32);
 	SetUpdateHandler(&Mouse::update);
 	SetMessageHandler(&Mouse::handleMessage);
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = 32;
-	_drawRect.height = 32;
-	_deltaRect = _drawRect;
-	processDelta();
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = 32;
+	_drawOffset.height = 32;
+	_collisionBoundsOffset = _drawOffset;
+	updateBounds();
 	_needRefresh = true;
 	CursorMan.showMouse(false);
 }
@@ -155,7 +155,7 @@ uint32 Mouse::handleMessage(int messageNum, const MessageParam &param, Entity *s
 		_x = param.asPoint().x;
 		_y = param.asPoint().y;
 		updateCursorNum();
-		processDelta();
+		updateBounds();
 		break;
 	}
 	return messageResult;
@@ -167,24 +167,24 @@ void Mouse::updateCursor() {
 		return;
 
 	if (_doDeltaX) {
-		_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
+		_surface->getDrawRect().x = filterX(_x - _drawOffset.width - _drawOffset.x + 1);
 	} else {
-		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
+		_surface->getDrawRect().x = filterX(_x + _drawOffset.x);
 	}
 
 	if (_doDeltaY) {
-		_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
+		_surface->getDrawRect().y = filterY(_y - _drawOffset.height - _drawOffset.y + 1);
 	} else {
-		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+		_surface->getDrawRect().y = filterY(_y + _drawOffset.y);
 	}
 
 	if (_needRefresh) {
 		_needRefresh = false;
-		_drawRect = _mouseCursorResource.getRect();
+		_drawOffset = _mouseCursorResource.getRect();
 		_surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
 		Graphics::Surface *cursorSurface = _surface->getSurface();
 		CursorMan.replaceCursor((const byte*)cursorSurface->pixels,
-			cursorSurface->w, cursorSurface->h, -_drawRect.x, -_drawRect.y, 0);
+			cursorSurface->w, cursorSurface->h, -_drawOffset.x, -_drawOffset.y, 0);
 	}
 
 }
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index f81be07..fb45b8a 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -38,20 +38,20 @@ Sprite::~Sprite() {
 	delete _surface;
 }
 
-void Sprite::processDelta() {
+void Sprite::updateBounds() {
 	if (_doDeltaX) {
-		_rect.x1 = _x - _deltaRect.x - _deltaRect.width + 1;
-		_rect.x2 = _x - _deltaRect.x;
+		_collisionBounds.x1 = _x - _collisionBoundsOffset.x - _collisionBoundsOffset.width + 1;
+		_collisionBounds.x2 = _x - _collisionBoundsOffset.x;
 	} else {
-		_rect.x1 = _x + _deltaRect.x;
-		_rect.x2 = _x + _deltaRect.x + _deltaRect.width - 1;
+		_collisionBounds.x1 = _x + _collisionBoundsOffset.x;
+		_collisionBounds.x2 = _x + _collisionBoundsOffset.x + _collisionBoundsOffset.width - 1;
 	}
 	if (_doDeltaY) {
-		_rect.y1 = _y - _deltaRect.y - _deltaRect.height + 1;
-		_rect.y2 = _y - _deltaRect.y;
+		_collisionBounds.y1 = _y - _collisionBoundsOffset.y - _collisionBoundsOffset.height + 1;
+		_collisionBounds.y2 = _y - _collisionBoundsOffset.y;
 	} else {
-		_rect.y1 = _y + _deltaRect.y;
-		_rect.y2 = _y + _deltaRect.y + _deltaRect.height - 1;
+		_collisionBounds.y1 = _y + _collisionBoundsOffset.y;
+		_collisionBounds.y2 = _y + _collisionBoundsOffset.y + _collisionBoundsOffset.height - 1;
 	}
 }
 
@@ -66,11 +66,11 @@ void Sprite::setDoDeltaY(int type) {
 }
 
 bool Sprite::isPointInside(int16 x, int16 y) {
-	return x >= _rect.x1 && x <= _rect.x2 && y >= _rect.y1 && y <= _rect.y2;
+	return x >= _collisionBounds.x1 && x <= _collisionBounds.x2 && y >= _collisionBounds.y1 && y <= _collisionBounds.y2;
 }
 
 bool Sprite::checkCollision(NRect &rect) {
-	return (_rect.x1 < rect.x2) && (rect.x1 < _rect.x2) && (_rect.y1 < rect.y2) && (rect.y1 < _rect.y2);	
+	return (_collisionBounds.x1 < rect.x2) && (rect.x1 < _collisionBounds.x2) && (_collisionBounds.y1 < rect.y2) && (rect.y1 < _collisionBounds.y2);	
 }
 
 uint32 Sprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -147,10 +147,10 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y,
 	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
 	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
 	
-	_drawRect.x = 0;
-	_drawRect.y = 0;
-	_drawRect.width = width;
-	_drawRect.height = height; 
+	_drawOffset.x = 0;
+	_drawOffset.y = 0;
+	_drawOffset.width = width;
+	_drawOffset.height = height; 
 
 	_needRefresh = true;
 
@@ -164,19 +164,19 @@ void StaticSprite::update() {
 		return;
 		
 	if (_doDeltaX) {
-		_surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1);
+		_surface->getDrawRect().x = filterX(_x - _drawOffset.x - _drawOffset.width + 1);
 	} else {
-		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
+		_surface->getDrawRect().x = filterX(_x + _drawOffset.x);
 	}
 		
 	if (_doDeltaY) {
-		_surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1);
+		_surface->getDrawRect().y = filterY(_y - _drawOffset.y - _drawOffset.height + 1);
 	} else {
-		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+		_surface->getDrawRect().y = filterY(_y + _drawOffset.y);
 	}
 
 	if (_needRefresh) {
-		_surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
+		_surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawOffset.width, _drawOffset.height);
 		_needRefresh = false;
 	}
 
@@ -187,10 +187,10 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
 	_spriteResource.load2(fileHash);
 
 	if (dimensions) {
-		_drawRect.x = 0;
-		_drawRect.y = 0;
-		_drawRect.width = _spriteResource.getDimensions().width;
-		_drawRect.height = _spriteResource.getDimensions().height;
+		_drawOffset.x = 0;
+		_drawOffset.y = 0;
+		_drawOffset.width = _spriteResource.getDimensions().width;
+		_drawOffset.height = _spriteResource.getDimensions().height;
 	}
 
 	if (position) {
@@ -261,7 +261,7 @@ void AnimatedSprite::updateDeltaXY() {
 	}
 	_deltaX = 0;
 	_deltaY = 0;
-	processDelta();
+	updateBounds();
 }
 
 void AnimatedSprite::setRepl(byte oldColor, byte newColor) {
@@ -370,19 +370,19 @@ void AnimatedSprite::updatePosition() {
 		return;
 
 	if (_doDeltaX) {
-		_surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1);
+		_surface->getDrawRect().x = filterX(_x - _drawOffset.x - _drawOffset.width + 1);
 	} else {
-		_surface->getDrawRect().x = filterX(_x + _drawRect.x);
+		_surface->getDrawRect().x = filterX(_x + _drawOffset.x);
 	}
 
 	if (_doDeltaY) {
-		_surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1);
+		_surface->getDrawRect().y = filterY(_y - _drawOffset.y - _drawOffset.height + 1);
 	} else {
-		_surface->getDrawRect().y = filterY(_y + _drawRect.y);
+		_surface->getDrawRect().y = filterY(_y + _drawOffset.y);
 	}
 
 	if (_needRefresh) {
-		_surface->drawAnimResource(_animResource, _currFrameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height);
+		_surface->drawAnimResource(_animResource, _currFrameIndex, _doDeltaX, _doDeltaY, _drawOffset.width, _drawOffset.height);
 		_needRefresh = false;
 	}
 
@@ -414,12 +414,12 @@ void AnimatedSprite::updateFrameInfo() {
 	debug(8, "AnimatedSprite::updateFrameInfo()");
 	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_currFrameIndex);
 	_frameChanged = true;
-	_drawRect = frameInfo.rect;
+	_drawOffset = frameInfo.rect;
 	_deltaX = frameInfo.deltaX;
 	_deltaY = frameInfo.deltaY;
-	_deltaRect = frameInfo.deltaRect;
+	_collisionBoundsOffset = frameInfo.deltaRect;
 	_currFrameTicks = frameInfo.counter;
-	processDelta();
+	updateBounds();
 	_needRefresh = true;
 	if (frameInfo.frameHash != 0)
 		sendMessage(this, 0x100D, frameInfo.frameHash);
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 358a37b..7e07f3a 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -42,7 +42,7 @@ public:
 	~Sprite();
 	void init() {}
 	BaseSurface *getSurface() { return _surface; }
-	void processDelta();
+	void updateBounds();
 	void setDoDeltaX(int type);
 	void setDoDeltaY(int type);
 	bool isPointInside(int16 x, int16 y);
@@ -54,7 +54,7 @@ public:
 	uint16 getFlags() const { return _flags; }
 	bool isDoDeltaX() const { return _doDeltaX; }
 	bool isDoDeltaY() const { return _doDeltaY; }
-	NRect& getRect() { return _rect; }
+	NRect& getCollisionBounds() { return _collisionBounds; }
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void loadDataResource(uint32 fileHash);
 	int16 defFilterY(int16 y);
@@ -75,13 +75,10 @@ protected:
 	int16 _x, _y;
 	bool _doDeltaX, _doDeltaY;
 	bool _needRefresh;
-	//0000002B field_2B		db ?
-	//0000002C field2C		dd ? // unused
-	NDrawRect _drawRect;
-	NDrawRect _deltaRect;
-	NRect _rect;
+	NDrawRect _drawOffset;
+	NRect _collisionBounds;
+	NDrawRect _collisionBoundsOffset;
 	uint16 _flags;
-	//0000004A field4A		dw ? // seems to be unused except in ctor
 	DataResource _dataResource;
 	void createSurface(int surfacePriority, int16 width, int16 height);
 	void handleSpriteUpdate() {


Commit: f24a6769c2bf376def72274d6ed94c786ca03766
    https://github.com/scummvm/scummvm/commit/f24a6769c2bf376def72274d6ed94c786ca03766
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:33-07:00

Commit Message:
NEVERHOOD: Make use of NDrawRect::set

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index e9813e6..75755dd 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -198,10 +198,7 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene
 	
 	_spriteResource.load2(0x24A4A664);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_collisionBoundsOffset = _drawOffset;
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index e22a668..2e7f85d 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -166,10 +166,7 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but
 	_spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]);
 	createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 72cf0ed..ff26d17 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -618,10 +618,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 		_y = 239; 
 	}
 
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 
 	_needRefresh = true;
 	
@@ -771,10 +768,7 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene
 	_spriteResource.load2(fileHash1);
 	createSurface(surfacePriority, 40, 40);
 	
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 
@@ -791,20 +785,14 @@ void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHashes[1] = fileHash2;
 	if (_status == 2) {
 		_spriteResource.load2(fileHash2);
-		_drawOffset.x = 0;
-		_drawOffset.y = 0;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
 		StaticSprite::update();
 	} else {
 		_spriteResource.load2(fileHash1);
-		_drawOffset.x = 0;
-		_drawOffset.y = 0;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
@@ -817,10 +805,7 @@ void SsCommonPressButton::update() {
 		if (_status == 1) {
 			_status = 2;
 			_spriteResource.load2(_fileHashes[1]);
-			_drawOffset.x = 0;
-			_drawOffset.y = 0;
-			_drawOffset.width = _spriteResource.getDimensions().width;
-			_drawOffset.height = _spriteResource.getDimensions().height;
+			_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 			_x = _spriteResource.getPosition().x;
 			_y = _spriteResource.getPosition().y;
 			_needRefresh = true;
@@ -829,10 +814,7 @@ void SsCommonPressButton::update() {
 		} else if (_status == 2) {
 			_status = 3;
 			_spriteResource.load2(_fileHashes[0]);
-			_drawOffset.x = 0;
-			_drawOffset.y = 0;
-			_drawOffset.width = _spriteResource.getDimensions().width;
-			_drawOffset.height = _spriteResource.getDimensions().height;
+			_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 			_x = _spriteResource.getPosition().x;
 			_y = _spriteResource.getPosition().y;
 			_needRefresh = true;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index e746be7..d21e3af 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -306,8 +306,8 @@ SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16
 
 	_x = x;
 	_y = y;
-	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
+	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	StaticSprite::update();
 }
 
@@ -406,10 +406,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_collisionBoundsOffset = _drawOffset;
 	_needRefresh = true;
 	updateBounds();
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index bf4f1df..5237588 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -172,18 +172,13 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 		_spriteResource.load2(kScene1201TntFileHashList1[elemIndex]);
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
-		_drawOffset.x = 0;
-		_drawOffset.y = 0;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	} else {
 		_spriteResource.load2(kScene1201TntFileHashList2[elemIndex]);
 		_x = x;
 		_y = y;
-		_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-		_drawOffset.y = -_spriteResource.getDimensions().height;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -_spriteResource.getDimensions().height,
+			_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	
 	}
 	createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index b746d51..06cdc10 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -490,10 +490,8 @@ SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positio
 	
 	_spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]);
 	createSurface(100, 16, 16);
-	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = kSsScene2201PuzzleCubePoints[positionIndex].x;
 	_y = kSsScene2201PuzzleCubePoints[positionIndex].y;
 	_needRefresh = true;
@@ -683,10 +681,8 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS
 	} else {
 		createSurface(500, 128, 128);
 	}
-	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_collisionBoundsOffset = _drawOffset;
 	_x = kSsScene2202PuzzleTilePoints[_tileIndex].x;
 	_y = kSsScene2202PuzzleTilePoints[_tileIndex].y;
@@ -792,10 +788,8 @@ void SsScene2202PuzzleTile::suMoveTileY() {
 void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 
 	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]);
-	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_needRefresh = true;
 
 	setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1);
@@ -873,10 +867,8 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 
 void SsScene2202PuzzleTile::stopMoving() {
 	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
-	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_needRefresh = true;
 	SetSpriteUpdate(NULL);
 	_isMoving = false;
@@ -1225,10 +1217,7 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
 	SetMessageHandler(&SsScene2205DoorFrame::handleMessage);
 	_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
 	createSurface(1100, 45, 206);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_needRefresh = true;
@@ -1240,10 +1229,7 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x2000:
 		_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
-		_drawOffset.x = 0;
-		_drawOffset.y = 0;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 		_x = _spriteResource.getPosition().x;
 		_y = _spriteResource.getPosition().y;
 		_needRefresh = true;
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index bb9e10b..8345a8c 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -487,10 +487,7 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x070220D9);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_collisionBoundsOffset = _drawOffset;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 7c895e9..53ae40c 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -1373,10 +1373,7 @@ SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *paren
 	else
 		_spriteResource.load2(0x11814A21);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_collisionBoundsOffset = _drawOffset;
@@ -1416,10 +1413,7 @@ SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x8889B008);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1450,10 +1444,7 @@ SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x06092132);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1484,10 +1475,7 @@ SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x211003A0);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1507,10 +1495,7 @@ SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm)
 	
 	_spriteResource.load2(0x9A816000);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -1656,10 +1641,7 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280
 		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]);
 
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_collisionBoundsOffset = _drawOffset;
@@ -2262,10 +2244,7 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce
 	
 	_spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]);
 	createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_collisionBoundsOffset = _drawOffset;
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 7abab12..ae74b14 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -256,10 +256,7 @@ SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene
 
 	_spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]);
 	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25;
@@ -301,10 +298,7 @@ SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *
 	
 	_spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]);
 	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	setVisible(false);
@@ -328,10 +322,7 @@ SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which)
 
 	_spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]);
 	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
 	_needRefresh = true;
@@ -343,16 +334,10 @@ SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentSce
 	
 	_spriteResource.load2(kSsScene2901BigButtonFileHashes[which]);
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_collisionBounds.x1 = 62;
-	_collisionBounds.y1 = 94;
-	_collisionBounds.x2 = 322;
-	_collisionBounds.y2 = 350;
+	_collisionBounds.set(62, 94, 322, 350);
 	setVisible(false);
 	_needRefresh = true;
 	loadSound(0, 0xF3D420C8);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 8005c62..cb4faaf 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -475,14 +475,8 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
-	_collisionBoundsOffset.x = 0;
-	_collisionBoundsOffset.y = 0;
-	_collisionBoundsOffset.width = _spriteResource.getDimensions().width;
-	_collisionBoundsOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	_collisionBoundsOffset = _drawOffset;
 	setVisible(false);
 	updateBounds();
 	_needRefresh = true;
@@ -521,10 +515,7 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
 	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_needRefresh = true;
 	if (getGlobalVar(V_ROBOT_HIT)) {
 		hide();
@@ -573,10 +564,7 @@ SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
 	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	setVisible(false);
 	_needRefresh = true;
 }
@@ -595,10 +583,7 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy
 	createSurface(1200, 33, 31);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = 33;
-	_drawOffset.height = 31;
+	_drawOffset.set(0, 0, 33, 31);
 	_collisionBoundsOffset = _drawOffset;
 	updateBounds();
 	_needRefresh = true;
@@ -617,10 +602,7 @@ void SsScene3009SymbolArrow::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		_spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
 		_needRefresh = true;
-		_drawOffset.x = 0;
-		_drawOffset.y = 0;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	}
 }
 
@@ -632,10 +614,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
 			_countdown = 2;
 			_spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]);
 			_needRefresh = true;
-			_drawOffset.x = 0;
-			_drawOffset.y = 0;
-			_drawOffset.width = _spriteResource.getDimensions().width;
-			_drawOffset.height = _spriteResource.getDimensions().height;
+			_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 			playSound(0);
 			sendMessage(_asSymbol, 0x2005, _incrDecr);
 		}
@@ -1155,10 +1134,7 @@ void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
 	_spriteResource.load(fileHash);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_collisionBoundsOffset = _drawOffset;
 	updateBounds();
 	_needRefresh = true;
@@ -1430,10 +1406,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo
 	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = _spriteResource.getPosition().x;
 	_y = _spriteResource.getPosition().y;
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = _spriteResource.getDimensions().width;
-	_drawOffset.height = _spriteResource.getDimensions().height;
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_collisionBoundsOffset = _drawOffset;
 	setVisible(false);
 	updateBounds();
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index fb45b8a..0696aa6 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -147,10 +147,7 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y,
 	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
 	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
 	
-	_drawOffset.x = 0;
-	_drawOffset.y = 0;
-	_drawOffset.width = width;
-	_drawOffset.height = height; 
+	_drawOffset.set(0, 0, width, height);
 
 	_needRefresh = true;
 
@@ -187,10 +184,7 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
 	_spriteResource.load2(fileHash);
 
 	if (dimensions) {
-		_drawOffset.x = 0;
-		_drawOffset.y = 0;
-		_drawOffset.width = _spriteResource.getDimensions().width;
-		_drawOffset.height = _spriteResource.getDimensions().height;
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	}
 
 	if (position) {


Commit: bf1371c9d49845d3aadab2b235208bf601ab3987
    https://github.com/scummvm/scummvm/commit/bf1371c9d49845d3aadab2b235208bf601ab3987
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Rename and clean up fields in AnimFrameInfo

Changed paths:
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 631b050..1a738c1 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -251,15 +251,15 @@ void NeverhoodEngine::dumpAllResources() {
 			anim.load(entry.archiveEntry->fileHash);
 			for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) {
 				const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex);
-				int16 width = (frameInfo.rect.width + 3) & 0xFFFC;
-				byte *pixels = new byte[width * frameInfo.rect.height];
-				memset(pixels, 0, width * frameInfo.rect.height);
+				int16 width = (frameInfo.drawOffset.width + 3) & 0xFFFC;
+				byte *pixels = new byte[width * frameInfo.drawOffset.height];
+				memset(pixels, 0, width * frameInfo.drawOffset.height);
 				anim.draw(frameIndex, pixels, width, false, false);
 				Common::String filename = 
 					frameInfo.frameHash != 0
 					? Common::String::format("%08X_%03d_%08X.tga", entry.archiveEntry->fileHash, frameIndex, frameInfo.frameHash) 
 					: Common::String::format("%08X_%03d.tga", entry.archiveEntry->fileHash, frameIndex);
-				writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height);
+				writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.drawOffset.height);
 				delete[] pixels;
 			}
 		}
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index aff3528..1246472 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -160,8 +160,8 @@ AnimResource::~AnimResource() {
 void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) {
 	const AnimFrameInfo frameInfo = _frames[frameIndex];
 	_currSpriteData = _spriteData + frameInfo.spriteDataOffs;
-	_width = frameInfo.rect.width;
-	_height = frameInfo.rect.height;
+	_width = frameInfo.drawOffset.width;
+	_height = frameInfo.drawOffset.height;
 	if (_replEnabled && _replOldColor != _replNewColor)
 		unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY, _replOldColor, _replNewColor);
 	else
@@ -235,24 +235,23 @@ bool AnimResource::load(uint32 fileHash) {
 		AnimFrameInfo frameInfo;
 		frameInfo.frameHash = READ_LE_UINT32(frameList);
 		frameInfo.counter = READ_LE_UINT16(frameList + 4);
-		frameInfo.rect.x = READ_LE_UINT16(frameList + 6);
-		frameInfo.rect.y = READ_LE_UINT16(frameList + 8);
-		frameInfo.rect.width = READ_LE_UINT16(frameList + 10);
-		frameInfo.rect.height = READ_LE_UINT16(frameList + 12);
+		frameInfo.drawOffset.x = READ_LE_UINT16(frameList + 6);
+		frameInfo.drawOffset.y = READ_LE_UINT16(frameList + 8);
+		frameInfo.drawOffset.width = READ_LE_UINT16(frameList + 10);
+		frameInfo.drawOffset.height = READ_LE_UINT16(frameList + 12);
 		frameInfo.deltaX = READ_LE_UINT16(frameList + 14);
 		frameInfo.deltaY = READ_LE_UINT16(frameList + 16);
-		frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); 
-		frameInfo.deltaRect.y = READ_LE_UINT16(frameList + 20); 
-		frameInfo.deltaRect.width = READ_LE_UINT16(frameList + 22); 
-		frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24);
-		frameInfo.field_1A = READ_LE_UINT16(frameList + 26); 
+		frameInfo.collisionBoundsOffset.x = READ_LE_UINT16(frameList + 18); 
+		frameInfo.collisionBoundsOffset.y = READ_LE_UINT16(frameList + 20); 
+		frameInfo.collisionBoundsOffset.width = READ_LE_UINT16(frameList + 22); 
+		frameInfo.collisionBoundsOffset.height = READ_LE_UINT16(frameList + 24);
 		frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28);
-		debug(8, "frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", 
+		debug(8, "frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; collisionBoundsOffset = (%d,%d,%d,%d); spriteDataOffs = %08X", 
 			frameInfo.frameHash, frameInfo.counter, 
-			frameInfo.rect.x, frameInfo.rect.y, frameInfo.rect.width, frameInfo.rect.height,
+			frameInfo.drawOffset.x, frameInfo.drawOffset.y, frameInfo.drawOffset.width, frameInfo.drawOffset.height,
 			frameInfo.deltaX, frameInfo.deltaY,
-			frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height,
-			frameInfo.field_1A, frameInfo.spriteDataOffs);
+			frameInfo.collisionBoundsOffset.x, frameInfo.collisionBoundsOffset.y, frameInfo.collisionBoundsOffset.width, frameInfo.collisionBoundsOffset.height,
+			frameInfo.spriteDataOffs);
 		frameList += 32;
 		_frames.push_back(frameInfo);
 	}
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index b49ee88..50a49e3 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -68,10 +68,9 @@ protected:
 struct AnimFrameInfo {
 	uint32 frameHash;
 	int16 counter;
-	NDrawRect rect;
+	NDrawRect drawOffset;
 	int16 deltaX, deltaY;
-	NDrawRect deltaRect;
-	uint16 field_1A; 
+	NDrawRect collisionBoundsOffset;
 	uint32 spriteDataOffs;
 };
 
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 0696aa6..40b651e 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -408,10 +408,10 @@ void AnimatedSprite::updateFrameInfo() {
 	debug(8, "AnimatedSprite::updateFrameInfo()");
 	const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_currFrameIndex);
 	_frameChanged = true;
-	_drawOffset = frameInfo.rect;
+	_drawOffset = frameInfo.drawOffset;
 	_deltaX = frameInfo.deltaX;
 	_deltaY = frameInfo.deltaY;
-	_collisionBoundsOffset = frameInfo.deltaRect;
+	_collisionBoundsOffset = frameInfo.collisionBoundsOffset;
 	_currFrameTicks = frameInfo.counter;
 	updateBounds();
 	_needRefresh = true;


Commit: 1589e4fe7d01e668ee5d5d02684e073df1242ad4
    https://github.com/scummvm/scummvm/commit/1589e4fe7d01e668ee5d5d02684e073df1242ad4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Add new method StaticSprite::loadSprite and use it instead of setting stuff "manually"

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/sprite.cpp
    engines/neverhood/sprite.h



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 75755dd..572074b 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -165,7 +165,7 @@ AsDiskplayerSceneKey::AsDiskplayerSceneKey(NeverhoodEngine *vm)
 	_newStickFrameIndex = 0;
 	_needRefresh = true;
 	updatePosition();
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 uint32 AsDiskplayerSceneKey::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -183,29 +183,21 @@ void AsDiskplayerSceneKey::stDropKey() {
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsDiskplayerSceneKey::handleMessage);
 	NextState(&AsDiskplayerSceneKey::stDropKeyDone);
-	_surface->setVisible(true);
+	setVisible(true);
 }
 
 void AsDiskplayerSceneKey::stDropKeyDone() {
 	stopAnimation();
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&Sprite::handleMessage);
-	_surface->setVisible(false);
+	setVisible(false);
 }
 
 DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene)
 	: StaticSprite(vm, 1400), _diskplayerScene(diskplayerScene), _isPlaying(false) {
 	
-	_spriteResource.load2(0x24A4A664);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	updateBounds();
-	_needRefresh = true;
-	StaticSprite::update();
-	_surface->setVisible(false);
+	loadSprite(0x24A4A664, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
+	setVisible(false);
 	loadSound(0, 0x44043000);
 	loadSound(1, 0x44045000);
 	SetMessageHandler(&DiskplayerPlayButton::handleMessage);
@@ -225,7 +217,7 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p
 				press();
 			}
 		}
-		StaticSprite::update();
+		updatePosition();
 		messageResult = 1;
 		break;
 	}
@@ -234,8 +226,8 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p
 
 void DiskplayerPlayButton::press() {
 	if (!_isPlaying) {
-		_surface->setVisible(true);
-		StaticSprite::update();
+		setVisible(true);
+		updatePosition();
 		playSound(0);
 		_isPlaying = true;
 	}
@@ -243,8 +235,8 @@ void DiskplayerPlayButton::press() {
 
 void DiskplayerPlayButton::release() {
 	if (_isPlaying) {
-		_surface->setVisible(false);
-		StaticSprite::update();
+		setVisible(false);
+		updatePosition();
 		playSound(1);
 		_isPlaying = false;
 	}
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 38d8b99..f9e734d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -307,8 +307,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 4;
-	createModule(1100, -1);
+	_vm->gameState().sceneNum = 2;
+	createModule(2800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 2e7f85d..fdde1a2 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -163,12 +163,7 @@ static const uint32 kMainMenuButtonFileHashes[] = {
 MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) {
 
-	_spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]);
-	createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(kMainMenuButtonFileHashes[_buttonIndex], kSLFDefDrawOffset | kSLFDefPosition, 100);
 
 	// TODO Move to const array
 	switch (_buttonIndex) {
@@ -202,15 +197,12 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but
 	}
 	
 	setVisible(false);
-	_needRefresh = true;
-
 	SetUpdateHandler(&MainMenuButton::update);
 	SetMessageHandler(&MainMenuButton::handleMessage);
-
 }
 
 void MainMenuButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown) == 0) {
 		setVisible(false);
 		sendMessage(_parentScene, 0x2000, _buttonIndex);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index ff26d17..ac6830e 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -606,32 +606,16 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param
 AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
 	: StaticSprite(vm, 1200) {
 	
-	_spriteResource.load2(0x1052370F);
-	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	loadSprite(0x1052370F, kSLFDefDrawOffset | kSLFSetPosition, 800, 526, getGlobalVar(V_FLYTRAP_RING_DOOR) ? 49 : 239);
 	setClipRect(clipRect);
-
-	_x = 526;
-	
-	if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
-		_y = 49; 
-	} else {
-		_y = 239; 
-	}
-
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-
-	_needRefresh = true;
-	
 	SetUpdateHandler(&AsScene1002Door::update);
 	SetMessageHandler(&AsScene1002Door::handleMessage);
 	SetSpriteUpdate(NULL);
-	StaticSprite::update();
-	
 }
 
 void AsScene1002Door::update() {
 	handleSpriteUpdate();
-	StaticSprite::update();
+	updatePosition();
 }
 
 uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -761,42 +745,22 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene
 	: StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) {
 
 	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000;
-
 	_fileHashes[0] = fileHash1;
 	_fileHashes[1] = fileHash2;
-	
-	_spriteResource.load2(fileHash1);
 	createSurface(surfacePriority, 40, 40);
-	
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-
+	loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
 	setVisible(false);
-	_needRefresh = true;
-	
 	SetUpdateHandler(&SsCommonPressButton::update);
 	SetMessageHandler(&SsCommonPressButton::handleMessage);
-
 }
 
 void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHashes[0] = fileHash1;
 	_fileHashes[1] = fileHash2;
 	if (_status == 2) {
-		_spriteResource.load2(fileHash2);
-		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-		_x = _spriteResource.getPosition().x;
-		_y = _spriteResource.getPosition().y;
-		_needRefresh = true;
-		StaticSprite::update();
+		loadSprite(fileHash2, kSLFDefDrawOffset | kSLFDefPosition);
 	} else {
-		_spriteResource.load2(fileHash1);
-		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-		_x = _spriteResource.getPosition().x;
-		_y = _spriteResource.getPosition().y;
-		_needRefresh = true;
-		StaticSprite::update();
+		loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
 	}
 }
 
@@ -804,21 +768,11 @@ void SsCommonPressButton::update() {
 	if (_countdown != 0 && (--_countdown) == 0) {
 		if (_status == 1) {
 			_status = 2;
-			_spriteResource.load2(_fileHashes[1]);
-			_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-			_x = _spriteResource.getPosition().x;
-			_y = _spriteResource.getPosition().y;
-			_needRefresh = true;
-			StaticSprite::update();
+			loadSprite(_fileHashes[1], kSLFDefDrawOffset | kSLFDefPosition);
 			_countdown = 4;
 		} else if (_status == 2) {
 			_status = 3;
-			_spriteResource.load2(_fileHashes[0]);
-			_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-			_x = _spriteResource.getPosition().x;
-			_y = _spriteResource.getPosition().y;
-			_needRefresh = true;
-			StaticSprite::update();
+			loadSprite(_fileHashes[0], kSLFDefDrawOffset | kSLFDefPosition);
 			_countdown = 4;
 		} else if (_status == 3) {
 			_status = 0;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index d21e3af..afcd698 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -302,19 +302,15 @@ uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam &para
 }
 
 SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y)
-	: StaticSprite(vm, fileHash, 200) {
+	: StaticSprite(vm, 0) {
 
-	_x = x;
-	_y = y;
-	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
-		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	StaticSprite::update();
+	loadSprite(fileHash, kSLFCenteredDrawOffset | kSLFSetPosition, 200, x, y);
 }
 
 void SsScene1105Symbol::hide() {
 	setVisible(false);
 	_needRefresh = true;
-	StaticSprite::update();
+	updatePosition();
 }
 
 SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y)
@@ -338,16 +334,13 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p
 }
 
 void SsScene1105SymbolDie::loadSymbolSprite() {
-	load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false);
-	_drawOffset.x = -(_spriteResource.getDimensions().width / 2);
-	_drawOffset.y = -(_spriteResource.getDimensions().height / 2);
-	StaticSprite::update();
+	loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], kSLFCenteredDrawOffset);
 }
 
 void SsScene1105SymbolDie::hide() {
 	setVisible(false);
 	_needRefresh = true;
-	StaticSprite::update();
+	updatePosition();
 }
 
 AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene)
@@ -402,14 +395,7 @@ void AsScene1105TeddyBear::hide() {
 SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) {
 	
-	_spriteResource.load2(0x8228A46C);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
-	_needRefresh = true;
-	updateBounds();
+	loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
 	loadSound(0, 0x44045140);
 	SetUpdateHandler(&SsScene1105OpenButton::update);
@@ -417,7 +403,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS
 }
 
 void SsScene1105OpenButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown == 0)) {
 		setVisible(false);
 		sendMessage(_parentScene, 0x2001, 0);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 5237588..e6442a0 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -169,22 +169,11 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
 	int16 x = kScene1201PointArray[pointIndex].x;
 	int16 y = kScene1201PointArray[pointIndex].y;
 	if (x < 300) {
-		_spriteResource.load2(kScene1201TntFileHashList1[elemIndex]);
-		_x = _spriteResource.getPosition().x;
-		_y = _spriteResource.getPosition().y;
-		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+		loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50);
 	} else {
-		_spriteResource.load2(kScene1201TntFileHashList2[elemIndex]);
-		_x = x;
-		_y = y;
-		_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -_spriteResource.getDimensions().height,
-			_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	
+		loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y);
 	}
-	createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	setClipRect(0, 0, 640, clipY2);
-	_needRefresh = true;
-	StaticSprite::update();
 }
 	
 AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash)
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index b623af0..409e554 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -370,7 +370,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
 
 void SsScene1302Fence::update() {
 	handleSpriteUpdate();
-	StaticSprite::update();
+	updatePosition();
 }
 
 uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1533,7 +1533,7 @@ SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int i
 	
 	setVisible(false);
 	_x = _spriteResource.getPosition().x + index * 20;
-	StaticSprite::update();
+	updatePosition();
 }
 
 AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index cedb283..0693417 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -791,7 +791,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas
 	: StaticSprite(vm, fileHash, surfacePriority) {
 	
 	SetFilterY(&Sprite::defFilterY);
-	SetUpdateHandler(&StaticSprite::update);
+	SetUpdateHandler(&StaticSprite::updatePosition);
 	
 }
 
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index f6dea96..df64e19 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -145,7 +145,7 @@ SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHas
 	
 	_x = _spriteResource.getPosition().x + symbolIndex * 30;
 	_y = _spriteResource.getPosition().y + 160;
-	StaticSprite::update();
+	updatePosition();
 }
 
 SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash)
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index fb98c2e..da02243 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -455,15 +455,8 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
 	: StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol),
 	_countdown1(0) {
 	
-	_spriteResource.load2(0x64516424);
-	createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	loadSprite(0x64516424, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1400);
 	setVisible(false);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	updateBounds();
-	_needRefresh = true;
 	loadSound(0, 0x44061000);
 	SetUpdateHandler(&SsScene1907UpDownButton::update);
 	SetMessageHandler(&SsScene1907UpDownButton::handleMessage);
@@ -476,7 +469,7 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
 }
 
 void SsScene1907UpDownButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown1 != 0 && (--_countdown1 == 0)) {
 		setVisible(false);
 		sendMessage(_parentScene, 0x2000, 0);
@@ -490,7 +483,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
 		if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
 			setVisible(true);
 			_countdown1 = 4;
-			StaticSprite::update();
+			updatePosition();
 			playSound(0);
 		}
 		messageResult = 1;
@@ -500,14 +493,14 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
 
 void SsScene1907UpDownButton::setToUpPosition() {
 	_y = _spriteResource.getPosition().y;
-	Sprite::updateBounds();
-	StaticSprite::update();
+	updateBounds();
+	updatePosition();
 }
 
 void SsScene1907UpDownButton::setToDownPosition() {
 	_y = _spriteResource.getPosition().y + 174;
-	Sprite::updateBounds();
-	StaticSprite::update();
+	updateBounds();
+	updatePosition();
 }
 
 AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 879250a..cbd11b6 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -165,8 +165,7 @@ SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene
 		_soundFileHash = 0x44141000;
 	createSurface(1010, 61, 30);
 	if (_fileHash1) {
-		load(_fileHash1, true, true);
-		StaticSprite::update();
+		loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
 	} else
 		setVisible(false);
 }
@@ -175,8 +174,7 @@ void SsCommonFloorButton::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		sendMessage(_parentScene, 0x1022, 1010);
 		if (_fileHash1) {
-			load(_fileHash1, true, true);
-			StaticSprite::update();
+			loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
 		} else
 			setVisible(false);
 	}
@@ -189,8 +187,7 @@ uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &pa
 		sendMessage(_parentScene, 0x480B, 0);
 		setVisible(true);
 		sendMessage(_parentScene, 0x1022, 990);
-		load(_fileHash2, true, true);
-		StaticSprite::update();
+		loadSprite(_fileHash2, kSLFDefDrawOffset | kSLFDefPosition);
 		_countdown = 16;
 		playSound(0, _soundFileHash);
 		break;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 06cdc10..102704a 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -488,13 +488,9 @@ void AsScene2201Door::stCloseDoor() {
 SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex)
 	: StaticSprite(vm, 900) {
 	
-	_spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]);
 	createSurface(100, 16, 16);
-	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
-		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = kSsScene2201PuzzleCubePoints[positionIndex].x;
-	_y = kSsScene2201PuzzleCubePoints[positionIndex].y;
-	_needRefresh = true;
+	loadSprite(kSsScene2201PuzzleCubeFileHashes[cubeIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 0,
+		kSsScene2201PuzzleCubePoints[positionIndex].x, kSsScene2201PuzzleCubePoints[positionIndex].y);
 }
 
 Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -670,32 +666,26 @@ static const uint32 kSsScene2202PuzzleTileFileHashes2[] = {
 
 SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) {
-	
+
+	int surfacePriority;	
+
 	SetUpdateHandler(&SsScene2202PuzzleTile::update);
 	SetMessageHandler(&SsScene2202PuzzleTile::handleMessage);
-	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
-	if (_tileIndex >= 0 && _tileIndex <= 2) {
-		createSurface(100, 128, 128);
-	} else	if (_tileIndex >= 3 && _tileIndex <= 5) {
-		createSurface(300, 128, 128);
-	} else {
-		createSurface(500, 128, 128);
-	}
-	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
-		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
-	_x = kSsScene2202PuzzleTilePoints[_tileIndex].x;
-	_y = kSsScene2202PuzzleTilePoints[_tileIndex].y;
-	updateBounds();
-	_needRefresh = true;
-	StaticSprite::update();
+	if (_tileIndex >= 0 && _tileIndex <= 2)
+		surfacePriority = 100;
+	else if (_tileIndex >= 3 && _tileIndex <= 5)
+		surfacePriority = 300;
+	else
+		surfacePriority = 500;
+	loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0,
+		kSsScene2202PuzzleTilePoints[_tileIndex].x, kSsScene2202PuzzleTilePoints[_tileIndex].y);
 	loadSound(0, 0x40958621);
 	loadSound(1, 0x51108241);
 }
 
 void SsScene2202PuzzleTile::update() {
 	handleSpriteUpdate();
-	StaticSprite::update();
+	updatePosition();
 }
 
 uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -787,10 +777,7 @@ void SsScene2202PuzzleTile::suMoveTileY() {
 
 void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 
-	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]);
-	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
-		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_needRefresh = true;
+	loadSprite(kSsScene2202PuzzleTileFileHashes1[_value], kSLFCenteredDrawOffset);
 
 	setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1);
 	setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value);
@@ -866,10 +853,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 }
 
 void SsScene2202PuzzleTile::stopMoving() {
-	_spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
-	_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
-		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_needRefresh = true;
+	loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset);
 	SetSpriteUpdate(NULL);
 	_isMoving = false;
 	sendMessage(_parentScene, 0x2002, _tileIndex);
@@ -1215,25 +1199,16 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 
 	SetMessageHandler(&SsScene2205DoorFrame::handleMessage);
-	_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
 	createSurface(1100, 45, 206);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_needRefresh = true;
-	StaticSprite::update();
+	loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition);
 }
 
 uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2000:
-		_spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
-		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-		_x = _spriteResource.getPosition().x;
-		_y = _spriteResource.getPosition().y;
-		_needRefresh = true;
-		StaticSprite::update();
+		loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition);
+		break;
 	}
 	return messageResult;
 }
@@ -1388,7 +1363,7 @@ AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHas
 
 void AsScene2206DoorSpikes::update() {
 	handleSpriteUpdate();
-	StaticSprite::update();
+	updatePosition();
 }
 
 uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1440,7 +1415,7 @@ AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash)
 
 void AsScene2206Platform::update() {
 	handleSpriteUpdate();
-	StaticSprite::update();
+	updatePosition();
 }
 
 uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1974,7 +1949,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
 
 	_x = 330;
 	_y = 246 + index * 50;
-	StaticSprite::update();	
+	updatePosition();	
 }
 
 Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index a017c11..ccc47d0 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -763,8 +763,7 @@ void Scene2402::update() {
 	if (_countdown != 0 && (--_countdown) == 0) {
 		if (_pipeStatus >= 10) {
 			sendMessage(_asDoor, 0x4808, 0);
-			_ssDoorFrame->load(0x00B415E0, true, true);
-			_ssDoorFrame->update();
+			_ssDoorFrame->loadSprite(0x00B415E0, kSLFDefDrawOffset | kSLFDefPosition);
 		} else if (_pipeStatus >= 5) {
 			_countdown = 8;
 			playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]);
@@ -791,8 +790,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2001:
-		_ssDoorFrame->load(0x406C0AE0, true, true);
-		_ssDoorFrame->update();
+		_ssDoorFrame->loadSprite(0x406C0AE0, kSLFDefDrawOffset | kSLFDefPosition);
 		break;
 	case 0x480B:
 		if (sender == _ssButton) {
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 8345a8c..de6e19e 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -485,14 +485,7 @@ void Scene2501::updateKlaymanCliprect() {
 SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
 	: StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) {
 	
-	_spriteResource.load2(0x070220D9);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_collisionBoundsOffset = _drawOffset;
-	updateBounds();
-	_needRefresh = true;
+	loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
 	loadSound(0, 0x4600204C);
 	loadSound(1, 0x408C0034);
@@ -503,7 +496,7 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
 }
 
 void SsScene2504Button::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) {
 		playSound(3);
 		setVisible(false);
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 7008a90..d1b95be 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -208,30 +208,19 @@ void Module2600::updateScene() {
 SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
 	
-	_spriteResource.load2(0x825A6923);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	if (!getGlobalVar(V_WATER_RUNNING))
 		setVisible(false);
-
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	updateBounds();
-	_needRefresh = true;
-
 	loadSound(0, 0x10267160);
 	loadSound(1, 0x7027FD64);
 	loadSound(2, 0x44043000);
 	loadSound(3, 0x44045000);
-
 	SetUpdateHandler(&SsScene2609Button::update);
 	SetMessageHandler(&SsScene2609Button::handleMessage);
-
 }
 
 void SsScene2609Button::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown == 0)) {
 		if (getGlobalVar(V_WATER_RUNNING)) {
 			setGlobalVar(V_WATER_RUNNING, 0);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index c5524fa..1e02e64 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -510,13 +510,7 @@ static const NPoint kCarShadowOffsets[] = {
 SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash)
 	: StaticSprite(vm, 0) {
 	
-	_spriteResource.load2(fileHash);
-	createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_needRefresh = true;
-	StaticSprite::update();
+	loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 0);
 }
 
 AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index)
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 53ae40c..c42e033 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -407,10 +407,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2801::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
-	if (getGlobalVar(V_RADIO_ENABLED) == 0) {
-		// Display the disabled radio; only possible when the left door is open
+	// Display the disabled radio; only possible when the left door is open
+	if (!getGlobalVar(V_RADIO_ENABLED))
 		insertStaticSprite(0x0001264C, 100);
-	}
 
 	if (which < 0) {
 		insertKlayman<KmScene2801>(194, 430);
@@ -1013,34 +1012,24 @@ void Scene2803::changeBackground() {
 		_background->load(0x412A423E);
 		_palette->addPalette(0x412A423E, 0, 256, 0);
 		_palette->addBasePalette(0x412A423E, 0, 256, 0);
-		_sprite3->load(0xA40EF2FB, false, false);
-		_sprite3->update();
-		_sprite4->load(0x0C03AA23, false, false);
-		_sprite4->update();
-		_sprite5->load(0x2A822E2E, false, false);
-		_sprite5->update();
-		_sprite6->load(0x2603A202, false, false);
-		_sprite6->update();
-		_sprite7->load(0x24320220, false, false);
-		_sprite7->update();
+		_sprite3->loadSprite(0xA40EF2FB);
+		_sprite4->loadSprite(0x0C03AA23);
+		_sprite5->loadSprite(0x2A822E2E);
+		_sprite6->loadSprite(0x2603A202);
+		_sprite7->loadSprite(0x24320220);
 		_mouseCursor->load(0xA423A41A);
 		_mouseCursor->updateCursor();
-		_sprite8->load(0x3C42022F, false, false);
-		_sprite8->update();
-		_sprite9->load(0x341A0237, false, false);
-		_sprite9->update();
+		_sprite8->loadSprite(0x3C42022F);
+		_sprite9->loadSprite(0x341A0237);
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
-			_asTestTubeOne->load(0x66121222, false, false);
-			_asTestTubeOne->update();
+			_asTestTubeOne->loadSprite(0x66121222);
 		} else
 			sendMessage(_asTestTubeOne, 0x2000, 0);
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
-			_asTestTubeTwo->load(0x64330236, false, false);
-			_asTestTubeTwo->update();
+			_asTestTubeTwo->loadSprite(0x64330236);
 		}
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
-			_asTestTubeThree->load(0x2E4A22A2, false, false);
-			_asTestTubeThree->update();
+			_asTestTubeThree->loadSprite(0x2E4A22A2);
 		}
 		_sprite10->setVisible(true);
 	} else {
@@ -1048,34 +1037,24 @@ void Scene2803::changeBackground() {
 		_background->load(0x29800A01);
 		_palette->addPalette(0x29800A01, 0, 256, 0);
 		_palette->addBasePalette(0x29800A01, 0, 256, 0);
-		_sprite3->load(0x234340A0, false, false);
-		_sprite3->update();
-		_sprite4->load(0x16202200, false, false);
-		_sprite4->update();
-		_sprite5->load(0x1030169A, false, false);
-		_sprite5->update();
-		_sprite6->load(0x1600A6A8, false, false);
-		_sprite6->update();
-		_sprite7->load(0xD0802EA0, false, false);
-		_sprite7->update();
+		_sprite3->loadSprite(0x234340A0);
+		_sprite4->loadSprite(0x16202200);
+		_sprite5->loadSprite(0x1030169A);
+		_sprite6->loadSprite(0x1600A6A8);
+		_sprite7->loadSprite(0xD0802EA0);
 		_mouseCursor->load(0x00A05290);
 		_mouseCursor->updateCursor();
-		_sprite8->load(0x108012C1, false, false);
-		_sprite8->update();
-		_sprite9->load(0x708072E0, false, false);
-		_sprite9->update();
+		_sprite8->loadSprite(0x108012C1);
+		_sprite9->loadSprite(0x708072E0);
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
-			_asTestTubeOne->load(0x50C027A8, false, false);
-			_asTestTubeOne->update();
+			_asTestTubeOne->loadSprite(0x50C027A8);
 		} else
 			sendMessage(_asTestTubeOne, 0x2000, 1);
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
-			_asTestTubeTwo->load(0xD48077A0, false, false);
-			_asTestTubeTwo->update();
+			_asTestTubeTwo->loadSprite(0xD48077A0);
 		}
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
-			_asTestTubeThree->load(0x30022689, false, false);
-			_asTestTubeThree->update();
+			_asTestTubeThree->loadSprite(0x30022689);
 		}
 		_sprite10->setVisible(false);
 	}
@@ -1368,25 +1347,15 @@ void Scene2803Small::updatePaletteArea(bool instantly) {
 SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene)
 	: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) {
 	
-	if (getGlobalVar(V_SHRINK_LIGHTS_ON))
-		_spriteResource.load2(0x51A10202);
-	else
-		_spriteResource.load2(0x11814A21);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_collisionBoundsOffset = _drawOffset;
-	updateBounds();
+	loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0x51A10202 : 0x11814A21, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
-	_needRefresh = true;
 	SetUpdateHandler(&SsScene2804RedButton::update);
 	SetMessageHandler(&SsScene2804RedButton::handleMessage);
 	loadSound(0, 0x44241240);
 }
 
 void SsScene2804RedButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown) == 0) {
 		setVisible(false);
 	}
@@ -1411,14 +1380,8 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p
 SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
-	_spriteResource.load2(0x8889B008);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(0x8889B008, kSLFDefDrawOffset | kSLFDefPosition, 400);
 	setVisible(false);
-	_needRefresh = true;
-	StaticSprite::update();
 	SetMessageHandler(&SsScene2804LightCoil::handleMessage);
 }
 
@@ -1427,12 +1390,12 @@ uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &p
 	switch (messageNum) {
 	case 0x2002:
 		setVisible(true);
-		StaticSprite::update();
+		updatePosition();
 		messageResult = 1;
 		break;
 	case 0x2003:
 		setVisible(false);
-		StaticSprite::update();
+		updatePosition();
 		messageResult = 1;
 		break;
 	}
@@ -1442,14 +1405,8 @@ uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &p
 SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
-	_spriteResource.load2(0x06092132);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(0x06092132, kSLFDefDrawOffset | kSLFDefPosition, 400);
 	setVisible(false);
-	_needRefresh = true;
-	StaticSprite::update();
 	SetMessageHandler(&SsScene2804LightTarget::handleMessage);
 }
 
@@ -1458,12 +1415,12 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam
 	switch (messageNum) {
 	case 0x2004:
 		setVisible(true);
-		StaticSprite::update();
+		updatePosition();
 		messageResult = 1;
 		break;
 	case 0x2005:
 		setVisible(false);
-		StaticSprite::update();
+		updatePosition();
 		messageResult = 1;
 		break;
 	}
@@ -1473,34 +1430,22 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam
 SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
-	_spriteResource.load2(0x211003A0);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(0x211003A0, kSLFDefDrawOffset | kSLFDefPosition, 400);
 	setVisible(false);
-	_needRefresh = true;
-	StaticSprite::update();
 	loadSound(0, 0xCB36BA54);
 }
 
 void SsScene2804Flash::show() {
 	setVisible(true);
-	StaticSprite::update();
+	updatePosition();
 	playSound(0);
 }
 
 SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm)
 	: StaticSprite(vm, 900) {
 	
-	_spriteResource.load2(0x9A816000);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(0x9A816000, kSLFDefDrawOffset | kSLFDefPosition, 400);
 	setVisible(false);
-	_needRefresh = true;
-	StaticSprite::update();
 }
 
 AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex)
@@ -1635,26 +1580,16 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280
 		0x5008292B
 	};
 	
-	if (getGlobalVar(V_SHRINK_LIGHTS_ON))
-		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]);
-	else
-		_spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]);
-
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_collisionBoundsOffset = _drawOffset;
-	updateBounds();
+	loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? kSsScene2804CrystalButtonFileHashes1[crystalIndex] : kSsScene2804CrystalButtonFileHashes2[crystalIndex],
+		kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
 	loadSound(0, 0x44045140);
-	_needRefresh = true;
 	SetUpdateHandler(&SsScene2804CrystalButton::update);
 	SetMessageHandler(&SsScene2804CrystalButton::handleMessage);
 }
 
 void SsScene2804CrystalButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown) == 0) {
 		setVisible(false);
 	}
@@ -1721,7 +1656,7 @@ uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &pa
 	
 void AsScene2804BeamCoil::show() {
 	_ssBeamCoilBody->setVisible(true);
-	// TODO _ssBeamCoilBody->update(); -> show()
+	// TODO _ssBeamCoilBody->updatePosition(); -> show()
 	setVisible(true);
 	startAnimation(0x00494891, 0, -1);
 	playSound(0);
@@ -1734,7 +1669,7 @@ void AsScene2804BeamCoil::hide() {
 	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
 	setVisible(false);
 	_ssBeamCoilBody->setVisible(false);
-	// TODO _ssBeamCoilBody->update(); -> hide()
+	// TODO _ssBeamCoilBody->updatePosition(); -> hide()
 	_vm->_soundMan->stopSound(0xEF56B094);
 }
 
@@ -2242,22 +2177,14 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce
 	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum),
 	_testTubeIndex(testTubeIndex) {
 	
-	_spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]);
-	createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_collisionBoundsOffset = _drawOffset;
-	updateBounds();
+	loadSprite(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex], kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1500);
+	setVisible(false);
 	SetUpdateHandler(&SsScene2808Dispenser::update);
 	SetMessageHandler(&SsScene2808Dispenser::handleMessage);
-	setVisible(false);
-	_needRefresh = true;
-	StaticSprite::update();
 }
 
 void SsScene2808Dispenser::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown) == 0) {
 		setVisible(false);
 	}
@@ -2276,7 +2203,7 @@ uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &p
 
 void SsScene2808Dispenser::startCountdown(int index) {
 	setVisible(true);
-	StaticSprite::update();
+	updatePosition();
 	if (_testTubeSetNum == 0) {
 		_countdown = kClass428Countdowns1[index];
 	} else {
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index ae74b14..4b8f28e 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -254,24 +254,18 @@ static const uint32 kSsScene2901BigButtonFileHashes[] = {
 SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) {
 
-	_spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]);
-	createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25;
-	_collisionBounds.y1 = kSsScene2901LocationButtonPoints[_index].y - 25;
-	_collisionBounds.x2 = kSsScene2901LocationButtonPoints[_index].x + 25;
-	_collisionBounds.y2 = kSsScene2901LocationButtonPoints[_index].y + 25;
+	const NPoint &pt = kSsScene2901LocationButtonPoints[_index];
+	
+	loadSprite(kSsScene2901LocationButtonFileHashes[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 800);
+	_collisionBounds.set(pt.x - 25, pt.y - 25, pt.x + 25, pt.y + 25);
 	setVisible(false);
-	_needRefresh = true;
 	loadSound(0, 0x440430C0);
 	SetUpdateHandler(&SsScene2901LocationButton::update);
 	SetMessageHandler(&SsScene2901LocationButton::handleMessage);
 }
 	
 void SsScene2901LocationButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown1 != 0 && (--_countdown1) == 0) {
 		setVisible(false);
 	}
@@ -296,57 +290,41 @@ uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessagePar
 SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index)
 	: StaticSprite(vm, 900), _index(index) {
 	
-	_spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]);
-	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 900);
 	setVisible(false);
-	_needRefresh = true;
 	loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]);
 }
 
 void SsScene2901LocationButtonLight::show() {
 	playSound(0);
 	setVisible(true);
-	StaticSprite::update();
+	updatePosition();
 }
 
 void SsScene2901LocationButtonLight::hide() {
 	setVisible(false);
-	StaticSprite::update();
+	updatePosition();
 }
 
 SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which)
 	: StaticSprite(vm, 900) {
 
-	_spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]);
-	createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_needRefresh = true;
-	StaticSprite::update();
+	loadSprite(kSsScene2901BrokenButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 900);
 }
 
 SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) {
-	
-	_spriteResource.load2(kSsScene2901BigButtonFileHashes[which]);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);	
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+
+	loadSprite(kSsScene2901BigButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 400);	
 	_collisionBounds.set(62, 94, 322, 350);
 	setVisible(false);
-	_needRefresh = true;
 	loadSound(0, 0xF3D420C8);
 	SetUpdateHandler(&SsScene2901BigButton::update);
 	SetMessageHandler(&SsScene2901BigButton::handleMessage);
 }
 
 void SsScene2901BigButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown1 != 0 && (--_countdown1) == 0) {
 		setVisible(false);
 		sendMessage(_parentScene, 0x2000, 0);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index cb4faaf..713d72d 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -471,22 +471,15 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = {
 SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene)
 	: StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) {
 	
-	_spriteResource.load2(0x120B24B0);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
+	loadSprite(0x120B24B0, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
-	updateBounds();
-	_needRefresh = true;
 	SetUpdateHandler(&SsScene3009FireCannonButton::update);
 	SetMessageHandler(&SsScene3009FireCannonButton::handleMessage);
 	loadSound(0, 0x3901B44F);
 }
 
 void SsScene3009FireCannonButton::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_isClicked && !isSoundPlaying(0)) {
 		sendMessage(_parentScene, 0x2000, 0);
 		setVisible(false);
@@ -511,17 +504,11 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP
 SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
 	: StaticSprite(vm, 1400), _blinkCountdown(0) {
 
-	_spriteResource.load2(kSsScene3009SymbolEdgesFileHashes[index]);
-	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_needRefresh = true;
-	if (getGlobalVar(V_ROBOT_HIT)) {
+	loadSprite(kSsScene3009SymbolEdgesFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600);
+	if (getGlobalVar(V_ROBOT_HIT))
 		hide();
-	} else {
+	else
 		startBlinking();
-	}
 	SetUpdateHandler(&SsScene3009SymbolEdges::update);
 }
 
@@ -532,7 +519,7 @@ void SsScene3009SymbolEdges::update() {
 		} else {
 			setVisible(false);
 		}
-		StaticSprite::update();
+		updatePosition();
 		_blinkCountdown = 3;
 		_blinkToggle = !_blinkToggle;
 	}
@@ -540,19 +527,19 @@ void SsScene3009SymbolEdges::update() {
 
 void SsScene3009SymbolEdges::show() {
 	setVisible(true);
-	StaticSprite::update();
+	updatePosition();
 	_blinkCountdown = 0;
 }
 
 void SsScene3009SymbolEdges::hide() {
 	setVisible(false);
-	StaticSprite::update();
+	updatePosition();
 	_blinkCountdown = 0;
 }
 
 void SsScene3009SymbolEdges::startBlinking() {
 	setVisible(true);
-	StaticSprite::update();
+	updatePosition();
 	_blinkCountdown = 3;
 	_blinkToggle = true;
 }
@@ -560,18 +547,13 @@ void SsScene3009SymbolEdges::startBlinking() {
 SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
 	: StaticSprite(vm, 1400) {
 
-	_spriteResource.load2(kSsScene3009TargetLineFileHashes[index]);
-	createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	loadSprite(kSsScene3009TargetLineFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600);
 	setVisible(false);
-	_needRefresh = true;
 }
 
 void SsScene3009TargetLine::show() {
 	setVisible(true);
-	StaticSprite::update();
+	updatePosition();
 }
 
 SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index)
@@ -579,14 +561,13 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy
 
 	_incrDecr = _index % 2;
 
-	_spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
 	createSurface(1200, 33, 31);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
+	loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefPosition);
 	_drawOffset.set(0, 0, 33, 31);
 	_collisionBoundsOffset = _drawOffset;
 	updateBounds();
 	_needRefresh = true;
+
 	SetUpdateHandler(&SsScene3009SymbolArrow::update);
 	SetMessageHandler(&SsScene3009SymbolArrow::handleMessage);
 	loadSound(0, 0x2C852206);
@@ -598,11 +579,9 @@ void SsScene3009SymbolArrow::hide() {
 }
 
 void SsScene3009SymbolArrow::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown == 0)) {
-		_spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
-		_needRefresh = true;
-		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+		loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefDrawOffset);
 	}
 }
 
@@ -612,9 +591,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
 	case 0x1011:
 		if (_enabled && _countdown == 0) {
 			_countdown = 2;
-			_spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]);
-			_needRefresh = true;
-			_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+			loadSprite(kSsScene3009SymbolArrowFileHashes1[_index], kSLFDefDrawOffset);
 			playSound(0);
 			sendMessage(_asSymbol, 0x2005, _incrDecr);
 		}
@@ -1063,22 +1040,13 @@ static const uint32 kAsScene3010DeadBoltFileHashes1[] = {
 SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) {
 
-	NDimensions dimensions1, dimensions2;
-	 
 	_buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0;
-	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
-	dimensions1 = _spriteResource.getDimensions();
-	_spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
-	dimensions2 = _spriteResource.getDimensions();
-	createSurface(400, 
-		MAX(dimensions1.width, dimensions2.width),
-		MAX(dimensions1.height, dimensions2.height));
+	createSurface(400, 88, 95);
 	setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
-	if (initDisabled) {
+	if (initDisabled)
 		disableButton();
-	} else if (_buttonEnabled) {
+	else if (_buttonEnabled)
 		_countdown1 = initCountdown * 12 + 1;
-	}
 	loadSound(0, 0xF4217243);
 	loadSound(1, 0x44049000);
 	loadSound(2, 0x6408107E);
@@ -1116,7 +1084,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
 				sendMessage(_parentScene, 0x2002, _buttonIndex);
 			}
 			_needRefresh = true;
-			StaticSprite::update();
+			updatePosition();
 		}
 		messageResult = 1;
 		break;
@@ -1131,14 +1099,7 @@ void SsScene3010DeadBoltButton::disableButton() {
 }
 
 void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
-	_spriteResource.load(fileHash);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
-	updateBounds();
-	_needRefresh = true;
-	StaticSprite::update();
+	loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset);
 }
 
 void SsScene3010DeadBoltButton::setCountdown(int count) {
@@ -1397,26 +1358,15 @@ static const uint32 kAsScene3011SymbolFileHashes[] = {
 SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag)
 	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
 	
-	if (flag) {
-		_spriteResource.load2(0x11282020);
-	} else {
-		_spriteResource.load2(0x994D0433);
-	}
-	loadSound(0, 0x44061000);
-	createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_x = _spriteResource.getPosition().x;
-	_y = _spriteResource.getPosition().y;
-	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	_collisionBoundsOffset = _drawOffset;
+	loadSprite(flag ? 0x11282020 : 0x994D0433, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
-	updateBounds();
-	_needRefresh = true;
+	loadSound(0, 0x44061000);
 	SetUpdateHandler(&SsScene3011Button::update);
 	SetMessageHandler(&SsScene3011Button::handleMessage);
 }
 
 void SsScene3011Button::update() {
-	StaticSprite::update();
+	updatePosition();
 	if (_countdown != 0 && (--_countdown == 0)) {
 		setVisible(false);
 	}
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 40b651e..d034783 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -120,42 +120,43 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
 
 }
 
-StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
+StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y)
 	: Sprite(vm, 0), _spriteResource(vm) {
 
-	init(calcHash(filename), surfacePriority, x, y, width, height);
-}
-
-StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
-	: Sprite(vm, 0), _spriteResource(vm) {
-
-	init(fileHash, surfacePriority, x, y, width, height);
-}
-
-void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) {
-
 	_spriteResource.load2(fileHash);
-
-	if (width == 0)
-		width = _spriteResource.getDimensions().width;
-
-	if (height == 0)
-		height = _spriteResource.getDimensions().height;
-
-	createSurface(surfacePriority, width, height);
-
+	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
 	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
-	
-	_drawOffset.set(0, 0, width, height);
-
+	_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_needRefresh = true;
+	updatePosition();
+}
 
-	update();
-	
+void StaticSprite::loadSprite(uint32 fileHash, uint flags, int surfacePriority, int16 x, int16 y) {
+	_spriteResource.load2(fileHash);
+	if (!_surface)
+		createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	if (flags & kSLFDefDrawOffset)
+		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	else if (flags & kSLFCenteredDrawOffset)
+		_drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+			_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	if (flags & kSLFDefPosition) {
+		_x = _spriteResource.getPosition().x;
+		_y = _spriteResource.getPosition().y;
+	} else if (flags & kSLFSetPosition) {
+		_x = x;
+		_y = y;
+	}
+	if (flags & kSLFDefCollisionBoundsOffset) {
+		_collisionBoundsOffset = _drawOffset;
+		updateBounds();
+	}
+	_needRefresh = true;
+	updatePosition();
 }
 
-void StaticSprite::update() {
+void StaticSprite::updatePosition() {
 
 	if (!_surface)
 		return;
@@ -179,23 +180,6 @@ void StaticSprite::update() {
 
 }
 
-void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
-
-	_spriteResource.load2(fileHash);
-
-	if (dimensions) {
-		_drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-	}
-
-	if (position) {
-		_x = _spriteResource.getPosition().x;
-		_y = _spriteResource.getPosition().y;
-	}
-
-	_needRefresh = true;
-
-}
-
 // AnimatedSprite
 
 AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, int objectPriority)
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 7e07f3a..80da176 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -93,16 +93,22 @@ protected:
 	}
 };
 
+enum {
+	kSLFDefDrawOffset				= 1 << 0,
+	kSLFCenteredDrawOffset			= 1 << 1,
+	kSLFDefPosition					= 1 << 2,
+	kSLFSetPosition					= 1 << 3,
+	kSLFDefCollisionBoundsOffset	= 1 << 4
+};
+
 class StaticSprite : public Sprite {
 public:
 	StaticSprite(NeverhoodEngine *vm, int objectPriority);
-	StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
-	StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
-	void load(uint32 fileHash, bool dimensions, bool position);
-	void update();
+	StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition);
+	void loadSprite(uint32 fileHash, uint flags = 0, int surfacePriority = 0, int16 x = kDefPosition, int16 y = kDefPosition);
+	void updatePosition();
 protected:
 	SpriteResource _spriteResource;
-	void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
 };
 
 #define AnimationCallback(callback) static_cast <void (AnimatedSprite::*)()> (callback)


Commit: 4d7610f69d3395e319c56b822197ea6f6c87be96
    https://github.com/scummvm/scummvm/commit/4d7610f69d3395e319c56b822197ea6f6c87be96
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1000:

- Rename stuff
- Remove superfluous braces
- Add a comment to the "which" code in each scene
- Use a seperate _sceneNum instead of _vm->gameState().sceneNum
- Remove code related to unused resource preloading and debug messages

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module3000.cpp
    engines/neverhood/module3000.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f9e734d..350dd76 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -289,9 +289,11 @@ void GameModule::startup() {
 	setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 	setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
 	setGlobalVar(V_TV_JOKE_TOLD, 1);
+	/*
 	// Give all disks
 	for (int i = 0; i < 20; i++)
 		setSubVar(VA_IS_TAPE_INSERTED, i, 1);
+	*/
 	setSubVar(VA_IS_KEY_INSERTED, 0, 1);
 	setSubVar(VA_IS_KEY_INSERTED, 1, 1);
 	setSubVar(VA_IS_KEY_INSERTED, 2, 1);
@@ -306,9 +308,16 @@ void GameModule::startup() {
 	// <<<DEBUG
 
 #if 1
-	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 2;
-	createModule(2800, -1);
+	/*
+	//DEBUG>>>
+	createScene(_vm->gameState().sceneNum, _vm->gameState().which);
+	return;
+	//DEBUG<<<
+	*/
+
+	_vm->gameState().which = 1;
+	_vm->gameState().sceneNum = 3;
+	createModule(1000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index ac6830e..c7c3fb2 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -50,25 +50,30 @@ Module1000::~Module1000() {
 
 void Module1000::createScene(int sceneNum, int which) {
 	debug("Module1000::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
 		_childObject = new Scene1001(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
 		_childObject = new Scene1002(_vm, this, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
 		createStaticScene(0xC084110C, 0x41108C00);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_vm->_soundMan->stopMusic(0x061880C6, 0, 2);
 		_childObject = new Scene1004(_vm, this, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->stopMusic(0x061880C6, 0, 0);
 		_vm->_soundMan->startMusic(_musicFileHash, 0, 0);
 		_childObject = new Scene1005(_vm, this, which);
@@ -80,7 +85,7 @@ void Module1000::createScene(int sceneNum, int which) {
 
 void Module1000::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (_moduleResult == 2)
 				createScene(2, 0);
@@ -209,11 +214,10 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &para
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x00352100) {
+		if (param.asInteger() == 0x00352100)
 			sendMessage(_asDoor, 0x2000, 0);
-		} else if (param.asInteger() == 0x0A1A0109) {
+		else if (param.asInteger() == 0x0A1A0109)
 			playSound(0, 0x66410886);
-		}
 		break;
 	case 0x2000:
 		startAnimation(0x022C90D4, 1, -1);
@@ -240,9 +244,8 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &para
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x0E0A1410) {
+		if (param.asInteger() == 0x0E0A1410)
 			playSound(0, 0x60803F10);
-		}
 		break;
 	case 0x2001:
 		startAnimation(0xC68C2299, 0, -1);
@@ -273,11 +276,10 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x00C0C444) {
+		if (param.asInteger() == 0x00C0C444)
 			sendMessage(_parentScene, 0x480F, 0);
-		} else if (param.asInteger() == 0xC41A02C0) {
+		else if (param.asInteger() == 0xC41A02C0)
 			playSound(0, 0x40581882);
-		}
 		break;
 	case 0x1011:
 		sendMessage(_parentScene, 0x4826, 0);
@@ -311,9 +313,8 @@ SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentSce
 }
 	
 void SsCommonButtonSprite::update() {
-	if (_countdown != 0 && (--_countdown) == 0) {
+	if (_countdown != 0 && (--_countdown) == 0)
 		setVisible(false);
-	}
 }
 	
 uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -330,7 +331,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 }
 		
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule, true), _asDoor(NULL), _asWindow(NULL) {
 
 	Sprite *tempSprite;
 
@@ -342,14 +343,17 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x6520A400);
 	
 	if (which < 0) {
+		// Restoring game
 		setRectList(0x004B49F0);
 		insertKlayman<KmScene1001>(200, 433);
 		setMessageList(0x004B4888);
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		setRectList(0x004B49F0);
 		insertKlayman<KmScene1001>(640, 433);
 		setMessageList(0x004B4898);
 	} else if (which == 2) {
+		// Klaymen returning from looking through the window
 		setRectList(0x004B49F0);
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1001>(390, 433);
@@ -359,6 +363,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 		setMessageList(0x004B4970);
 	} else {
+		// Klaymen sleeping
 		setRectList(0x004B4A00);
 		insertKlayman<KmScene1001>(200, 433);
 		setMessageList(0x004B4890);
@@ -368,11 +373,9 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
 	
-	if (getGlobalVar(V_DOOR_BUSTED) == 0) {
+	if (!getGlobalVar(V_DOOR_BUSTED)) {
 		_asDoor = insertSprite<AsScene1001Door>();
 		_asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
-	} else {
-		_asDoor = NULL;
 	}
 
 	_asLever = insertSprite<AsScene1001Lever>(this, 150, 433, 1);
@@ -382,12 +385,10 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
 
-	if (getGlobalVar(V_WINDOW_OPEN) == 0) {
+	if (!getGlobalVar(V_WINDOW_OPEN)) {
 		tempSprite = insertStaticSprite(0x8C066150, 200);
 		_asWindow = insertSprite<AsScene1001Window>();
 		_asWindow->setClipRect(tempSprite->getDrawRect());
-	} else {
-		_asWindow = NULL;
 	}
 
 	_asHammer = insertSprite<AsScene1001Hammer>(_asDoor);
@@ -399,21 +400,9 @@ Scene1001::~Scene1001() {
 }
 
 uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug("Scene1001::handleMessage(%04X)", messageNum);
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) {
-			leaveScene(0);
-		}
-		break;
-	case 0x000D:
-		if (param.asInteger() == 0x188B2105) {
-			leaveScene(0);
-			messageResult = 1;
-		}
-		break;
 	case 0x100D:
 		if (param.asInteger() == 0x00342624) {
 			sendEntityMessage(_klayman, 0x1014, _asLever);
@@ -440,14 +429,10 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 		setRectList(0x004B49F0);
 		break;
 	case 0x480B:
-		if (_asWindow) {
-			sendMessage(_asWindow, 0x2001, 0);
-		}
+		sendMessage(_asWindow, 0x2001, 0);
 		break;
 	case 0x480F:
-		if (_asHammer) {
-			sendMessage(_asHammer, 0x2000, 0);
-		}
+		sendMessage(_asHammer, 0x2000, 0);
 		break;
 	}
 	return messageResult;
@@ -455,14 +440,14 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entit
 
 // Scene1002
 
-AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _flag1(flag1) {
+AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isSpecial(isSpecial) {
 
 	SetUpdateHandler(&AsScene1002Ring::update);
 	
-	if (flag1) {
+	if (_isSpecial) {
 		createSurface(990, 68, 314);
-		if (flag2) {
+		if (isRingLow) {
 			startAnimation(0x04103090, 0, -1);
 			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
 		} else {
@@ -485,8 +470,8 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f
 }
 
 void AsScene1002Ring::update() {
-	AnimatedSprite::updateAnim();
-	AnimatedSprite::updatePosition();
+	updateAnim();
+	updatePosition();
 }
 
 uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam &param, Entity *sender) {
@@ -496,11 +481,7 @@ uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam &param, En
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
 		sendMessage(_parentScene, 0x4806, 0);
 		SetMessageHandler(&AsScene1002Ring::hmRingPulled1);
-		if (_flag1) {
-			startAnimation(0x87502558, 0, -1);
-		} else {
-			startAnimation(0x80DD4010, 0, -1);
-		}
+		startAnimation(_isSpecial ? 0x87502558 : 0x80DD4010, 0, -1);
 		break;
 	case 0x480F:
 		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
@@ -522,13 +503,8 @@ uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		if (_flag1) {
-			startAnimation(0x78D0A812, 0, -1);
-			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
-		} else {
-			startAnimation(0xB85D2A10, 0, -1);
-			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
-		}
+		startAnimation(_isSpecial ? 0x78D0A812 : 0xB85D2A10, 0, -1);
+		SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
 		break;
 	case 0x4807:
 		sendMessage(_parentScene, 0x4807, 0);
@@ -586,9 +562,8 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param
 	uint32 messageResult = hmRingIdle(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x05410F72) {
+		if (param.asInteger() == 0x05410F72)
 			playSound(0, 0x21EE40A9);
-		}
 		break;
 	case 0x3002:
 		startAnimation(0xA85C4011, 0, -1);
@@ -684,25 +659,24 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess
 AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect)
 	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) {
 
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
-	SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy);
 	createSurface(800, 136, 147);
 	setClipRect(clipRect);
 	suDoorSpy();
 	loadSound(0, 0xC0C40298);
 	startAnimation(0x586C1D48, 0, 0);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
+	SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy);
 }
 
 uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0xA61CA1C2) {
+		if (param.asInteger() == 0xA61CA1C2)
 			sendMessage(_asBoxingGloveHitEffect, 0x2004, 0);
-		} else if (param.asInteger() == 0x14CE0620) {
+		else if (param.asInteger() == 0x14CE0620)
 			playSound(0);
-		}
 		break;
 	case 0x2003:
 		stDoorSpyBoxingGlove();
@@ -757,11 +731,7 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene
 void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
 	_fileHashes[0] = fileHash1;
 	_fileHashes[1] = fileHash2;
-	if (_status == 2) {
-		loadSprite(fileHash2, kSLFDefDrawOffset | kSLFDefPosition);
-	} else {
-		loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
-	}
+	loadSprite(_status == 2 ? fileHash2 : fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
 }
 
 void SsCommonPressButton::update() {
@@ -795,16 +765,11 @@ uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam &pa
 	return messageResult;
 }
 
-AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _flag(flag), _countdown(0) {
+AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool isSecond)
+	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _isSecond(isSecond), _countdown(0) {
 
 	createSurface(995, 175, 195);
-
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-
-	if (!_flag) {
+	if (!_isSecond) {
 		if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 			setDoDeltaX(1);
 			_x = 366;
@@ -824,23 +789,23 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par
 			stIdle();
 		} 
 	}
-	
 	_flags = 4;
+	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
+	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
 void AsScene1002VenusFlyTrap::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		gotoNextState();
-	}
 	AnimatedSprite::update();
 }
 
 void AsScene1002VenusFlyTrap::upIdle() {
-	if (_countdown == 0 && _klayman->getX() - 20 > _x) {
+	if (_countdown == 0 && _klayman->getX() - 20 > _x)
 		setDoDeltaX(1);
-	} else if (_klayman->getX() + 20 < _x) {
+	else if (_klayman->getX() + 20 < _x)
 		setDoDeltaX(0);
-	}
 	update();
 }
 
@@ -848,14 +813,13 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x000890C4) {
+		if (param.asInteger() == 0x000890C4)
 			playSound(0, 0xC21190D8);
-		} else if (param.asInteger() == 0x522200A0) {
+		else if (param.asInteger() == 0x522200A0)
 			playSound(0, 0x931080C8);
-		}
 		break;
 	case 0x1011:
-		if (_flag) {
+		if (_isSecond) {
 			if (_x >= 154 && _x <= 346) {
 				sendMessage(_parentScene, 0x2000, 0);
 				messageResult = 1;
@@ -869,22 +833,20 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
 		break;
 	case 0x480B:
 		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
-		if (!_flag) {
-			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
+		if (!_isSecond) {
+			if (getGlobalVar(V_FLYTRAP_RING_DOOR))
 				stRelease();
-			} else {
+			else
 				stWalk();
-			}
 		} else {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE))
 				stRelease();
-			} else {
+			else
 				stWalk();
-			}
 		}
 		break;
 	case 0x480C:
-		if (_flag) {
+		if (_isSecond) {
 			if (_x >= 154 && _x <= 346)
 				messageResult = 1;
 			else				
@@ -897,9 +859,8 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam
 		}
 		break;
 	case 0x480E:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			stGrabRing();
-		}
 		break;
 	case 0x4810:
 		swallowKlayman();
@@ -928,25 +889,19 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x000890C4) {
+		if (param.asInteger() == 0x000890C4)
 			playSound(0, 0xC21190D8);
-		} else if (param.asInteger() == 0x41881801) {
-			if (_flag) {
-				if (_x > 330) {
+		else if (param.asInteger() == 0x41881801) {
+			if (_isSecond) {
+				if (_x > 330)
 					sendMessage(_klayman, 0x4811, 2);
-				} else if (_x > 265) {
-					// FIXME: This check is the same as the one below.
-					// Perhaps the third parameter should be 1 here?
+				else
 					sendMessage(_klayman, 0x4811, 0);
-				} else {
-					sendMessage(_klayman, 0x4811, 0);
-				}
 			} else {
 				sendMessage(_klayman, 0x4811, 0);
 			}
-		} else if (param.asInteger() == 0x522200A0) {
+		} else if (param.asInteger() == 0x522200A0)
 			playSound(0, 0x931080C8);
-		}
 		break;
 	case 0x3002:
 		gotoNextState();
@@ -1010,17 +965,17 @@ void AsScene1002VenusFlyTrap::stIdle() {
 	startAnimation(0xC8204250, 0, -1);
 	SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle);
 	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
-	if (_flag) {
-		if (_x >= 154 && _x <= 346) {
+	if (_isSecond) {
+		if (_x >= 154 && _x <= 346)
 			setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32);
-		} else {
+		else {
 			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
 			_countdown = 12;
 		}
 	} else {
-		if (_x >= 174 && _x <= 430) {
+		if (_x >= 174 && _x <= 430)
 			setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32);
-		} else {
+		else {
 			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
 			_countdown = 12;
 		}
@@ -1043,11 +998,10 @@ void AsScene1002VenusFlyTrap::stSpitOutKlayman() {
 
 void AsScene1002VenusFlyTrap::swallowKlayman() {
 	if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) {
-		if (_flag) {
+		if (_isSecond)
 			setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0);
-		} else {
+		else
 			setDoDeltaX(_x > 320 ? 1 : 0);
-		}
 		sendMessage(_klayman, 0x2001, 0);
 		startAnimation(0x8C2C80D4, 0, -1);
 		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
@@ -1065,20 +1019,18 @@ AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngi
 	if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 		startAnimation(0x004A4495, -1, -1);
 		_newStickFrameIndex = STICK_LAST_FRAME;
-	} else {
+	} else
 		setVisible(false);
-	}
 	SetUpdateHandler(&AsScene1002OutsideDoorBackground::update);
 	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);	
 }
 
 void AsScene1002OutsideDoorBackground::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
-		if (_isDoorClosed) {
+		if (_isDoorClosed)
 			stCloseDoor();
-		} else {
+		else
 			stOpenDoor();
-		}
 	}
 	AnimatedSprite::update();
 }
@@ -1110,17 +1062,17 @@ uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const Messa
 
 void AsScene1002OutsideDoorBackground::stOpenDoor() {
 	startAnimation(0x004A4495, 0, -1);
-	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);
 	_newStickFrameIndex = STICK_LAST_FRAME;
 	setVisible(true);
+	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);
 }
 
 void AsScene1002OutsideDoorBackground::stCloseDoor() {
 	startAnimation(0x004A4495, -1, -1);
 	_playBackwards = true;
+	setVisible(true);
 	SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation);
 	NextState(&AsScene1002OutsideDoorBackground::stDoorClosed);
-	setVisible(true);
 }
 
 void AsScene1002OutsideDoorBackground::stDoorClosed() {
@@ -1132,9 +1084,9 @@ AsScene1002KlaymanLadderHands::AsScene1002KlaymanLadderHands(NeverhoodEngine *vm
 	: AnimatedSprite(vm, 1200), _klayman(klayman) {
 	
 	createSurface(1200, 40, 163);
+	setVisible(false);
 	SetUpdateHandler(&AsScene1002KlaymanLadderHands::update);
 	SetMessageHandler(&Sprite::handleMessage);
-	setVisible(false);
 }
 
 void AsScene1002KlaymanLadderHands::update() {
@@ -1152,9 +1104,8 @@ void AsScene1002KlaymanLadderHands::update() {
 		_x = _klayman->getX(); 
 		_y = _klayman->getY(); 
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
-	} else {
+	} else
 		setVisible(false);
-	}
 	AnimatedSprite::update();
 }
 
@@ -1162,10 +1113,10 @@ AsScene1002KlaymanPeekHand::AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scen
 	: AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman),
 	_isClipRectSaved(false) {
 	
-	SetUpdateHandler(&AsScene1002KlaymanPeekHand::update);
-	SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage);
 	createSurface(1000, 33, 41);
 	setVisible(false);
+	SetUpdateHandler(&AsScene1002KlaymanPeekHand::update);
+	SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage);
 }
 
 void AsScene1002KlaymanPeekHand::update() {
@@ -1176,9 +1127,8 @@ void AsScene1002KlaymanPeekHand::update() {
 		_x = _klayman->getX();
 		_y = _klayman->getY();
 		setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
-	} else {
+	} else
 		setVisible(false);
-	}
 	AnimatedSprite::update();
 }
 
@@ -1202,7 +1152,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa
 }
 
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag1B4(false), _flag1BE(false) {
+	: Scene(vm, parentModule, true), _isKlaymanFloor(false), _isClimbingLadder(false) {
 
 	NRect tempClipRect;
 	Sprite *tempSprite;
@@ -1211,12 +1161,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1002::handleMessage);
 
 	setHitRects(0x004B4138);
-
 	setBackground(0x12C23307);
 	setPalette(0x12C23307);
 
-	_flag = false;
-
 	insertStaticSprite(0x06149428, 1100);
 	insertStaticSprite(0x312C8774, 1100);
 
@@ -1228,7 +1175,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_class599 = insertStaticSprite(0x316C4BB4, 1015);
 
 	if (which < 0) {
-		if (_vm->_gameState.field2 == 0) {
+		// Restoring game
+		if (_vm->_gameState.which == 0) {
+			// Klaymen on top
 			insertKlayman<KmScene1002>(90, 226);
 			_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			setMessageList(0x004B4270);
@@ -1236,6 +1185,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect();
 			_klayman->setRepl(64, 0);
 		} else {
+			// Klaymen on the floor
 			insertKlayman<KmScene1002>(379, 435);
 			_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 			setMessageList(0x004B4270);
@@ -1243,21 +1193,24 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 			_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		}
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene1002>(650, 435);
 		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4478);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
-		_vm->_gameState.field2 = 1;
+		_vm->_gameState.which = 1;
 	} else if (which == 2) {
+		// Klaymen coming up the ladder
 		insertKlayman<KmScene1002>(68, 645);
 		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4298);
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
-		_vm->_gameState.field2 = 1;
+		_vm->_gameState.which = 1;
 		sendMessage(_klayman, 0x4820, 0);
 	} else {
+		// Klaymen entering from the left, peeking
 		insertKlayman<KmScene1002>(90, 226);
 		_asKlaymanLadderHands = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 		setMessageList(0x004B4470);
@@ -1266,7 +1219,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asKlaymanPeekHand = insertSprite<AsScene1002KlaymanPeekHand>(this, _klayman);
 		_asKlaymanPeekHand->setClipRect(_klayman->getClipRect());
 		_klayman->setRepl(64, 0);
-		_vm->_gameState.field2 = 0;
+		_vm->_gameState.which = 0;
 	}
 
 	insertMouse433(0x23303124);
@@ -1277,7 +1230,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 258, 191, _class599->getDrawRect().y, false);
 	_asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _class599->getDrawRect().y, false);
-	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR) != 0);
+	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR));
 	_asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _class599->getDrawRect().y, false);
 	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _class599->getDrawRect().y, false);
 
@@ -1304,56 +1257,32 @@ Scene1002::~Scene1002() {
 
 void Scene1002::update() {
 	Scene::update();
-	if (!_flag1B4 && _klayman->getY() > 230) {
+	if (!_isKlaymanFloor && _klayman->getY() > 230) {
 		_klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
 		_asKlaymanLadderHands->setClipRect(_klayman->getClipRect());
 		deleteSprite(&_ssLadderArchPart3);
 		_klayman->clearRepl();
-		_flag1B4 = true;
-		_vm->_gameState.field2 = 1;
-	}
-
-	if (_flag1BE && _klayman->getY() > 422) {
-		sendMessage(_parentModule, 0x1024, 1);
-		_flag1BE = false;
+		_isKlaymanFloor = true;
+		_vm->_gameState.which = 1;
 	}
-	
 }
 
 uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
-	case 0x0001:
-		// Debug stuff (original)
-		if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) {
-			setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
-			setGlobalVar(V_FLYTRAP_POSITION_1, 3);
-			leaveScene(1);
-		}
-		break;
-	case 0x000D:
-		// Debug stuff (original)
-		if (param.asInteger() == 0x48848178) {
-			setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
-			setGlobalVar(V_FLYTRAP_POSITION_1, 3);
-			leaveScene(1);
-		}
-		messageResult = 1;
-		break;
 	case 0x100D:
 		if (param.asInteger() == 0xE6EE60E1) {
-			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
+			if (getGlobalVar(V_FLYTRAP_RING_DOOR))
 				setMessageList(0x004B4428);
-			} else {
+			else
 				setMessageList(0x004B4448);
-			}
 			messageResult = 1;
-		} else if (param.asInteger() == 0x4A845A00) {
+		} else if (param.asInteger() == 0x4A845A00)
 			sendEntityMessage(_klayman, 0x1014, _asRing1);
-		} else if (param.asInteger() == 0x43807801) {
+		else if (param.asInteger() == 0x43807801)
 			sendEntityMessage(_klayman, 0x1014, _asRing2);
-		} else if (param.asInteger() == 0x46C26A01) {
+		else if (param.asInteger() == 0x46C26A01) {
 			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
 				setMessageList(0x004B44B8);
 			} else {
@@ -1366,19 +1295,18 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 				}
 			}
 			messageResult = 1;
-		} else if (param.asInteger() == 0x468C7B11) {
+		} else if (param.asInteger() == 0x468C7B11)
 			sendEntityMessage(_klayman, 0x1014, _asRing4);
-		} else if (param.asInteger() == 0x42845B19) {
+		else if (param.asInteger() == 0x42845B19)
 			sendEntityMessage(_klayman, 0x1014, _asRing5);
-		} else if (param.asInteger() == 0xC0A07458) {
+		else if (param.asInteger() == 0xC0A07458)
 			sendEntityMessage(_klayman, 0x1014, _ssPressButton);
-		}
 		break;
 	case 0x1024:
 		sendMessage(_parentModule, 0x1024, param.asInteger());
 		break;
 	case 0x2000:
-		if (_flag) {
+		if (_isClimbingLadder) {
 			setMessageList2(0x004B43D0);
 		} else {
 			if (_klayman->getY() > 420) {
@@ -1395,16 +1323,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		_messageList = NULL;
 		break;										
 	case 0x2005:
-		_flag = true;
+		_isClimbingLadder = true;
 		setRectList(0x004B4418);
 		break;										
 	case 0x2006:
-		_flag = false;
+		_isClimbingLadder = false;
 		setRectList(0x004B43A0);
 		break;
 	case 0x4806:
-		sendMessage(_parentModule, 0x1024, 2);
-		_flag1BE = true;
 		if (sender == _asRing1) {
 			setGlobalVar(V_RADIO_ENABLED, 0);
 			playSound(0, 0x665198C0);
@@ -1487,18 +1413,17 @@ AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm)
 	_x = 330;
 	_y = 327;
 	createSurface(800, 56, 50);
+	setVisible(false);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1004TrashCan::handleMessage);
-	setVisible(false);
 }
 
 uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x225A8587) {
+		if (param.asInteger() == 0x225A8587)
 			playSound(0, 0x109AFC4C);
-		}
 		break;
 	case 0x2002:
 		startAnimation(0xEB312C11, 0, -1);
@@ -1534,14 +1459,17 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse433(0x03001504);
 
 	if (which < 0) {
+		// Restoring game
 		setRectList(0x004B7C70);
 		insertKlayman<KmScene1004>(330, 327);
 		setMessageList(0x004B7C18);
 	} else if (which == 1) {
+		// Klaymen returning from reading a note
 		setRectList(0x004B7C70);
 		insertKlayman<KmScene1004>(330, 327);
 		setMessageList(0x004B7C08);
 	} else {
+		// Klaymen coming down the ladder
 		loadDataResource(0x01900A04);
 		insertKlayman<KmScene1004>(_dataResource.getPoint(0x80052A29).x, 27);
 		setMessageList(0x004B7BF0);
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index f63d1f0..6f73326 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -36,6 +36,7 @@ public:
 	Module1000(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1000();
 protected:
+	int _sceneNum;
 	uint32 _musicFileHash;
 	void createScene(int sceneNum, int which);
 	void updateScene();
@@ -114,10 +115,10 @@ protected:
 
 class AsScene1002Ring : public AnimatedSprite {
 public:
-	AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2);
+	AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow);
 protected:
 	Scene *_parentScene;
-	bool _flag1;
+	bool _isSpecial;
 	void update();
 	uint32 hmRingIdle(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender);
@@ -164,22 +165,22 @@ public:
 	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
 protected:
 	Scene *_parentScene;
-	int _countdown;
+	uint32 _soundFileHash;
 	uint32 _fileHashes[2];
 	int _status;
-	uint32 _soundFileHash;
+	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene1002VenusFlyTrap : public AnimatedSprite {
 public:
-	AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag);
+	AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool isSecond);
 protected:
 	Scene *_parentScene;
 	Sprite *_klayman;
 	int _countdown;
-	bool _flag;
+	bool _isSecond;
 	void update();
 	void upIdle();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -253,9 +254,8 @@ protected:
 	Sprite *_asKlaymanPeekHand;
 	Sprite *_asOutsideDoorBackground;
 	Sprite *_ssPressButton;
-	bool _flag1B4;
-	bool _flag1BE;
-	bool _flag;
+	bool _isKlaymanFloor;
+	bool _isClimbingLadder;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 713d72d..9c2d896 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -47,9 +47,9 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 	_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
 
-	_flag = getGlobalVar(V_WALL_BROKEN) != 0;
+	_isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
 
-	if (_flag) {
+	if (_isWallBroken) {
 		_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
 		_vm->_soundMan->playSoundLooping(0x90F0D1C3);
 	}
@@ -89,7 +89,7 @@ void Module3000::createScene(int sceneNum, int which) {
 		break;
 	case 2:
 		_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
-		if (_flag) {
+		if (_isWallBroken) {
 			_soundVolume = 90;
 			_vm->_soundMan->setSoundVolume(0x90F0D1C3, 90);
 		}
@@ -193,7 +193,7 @@ void Module3000::updateScene() {
 			break;
 		case 2:
 			_vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0);
-			if (_flag) {
+			if (_isWallBroken) {
 				_soundVolume = 0;
 				_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
 			}
@@ -238,7 +238,7 @@ void Module3000::updateScene() {
 			createScene(8, -1);
 			break;
 		case 8:
-			_flag = getGlobalVar(V_WALL_BROKEN); // CHECKME
+			_isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
 			if (_moduleResult != 1) {
 				_vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0);
 				createScene(4, 1);
@@ -299,7 +299,7 @@ void Module3000::updateScene() {
 					} else if (frameNumber == 10) {
 						_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 					}
-					if (_flag && _soundVolume < 90 && frameNumber % 2) {
+					if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) {
 						if (frameNumber == 0)
 							_soundVolume = 40;
 						else
@@ -313,7 +313,7 @@ void Module3000::updateScene() {
 			if (navigationScene()->isWalkingForward()) {
 				uint32 frameNumber = navigationScene()->getFrameNumber();
 				int navigationIndex = navigationScene()->getNavigationIndex();
-				if (_flag && _soundVolume > 1 && frameNumber % 2) {
+				if (_isWallBroken && _soundVolume > 1 && frameNumber % 2) {
 					_soundVolume--;
 					_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 				}
@@ -338,7 +338,7 @@ void Module3000::updateScene() {
 					if (frameNumber == 40) {
 						_vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0);
 					}
-					if (_flag && _soundVolume < 90 && frameNumber % 2) {
+					if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) {
 						if (frameNumber == 0)
 							_soundVolume = 40;
 						else
diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h
index 945ca7e..0fd1a1e 100644
--- a/engines/neverhood/module3000.h
+++ b/engines/neverhood/module3000.h
@@ -36,7 +36,7 @@ public:
 	virtual ~Module3000();
 protected:
 	int _soundVolume;
-	bool _flag;
+	bool _isWallBroken;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 1a738c1..9141de0 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -66,7 +66,7 @@ Common::Error NeverhoodEngine::run() {
 	_mouseY = 0;
 
 	_gameState.sceneNum = 0;
-	_gameState.field2 = 0;
+	_gameState.which = 0;
 
 	_staticData = new StaticData();
 	_staticData->load("neverhood.dat");
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 2aa84e5..ba6b9f7 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -53,7 +53,6 @@ struct NPoint;
 struct GameState {
 	int sceneNum;
 	int which;
-	int field2;
 };
 
 class NeverhoodEngine : public ::Engine {


Commit: f744e60e0ef6bb959f9adb9f7a1d1dcc1eba2b09
    https://github.com/scummvm/scummvm/commit/f744e60e0ef6bb959f9adb9f7a1d1dcc1eba2b09
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1100:

- Rename stuff
- Remove superfluous braces
- Add a comment to the "which" code in each scene
- Use a seperate _sceneNum instead of _vm->gameState().sceneNum

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1100.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 350dd76..fe73258 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -315,9 +315,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 1;
-	_vm->gameState().sceneNum = 3;
-	createModule(1000, -1);
+	_vm->gameState().which = 3;
+	_vm->gameState().sceneNum = 8;
+	createModule(1100, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index afcd698..6dcc5f9 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -65,17 +65,20 @@ void Module1100::createScene(int sceneNum, int which) {
 	static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0};
 	static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0};
 	debug("Module1100::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
+	_sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_countdown = 65;
 		createNavigationScene(0x004B8430, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_countdown = 50;
 		createNavigationScene(0x004B8460, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		if (getGlobalVar(V_ROBOT_TARGET)) {
 			createNavigationScene(0x004B84F0, which);
 		} else {
@@ -83,6 +86,7 @@ void Module1100::createScene(int sceneNum, int which) {
 		}
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		if (getGlobalVar(V_ROBOT_TARGET)) {
 			createNavigationScene(0x004B8580, which);
 		} else {
@@ -90,26 +94,32 @@ void Module1100::createScene(int sceneNum, int which) {
 		}
 		break;
 	case 4:
-		_childObject = new Scene1105(_vm, this, which);
+		_vm->gameState().sceneNum = 4;
+		_childObject = new Scene1105(_vm, this);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		if (getGlobalVar(V_ROBOT_TARGET))
 			createSmackerScene(0x04180001, true, false, false);
 		else
 			createSmackerScene(0x04180007, true, false, false);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->_soundMan->deleteSoundGroup(0x0002C818);
 		createSmackerScene(kSmackerFileHashList06, true, true, false);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
 		createSmackerScene(kSmackerFileHashList07, true, true, false);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_childObject = new Scene1109(_vm, this, which);
 		break;
 	case 1002:
+		_vm->gameState().sceneNum = 2;
 		_countdown = 40;
 		_vm->_soundMan->setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x00012211, true, true, false);
@@ -121,65 +131,58 @@ void Module1100::createScene(int sceneNum, int which) {
 
 void Module1100::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			_countdown = 0;
 			_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
 			_vm->_soundMan->setSoundVolume(0x48498E46, 65);
 			_vm->_soundMan->setSoundVolume(0x50399F64, 65);
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(1, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(8, 0);
-			}
 			break;
 		case 1:
 			_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
 			if (getGlobalVar(V_ROBOT_HIT)) {
-				if (_moduleResult == 0) {
+				if (_moduleResult == 0)
 					createScene(6, -1);
-				} else if (_moduleResult == 1) {
+				else if (_moduleResult == 1)
 					createScene(0, 1);
-				}
 			} else {
-				if (_moduleResult == 0) {
+				if (_moduleResult == 0)
 					createScene(2, 0);
-				} else if (_moduleResult == 1) {
+				else if (_moduleResult == 1)
 					createScene(0, 1);
-				}
 			}
 			break;
 		case 2:
 			_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
-			if (_navigationAreaType == 3) {
+			if (_navigationAreaType == 3)
 				createScene(7, -1);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(3, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(1002, -1);
-			}
 			break;
 		case 3:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(4, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(2, 3);
-			}
 			break;
 		case 4:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(3, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(5, -1);
-			}
 			break;
 		case 5:
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			if (getGlobalVar(V_ROBOT_TARGET)) {
+			if (getGlobalVar(V_ROBOT_TARGET))
 				createScene(3, 0);
-			} else {
+			else
 				createScene(4, 0);
-			}
 			break;
 		case 6:
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
@@ -190,11 +193,10 @@ void Module1100::updateScene() {
 			createScene(2, 2);
 			break;
 		case 8:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(0, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				leaveModule(0);
-			}
 			break;
 		case 1002:
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
@@ -213,9 +215,8 @@ void Module1100::updateScene() {
 			}
 			break;
 		case 1:
-			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) {
+			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0))
 				_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
-			}
 			break;
 		case 2:
 			_vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0);
@@ -313,14 +314,14 @@ void SsScene1105Symbol::hide() {
 	updatePosition();
 }
 
-SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y)
-	: StaticSprite(vm, 1100), _index(index) {
+SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y)
+	: StaticSprite(vm, 1100), _dieIndex(dieIndex) {
 
-	SetMessageHandler(&SsScene1105SymbolDie::handleMessage);
 	_x = x;
 	_y = y;
 	createSurface(200, 50, 50);
 	loadSymbolSprite();
+	SetMessageHandler(&SsScene1105SymbolDie::handleMessage);
 }
 
 uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -334,7 +335,7 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p
 }
 
 void SsScene1105SymbolDie::loadSymbolSprite() {
-	loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], kSLFCenteredDrawOffset);
+	loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _dieIndex)], kSLFCenteredDrawOffset);
 }
 
 void SsScene1105SymbolDie::hide() {
@@ -393,7 +394,7 @@ void AsScene1105TeddyBear::hide() {
 }
 
 SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) {
+	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _isClicked(false) {
 	
 	loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	setVisible(false);
@@ -415,10 +416,10 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &
 	Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (_countdown == 0 && !_flag1) {
+		if (_countdown == 0 && !_isClicked) {
 			playSound(0);
 			setVisible(true);
-			_flag1 = true;
+			_isClicked = true;
 			_countdown = 4;
 		}
 		messageResult = 1;
@@ -427,9 +428,9 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _flag1(false), _flag2(false), _flag3(false),
-	_flag4(false), _flag5(false), _backgroundIndex(0) {
+Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule)
+	: Scene(vm, parentModule, true), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false),
+	_isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) {
 	
 	Sprite *ssOpenButton;
 	
@@ -458,14 +459,14 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x0001:
 		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			if (!_flag2 && _backgroundIndex == 0) {
-				if (_flag1) {
-					_flag1 = false;
+			if (!_isActionButtonClicked && _backgroundIndex == 0) {
+				if (_isPanelOpen) {
+					_isPanelOpen = false;
 					_backgroundIndex = 15;
 					SetUpdateHandler(&Scene1105::upClosePanel);
 				} else
-					_flag1 = true;
-				_flag5 = false;
+					_isPanelOpen = true;
+				_leaveResult = 0;
 			}
 		}
 		break;
@@ -476,7 +477,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x2003:
 		_backgroundIndex = 24;
-		_flag5 = true;
+		_leaveResult = 1;
 		SetUpdateHandler(&Scene1105::upClosePanel);
 		break;
 	case 0x4807:
@@ -486,19 +487,19 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entit
 				getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) {
 				setGlobalVar(V_ROBOT_TARGET, 1);
 				playSound(2);
-				_flag3 = true;
+				_doMoveTeddy = true;
 			} else {
 				sendMessage(_asTeddyBear, 0x2002, 0);
 			}
 			showMouse(false);
-			_flag2 = true;
+			_isActionButtonClicked = true;
 		}
 		break;
 	case 0x4826:
-		if (_flag1) {
+		if (_isPanelOpen) {
 			if (sender == _ssActionButton) {
 				sendMessage(_ssActionButton, 0x480B, 0);
-				_flag1 = false;
+				_isPanelOpen = false;
 			} else if (!getGlobalVar(V_ROBOT_TARGET)) {
 				if (sender == _ssSymbol1UpButton) {
 					if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) {
@@ -568,7 +569,7 @@ void Scene1105::createObjects() {
 	_ssActionButton = insertSprite<SsScene1105Button>(this, 0x8248AD35, NRect(280, 170, 354, 245));
 	_vm->_collisionMan->addSprite(_ssActionButton);
 	
-	_flag1 = true;
+	_isPanelOpen = true;
 	
 	_asTeddyBear->show();
 
@@ -587,9 +588,8 @@ void Scene1105::upOpenPanel() {
 			changeBackground(backgroundFileHash);
 			_palette->addPalette(backgroundFileHash, 0, 256, 0);
 		}
-		if (_backgroundIndex == 10) {
+		if (_backgroundIndex == 10)
 			playSound(0);
-		}
 		if (_backgroundIndex == 0) {
 			SetUpdateHandler(&Scene1105::update);
 			_countdown = 2;
@@ -621,7 +621,7 @@ void Scene1105::upClosePanel() {
 		}
 		if (_backgroundIndex == 0) {
 			SetUpdateHandler(&Scene1105::update);
-			_flag4 = true;
+			_isClosePanelDone = true;
 		}
 	}
 }
@@ -635,15 +635,13 @@ void Scene1105::update() {
 		getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2));
 
 	Scene::update();
-	if (_countdown != 0 && (--_countdown == 0)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		createObjects();
-	}
-	if (_flag4 && !isSoundPlaying(1)) {
-		leaveScene(_flag5);
-	}
-	if (_flag3 && !isSoundPlaying(2)) {
+	if (_isClosePanelDone && !isSoundPlaying(1))
+		leaveScene(_leaveResult);
+	if (_doMoveTeddy && !isSoundPlaying(2)) {
 		sendMessage(_asTeddyBear, 0x2002, 0);
-		_flag3 = false;
+		_doMoveTeddy = false;
 	}
 }
 
@@ -659,25 +657,30 @@ Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite1 = insertStaticSprite(0x600CEF01, 1100);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1109>(140, 436);
 		setMessageList(0x004B6260);
 		sendMessage(this, 0x2000, 0);
 	} else if (which == 1) {
+		// Klaymen teleporting in
 		insertKlayman<KmScene1109>(450, 436);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6268, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
+		// Klaymen teleporting out
 		insertKlayman<KmScene1109>(450, 436);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6318, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
+		// Klaymen returning from teleporter console
 		insertKlayman<KmScene1109>(450, 436);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6278, false);
 		sendMessage(this, 0x2000, 1);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1109>(0, 436);
 		setMessageList(0x004B6258);
 		sendMessage(this, 0x2000, 0);
diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h
index 126d149..e3fb7cb 100644
--- a/engines/neverhood/module1100.h
+++ b/engines/neverhood/module1100.h
@@ -36,6 +36,7 @@ public:
 	Module1100(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1100();
 protected:
+	int _sceneNum;
 	int _countdown;
 	void createScene(int sceneNum, int which);
 	void updateScene();
@@ -59,10 +60,10 @@ public:
 
 class SsScene1105SymbolDie : public StaticSprite {
 public:
-	SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y);
+	SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y);
 	void hide();
 protected:
-	uint _index;
+	uint _dieIndex;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void loadSymbolSprite();
 };
@@ -83,22 +84,22 @@ public:
 protected:
 	Scene *_parentScene;
 	int _countdown;
-	bool _flag1;
+	bool _isClicked;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class Scene1105 : public Scene {
 public:
-	Scene1105(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1105(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	int _countdown;
 	int _backgroundIndex;
-	bool _flag1;
-	bool _flag2;
-	bool _flag3;
-	bool _flag4;
-	bool _flag5;
+	bool _isPanelOpen;
+	bool _isActionButtonClicked;
+	bool _doMoveTeddy;
+	bool _isClosePanelDone;
+	int _leaveResult;
 	AsScene1105TeddyBear *_asTeddyBear;
 	SsScene1105Symbol *_ssSymbols[3];
 	SsScene1105SymbolDie *_ssSymbolDice[3];


Commit: 097f1f27bbb5c00f0cad7216161b2064a73ebd2b
    https://github.com/scummvm/scummvm/commit/097f1f27bbb5c00f0cad7216161b2064a73ebd2b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1200 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index fe73258..d6da2af 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -284,9 +284,9 @@ void GameModule::startup() {
 	*/
 	//setGlobalVar(V_ENTRANCE_OPEN, 0);
 	//setGlobalVar(V_DOOR_SPIKES_OPEN, 1);
-	setGlobalVar(V_CREATURE_ANGRY, 1);
+	//setGlobalVar(V_CREATURE_ANGRY, 1);
 	setGlobalVar(V_RADIO_ENABLED, 1);
-	setGlobalVar(V_TNT_DUMMY_BUILT, 1);
+	//setGlobalVar(V_TNT_DUMMY_BUILT, 1);
 	setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
 	setGlobalVar(V_TV_JOKE_TOLD, 1);
 	/*
@@ -316,8 +316,8 @@ void GameModule::startup() {
 	*/
 
 	_vm->gameState().which = 3;
-	_vm->gameState().sceneNum = 8;
-	createModule(1100, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(1200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index e6442a0..98ec012 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -29,15 +29,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	SetMessageHandler(&Module1200::handleMessage);
 
-	debug("Module1200: which = %d", which);
-	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(0, 2);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 	_vm->_soundMan->addMusic(0x00478311, 0x62222CAE);
 	_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
@@ -49,15 +46,18 @@ Module1200::~Module1200() {
 
 void Module1200::createScene(int sceneNum, int which) {
 	debug("Module1200::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_childObject = new Scene1201(_vm, this, which);
 		break;
 	case 1:
-		_childObject = new Scene1202(_vm, this, which);
+		_vm->gameState().sceneNum = 1;
+		_childObject = new Scene1202(_vm, this);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->stopMusic(0x62222CAE, 0, 0);
 		createSmackerScene(0x31890001, true, true, false);
 		setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1);
@@ -69,19 +69,17 @@ void Module1200::createScene(int sceneNum, int which) {
 
 void Module1200::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(1, 0);
-			} else if (_moduleResult == 2) {
-				if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) {
+			else if (_moduleResult == 2) {
+				if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID))
 					createScene(2, -1);
-				} else {
+				else
 					leaveModule(1);
-				}
-			} else {
+			} else
 				leaveModule(0);
-			}
 			break;
 		case 1:
 			createScene(0, 1);
@@ -101,78 +99,41 @@ static const uint32 kScene1201InitArray[] = {
 };
 
 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}
+	{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
+	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
+	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), _field7A(-1) {
+	: StaticSprite(vm, 900) {
 
 	int16 x = kScene1201PointArray[pointIndex].x;
 	int16 y = kScene1201PointArray[pointIndex].y;
-	if (x < 300) {
+	if (x < 300)
 		loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50);
-	} else {
+	else
 		loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y);
-	}
 	setClipRect(0, 0, 640, clipY2);
 }
 	
@@ -203,7 +164,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag)
+AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging)
 	: AnimatedSprite(vm, 1200) {
 
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -211,7 +172,7 @@ AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag)
 	createSurface(10, 34, 149);
 	_x = 202;
 	_y = -32;
-	if (flag) {
+	if (isDummyHanging) {
 		startAnimation(0x928F0C10, 15, -1);
 		_newStickFrameIndex = STICK_LAST_FRAME;
 	} else {
@@ -224,9 +185,8 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x02060018) {
+		if (param.asInteger() == 0x02060018)
 			playSound(0, 0x47900E06);
-		}
 		break;
 	case 0x2006:
 		startAnimation(0x928F0C10, 1, -1);
@@ -236,7 +196,7 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam &
 	return messageResult;
 }
 
-AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag)
+AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen)
 	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) {
 
 	createSurface1(0xD088AC30, 100);
@@ -245,7 +205,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 	SetUpdateHandler(&AsScene1201RightDoor::update);
 	SetMessageHandler(&AsScene1201RightDoor::handleMessage);
 	_newStickFrameIndex = STICK_LAST_FRAME;
-	if (flag) {
+	if (isOpen) {
 		startAnimation(0xD088AC30, -1, -1);
 		_newStickFrameIndex = STICK_LAST_FRAME;
 		_countdown = 25;
@@ -256,9 +216,8 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman,
 }
 
 void AsScene1201RightDoor::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		stCloseDoor();
-	}
 	AnimatedSprite::update();
 }
 
@@ -348,11 +307,10 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam &para
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x092870C0) {
+		if (param.asInteger() == 0x092870C0)
 			sendMessage(_asTntManRope, 0x2006, 0);
-		} else if (param.asInteger() == 0x11CA0144) {
+		else if (param.asInteger() == 0x11CA0144)
 			playSound(0, 0x51800A04);
-		}
 		break;
 	case 0x1011:
 		sendMessage(_parentScene, 0x2002, 0);
@@ -479,9 +437,8 @@ uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageP
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x86668011) {
+		if (param.asInteger() == 0x86668011)
 			playSound(0);
-		}
 		break;
 	}
 	return messageResult;
@@ -571,13 +528,12 @@ AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene
 }
 
 void AsScene1201Creature::update() {
-	bool oldFlag = _klaymanTooClose;
+	bool oldKlaymanTooClose = _klaymanTooClose;
 	_klaymanTooClose = _klayman->getX() >= 385;
-	if (_klaymanTooClose != oldFlag)
+	if (_klaymanTooClose != oldKlaymanTooClose)
 		stWaiting();
-	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		gotoNextState();
-	}
 	updateAnim();
 	handleSpriteUpdate();
 	updatePosition();
@@ -587,9 +543,8 @@ uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam &param,
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x02060018) {
+		if (param.asInteger() == 0x02060018)
 			playSound(0, 0xCD298116);
-		}
 		break;
 	case 0x2004:
 		GotoState(&AsScene1201Creature::stStartReachForTntDummy);
@@ -632,7 +587,7 @@ void AsScene1201Creature::stWaiting() {
 	startAnimation(0x08081513, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::hmWaiting);
 	NextState(&AsScene1201Creature::stPincerSnap);
-	_countdown1 = 36;
+	_countdown = 36;
 }
 
 void AsScene1201Creature::stPincerSnap() {
@@ -647,20 +602,20 @@ void AsScene1201Creature::stStartReachForTntDummy() {
 	startAnimation(0x08081513, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::hmWaiting);
 	NextState(&AsScene1201Creature::stReachForTntDummy);
-	_countdown1 = 48;
+	_countdown = 48;
 }
 
 void AsScene1201Creature::stReachForTntDummy() {
 	startAnimation(0x5A201453, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::hmWaiting);
-	_countdown1 = 0;
+	_countdown = 0;
 }
 
 void AsScene1201Creature::stPincerSnapKlayman() {
 	startAnimation(0xCA287133, 0, -1);
 	SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlayman);
 	NextState(&AsScene1201Creature::stWaiting);
-	_countdown1 = 0;
+	_countdown = 0;
 }
 
 AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman)
@@ -712,9 +667,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) {
 		setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1);
-		for (uint32 index = 0; index < 18; index++) {
+		for (uint32 index = 0; index < 18; index++)
 			setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]);
-		}
 	}
 
 	insertMouse433(0x9A2C0409);
@@ -748,12 +702,15 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asKlaymanHead = insertSprite<AsScene1201KlaymanHead>();
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1201>(364, 333);
 		setMessageList(0x004AEC08);
 	} else if (which == 3) {
+		// Klaymen standing after the weasel exploded
 		insertKlayman<KmScene1201>(400, 329);
 		setMessageList(0x004AEC08);
 	} else if (which == 2) {
+		// Klaymen entering from the right
 		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
 			insertKlayman<KmScene1201>(374, 333);
 			setMessageList(0x004AEC08);
@@ -762,6 +719,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AEC20);
 		}
 	} else if (which == 1) {
+		// Klaymen returning from the TNT console
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1201>(364, 333);
 			_klayman->setDoDeltaX(1);
@@ -770,6 +728,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 		setMessageList(0x004AEC30);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1201>(0, 336);
 		setMessageList(0x004AEC10);
 	}
@@ -848,11 +807,10 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			tntIndex++;
 		}
 
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
+		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED))
 			setRectList(0x004AEE18);
-		} else {
+		else
 			setRectList(0x004AED88);
-		}
 		 
 	}
 
@@ -861,9 +819,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asLeftDoor = insertSprite<AsScene1201LeftDoor>(_klayman);
 	_asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480);
 
-	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) {
+	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0)
 		setGlobalVar(V_MATCH_STATUS, 1);
-	}
 
 	_asMatch = NULL;
 
@@ -898,23 +855,22 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (param.asInteger() == 0x07053000) {
 			_creatureExploded = true;
 			sendMessage(_asCreature, 0x2004, 0);
-		} else if (param.asInteger() == 0x140E5744) {
+		} else if (param.asInteger() == 0x140E5744)
 			sendMessage(_asCreature, 0x2005, 0);
-		} else if (param.asInteger() == 0x40253C40) {
+		else if (param.asInteger() == 0x40253C40) {
 			_canAcceptInput = false;
 			sendMessage(_asCreature, 0x2006, 0);
 		} else if (param.asInteger() == 0x090EB048) {
-			if (_klayman->getX() < 572) {
+			if (_klayman->getX() < 572)
 				setMessageList2(0x004AEC90);
-			} else {
+			else
 				setMessageList2(0x004AEC20);
-			}
 		}
 		break;
 	case 0x2001:
-		if (getGlobalVar(V_MATCH_STATUS) == 0) {
+		if (getGlobalVar(V_MATCH_STATUS) == 0)
 			setMessageList2(0x004AECB0);
-		} else {
+		else {
 			sendEntityMessage(_klayman, 0x1014, _asMatch);
 			setMessageList2(0x004AECC0);
 		}
@@ -927,11 +883,10 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entit
 		} else if (getGlobalVar(V_MATCH_STATUS) == 3) {
 			// Light the TNT dummy if we have the match
 			sendEntityMessage(_klayman, 0x1014, _asTntMan);
-			if (_klayman->getX() > _asTntMan->getX()) {
+			if (_klayman->getX() > _asTntMan->getX())
 				setMessageList(0x004AECD0);
-			} else {
+			else
 				setMessageList(0x004AECE0);
-			}
 		}
 		break;
 	case 0x4814:
@@ -960,45 +915,21 @@ static const uint32 kScene1202Table[] = {
 };
 
 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}
+	{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
+	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)
@@ -1056,9 +987,9 @@ void AsScene1202TntItem::stChangePositionFadeIn() {
 	_x = kScene1202Points[_newPosition].x;
 	_y = kScene1202Points[_newPosition].y;
 	startAnimation(kScene1202FileHashes[_itemIndex], 6, -1);
+	_playBackwards = true;
 	SetMessageHandler(&AsScene1202TntItem::hmChangePosition);
 	NextState(&AsScene1202TntItem::stChangePositionDone);
-	_playBackwards = true;
 }
 
 void AsScene1202TntItem::stChangePositionDone() {
@@ -1066,15 +997,14 @@ void AsScene1202TntItem::stChangePositionDone() {
 	stShowIdle();
 }
 
-Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _paletteResource(vm),  
-	_flag(true), _soundFlag(false), _counter(0), _clickedIndex(-1) {
+	_soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) {
 
 	SetMessageHandler(&Scene1202::handleMessage);
 	SetUpdateHandler(&Scene1202::update);
 
 	setBackground(0x60210ED5);
-
 	setPalette(0x60210ED5);
 	addEntity(_palette);
 
@@ -1083,16 +1013,15 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertMouse435(0x10ED160A, 20, 620);
 
-	for (int i = 0; i < 18; i++) {
-		_asTntItems[i] = insertSprite<AsScene1202TntItem>(this, i);
-		_vm->_collisionMan->addSprite(_asTntItems[i]);
+	for (int tntIndex = 0; tntIndex < 18; tntIndex++) {
+		_asTntItems[tntIndex] = insertSprite<AsScene1202TntItem>(this, tntIndex);
+		_vm->_collisionMan->addSprite(_asTntItems[tntIndex]);
 	}
 
 	insertStaticSprite(0x8E8419C1, 1100);
 
-	if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
+	if (getGlobalVar(V_TNT_DUMMY_BUILT))
 		SetMessageHandler(&Scene1202::hmSolved);
-	}
 
 	playSound(0, 0x40106542);
 	loadSound(1, 0x40005446);
@@ -1102,15 +1031,13 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 Scene1202::~Scene1202() {
-	if (isSolved()) {
+	if (isSolved())
 		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
-	}
 }
 
 void Scene1202::update() {
 	Scene::update();
-	if (_soundFlag) {
-		debug("CHECK SOLVED");
+	if (_isPuzzleSolved) {
 		if (!isSoundPlaying(3))
 			leaveScene(0);
 	} else if (_counter == 0 && isSolved()) {
@@ -1120,7 +1047,7 @@ void Scene1202::update() {
 		_palette->copyToBasePalette(_paletteData);
 		_palette->startFadeToPalette(24);
 		playSound(3);
-		_soundFlag = true;
+		_isPuzzleSolved = true;
 	} else if (_clickedIndex >= 0 && _counter == 0) {
 		int destIndex = kScene1202Table[_clickedIndex];
 		sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex));
@@ -1130,12 +1057,8 @@ void Scene1202::update() {
 		setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp);
 		_counter = 2;
 		_clickedIndex = -1;
-		if (_flag) {
-			playSound(1);
-		} else {
-			playSound(2);
-		}
-		_flag = !_flag;
+		playSound(_soundToggle ? 1 : 2);
+		_soundToggle = !_soundToggle;
 	}
 }
 
@@ -1144,9 +1067,8 @@ uint32 Scene1202::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) {
+		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isPuzzleSolved)
 			leaveScene(0);
-		}
 		break;
 	case 0x2000:
 		_clickedIndex = (int)param.asInteger();
@@ -1162,21 +1084,14 @@ uint32 Scene1202::hmSolved(int messageNum, const MessageParam &param, Entity *se
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
 			leaveScene(0);
-		}
 		break;
 	}
 	return 0;
 }
 
 bool Scene1202::isSolved() {
-
-	debug("isSolved() %d %d %d %d %d %d", 
-		getSubVar(VA_TNT_POSITIONS,  0), getSubVar(VA_TNT_POSITIONS,  3),
-		getSubVar(VA_TNT_POSITIONS,  6), getSubVar(VA_TNT_POSITIONS,  9),
-		getSubVar(VA_TNT_POSITIONS,  12), getSubVar(VA_TNT_POSITIONS,  15));
-
 	return 
 		getSubVar(VA_TNT_POSITIONS,  0) ==  0 && getSubVar(VA_TNT_POSITIONS,  3) ==  3 && 
 		getSubVar(VA_TNT_POSITIONS,  6) ==  6 && getSubVar(VA_TNT_POSITIONS,  9) ==  9 &&
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
index a0e9c9f..1fe607d 100644
--- a/engines/neverhood/module1200.h
+++ b/engines/neverhood/module1200.h
@@ -36,6 +36,7 @@ public:
 	Module1200(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1200();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };
@@ -53,14 +54,14 @@ protected:
 
 class AsScene1201TntManRope : public AnimatedSprite {
 public:
-	AsScene1201TntManRope(NeverhoodEngine *vm, bool flag);
+	AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class AsScene1201RightDoor : public AnimatedSprite {
 public:
-	AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag);
+	AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen);
 protected:
 	Sprite *_klayman;
 	int _countdown;
@@ -129,7 +130,7 @@ public:
 protected:
 	Scene *_parentScene;
 	Sprite *_klayman;
-	int _countdown1;
+	int _countdown;
 	bool _klaymanTooClose;
 	void update();
 	uint32 hmWaiting(int messageNum, const MessageParam &param, Entity *sender);
@@ -156,7 +157,6 @@ public:
 	SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2);
 protected:
 	uint32 _elemIndex;
-	int16 _field7A;	
 };
 
 class Scene1201 : public Scene {
@@ -195,7 +195,7 @@ protected:
 
 class Scene1202 : public Scene {
 public:
-	Scene1202(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1202(NeverhoodEngine *vm, Module *parentModule);
 	virtual ~Scene1202();
 protected:
 	PaletteResource _paletteResource;
@@ -203,8 +203,8 @@ protected:
 	int _counter;
 	int _clickedIndex;
 	byte _paletteData[1024];
-	bool _soundFlag;
-	bool _flag;
+	bool _isPuzzleSolved;
+	bool _soundToggle;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmSolved(int messageNum, const MessageParam &param, Entity *sender);


Commit: ee7d47cb187cbfcc4374acc6161fe6ab0d46598d
    https://github.com/scummvm/scummvm/commit/ee7d47cb187cbfcc4374acc6161fe6ab0d46598d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1300 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d6da2af..0eeee2e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -305,6 +305,8 @@ void GameModule::startup() {
 	// Enable all locations
 	for (int i = 0; i < 6; i++)
 		setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1);
+	//setGlobalVar(V_PROJECTOR_LOCATION, 4);
+	setGlobalVar(V_KEYDOOR_UNLOCKED, 1);
 	// <<<DEBUG
 
 #if 1
@@ -315,9 +317,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 3;
-	_vm->gameState().sceneNum = 0;
-	createModule(1200, -1);
+	_vm->gameState().which = 5;
+	_vm->gameState().sceneNum = 6;
+	createModule(1300, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 409e554..feebd78 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -110,90 +110,106 @@ Module1300::~Module1300() {
 
 void Module1300::createScene(int sceneNum, int which) {
 	debug("Module1300::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
+	_sceneNum = sceneNum;
 	switch (_vm->gameState().sceneNum) {
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1302(_vm, this, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new Scene1303(_vm, this, which);
+		_childObject = new Scene1303(_vm, this);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new Scene1304(_vm, this, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1305(_vm, this, which);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1306(_vm, this, which);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x00203197, 0, 2);
-		_childObject = new Scene1307(_vm, this, which);
+		_childObject = new Scene1307(_vm, this);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x00203197, 0, 2);
 		_childObject = new Scene1308(_vm, this, which);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 1);
 		break;
 	case 9:
+		_vm->gameState().sceneNum = 9;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createSmackerScene(0x20082818, true, true, false);
 		break;
 	case 10:
+		_vm->gameState().sceneNum = 10;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createSmackerScene(0x20082828, true, true, false);
 		break;
 	case 11:
+		_vm->gameState().sceneNum = 11;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B27A8, which);
 		break;
 	case 12:
+		_vm->gameState().sceneNum = 12;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B2718, which);
 		break;
 	case 13:
+		_vm->gameState().sceneNum = 13;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B27D8, which);
 		break;
 	case 14:
+		_vm->gameState().sceneNum = 14;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B2808, which);
 		break;
 	case 15:
+		_vm->gameState().sceneNum = 15;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		createNavigationScene(0x004B2838, which);
 		break;
 	case 16:
+		_vm->gameState().sceneNum = 16;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new Scene1317(_vm, this, which);
+		_childObject = new Scene1317(_vm, this);
 		break;
 	case 17:
-		// TODO: Credits scene
+		_vm->gameState().sceneNum = 17;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
 		_childObject = new CreditsScene(_vm, this, false);
@@ -205,13 +221,12 @@ void Module1300::createScene(int sceneNum, int which) {
 			
 void Module1300::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 1:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(4, 0);
-			} else {
+			else
 				createScene(7, 1);
-			}
 			break;
 		case 2:
 			createScene(5, 3);
@@ -223,27 +238,25 @@ void Module1300::updateScene() {
 			createScene(16, -1);
 			break;
 		case 5:
-			if (_moduleResult == 2) {
+			if (_moduleResult == 2)
 				createScene(8, 0);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createScene(2, 0);
-			} else if (_moduleResult == 0) {
+			else if (_moduleResult == 0)
 				leaveModule(0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(10, -1);
-			}
 			break;
 		case 6:
 			createScene(7, 2);
 			break;
 		case 7:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(13, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(1, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(6, 0);
-			}
 			break;
 		case 8:
 			createScene(5, 2);
@@ -271,25 +284,22 @@ void Module1300::updateScene() {
 				createScene(13, 1);
 			break;
 		case 13:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(12, 2);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(7, 0);
-			}
 			break;
 		case 14:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(12, 3);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(9, -1);
-			}
 			break;
 		case 15:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(12, 4);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(3, 0);
-			}
 			break;
 		case 16:
 			createScene(17, -1);
@@ -307,8 +317,6 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 	_x = 320;
 	_y = 240;
 	createSurface1(0x88148150, 500);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1302Bridge::handleMessage);
 	if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 		startAnimation(0x88148150, 0, -1);
 		_newStickFrameIndex = 0;
@@ -318,6 +326,8 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene)
 	}
 	loadSound(0, 0x68895082);
 	loadSound(1, 0x689BD0C1);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene1302Bridge::handleMessage);
 }
 
 uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -338,8 +348,8 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam &para
 
 void AsScene1302Bridge::stLowerBridge() {
 	startAnimation(0x88148150, 0, -1);
-	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
 	playSound(1);
+	NextState(&AsScene1302Bridge::cbLowerBridgeEvent);
 }
 
 void AsScene1302Bridge::stRaiseBridge() {
@@ -358,14 +368,14 @@ void AsScene1302Bridge::cbLowerBridgeEvent() {
 SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
 	: StaticSprite(vm, 0x11122122, 200) {
 	
-	SetUpdateHandler(&SsScene1302Fence::update);
-	SetMessageHandler(&SsScene1302Fence::handleMessage);
-	SetSpriteUpdate(NULL);
 	_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() {
@@ -378,13 +388,13 @@ uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param
 	switch (messageNum) {
 	case 0x4808:
 		playSound(0);
-		SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
 		SetMessageHandler(NULL);
+		SetSpriteUpdate(&SsScene1302Fence::suMoveDown);
 		break;
 	case 0x4809:
 		playSound(1);
-		SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
 		SetMessageHandler(NULL);
+		SetSpriteUpdate(&SsScene1302Fence::suMoveUp);
 		break;
 	}
 	return messageResult;
@@ -412,9 +422,9 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
 	SetMessageHandler(&Scene1302::handleMessage);
+
 	setHitRects(0x004B0858);
 	setRectList(0x004B0A38);
-
 	setBackground(0x420643C4);
 	setPalette(0x420643C4);
 	insertMouse433(0x643C0428);
@@ -424,21 +434,21 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite2 = insertStaticSprite(0x70430830, 1200);
 	_sprite2->setVisible(false);
 	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
-
 	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 218, 122, _class595->getDrawRect().y, false);
 	_asRing2 = insertSprite<AsScene1002Ring>(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE));
 	_asRing3 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false);
 	_asRing4 = insertSprite<AsScene1002Ring>(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE));
 	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false);
-
 	_asBridge = insertSprite<AsScene1302Bridge>(this);
 	_ssFence = insertSprite<SsScene1302Fence>();
 	_ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2());
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1002>(380, 364);
 		setMessageList(0x004B0868);
 	} else {
+		// Klaymen entering from back
 		insertKlayman<KmScene1002>(293, 330);
 		setMessageList(0x004B0870);
 	}
@@ -457,87 +467,77 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x4A845A00) {
+		if (param.asInteger() == 0x4A845A00)
 			sendEntityMessage(_klayman, 0x1014, _asRing1);
-		} else if (param.asInteger() == 0x43807801) {
+		else if (param.asInteger() == 0x43807801) {
 			if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
 				sendEntityMessage(_klayman, 0x1014, _asRing2);
-				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) {
+				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32)
 					setMessageList(0x004B0940);
-				} else {
+				else
 					setMessageList(0x004B0938);
-				}
-			} else {
+			} else
 				setMessageList(0x004B0950);
-			}
 			messageResult = 1;
-		} else if (param.asInteger() == 0x46C26A01) {
+		} else if (param.asInteger() == 0x46C26A01)
 			sendEntityMessage(_klayman, 0x1014, _asRing3);
-		} else if (param.asInteger() == 0x468C7B11) {
+		else if (param.asInteger() == 0x468C7B11) {
 			if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) {
 				sendEntityMessage(_klayman, 0x1014, _asRing4);
-				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) {
+				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32)
 					setMessageList(0x004B0940);
-				} else {
+				else
 					setMessageList(0x004B0938);
-				}
-			} else {
+			} else
 				setMessageList(0x004B0950);
-			}
 			messageResult = 1;
-		} else if (param.asInteger() == 0x42845B19) {
+		} else if (param.asInteger() == 0x42845B19)
 			sendEntityMessage(_klayman, 0x1014, _asRing5);
-		} else if (param.asInteger() == 0x430A6060) {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
+		else if (param.asInteger() == 0x430A6060) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
 				setMessageList2(0x004B0910);
-			} else {
+			else
 				cancelMessageList();
-			}
 		} else if (param.asInteger() == 0x012E2070) {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
 				setMessageList2(0x004B0968);
-			} else {
+			else
 				cancelMessageList();
-			}
 		} else if (param.asInteger() == 0x11C40840) {
-			if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) {
+			if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342)
 				setMessageList(0x004B0878);
-			} else {
+			else
 				setMessageList(0x004B0978);
-			}
 		}
 		break;
 	case 0x2000:
 		if (_klayman->getY() > 360) {
 			sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap);
 			setMessageList2(0x004B08F0);	
-		} else {
+		} else
 			setMessageList2(0x004B0920);
-		}
 		break;
 	case 0x2002:
-		if (_klayman->getX() > 545) {
+		if (_klayman->getX() > 545)
 			leaveScene(1);
-		}
 		break;
 	case 0x2032:
 		_sprite2->setVisible(true);
 		break;
 	case 0x4806:
 		sendMessage(_parentModule, 0x1024, 2);
-		if (sender == _asRing1) {
+		if (sender == _asRing1)
 			playSound(0, 0x665198C0);
-		} else if (sender == _asRing2) {
+		else if (sender == _asRing2) {
 			sendMessage(_asBridge, 0x4808, 0);
 			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
-		} else if (sender == _asRing3) {
+		} else if (sender == _asRing3)
 			playSound(0, 0xE2D389C0);
-		} else if (sender == _asRing4) {
+		else if (sender == _asRing4) {
 			sendMessage(_ssFence, 0x4808, 0);
 			setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
-		} else if (sender == _asRing5) {
+		} else if (sender == _asRing5)
 			playSound(0, 0x40428A09);
-		}
 		break;
 	case 0x4807:
 		if (sender == _asRing2) {
@@ -548,11 +548,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entit
 			sendMessage(_ssFence, 0x4809, 0);
 			setGlobalVar(V_FLYTRAP_RING_FENCE, 0);
 		} else if (sender == _asVenusFlyTrap) {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
+			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
 				sendMessage(_asRing2, 0x4807, 0);
-			} else {
+			else
 				sendMessage(_asRing4, 0x4807, 0);
-			}
 		}
 		break;
 	case 0x480F:
@@ -588,10 +587,10 @@ AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene)
 	createSurface(200, 128, 315);
 	_x = 289;
 	_y = 390;
+	startAnimation(0x800278D2, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1303Balloon::handleMessage);
 	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	startAnimation(0x800278D2, 0, -1);
 }
 
 uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -612,15 +611,14 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x020B0003) {
+		if (param.asInteger() == 0x020B0003)
 			playSound(0, 0x742B0055);
-		} 
 		break;
 	case 0x3002:
 		playSound(0, 0x470007EE);
 		stopAnimation();
-		SetMessageHandler(NULL);
 		setVisible(false);
+		SetMessageHandler(NULL);
 		break;
 	}
 	return messageResult;
@@ -631,12 +629,12 @@ void AsScene1303Balloon::stPopBalloon() {
 	SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped);
 }
 
-Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true) {
 
 	SetMessageHandler(&Scene1303::handleMessage);
+
 	setRectList(0x004AF9E8);
-	
 	setBackground(0x01581A9C);
 	setPalette(0x01581A9C);
 	insertMouse433(0x81A9801D);
@@ -663,9 +661,8 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asBalloon, 0x2000, 0);
 		break;
 	case 0x4826:
-		if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) {
+		if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE))
 			setMessageList(0x004AF9B8);
-		}
 		break;
 	}
 	return 0;
@@ -695,11 +692,11 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &para
 }
 
 Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule, true), _asNeedle(NULL) {
 	
 	SetMessageHandler(&Scene1304::handleMessage);
-	setRectList(0x004B91A8);
 
+	setRectList(0x004B91A8);
 	setBackground(0x062C0214);
 	setPalette(0x062C0214);
 	insertMouse433(0xC021006A);
@@ -709,14 +706,11 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asKey);
 	} else {
 		_asKey = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
-		// TODO _asKey->setUpdateDeltaXY();
 	}
 
 	if (!getGlobalVar(V_HAS_NEEDLE)) {
 		_asNeedle = insertSprite<AsScene1304Needle>(this, 1100, 278, 347);
 		_vm->_collisionMan->addSprite(_asNeedle);
-	} else {
-		_asNeedle = NULL;
 	}
 
 	_sprite1 = insertStaticSprite(0x0562E621, 1100);
@@ -724,9 +718,11 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertStaticSprite(0x090AF033, 1100);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1304>(217, 347);
 		setMessageList(0x004B90E8);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1304>(100, 347);
 		setMessageList(0x004B90F0);
 	}
@@ -740,11 +736,10 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x415634A4) {
-			if (getGlobalVar(V_BALLOON_POPPED)) {
+			if (getGlobalVar(V_BALLOON_POPPED))
 				cancelMessageList();
-			} else {
+			else
 				setMessageList(0x004B9158);
-			}
 		}
 		break;
 	case 0x4826:
@@ -764,16 +759,18 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
 	SetMessageHandler(&Scene1305::handleMessage);
-	setRectList(0x004B6E98);
 
+	setRectList(0x004B6E98);
 	setBackground(0x28801B64);
 	setPalette(0x28801B64);
 	insertMouse433(0x01B60280);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1305>(212, 441);
 		setMessageList(0x004B6E40);
 	} else {
+		// Klaymen enters falling
 		insertKlayman<KmScene1305>(212, 441);
 		setMessageList(0x004B6E48);
 	}
@@ -793,16 +790,15 @@ AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene
 	createSurface1(0x043B0270, 100);
 	startAnimation(0x043B0270, 0, -1);
 	_newStickFrameIndex = 0;
-	SetMessageHandler(&AsScene1306Elevator::handleMessage);
 	loadSound(0, 0x1C100E83);
 	loadSound(1, 0x1C08CEC5);
 	loadSound(2, 0x5D011E87);
+	SetMessageHandler(&AsScene1306Elevator::handleMessage);
 }
 
 void AsScene1306Elevator::update() {
-	if (_isUp && _countdown != 0 && (--_countdown == 0)) {
+	if (_isUp && _countdown != 0 && (--_countdown == 0))
 		stGoingDown();
-	}
 	AnimatedSprite::update();
 	if (_currFrameIndex == 7) {
 		playSound(1);
@@ -812,9 +808,8 @@ void AsScene1306Elevator::update() {
 
 void AsScene1306Elevator::upGoingDown() {
 	AnimatedSprite::update();
-	if (_currFrameIndex == 5) {
+	if (_currFrameIndex == 5)
 		_asElevatorDoor->setVisible(true);
-	}
 }
 
 uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -839,36 +834,36 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa
 void AsScene1306Elevator::stGoingUp() {
 	setVisible(true);
 	_isDown = false;
-	SetUpdateHandler(&AsScene1306Elevator::update);
 	startAnimation(0x043B0270, 0, -1);
-	NextState(&AsScene1306Elevator::cbGoingUpEvent);
 	playSound(0);
+	SetUpdateHandler(&AsScene1306Elevator::update);
+	NextState(&AsScene1306Elevator::cbGoingUpEvent);
 }
 
 void AsScene1306Elevator::cbGoingUpEvent() {
-	SetUpdateHandler(&AsScene1306Elevator::update);
 	sendMessage(_parentScene, 0x4808, 0);
 	_isUp = true;
 	_countdown = 144;
 	stopAnimation();
 	setVisible(false);
+	SetUpdateHandler(&AsScene1306Elevator::update);
 }
 
 void AsScene1306Elevator::stGoingDown() {
-	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
 	_isUp = false;
 	setVisible(true);
 	startAnimation(0x043B0270, -1, -1);
 	_playBackwards = true;
-	NextState(&AsScene1306Elevator::cbGoingDownEvent);
 	playSound(1);
+	SetUpdateHandler(&AsScene1306Elevator::upGoingDown);
+	NextState(&AsScene1306Elevator::cbGoingDownEvent);
 }
 
 void AsScene1306Elevator::cbGoingDownEvent() {
 	_isDown = true;
 	sendMessage(_parentScene, 0x4809, 0);
-	SetUpdateHandler(&AsScene1306Elevator::update);
 	stopAnimation();
+	SetUpdateHandler(&AsScene1306Elevator::update);
 }
 
 Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -889,31 +884,29 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x404A36A0, 100, 0x440C1000);
-	
 	_asTape = insertSprite<AsScene1201Tape>(this, 19, 1100, 359, 445, 0x9148A011);
-
 	_asElevatorDoor = insertSprite<AnimatedSprite>(0x043B0270, 90, 320, 240);
 	_asElevatorDoor->startAnimation(0x043B0270, 6, -1);
 	_asElevatorDoor->setNewHashListIndex(6);
-
 	_asElevator = insertSprite<AsScene1306Elevator>(this, _asElevatorDoor);
-	
 	_sprite1 = insertStaticSprite(0x036A1EE0, 80);
-	
 	insertStaticSprite(0x00042313, 1100);
 
 	if (which < 0) {
+		// Resoring game
 		insertKlayman<KmScene1306>(380, 440);
 		setMessageList(0x004AFAD0);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 1) {
+		// Klaymen teleporting in
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFAF0);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 2) {
+		// Klaymen returning from diskplayer
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1306>(515, 440);
 			_klayman->setDoDeltaX(1);
@@ -924,23 +917,27 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 3) {
+		// Klaymen returning from window
 		insertKlayman<KmScene1306>(534, 440);
 		setMessageList(0x004AFC30);
 		sendMessage(this, 0x2000, 0);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 4) {
+		// Klaymen teleporting out
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFC38);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else if (which == 5) {
+		// Klaymen returning from teleporter
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFB00);
 		sendMessage(this, 0x2000, 1);
 		_vm->_collisionMan->addSprite(_asTape);
 	} else {
+		// Klaymen coming up in elevator
 		insertKlayman<KmScene1306>(286, 408);
 		setSurfacePriority(_asElevator->getSurface(), 1100);
 		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
@@ -961,14 +958,13 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x402064D8) {
+		if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x01C66840) {
-			if (sendMessage(_asElevator, 0x2001, 0) != 0) {
+		else if (param.asInteger() == 0x01C66840) {
+			if (sendMessage(_asElevator, 0x2001, 0) != 0)
 				setMessageList(0x004AFBD8);
-			} else {
+			else
 				setMessageList(0x004AFAE0);
-			}
 		} else if (param.asInteger() == 0x8E646E00) {
 			setMessageList(0x004AFAD8);
 			clearRectList();
@@ -985,9 +981,8 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x480B:
-		if (sender == _ssButton) {
+		if (sender == _ssButton)
 			sendMessage(_asElevator, 0x4808, 0);
-		}
 		break;
 	case 0x4826:
 		if (sender == _asKey) {
@@ -1045,21 +1040,15 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 }
 
 static const uint32 kAsScene1307KeyResourceList1[] = {
-	0x0438069C,
-	0x45B0023C,
-	0x05700217
+	0x0438069C, 0x45B0023C, 0x05700217
 };
 
 static const uint32 kAsScene1307KeyResourceList2[] = {
-	0x04441334,
-	0x061433F0,
-	0x06019390
+	0x04441334, 0x061433F0, 0x06019390
 };
 
 static const uint32 kAsScene1307KeyResourceList3[] = {
-	0x11A80030,
-	0x178812B1,
-	0x1488121C
+	0x11A80030, 0x178812B1, 0x1488121C
 };
 
 static const uint32 *kAsScene1307KeyResourceLists[] = {
@@ -1069,27 +1058,16 @@ static const uint32 *kAsScene1307KeyResourceLists[] = {
 };
 
 static const int kAsScene1307KeySurfacePriorities[] = {
-	700, 
-	500, 
-	300, 
-	100
+	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}
+	{-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;
@@ -1100,36 +1078,29 @@ static const int16 kAsScene1307KeyFrameIndices[] = {
 };
 
 const int kAsScene1307KeyDivValue = 200;
-
 const int16 kAsScene1307KeyXDelta = 70;
 const int16 kAsScene1307KeyYDelta = -12;
 
-AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _clipRects(clipRects),
+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[_index]; 
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; 
 	
 	_dataResource.load(0x22102142);
 	_pointList = _dataResource.getPointArray(0xAC849240);
-	
-	pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)];
+	pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
 	_x = pt.x;
 	_y = pt.y;
-	
-	createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 190, 148);
-	
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1307Key::handleMessage);
-	
+	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) {
@@ -1146,7 +1117,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam &param,
 		_isClickable = param.asInteger() != 0;
 		break;
 	case 0x2001:
-		setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index, param.asInteger());
+		setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex, param.asInteger());
 		stMoveKey();
 		break;
 	case 0x2003:
@@ -1194,7 +1165,7 @@ void AsScene1307Key::suMoveKey() {
 		updateBounds();
 		_pointIndex++;
 	} else {
-		NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)];
+		NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
 		_x = pt.x + kAsScene1307KeyXDelta;
 		_y = pt.y + kAsScene1307KeyYDelta;
 		stInsertKey();
@@ -1202,23 +1173,23 @@ void AsScene1307Key::suMoveKey() {
 }
 
 void AsScene1307Key::stRemoveKey() {
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; 
 	_pointIndex = 0;
-	SetSpriteUpdate(&AsScene1307Key::suRemoveKey);
 	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, _index) % 4]);
-	setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]);
-	SetSpriteUpdate(&AsScene1307Key::suInsertKey);
+	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, _index)];
+	NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)];
 	int16 newX = pt.x + kAsScene1307KeyXDelta;
 	int16 newY = pt.y + kAsScene1307KeyYDelta;
 	sendMessage(_parentScene, 0x1022, 1000);
@@ -1228,29 +1199,29 @@ void AsScene1307Key::stMoveKey() {
 	if (newX == _x && newY == _y) {
 		stInsertKey();
 	} else {
-		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+		const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; 
 		_pointIndex = 0;
 		_frameIndex = 0;
 		_deltaX = newX - _x;
 		_deltaY = newY - _y;
-		SetSpriteUpdate(&AsScene1307Key::suMoveKey);
 		startAnimation(fileHashes[0], 0, -1);
+		SetSpriteUpdate(&AsScene1307Key::suMoveKey);
 	}
 }
 
 void AsScene1307Key::stUnlock() {
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; 
 	startAnimation(fileHashes[1], 0, -1);
 	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
 void AsScene1307Key::stInsert() {
-	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; 
+	const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; 
 	startAnimation(fileHashes[2], 0, -1);
 	_newStickFrameIndex = STICK_LAST_FRAME;
 }
 
-Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL),
 	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
 
@@ -1279,13 +1250,10 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	tempSprite = insertStaticSprite(0x00A3621C, 800);
 	_clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480);
-
 	tempSprite = insertStaticSprite(0x00A3641C, 600);
 	_clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480);
-
 	tempSprite = insertStaticSprite(0x00A3681C, 400);
 	_clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480);
-
 	tempSprite = insertStaticSprite(0x00A3701C, 200);
 	_clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480);
 
@@ -1304,11 +1272,10 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene1307::update() {
 	Scene::update();
-	if (_countdown && (--_countdown == 0)) {
+	if (_countdown && (--_countdown == 0))
 		_doLeaveScene = true;
-	} else if (_countdown == 20) {
+	else if (_countdown == 20)
 		_palette->startFadeToWhite(40);
-	}
 	if (_doLeaveScene && !isSoundPlaying(0)) {
 		leaveScene(1);
 		setGlobalVar(V_KEYDOOR_UNLOCKED, 1);
@@ -1348,9 +1315,8 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 						}
 					}
 				}
-			} else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) {
+			} else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey)
 				leaveScene(0);
-			}
 		}
 		break;
 	case 0x2002:
@@ -1386,30 +1352,20 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 static const uint32 kScene1308NumberFileHashes[] = {
-	0x08006320,
-	0x10006320,
-	0x20006320,
-	0x40006320,
-	0x80006320,
-	0x00006321,
-	0x00006322,
-	0x00006324,
-	0x00006328,
-	0x08306320,
-	0x10306320,
-	0x20306320,
-	0x40306320,
-	0x80306320,
-	0x00306321,
+	0x08006320, 0x10006320, 0x20006320,
+	0x40006320, 0x80006320, 0x00006321,
+	0x00006322, 0x00006324, 0x00006328,
+	0x08306320, 0x10306320, 0x20306320,
+	0x40306320, 0x80306320, 0x00306321,
 	0x00306322
 };
 
 AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) {
 	
-	SetMessageHandler(&AsScene1308JaggyDoor::handleMessage);
 	setVisible(false);
 	stopAnimation();
+	SetMessageHandler(&AsScene1308JaggyDoor::handleMessage);
 }
 
 uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1431,8 +1387,8 @@ uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam &p
 void AsScene1308JaggyDoor::stOpenDoor() {
 	startAnimation(0xBA0AE050, 0, -1);
 	setVisible(true);
-	NextState(&AsScene1308JaggyDoor::stOpenDoorDone);
 	playSound(0, calcHash("fxDoorOpen38"));
+	NextState(&AsScene1308JaggyDoor::stOpenDoorDone);
 }
 
 void AsScene1308JaggyDoor::stOpenDoorDone() {
@@ -1445,8 +1401,8 @@ void AsScene1308JaggyDoor::stCloseDoor() {
 	startAnimation(0xBA0AE050, -1, -1);
 	_playBackwards = true;
 	setVisible(true);
-	NextState(&AsScene1308JaggyDoor::stCloseDoorDone);
 	playSound(0, calcHash("fxDoorClose38"));
+	NextState(&AsScene1308JaggyDoor::stCloseDoorDone);
 }
 
 void AsScene1308JaggyDoor::stCloseDoorDone() {
@@ -1457,9 +1413,9 @@ void AsScene1308JaggyDoor::stCloseDoorDone() {
 AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) {
 	
+	playSound(0, 0x51456049);
 	SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage);
 	NextState(&AsScene1308KeyboardDoor::stFallingKeys);
-	playSound(0, 0x51456049);
 }
  
 uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1474,9 +1430,9 @@ uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam
 
 void AsScene1308KeyboardDoor::stFallingKeys() {
 	startAnimation(0x6238B191, 0, -1);
-	NextState(&AsScene1308KeyboardDoor::stFallingKeysDone);
 	_x = 580;
 	_y = 383;
+	NextState(&AsScene1308KeyboardDoor::stFallingKeysDone);
 }
 
 void AsScene1308KeyboardDoor::stFallingKeysDone() {
@@ -1488,10 +1444,10 @@ void AsScene1308KeyboardDoor::stFallingKeysDone() {
 AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) {
 	
-	SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage);
 	setVisible(false);
 	stopAnimation();
 	Entity::_priority = 1200;
+	SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage);
 }
 
 uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1539,32 +1495,31 @@ SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int i
 AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1100) {
 
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1308Mouse::handleMessage);
 	_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) {
+		if (param.asInteger() == 0x66382026)
 			playSound(0, 0x0CD84468);
-		} else if (param.asInteger() == 0x6E28061C) {
+		else if (param.asInteger() == 0x6E28061C)
 			playSound(0, 0x78C8402C);
-		} else if (param.asInteger() == 0x462F0410) {
+		else if (param.asInteger() == 0x462F0410)
 			playSound(0, 0x60984E28);
-		}
 		break;
 	}
 	return messageResult;
 }
 
 Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag1(false) {
+	: Scene(vm, parentModule, true), _isProjecting(false), _asProjector(NULL) {
 	
 	_vm->gameModule()->initKeySlotsPuzzle();
 
@@ -1585,16 +1540,15 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite1 = insertStaticSprite(0x0A042060, 1100);
 	_asJaggyDoor = insertSprite<AsScene1308JaggyDoor>(this);
 	_asLightWallSymbols = insertSprite<AsScene1308LightWallSymbols>(this);
-
 	_ssNumber1 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0);
 	_ssNumber2 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1);
 	_ssNumber3 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2);
-
 	_sprite2 = insertStaticSprite(0x40043120, 995);
 	_sprite3 = insertStaticSprite(0x43003100, 995);
 	_sprite4 = NULL;
 	
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1308>(380, 440);
 		setMessageList(0x004B57C0);
 		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
@@ -1605,6 +1559,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene1308>(640, 440);
 		setMessageList(0x004B57C8);
 		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
@@ -1615,6 +1570,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else if (which == 2) {
+		// Klaymen returning from keyslots panel
 		insertKlayman<KmScene1308>(475, 440);
 		setMessageList(0x004B58B0);
 		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
@@ -1626,6 +1582,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 			setRectList(0x004B5980);
 		}
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1308>(41, 440);
 		setMessageList(0x004B57D0);
 		sendMessage(_asJaggyDoor, 0x4808, 0);
@@ -1639,19 +1596,16 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 	}
 
-	if (_sprite4) {
+	if (_sprite4)
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480);
-	} else {
+	else
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-	}
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
 		_vm->_collisionMan->addSprite(_asProjector);
 		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
 		_asProjector->setRepl(64, 0);
-	} else {
-		_asProjector = NULL;
 	}
 
 }
@@ -1662,15 +1616,14 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x88C11390) {
 			setRectList(0x004B59A0);
-			_flag1 = true;
+			_isProjecting = true;
 		} else if (param.asInteger() == 0x08821382) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
-			if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
+			if (getGlobalVar(V_KEYDOOR_UNLOCKED))
 				setRectList(0x004B5990);
-			} else {
+			else
 				setRectList(0x004B5980);
-			}
-			_flag1 = false;
+			_isProjecting = false;
 		} else if (param.asInteger() == 0x4AC68808) {
 			clearRectList();
 			sendMessage(_asJaggyDoor, 0x4809, 0);
@@ -1687,11 +1640,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x2000:
-		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
+		if (getGlobalVar(V_KEYDOOR_UNLOCKED))
 			setRectList(0x004B5990);
-		} else {
+		else
 			setRectList(0x004B5980);
-		}
 		setMessageList(0x004B57E8, false);
 		_sprite1->setVisible(true);
 		_klayman->setVisible(true);
@@ -1719,23 +1671,22 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _asProjector) {
-			if (_flag1) {
+			if (_isProjecting)
 				setMessageList2(0x004B5868);
-			} else {
+			else {
 				if (param.asInteger() == 1) {
 					sendEntityMessage(_klayman, 0x1014, _asProjector);
 					setMessageList2(0x004B5848);
 				} else if (sendMessage(_asProjector, 0x480C, _klayman->getX() <= _asProjector->getX() ? 0 : 1) != 0) {
 					sendEntityMessage(_klayman, 0x1014, _asProjector);
 					setMessageList2(0x004B5830);
-				} else {
+				} else
 					setMessageList2(0x004B5800);
-				}
 			}
 		} else if (sender == _asTape) {
-			if (_flag1) {
+			if (_isProjecting)
 				setMessageList2(0x004B5868);
-			} else if (_messageListStatus != 2) {
+			else if (_messageListStatus != 2) {
 				sendEntityMessage(_klayman, 0x1014, _asTape);
 				setMessageList2(0x004B58E0);
 			}
@@ -1745,7 +1696,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true) {
 	
 	SetMessageHandler(&Scene1317::handleMessage);
@@ -1817,16 +1768,6 @@ uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-uint32 Scene1317::hmNoDecisionYet(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		stChooseKing();
-		break;
-	}
-	return messageResult;
-}
-
 uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -1837,16 +1778,6 @@ uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Enti
 	return messageResult;
 }
 
-uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		leaveScene(0);
-		break;
-	}
-	return messageResult;
-}
-
 uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -1859,45 +1790,45 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *
 
 void Scene1317::stChooseKing() {
 	showMouse(true);
-	SetMessageHandler(&Scene1317::hmChooseKing);
-	SetUpdateHandler(&Scene1317::upChooseKing);
 	_smackerFileHash = 0x10982841;
 	_keepLastSmackerFrame = true;
 	_decisionCountdown = 450;
 	_klaymanBlinks = false;
 	_klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
+	SetMessageHandler(&Scene1317::hmChooseKing);
+	SetUpdateHandler(&Scene1317::upChooseKing);
 }
 
 void Scene1317::stNoDecisionYet() {
 	showMouse(false);
-	SetMessageHandler(&Scene1317::hmNoDecisionYet);
-	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x20982841;
 	_keepLastSmackerFrame = false;
+	SetMessageHandler(&Scene1317::handleMessage);
+	SetUpdateHandler(&Scene1317::update);
 }
 
 void Scene1317::stHoborgAsKing() {
 	showMouse(false);
-	SetMessageHandler(&Scene1317::hmHoborgAsKing);
-	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x40982841;
 	_keepLastSmackerFrame = false;
+	SetMessageHandler(&Scene1317::hmHoborgAsKing);
+	SetUpdateHandler(&Scene1317::update);
 }
 
 void Scene1317::stKlaymanAsKing() {
 	showMouse(false);
-	SetMessageHandler(&Scene1317::hmKlaymanAsKing);
-	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x80982841;
 	_keepLastSmackerFrame = false;
+	SetMessageHandler(&Scene1317::hmEndMovie);
+	SetUpdateHandler(&Scene1317::update);
 }
 
 void Scene1317::stEndMovie() {
 	showMouse(false);
-	SetMessageHandler(&Scene1317::hmEndMovie);
-	SetUpdateHandler(&Scene1317::update);
 	_smackerFileHash = 0x40800711;
 	_keepLastSmackerFrame = false;
+	SetMessageHandler(&Scene1317::hmEndMovie);
+	SetUpdateHandler(&Scene1317::update);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
index e01daf1..ebbd031 100644
--- a/engines/neverhood/module1300.h
+++ b/engines/neverhood/module1300.h
@@ -37,6 +37,7 @@ public:
 	Module1300(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1300();
 protected:
+	int _sceneNum;
 	uint32 _musicFileHash;
 	void createScene(int sceneNum, int which);
 	void updateScene();
@@ -95,7 +96,7 @@ protected:
 
 class Scene1303 : public Scene {
 public:
-	Scene1303(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1303(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	Sprite *_sprite1;
 	Sprite *_asBalloon;
@@ -162,13 +163,13 @@ protected:
 
 class AsScene1307Key : public AnimatedSprite {
 public:
-	AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects);
+	AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects);
 protected:
 	Scene *_parentScene;
 	NPointArray *_pointList;
 	uint _pointIndex;
 	int _frameIndex;
-	uint _index;
+	uint _keyIndex;
 	NRect *_clipRects;
 	bool _isClickable;
 	int16 _prevX, _prevY;
@@ -186,7 +187,7 @@ protected:
 
 class Scene1307 : public Scene {
 public:
-	Scene1307(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1307(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	NPointArray *_keyHolePoints;
 	NRect _keyHoleRects[16];
@@ -262,13 +263,13 @@ protected:
 	Sprite *_sprite3;
 	Sprite *_sprite4;
 	Sprite *_sprite5;
-	bool _flag1;
+	bool _isProjecting;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
 class Scene1317 : public Scene {
 public:
-	Scene1317(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1317(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	SmackerPlayer *_smackerPlayer;
 	bool _klaymanBlinks;
@@ -280,9 +281,7 @@ protected:
 	void upChooseKing();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmChooseKing(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmNoDecisionYet(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmKlaymanAsKing(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmEndMovie(int messageNum, const MessageParam &param, Entity *sender);
 	void stChooseKing();
 	void stNoDecisionYet();


Commit: af37a2200e01e0ac40a7eb4646dbc8a1a82b6b1b
    https://github.com/scummvm/scummvm/commit/af37a2200e01e0ac40a7eb4646dbc8a1a82b6b1b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1400 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 0eeee2e..732cff7 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -317,9 +317,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 5;
-	_vm->gameState().sceneNum = 6;
-	createModule(1300, -1);
+	_vm->gameState().which = 2;
+	_vm->gameState().sceneNum = 3;
+	createModule(1400, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 0693417..2494941 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -35,11 +35,10 @@ Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->addMusic(0x00AD0012, 0x06333232);
 	_vm->_soundMan->addMusic(0x00AD0012, 0x624A220E);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 }
 
@@ -49,37 +48,44 @@ Module1400::~Module1400() {
 
 void Module1400::createScene(int sceneNum, int which) {
 	debug("Module1400::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_vm->_soundMan->startMusic(0x06333232, 0, 2);
 		_childObject = new Scene1401(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
 		_vm->_soundMan->stopMusic(0x624A220E, 0, 2);
 		_childObject = new Scene1402(_vm, this, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
 		_vm->_soundMan->startMusic(0x624A220E, 0, 2);
 		_childObject = new Scene1403(_vm, this, which);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_vm->_soundMan->startMusic(0x06333232, 0, 2);
 		_childObject = new Scene1404(_vm, this, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->startMusic(0x06333232, 0, 2);
-		_childObject = new Scene1405(_vm, this, which);
+		_childObject = new Scene1405(_vm, this);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 2);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
-		_childObject = new Scene1407(_vm, this, which);
+		_childObject = new Scene1407(_vm, this);
 		break;
 	}
 	SetUpdateHandler(&Module1400::updateScene);
@@ -88,36 +94,33 @@ void Module1400::createScene(int sceneNum, int which) {
 
 void Module1400::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(1, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(3, 0);
-			} else {
+			else
 				leaveModule(0);
-			}
 			break;
 		case 1:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(2, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(6, -1);
-			} else {
+			else
 				createScene(0, 1);
-			}
 			break;
 		case 2:
 			createScene(1, 1);
 			break;
 		case 3:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(4, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(5, -1);
-			} else {
+			else
 				createScene(0, 2);
-			}
 			break;
 		case 4:
 			createScene(3, 1);
@@ -140,9 +143,9 @@ AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm)
 	createSurface(900, 152, 147);
 	_x = 454;
 	_y = 217;
-	SetMessageHandler(&AsScene1401Pipe::handleMessage);
-	SetUpdateHandler(&AsScene1401Pipe::update);
 	startAnimation(0x4C210500, 0, -1);
+	SetUpdateHandler(&AsScene1401Pipe::update);
+	SetMessageHandler(&AsScene1401Pipe::handleMessage);
 }
 
 AsScene1401Pipe::~AsScene1401Pipe() {
@@ -151,9 +154,8 @@ AsScene1401Pipe::~AsScene1401Pipe() {
 
 void AsScene1401Pipe::update() {
 	AnimatedSprite::update();
-	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+	if (_countdown1 != 0 && (--_countdown1 == 0))
 		stDoneSucking();
-	}
 	if (_countdown2 != 0 && (--_countdown2 == 0)) {
 		_vm->_soundMan->addSound(0x01104C08, 0x4A116437);
 		_vm->_soundMan->playSoundLooping(0x4A116437);
@@ -162,18 +164,16 @@ void AsScene1401Pipe::update() {
 
 void AsScene1401Pipe::upSuckInProjector() {
 	AnimatedSprite::update();
-	if (_countdown1 != 0) {
+	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) {
+		if (param.asInteger() == 0x0A8A1490)
 			playSound(1, 0x6AB6666F);
-		}
 		break;
 	case 0x2000:
 		_countdown1 = 70;
@@ -191,11 +191,10 @@ uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam &pa
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x3002:
-		if (_countdown1 != 0) {
+		if (_countdown1 != 0)
 			stStartSucking();
-		} else {
+		else
 			stDoneSucking();
-		}
 		SetMessageHandler(&AsScene1401Pipe::handleMessage);
 		SetUpdateHandler(&AsScene1401Pipe::update);
 		break;
@@ -216,8 +215,8 @@ void AsScene1401Pipe::stDoneSucking() {
 
 void AsScene1401Pipe::stSuckInProjector() {
 	startAnimation(0x6C210810, 0, -1);
-	SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector);
 	SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector);
+	SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector);
 }
 
 AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
@@ -226,22 +225,21 @@ AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm)
 	createSurface(100, 71, 41);
 	_x = 478;
 	_y = 433;
+	startAnimation(0xA282C472, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1401Mouse::handleMessage);
-	startAnimation(0xA282C472, 0, -1);
 }
 
 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) {
+		if (param.asInteger() == 0x66382026)
 			playSound(0, 0x0CD84468);
-		} else if (param.asInteger() == 0x6E28061C) {
+		else if (param.asInteger() == 0x6E28061C)
 			playSound(0, 0x78C8402C);
-		} else if (param.asInteger() == 0x462F0410) {
+		else if (param.asInteger() == 0x462F0410)
 			playSound(0, 0x60984E28);
-		}
 		break;
 	case 0x4839:
 		stSuckedIn();
@@ -255,9 +253,9 @@ void AsScene1401Mouse::suSuckedIn() {
 	if (_collisionBounds.y1 <= 150) {
 		playSound(0, 0x0E32247F);
 		stopAnimation();
-		SetSpriteUpdate(NULL);
-		SetMessageHandler(NULL);
 		setVisible(false);
+		SetMessageHandler(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -272,9 +270,9 @@ AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm)
 	createSurface(200, 152, 147);
 	_x = 427;
 	_y = 433;
+	startAnimation(0x461A1490, 0, -1);
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene1401Cheese::handleMessage);
-	startAnimation(0x461A1490, 0, -1);
 }
 
 uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -292,9 +290,9 @@ void AsScene1401Cheese::suSuckedIn() {
 	if (_collisionBounds.y1 <= 150) {
 		playSound(0, 0x18020439);
 		stopAnimation();
-		SetSpriteUpdate(NULL);
-		SetMessageHandler(NULL);
 		setVisible(false);
+		SetMessageHandler(NULL);
+		SetSpriteUpdate(NULL);
 	}
 }
 
@@ -304,29 +302,26 @@ void AsScene1401Cheese::stSuckedIn() {
 }
 
 AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen)
-	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) {
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0), _isOpen(isOpen) {
 
 	_x = 320;
 	_y = 240;
 	createSurface1(0x04551900, 100);
-	SetUpdateHandler(&AsScene1401BackDoor::update);
-	SetMessageHandler(&AsScene1401BackDoor::handleMessage);
-	_newStickFrameIndex = STICK_LAST_FRAME;
 	if (isOpen) {
-		_isOpen = true;
-		startAnimation(0x04551900, -1,- 1);
+		startAnimation(0x04551900, -1, -1);
 		_countdown = 48;
 	} else {
-		_isOpen = false;
 		stopAnimation();
 		setVisible(false);
 	}
+	_newStickFrameIndex = STICK_LAST_FRAME;
+	SetUpdateHandler(&AsScene1401BackDoor::update);
+	SetMessageHandler(&AsScene1401BackDoor::handleMessage);
 }
 
 void AsScene1401BackDoor::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		stCloseDoor();
-	}
 	AnimatedSprite::update();
 }
 
@@ -411,29 +406,25 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam &para
 		break;
 	case 0x4807:
 		setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108);
-		if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) {
+		if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex)
 			stStartLockedInSlot();
-		} else {
+		else
 			stIdle();
-		}
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) {
+			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount)
 				incGlobalVar(V_PROJECTOR_SLOT, 1);
-			}
-		} else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) {
+		} 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) {
+		if (param.asInteger() != 1)
 			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
-		} else {
+		else
 			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
-		}
 		break;
 	case 0x482A:
 		sendMessage(_parentScene, 0x1022, 990);
@@ -455,9 +446,8 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par
 		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 {
+		} else
 			sendMessage(_parentScene, 0x4826, 0);
-		}
 		messageResult = 1;
 		break;
 	case 0x4807:
@@ -466,21 +456,18 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par
 		break;
 	case 0x480B:
 		if (param.asInteger() != 1) {
-			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) {
+			if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount)
 				incGlobalVar(V_PROJECTOR_SLOT, 1);
-			}
-		} else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) {
+		} 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) {
+		if (param.asInteger() != 1)
 			messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0;
-		} else {
+		else
 			messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0;
-		}
 		break;
 	case 0x480F:
 		stStartProjecting();
@@ -547,9 +534,9 @@ void AsCommonProjector::moveProjector() {
 		}
 	}
 
-	if (_lockedInSlot && !nowLockedInSlot) {
+	if (_lockedInSlot && !nowLockedInSlot)
 		_lockedInSlot = false;
-	} else if (!_lockedInSlot && nowLockedInSlot) {
+	else if (!_lockedInSlot && nowLockedInSlot) {
 		playSound(1, 0x5440E474);
 		_lockedInSlot = true;
 	}
@@ -561,82 +548,82 @@ void AsCommonProjector::stSuckedIn() {
 	if (_collisionBounds.y1 <= 150) {
 		sendMessage(_asPipe, 0x483A, 0);
 		stopAnimation();
+		setVisible(false);
 		SetMessageHandler(&Sprite::handleMessage);
 		SetSpriteUpdate(NULL);
-		setVisible(false);
 	}
 }
 
 void AsCommonProjector::stIdle() {
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::handleMessage);
 	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);
-	SetSpriteUpdate(&AsCommonProjector::suMoving);
-	SetMessageHandler(&AsCommonProjector::handleMessage);
 	playSound(1, 0xEC008474);
+	SetMessageHandler(&AsCommonProjector::handleMessage);
+	SetSpriteUpdate(&AsCommonProjector::suMoving);
 }
 
 void AsCommonProjector::stStartLockedInSlot() {
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
 	startAnimation(0x80C32213, 0, -1);
+	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	SetSpriteUpdate(NULL);
 	NextState(&AsCommonProjector::stStayLockedInSlot);
 }
 
 void AsCommonProjector::stStayLockedInSlot() {
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
 	startAnimation(0xD23B207F, 0, -1);
+	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
+	SetSpriteUpdate(NULL);
 }
 
 void AsCommonProjector::stStartProjecting() {
 	startAnimation(0x50A80517, 0, -1);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&AsCommonProjector::stLockedInSlot);
 	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);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&AsCommonProjector::hmLockedInSlot);
+	SetSpriteUpdate(NULL);
 }
 
 void AsCommonProjector::stStopProjecting() {
 	startAnimation(0x50A94417, 0, -1);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&AsCommonProjector::hmAnimation);
-	NextState(&AsCommonProjector::stStayLockedInSlot);
 	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);
-	SetSpriteUpdate(&AsCommonProjector::suMoving);
 	SetMessageHandler(&AsCommonProjector::hmAnimation);
+	SetSpriteUpdate(&AsCommonProjector::suMoving);
 	NextState(&AsCommonProjector::stMoving);
 }
 
 void AsCommonProjector::stStartSuckedIn() {
 	setGlobalVar(V_PROJECTOR_LOCATION, 4);
 	setGlobalVar(V_PROJECTOR_SLOT, 0);
-	SetSpriteUpdate(&AsCommonProjector::stSuckedIn);
-	SetMessageHandler(&Sprite::handleMessage);
 	startAnimation(0x708D4712, 0, -1);
 	playSound(2);
+	SetMessageHandler(&Sprite::handleMessage);
+	SetSpriteUpdate(&AsCommonProjector::stSuckedIn);
 }
 
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -646,8 +633,8 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene1401::handleMessage);
 	SetUpdateHandler(&Scene1401::update);
-	setRectList(0x004B6758);
 
+	setRectList(0x004B6758);
 	setBackground(0x08221FA5);
 	setPalette(0x08221FA5);
 	insertMouse433(0x21FA108A);
@@ -668,18 +655,22 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite2->setVisible(false);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1401>(380, 447);
 		setMessageList(0x004B65C8);
 		_sprite1->setVisible(false);
 	} else if (which == 1) {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1401>(0, 447);
 		setMessageList(0x004B65D0);
 		_sprite1->setVisible(false);
 	} else if (which == 2) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene1401>(660, 447);
 		setMessageList(0x004B65D8);
 		_sprite1->setVisible(false);
 	} else {
+		// Klaymen entering from the back
 		insertKlayman<KmScene1401>(290, 413);
 		setMessageList(0x004B65E8);
 		_sprite1->setVisible(false);
@@ -704,11 +695,10 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480);
 
-	if (which == 0 && _asProjector) {
+	if (which == 0 && _asProjector)
 		sendMessage(_asProjector, 0x482B, 0);
-	}
 
-	_asBackDoor = insertSprite<AsScene1401BackDoor>(_klayman, which == 1);
+	_asBackDoor = insertSprite<AsScene1401BackDoor>(_klayman, which == 0);
 
 }
 
@@ -717,33 +707,30 @@ void Scene1401::update() {
 	if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) {
 		_sprite2->setVisible(true);
 		_projectorBorderFlag = true;
-	} else {
+	} else
 		_sprite2->setVisible(false);
-	}
 }
 
 uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x02144CB1) {
+		if (param.asInteger() == 0x02144CB1)
 			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
-		} else if (param.asInteger() == 0x402064D8) {
+		else if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x01C66840) {
-			if (sendMessage(_asBackDoor, 0x2001, 0) != 0) {
+		else if (param.asInteger() == 0x01C66840) {
+			if (sendMessage(_asBackDoor, 0x2001, 0) != 0)
 				setMessageList(0x004B6690);
-			} else {
+			else
 				setMessageList(0x004B66B0);
-			}
 		}
 		break;
 	case 0x1019:
-		if (param.asInteger() != 0) {
+		if (param.asInteger() != 0)
 			leaveScene(2);
-		} else {
+		else
 			leaveScene(1);
-		}			
 		break;
 	case 0x480B:
 		if (sender == _ssFloorButton) {
@@ -755,31 +742,27 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 			}
 			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504)
 				sendMessage(_asProjector , 0x4839, 0);
-		} else if (sender == _ssButton) {
+		} else if (sender == _ssButton)
 			sendMessage(_ssButton, 0x4808, 0);
-		}
 		break;
 	case 0x4826:
 		if (sender == _asProjector) {
 			if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
 				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B6658);
-			} else {
+			} else
 				setMessageList2(0x004B65F0);
-			}
 		}						
 		break;
 	case 0x482A:
 		_sprite1->setVisible(true);
-		if (_asProjector) {
+		if (_asProjector)
 			sendMessage(_asProjector, 0x482B, 0);
-		}
 		break;
 	case 0x482B:
 		_sprite1->setVisible(false);
-		if (_asProjector) {
+		if (_asProjector)
 			sendMessage(_asProjector, 0x482A, 0);
-		}
 		break;
 	}
 	return 0;
@@ -792,10 +775,9 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas
 	
 	SetFilterY(&Sprite::defFilterY);
 	SetUpdateHandler(&StaticSprite::updatePosition);
-	
 }
 
-AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which)
+AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 
 	createSurface(900, 152, 147);
@@ -805,20 +787,20 @@ AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentSce
 	SetMessageHandler(&AsScene1402PuzzleBox::handleMessage);
 	_x = 279;
 	_y = 270;
-	if (which == 2) {
+	if (status == 2) {
 		// Puzzle box after the puzzle was solved
 		startAnimation(0x20060259, 0, -1);
-		NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone);
 		playSound(0, 0x419014AC);
 		loadSound(1, 0x61901C29);
-	} else if (which == 1) {
+		NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone);
+	} else if (status == 1) {
 		// Puzzle box appears
 		startAnimation(0x210A0213, 0, -1);
-		NextState(&AsScene1402PuzzleBox::stMoveUpDone);
 		playSound(0, 0x41809C6C);
+		NextState(&AsScene1402PuzzleBox::stMoveUpDone);
 	} else {
 		// Puzzle box is here
-		startAnimation(0x20060259, 0, -1);
+		startAnimation(0x20060259, -1, -1);
 		loadSound(1, 0x61901C29);
 		_newStickFrameIndex = STICK_LAST_FRAME;
 	}
@@ -879,15 +861,17 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B0C98);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B48);
-		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
+		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
 			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
-		}
 	} else if (which == 1) {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1402>(42, 391);
 		setMessageList(0x004B0B50);
 	} else if (which == 2) {
+		// Klaymen returning from the puzzle box
 		insertKlayman<KmScene1402>(377, 391);
 		setMessageList(0x004B0B60);
 		_klayman->setDoDeltaX(1);
@@ -896,10 +880,10 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 			clearRectList();
 			showMouse(false);
 			startShaking();
-		} else {
+		} else
 			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
-		}
 	} else {
+		// Klaymen entering from the right
 		insertKlayman<KmScene1402>(513, 391);
 		setMessageList(0x004B0B58);
 		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
@@ -952,9 +936,9 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x00F43389) {
-			if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
+			if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
 				leaveScene(0);
-			} else {
+			else {
 				clearRectList();
 				_klayman->setVisible(false);
 				showMouse(false);
@@ -964,11 +948,10 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x1019:
-		if (param.asInteger()) {
+		if (param.asInteger())
 			leaveScene(0);
-		} else {
+		else
 			leaveScene(1);
-		}
 		break;
 	case 0x2000:
 		stopShaking();
@@ -987,9 +970,8 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (sendMessage(_asProjector, 0x408C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
 				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B0BB8);
-			} else {
+			} else
 				setMessageList2(0x004B0B68);
-			}
 		}
 	}
 	return 0;
@@ -1100,11 +1082,10 @@ AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) {
 	
 	createSurface(100, 117, 45);
-
-	SetUpdateHandler(&AnimatedSprite::update);
 	_x = 108;
 	_y = 106;
 	stIdleLookAtGoodHole();
+	SetUpdateHandler(&AnimatedSprite::update);
 }
 
 void AsScene1407Mouse::suWalkTo() {
@@ -1114,9 +1095,9 @@ void AsScene1407Mouse::suWalkTo() {
 	else if (xdelta < -_deltaX)
 		xdelta = -_deltaX;
 	_deltaX = 0;		
-	if (_walkDestX == _x) {
+	if (_walkDestX == _x)
 		sendMessage(this, 0x1019, 0);
-	} else {
+	else {
 		_x += xdelta;
 		updateBounds();
 	}
@@ -1149,13 +1130,12 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
 				_walkDestX = kScene1407MouseHoles[holeIndex].x;
 				stWalkToHole();
 			} else {
-				if (mouseX < kScene1407MouseSections[_currSectionIndex].x1) {
+				if (mouseX < kScene1407MouseSections[_currSectionIndex].x1)
 					_walkDestX = kScene1407MouseSections[_currSectionIndex].x1;
-				} else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2) {
+				else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2)
 					_walkDestX = kScene1407MouseSections[_currSectionIndex].x2;
-				} else {
+				else
 					_walkDestX = mouseX;
-				}
 				stWalkToDest();
 			}
 		}
@@ -1169,14 +1149,12 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
 			// 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) {
-					if (ABS(kScene1407MouseHoles[index].x - _x) < distance) {
-						matchIndex = index;
-						distance = ABS(kScene1407MouseHoles[index].x - _x);
-					}
+			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;
@@ -1191,16 +1169,16 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam &param
 void AsScene1407Mouse::stIdleLookAtGoodHole() {
 	setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0);
 	startAnimation(0x72215194, 0, -1);
-	SetSpriteUpdate(NULL);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
+	SetSpriteUpdate(NULL);
 }
 
 void AsScene1407Mouse::stWalkToDest() {
 	if (_walkDestX != _x) {
 		setDoDeltaX(_walkDestX < _x ? 1 : 0);
 		startAnimation(0x22291510, 0, -1);
-		SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
 		SetMessageHandler(&AsScene1407Mouse::handleMessage);
+		SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
 		NextState(&AsScene1407Mouse::stIdleLookAtGoodHole);
 	}
 }
@@ -1208,19 +1186,19 @@ void AsScene1407Mouse::stWalkToDest() {
 void AsScene1407Mouse::stWalkToHole() {
 	setDoDeltaX(_walkDestX < _x ? 1 : 0);
 	startAnimation(0x22291510, 0, -1);
-	SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
 	SetMessageHandler(&AsScene1407Mouse::handleMessage);
+	SetSpriteUpdate(&AsScene1407Mouse::suWalkTo);
 	NextState(&AsScene1407Mouse::stGoThroughHole);
 }
 
 void AsScene1407Mouse::stGoThroughHole() {
 	startAnimation(0x72215194, 0, -1);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(NULL);
-	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
-	NextState(&AsScene1407Mouse::stArriveAtHole);
 	setVisible(false);
 	_countdown = 12;
+	SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole);
+	SetMessageHandler(NULL);
+	SetSpriteUpdate(NULL);
+	NextState(&AsScene1407Mouse::stArriveAtHole);
 }
 
 void AsScene1407Mouse::stArriveAtHole() {
@@ -1239,7 +1217,7 @@ void AsScene1407Mouse::stArriveAtHole() {
 	}
 }
 
-Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _puzzleSolvedCountdown(0),	_resetButtonCountdown(0) {
 
 	SetMessageHandler(&Scene1407::handleMessage);
@@ -1257,11 +1235,10 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene1407::update() {
 	Scene::update();
-	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) {
+	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0))
 		leaveScene(1);
-	} else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) {
+	else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0))
 		_ssResetButton->setVisible(false);
-	}
 }
 
 uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1299,35 +1276,32 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 // Scene1403
 
 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asProjector(NULL), _flag(false) {
+	: Scene(vm, parentModule, true), _asProjector(NULL), _isProjecting(false) {
 	
 	SetMessageHandler(&Scene1403::handleMessage);
 	
 	setRectList(0x004B1FF8);
-
 	setBackground(0x2110A234);
 	setPalette(0x2110A234);
 	insertMouse433(0x0A230219);
 
-	_class401_1 = insertStaticSprite(0x01102A33, 100);
-	_class401_1->setVisible(false);
-
-	_class401_2 = insertStaticSprite(0x04442520, 995);
-	
-	_class401_3 = insertStaticSprite(0x08742271, 995);
-
+	_sprite1 = insertStaticSprite(0x01102A33, 100);
+	_sprite1->setVisible(false);
+	_sprite2 = insertStaticSprite(0x04442520, 995);
+	_sprite3 = insertStaticSprite(0x08742271, 995);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 12, 1100, 201, 468, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape1);
 	_asTape1->setRepl(64, 0);
-
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 16, 1100, 498, 468, 0x9048A093);
 	_vm->_collisionMan->addSprite(_asTape2);
 	_asTape2->setRepl(64, 0);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1402>(380, 463);
 		setMessageList(0x004B1F18);
 	} else {
+		// Klaymen entering from the right
 		insertKlayman<KmScene1402>(640, 463);
 		setMessageList(0x004B1F20);
 	}
@@ -1342,7 +1316,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 			_klayman->updateBounds();
 			setMessageList(0x004B1F70);
 		}
-		_asProjector->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2());
+		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
 		_asProjector->setRepl(64, 0);
 	}
 
@@ -1354,11 +1328,11 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 	case 0x100D:
 		if (param.asInteger() == 0x88C11390) {
 			setRectList(0x004B2008);
-			_flag = true;
+			_isProjecting = true;
 		} else if (param.asInteger() == 0x08821382) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			setRectList(0x004B1FF8);
-			_flag = false;
+			_isProjecting = false;
 		}
 		break;
 	case 0x1019:
@@ -1366,36 +1340,34 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x1022:
 		if (sender == _asProjector) {
-			if (param.asInteger() >= 1000) {
-				setSurfacePriority(_class401_3->getSurface(), 1100);
-			} else {
-				setSurfacePriority(_class401_3->getSurface(), 995);
-			}
+			if (param.asInteger() >= 1000)
+				setSurfacePriority(_sprite3->getSurface(), 1100);
+			else
+				setSurfacePriority(_sprite3->getSurface(), 995);
 		}
 		break;
 	case 0x4807:
-		_class401_1->setVisible(false);
+		_sprite1->setVisible(false);
 		break;
 	case 0x480F:
-		_class401_1->setVisible(true);
+		_sprite1->setVisible(true);
 		break;
 	case 0x4826:
 		if (sender == _asProjector) {
-			if (_flag) {
+			if (_isProjecting)
 				setMessageList2(0x004B1FA8);
-			} else if (param.asInteger() == 1) {
+			else if (param.asInteger() == 1) {
 				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B1F88);
 			} else if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
 				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B1F58);
-			} else {
+			} else
 				setMessageList2(0x004B1F28);
-			}
 		} else if (sender == _asTape1 || sender == _asTape2) {
-			if (_flag) {
+			if (_isProjecting)
 				setMessageList2(0x004B1FA8);
-			} else if (_messageListStatus != 2) {
+			else if (_messageListStatus != 2) {
 				sendEntityMessage(_klayman, 0x1014, sender);
 				setMessageList2(0x004B1FB8);
 			}
@@ -1416,7 +1388,6 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1404::handleMessage);
 
 	setRectList(0x004B8D80);
-
 	setBackground(0xAC0B006F);
 	setPalette(0xAC0B006F);
 	_palette->addPalette(0x00801510, 0, 65, 0);
@@ -1428,17 +1399,19 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
-
 	_asTape = insertSprite<AsScene1201Tape>(this, 14, 1100, 281, 411, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1404>(376, 406);
 		setMessageList(0x004B8C28);
 	} else if (which == 1) {
+		// Klaymen returning from the tiles puzzle
 		insertKlayman<KmScene1404>(376, 406);
 		setMessageList(0x004B8C30);
 	} else if (which == 2) {
+		// Klaymen returning from the diskplayer
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1404>(347, 406);
 			_klayman->setDoDeltaX(1);
@@ -1447,6 +1420,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 		setMessageList(0x004B8D28);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1404>(30, 406);
 		setMessageList(0x004B8C38);
 	}
@@ -1476,11 +1450,10 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x410650C2) {
-			if (_asProjector && _asProjector->getX() == 220) {
+			if (_asProjector && _asProjector->getX() == 220)
 				setMessageList(0x004B8C40);
-			} else {
+			else
 				setMessageList(0x004B8CE8);
-			}
 		}
 		break;
 	case 0x1019:
@@ -1491,9 +1464,8 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) {
 				sendEntityMessage(_klayman, 0x1014, _asProjector);
 				setMessageList2(0x004B8CA0);
-			} else {
+			} else
 				setMessageList2(0x004B8C40);
-			}
 		} else if (sender == _asTape && _messageListStatus != 2) {
 			sendEntityMessage(_klayman, 0x1014, _asTape);
 			setMessageList(0x004B8CD0);
@@ -1534,21 +1506,17 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui
 	setVisible(false);
 	if (getSubVar(VA_IS_TILE_MATCH, _tileIndex))
 		_countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1;
-	SetUpdateHandler(&AsScene1405Tile::update);
-	SetMessageHandler(&AsScene1405Tile::handleMessage);
-	
-	debug("getSubVar(VA_TILE_SYMBOLS, _tileIndex) = %d", getSubVar(VA_TILE_SYMBOLS, _tileIndex));
-	
 	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)) {
+	if (_countdown != 0 && (--_countdown == 0))
 		show();
-	}
 }
 
 uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1581,11 +1549,14 @@ void AsScene1405Tile::hide() {
 	}
 }
 
-Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
 
 	_vm->gameModule()->initMemoryPuzzle();
 	
+	SetUpdateHandler(&Scene1405::update);
+	SetMessageHandler(&Scene1405::handleMessage);
+
 	setBackground(0x0C0C007D);
 	setPalette(0x0C0C007D);
 	insertMouse435(0xC00790C8, 20, 620);
@@ -1596,12 +1567,8 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getSubVar(VA_IS_TILE_MATCH, tileIndex))
 			_tilesLeft--;
 	}
-	
-	loadSound(0, 0x68E25540);
-	
-	SetMessageHandler(&Scene1405::handleMessage);
-	SetUpdateHandler(&Scene1405::update);
 
+	loadSound(0, 0x68E25540);
 }
 
 void Scene1405::update() {
@@ -1623,9 +1590,8 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
 			leaveScene(0);
-		}
 		break;
 	case 0x2000:
 		if (_selectFirstTile) {
@@ -1639,12 +1605,10 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entit
 					setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1);
 					setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1);
 					_tilesLeft -= 2;
-					if (_tilesLeft == 0) {
+					if (_tilesLeft == 0)
 						playSound(0);
-					}
-				} else {
+				} else
 					_countdown = 10;
-				}
 			}
 		}
 		break;
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
index 8f5a4c9..ada3c66 100644
--- a/engines/neverhood/module1400.h
+++ b/engines/neverhood/module1400.h
@@ -35,6 +35,7 @@ public:
 	Module1400(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1400();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };
@@ -154,7 +155,7 @@ public:
 
 class AsScene1402PuzzleBox : public AnimatedSprite {
 public:
-	AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which);
+	AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status);
 protected:
 	Scene *_parentScene;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -202,7 +203,7 @@ protected:
 
 class Scene1407 : public Scene {
 public:
-	Scene1407(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1407(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	Sprite *_asMouse;
 	Sprite *_ssResetButton;
@@ -218,13 +219,13 @@ class Scene1403 : public Scene {
 public:
 	Scene1403(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	Sprite *_class401_1;
-	Sprite *_class401_2;
-	Sprite *_class401_3;
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+	Sprite *_sprite3;
 	AsScene1201Tape *_asTape1;
 	AsScene1201Tape *_asTape2;
 	AsCommonProjector *_asProjector;
-	bool _flag;
+	bool _isProjecting;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
@@ -262,7 +263,7 @@ protected:
 
 class Scene1405 : public Scene {
 public:
-	Scene1405(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1405(NeverhoodEngine *vm, Module *parentModule);
 	int getCountdown() const { return _countdown; }
 protected:
 	bool _selectFirstTile;


Commit: f51140490d971ffa4cbd2095489085573ae795e1
    https://github.com/scummvm/scummvm/commit/f51140490d971ffa4cbd2095489085573ae795e1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1500 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1500.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 732cff7..b9ad01e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -319,7 +319,7 @@ void GameModule::startup() {
 
 	_vm->gameState().which = 2;
 	_vm->gameState().sceneNum = 3;
-	createModule(1400, -1);
+	createModule(1500, 0);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -411,7 +411,7 @@ void GameModule::createModule(int moduleNum, int which) {
 	case 1500:
 		_someFlag1 = false;
 		setGlobalVar(V_MODULE_NAME, 0x00F10114);
-		_childObject = new Module1500(_vm, this, which, true);
+		_childObject = new Module1500(_vm, this, which);
 		break;
 	case 1600:
 		setGlobalVar(V_MODULE_NAME, 0x01A008D8);
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 0b55209..98c55bc 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -24,32 +24,35 @@
 
 namespace Neverhood {
 
-Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag)
-	: Module(vm, parentModule), _flag(flag) {
+Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which)
+	: Module(vm, parentModule) {
 	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else {
+	else
 		createScene(3, -1);
-	}
 
 }
 
 void Module1500::createScene(int sceneNum, int which) {
 	debug("Module1500::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		sendMessage(_parentModule, 0x0800, 0);
 		createSmackerScene(0x001A0005, true, true, true);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48);
 		break;
 	}
@@ -59,16 +62,12 @@ void Module1500::createScene(int sceneNum, int which) {
 
 void Module1500::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			createScene(1, -1);
 			break;
 		case 1:
-			if (_flag) {
-				createScene(2, -1);
-			} else {
-				leaveModule(0);
-			}
+			createScene(2, -1);
 			break;
 		case 3:
 			createScene(0, -1);
@@ -83,13 +82,12 @@ void Module1500::updateScene() {
 // Scene1501
 
 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3)
-	: Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) {
+	: Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) {
 
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
 	
 	setBackground(backgroundFileHash);
-
 	setPalette();
 	addEntity(_palette);
 	_palette->addBasePalette(backgroundFileHash, 0, 256, 0);
@@ -101,9 +99,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun
 }
 
 void Scene1501::update() {
-
 	Scene::update();
-
 	if (_countdown1 != 0) {
 		_countdown1--;
 		if (_countdown1 == 0) {
@@ -118,7 +114,7 @@ void Scene1501::update() {
 	if (_countdown3 != 0)
 		_countdown3--;
 
-	if (_countdown3 == 0 && _flag && _countdown1 == 0) {
+	if (_countdown3 == 0 && _skip && _countdown1 == 0) {
 		_countdown1 = 12;
 		_palette->startFadeToBlack(11);
 	}
@@ -129,7 +125,7 @@ uint32 Scene1501::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0009:
-		_flag = true;
+		_skip = true;
 		break;
 	}
 	return messageResult;
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
index c562a24..c17cb45 100644
--- a/engines/neverhood/module1500.h
+++ b/engines/neverhood/module1500.h
@@ -34,9 +34,9 @@ namespace Neverhood {
 
 class Module1500 : public Module {
 public:
-	Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag);
+	Module1500(NeverhoodEngine *vm, Module *parentModule, int which);
 protected:
-	bool _flag;
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };
@@ -48,7 +48,7 @@ protected:
 	int _countdown1;
 	int _countdown2;
 	int _countdown3;
-	bool _flag;
+	bool _skip;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: e2b696b8918b50722a8804e2e3e9f16bfc3a643a
    https://github.com/scummvm/scummvm/commit/e2b696b8918b50722a8804e2e3e9f16bfc3a643a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:34-07:00

Commit Message:
NEVERHOOD: Clean up Module1600 (like the ones before)

- Remove AsScene1608Door because the corresponding animation resource didn't exist!

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index b9ad01e..77869fd 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -318,8 +318,8 @@ void GameModule::startup() {
 	*/
 
 	_vm->gameState().which = 2;
-	_vm->gameState().sceneNum = 3;
-	createModule(1500, 0);
+	_vm->gameState().sceneNum = 7;
+	createModule(1600, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 09bb375..c14e2b3 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -39,19 +39,18 @@ static const uint32 kModule1600SoundList[] = {
 Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(4, 1);
-	} else if (which == 2) {
+	else if (which == 2)
 		createScene(5, 0);
-	} else if (which == 3) {
+	else if (which == 3)
 		createScene(6, 1);
-	} else if (which == 4) {
+	else if (which == 4)
 		createScene(1, 0);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 	_vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList);
 	_vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150);
@@ -65,43 +64,52 @@ Module1600::~Module1600() {
 
 void Module1600::createScene(int sceneNum, int which) {
 	debug("Module1600::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		createNavigationScene(0x004B39D0, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		createNavigationScene(0x004B3A30, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		createNavigationScene(0x004B3A60, which);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		createNavigationScene(0x004B3A90, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		createNavigationScene(0x004B3B20, which);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		createNavigationScene(0x004B3B50, which);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		createNavigationScene(0x004B3B80, which);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_childObject = new Scene1608(_vm, this, which);
 		break;
 	case 8:
-		_childObject = new Scene1609(_vm, this, which);
+		_vm->gameState().sceneNum = 8;
+		_childObject = new Scene1609(_vm, this);
 		break;
 	case 1001:
-		if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) {
+		_vm->gameState().sceneNum = 1;
+		if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1)
 			createSmackerScene(0x80050200, true, true, false);
-		} else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) {
+		else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2)
 			createSmackerScene(0x80090200, true, true, false);
-		} else {
+		else
 			createSmackerScene(0x80000200, true, true, false);
-		}
 		if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2)
 			setGlobalVar(V_TALK_COUNTING_INDEX, 0);
 		else
@@ -114,7 +122,7 @@ void Module1600::createScene(int sceneNum, int which) {
 
 void Module1600::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (_moduleResult == 0)
 				createScene(2, 0);
@@ -182,10 +190,6 @@ void Module1600::updateScene() {
 AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: AnimatedSprite(vm, 1000), _parentScene(parentScene) {
 	
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::handleMessage);
-	SetSpriteUpdate(NULL);
-
 	createSurface(200, 556, 328);
 	_x = x;
 	_y = y;
@@ -211,12 +215,14 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	startAnimation(0xD4220027, 0, -1);
 	setDoDeltaX(getGlobalVar(V_CAR_DELTA_X));
 
+	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::handleMessage);
+	SetSpriteUpdate(NULL);
 }
 
 AsCommonCar::~AsCommonCar() {
-	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) {
+	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone))
 		setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X));
-	}
 }
 
 void AsCommonCar::setPathPoints(NPointArray *pathPoints) {
@@ -318,17 +324,15 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
 					minMatchIndex = i;
 				}
 				if (minMatchIndex == -1) {
-					if (_currPointIndex == 0) {
+					if (_currPointIndex == 0)
 						moveToPrevPoint();
-					} else {
+					else
 						SetSpriteUpdate(NULL);
-					}
 				} else {
-					if (minMatchIndex > _currPointIndex) {
+					if (minMatchIndex > _currPointIndex)
 						moveToNextPoint();
-					} else {
+					else
 						moveToPrevPoint();
-					}
 				}
 			} else {
 				_hasAgainDestPoint = true;
@@ -340,15 +344,15 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Ent
 		_yMoveTotalSteps = param.asInteger();
 		_steps = 0;
 		_isBraking = false;
-		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 		_lastDistance = 640;
+		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
 		break;
 	case 0x2008:
 		_yMoveTotalSteps = param.asInteger();
 		_steps = 0;
 		_isBraking = false;
-		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 		_lastDistance = 640;
+		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
 		break;
 	case 0x2009:
 		stEnterCar();
@@ -407,15 +411,15 @@ void AsCommonCar::stCarAtHome() {
 	_rectList = NULL;
 	NextState(&AsCommonCar::stLeanForwardIdle);
 	startAnimation(0x35698F78, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage);
-	SetUpdateHandler(&AsCommonCar::upIdle);
-	FinalizeState(&AsCommonCar::evIdleDone);
 	setDoDeltaX(doDeltaX ? 1 : 0);
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
 	_steps = 0;
 	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+	SetUpdateHandler(&AsCommonCar::upIdle);
+	SetMessageHandler(&AsCommonCar::handleMessage);
+	FinalizeState(&AsCommonCar::evIdleDone);
 }
 
 void AsCommonCar::updateTurnMovement() {
@@ -438,18 +442,18 @@ void AsCommonCar::updateMovement() {
 		_isMoving = false;
 		_isIdle = true;
 		startAnimation(0x192ADD30, 0, -1);
-		SetMessageHandler(&AsCommonCar::hmAnimation);
 		SetUpdateHandler(&AsCommonCar::update);
+		SetMessageHandler(&AsCommonCar::hmAnimation);
 		NextState(&AsCommonCar::stLeanForwardIdle);
 	} else if (!_isBraking && _steps && _isIdle) {
 		gotoNextState();
 		_isIdle = false;
 		startAnimation(0x9966B138, 0, -1);
-		SetMessageHandler(&AsCommonCar::hmAnimation);
 		SetUpdateHandler(&AsCommonCar::update);
+		SetMessageHandler(&AsCommonCar::hmAnimation);
 		NextState(&AsCommonCar::stUpdateMoveDirection);
 	} else {
-		bool flag = false;
+		bool inRect = false;
 		uint index = 0;
 		if (_rectList && _rectList->size() > 0) {
 			while (index < _rectList->size()) {
@@ -458,10 +462,10 @@ void AsCommonCar::updateMovement() {
 					break;
 			}
 			if (index < _rectList->size() && !_rectFlag)
-				flag = true;
+				inRect = true;
 			_rectFlag = index < _rectList->size();
 		}
-		if (flag) {
+		if (inRect) {
 			gotoNextState();
 			stHandleRect();
 		} else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) {
@@ -474,28 +478,28 @@ void AsCommonCar::updateMovement() {
 
 void AsCommonCar::stEnterCar() {
 	startAnimation(0xA86A9538, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	NextState(&AsCommonCar::stLeanForwardIdle);
 }
 
 void AsCommonCar::stLeaveCar() {
 	startAnimation(0xA86A9538, -1, -1);
 	_playBackwards = true;
-	SetMessageHandler(&AsCommonCar::hmLeaveCar);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmLeaveCar);
 }
 
 void AsCommonCar::stLeanForwardIdle() {
 	startAnimation(0x35698F78, 0, -1);
-	SetMessageHandler(&AsCommonCar::handleMessage);
-	SetUpdateHandler(&AsCommonCar::upIdle);
-	FinalizeState(&AsCommonCar::evIdleDone);
 	_currMoveDirection = 0;
 	_newMoveDirection = 0;
 	_steps = 0;
 	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+	SetUpdateHandler(&AsCommonCar::upIdle);
+	SetMessageHandler(&AsCommonCar::handleMessage);
+	FinalizeState(&AsCommonCar::evIdleDone);
 }
 
 void AsCommonCar::evIdleDone() {
@@ -504,19 +508,19 @@ void AsCommonCar::evIdleDone() {
 
 void AsCommonCar::stIdleBlink() {
 	startAnimation(0xB579A77C, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	SetUpdateHandler(&AsCommonCar::update);
-	NextState(&AsCommonCar::stLeanForwardIdle);
 	_idleCounter = 0;
 	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
+	NextState(&AsCommonCar::stLeanForwardIdle);
 }
 
 void AsCommonCar::stHandleRect() {
 	_isBusy = true;
 	gotoNextState();
 	startAnimation(0x9C220DA4, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	FinalizeState(&AsCommonCar::evHandleRectDone);
 }
 
@@ -528,15 +532,14 @@ void AsCommonCar::evHandleRectDone() {
 
 void AsCommonCar::stUpdateMoveDirection() {
 	_isMoving = true;
-	if (_currMoveDirection == 1) {
+	if (_currMoveDirection == 1)
 		startAnimation(0xD4AA03A4, 0, -1);
-	} else if (_currMoveDirection == 3) {
+	else if (_currMoveDirection == 3)
 		startAnimation(0xD00A1364, 0, -1);
-	} else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) {
+	else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX))
 		stTurnCar();
-	} else {
+	else
 		startAnimation(0xD4220027, 0, -1);
-	}
 	setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0);
 }
 
@@ -579,8 +582,8 @@ void AsCommonCar::stBrakeMoveToNextPoint() {
 	_isBusy = true;
 	_isBraking = true;
 	startAnimation(0x192ADD30, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	NextState(&AsCommonCar::stTurnCarMoveToNextPoint);
 }
 
@@ -589,8 +592,8 @@ void AsCommonCar::stTurnCar() {
 	gotoNextState();
 	_isBusy = true;
 	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	FinalizeState(&AsCommonCar::evTurnCarDone);
 	_turnMoveStatus = 0;
 	updateTurnMovement();
@@ -601,8 +604,8 @@ void AsCommonCar::stTurnCarMoveToNextPoint() {
 	gotoNextState();
 	_isBusy = true;
 	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	FinalizeState(&AsCommonCar::evTurnCarDone);
 	_turnMoveStatus = 1;
 	updateTurnMovement();
@@ -613,8 +616,8 @@ void AsCommonCar::stTurnCarMoveToPrevPoint() {
 	FinalizeState(NULL);
 	_isBusy = true;
 	startAnimation(0xF46A0324, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	FinalizeState(&AsCommonCar::evTurnCarDone);
 	_turnMoveStatus = 2;
 	updateTurnMovement();
@@ -666,8 +669,8 @@ void AsCommonCar::stBrakeMoveToPrevPoint() {
 	_isBusy = true;
 	_isBraking = true;
 	startAnimation(0x192ADD30, 0, -1);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
 	SetUpdateHandler(&AsCommonCar::update);
+	SetMessageHandler(&AsCommonCar::hmAnimation);
 	NextState(&AsCommonCar::stTurnCarMoveToPrevPoint);
 }
 
@@ -692,12 +695,10 @@ void AsCommonCar::suMoveToNextPoint() {
 		if (_steps <= 0) {
 			sendMessage(this, 0x1019, 0);
 			return;
-		} else {
+		} else
 			_steps--;
-		}
-	} else if (_steps < 11) {
+	} else if (_steps < 11)
 		_steps++;
-	}
 
 	bool firstTime = true;
 	_ySteps = _steps;
@@ -742,9 +743,9 @@ void AsCommonCar::suMoveToNextPoint() {
 			if (pt1.y < pt2.y)
 				_newMoveDirection = 1;
 			if (firstTime) {
-				if (pt1.y >= pt2.y) {
+				if (pt1.y >= pt2.y)
 					stepsCtr += 7;
-				} else {
+				else {
 					stepsCtr -= 4;
 					if (stepsCtr < 0)
 						stepsCtr = 0;
@@ -837,12 +838,10 @@ void AsCommonCar::suMoveToPrevPoint() {
 		if (_steps <= 0) {
 			sendMessage(this, 0x1019, 0);
 			return;
-		} else {
+		} else
 			_steps--;
-		}
-	} else if (_steps < 11) {
+	} else if (_steps < 11)
 		_steps++;
-	}
 
 	bool firstTime = true;
 	_ySteps = _steps;
@@ -980,67 +979,16 @@ void AsCommonCar::updateSound() {
 			maxSoundCounter = 5 - _steps;
 			if (maxSoundCounter < 1)
 				maxSoundCounter = 1;
-		} else {
+		} else
 			maxSoundCounter = 14 - _steps;
-		}
-	} else {
+	} else
 		maxSoundCounter = 21;
-	}
 	if (_soundCounter >= maxSoundCounter) {
 		sendMessage(_parentScene, 0x200D, 0);
 		_soundCounter = 0;
 	}
 }
 
-AsScene1608Door::AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _parentScene(parentScene) {
-
-	setVisible(false);
-	SetMessageHandler(&AsScene1608Door::handleMessage);
-	stopAnimation();
-}
-
-uint32 AsScene1608Door::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 AsScene1608Door::stOpenDoor() {
-	startAnimation(0x08C80144, 0, -1);
-	setVisible(true);
-	NextState(&AsScene1608Door::stOpenDoorDone);
-	playSound(0, calcHash("fxDoorOpen23"));
-}
-
-void AsScene1608Door::stOpenDoorDone() {
-	sendMessage(_parentScene, 0x2033, 0);
-	stopAnimation();
-	setVisible(false);
-}
-
-void AsScene1608Door::stCloseDoor() {
-	startAnimation(0x08C80144, -1, -1);
-	setVisible(true);
-	NextState(&AsScene1608Door::stCloseDoorDone);
-	playSound(0, calcHash("fxDoorClose23"));
-}
-
-void AsScene1608Door::stCloseDoorDone() {
-	sendMessage(_parentScene, 0x2034, 0);
-	stopAnimation();
-}
-
 AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
 
@@ -1059,10 +1007,10 @@ AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y)
 AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar)
 	: AnimatedSprite(vm, 1100), _asCar(asCar) {
 	
-	SetUpdateHandler(&AsCommonCarConnector::update);
 	createSurface1(0x60281C10, 150);
 	startAnimation(0x60281C10, -1, -1);
 	_newStickFrameIndex = STICK_LAST_FRAME;
+	SetUpdateHandler(&AsCommonCarConnector::update);
 }
 
 void AsCommonCarConnector::update() {
@@ -1082,14 +1030,16 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asKey);
 
 	if (which < 0) {
+		// Restoring game
 		if (_vm->gameState().which == 1)
+			// Klaymen is in the car
 			which = 1;
 		else {
+			// Klaymen is standing around
 			setRectList(0x004B47D0);
 			insertKlayman<KmScene1608>(380, 438);
 			_kmScene1608 = _klayman;
 			_klaymanInCar = false;
-			_asDoor = insertSprite<AsScene1608Door>(this);
 			_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
 			setMessageList(0x004B46A8);
 			setBackground(0x10080E01);
@@ -1102,6 +1052,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 			insertStaticSprite(0x4B18F868, 1200);
 		}
 	} else if (which == 0) {
+		// Klaymen entering from the left
 		_vm->gameState().which = 0;
 		setRectList(0x004B47D0);
 		insertKlayman<KmScene1608>(0, 438);
@@ -1114,12 +1065,11 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_collisionMan->addSprite(_asTape);
 		insertMouse433(0x80E05108);
 		_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
-		_asDoor = insertSprite<AsScene1608Door>(this);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 		SetUpdateHandler(&Scene1608::upLowerFloor);
-		sendMessage(_asDoor, 0x4808, 0);
 		insertStaticSprite(0x4B18F868, 1200);
 	} else if (which == 2) {
+		// Klaymen returning from looking through the upper window
 		_vm->gameState().which = 1;
 		_dataResource.load(0x003C0492);
 		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
@@ -1135,28 +1085,26 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene1608>(373, 220);
 			_klayman->setDoDeltaX(1);
-		} else {
+		} else
 			insertKlayman<KmScene1608>(283, 220);
-		}
 		_kmScene1608 = _klayman;
 		setMessageList(0x004B47A8);
 		SetMessageHandler(&Scene1608::hmUpperFloor);
 		SetUpdateHandler(&Scene1608::upUpperFloor);
-		// NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original
 		_asCar->setPathPoints(_roomPathPoints);
 		sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1);
 		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
-		_rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_rect2 = _rect1;
-		_rect2.y2 = 215;
-		_klayman->setClipRect(_rect1);
-		_asCar->setClipRect(_rect1);
-		_asIdleCarLower->setClipRect(_rect1);
-		_asIdleCarFull->setClipRect(_rect1);
+		_clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_clipRect2 = _clipRect1;
+		_clipRect2.y2 = 215;
+		_klayman->setClipRect(_clipRect1);
+		_asCar->setClipRect(_clipRect1);
+		_asIdleCarLower->setClipRect(_clipRect1);
+		_asIdleCarFull->setClipRect(_clipRect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape);
-		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_rect1);
+		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
 		_klaymanInCar = false;
 		_carClipFlag = false;
 		_carStatus = 0;
@@ -1165,6 +1113,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	// NOTE: Not in the else because 'which' is set to 1 in the true branch	
 	if (which == 1) {
+		// Klaymen entering riding the car
 		_vm->gameState().which = 1;
 		_dataResource.load(0x003C0492);
 		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
@@ -1176,52 +1125,49 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
 		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
 		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
-		_kmScene1608 = createSprite<KmScene1608>(this, 439, 220); // Special Klayman handling...
+		_kmScene1608 = createSprite<KmScene1608>(this, 439, 220);
 		sendMessage(_kmScene1608, 0x2032, 1);
 		_kmScene1608->setDoDeltaX(1);
 		SetMessageHandler(&Scene1608::hmRidingCar);
 		SetUpdateHandler(&Scene1608::upRidingCar);
 		_asIdleCarLower->setVisible(false);
 		_asIdleCarFull->setVisible(false);
-		// NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original
 		_asCar->setPathPoints(_roomPathPoints);
 		sendMessage(_asCar, 0x2002, 0);
 		sendMessage(_asCar, 0x2008, 90);
 		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
-		_rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_rect2 = _rect1;
-		_rect2.y2 = 215;
-		_kmScene1608->setClipRect(_rect1);
-		_asCar->setClipRect(_rect1);
-		_asIdleCarLower->setClipRect(_rect1);
-		_asIdleCarFull->setClipRect(_rect1);
+		_clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
+		_clipRect2 = _clipRect1;
+		_clipRect2.y2 = 215;
+		_kmScene1608->setClipRect(_clipRect1);
+		_asCar->setClipRect(_clipRect1);
+		_asIdleCarLower->setClipRect(_clipRect1);
+		_asIdleCarFull->setClipRect(_clipRect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
 		// ... _vm->_collisionMan->addSprite(_asTape);
-		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_rect1);
+		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
 		_klaymanInCar = true;
 		_carClipFlag = true;
 		_carStatus = 0;
 	}
 	
 	_palette->addPalette("paKlayRed", 0, 64, 0);
-
+	
 }
 
 Scene1608::~Scene1608() {
 	setGlobalVar(V_KLAYMAN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0);
-	if (_klaymanInCar) {
+	if (_klaymanInCar)
 		delete _kmScene1608;
-	} else {
+	else
 		delete _asCar;
-	}
 }
 
 void Scene1608::upLowerFloor() {
 	Scene::update();
-	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+	if (_countdown1 != 0 && (--_countdown1 == 0))
 		leaveScene(0);
-	}
 }
 
 void Scene1608::upUpperFloor() {
@@ -1292,13 +1238,13 @@ void Scene1608::upRidingCar() {
 	if (_asCar->getX() < 300) {
 		if (_carClipFlag) {
 			_carClipFlag = false;
-			_asCar->setClipRect(_rect1);
+			_asCar->setClipRect(_clipRect1);
 			if (!_asCar->isDoDeltaX())
 				sendMessage(_asCar, 0x200E, 0);
 		}
 	} else if (!_carClipFlag) {
 		_carClipFlag = true;
-		_asCar->setClipRect(_rect3);
+		_asCar->setClipRect(_clipRect3);
 	}
 }
 
@@ -1311,7 +1257,7 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity
 			_klayman->setVisible(false);
 			showMouse(false);
 			_sprite1->setVisible(false);
-			sendMessage(_asDoor, 0x4809, 0);
+			//sendMessage(_asDoor, 0x4809, 0); // Play sound?
 			_countdown1 = 28;
 		}
 		break;
@@ -1322,9 +1268,8 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity
 		if (sender == _asTape) {
 			sendEntityMessage(_kmScene1608, 0x1014, _asTape);
 			setMessageList(0x004B4770);
-		} else if (sender == _asKey) {
+		} else if (sender == _asKey)
 			setMessageList(0x004B46C8);
-		}
 		break;
 	}
 	return 0;
@@ -1334,9 +1279,8 @@ uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam &param, Entity
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x60842040) {
+		if (param.asInteger() == 0x60842040)
 			_carStatus = 1;
-		}
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -1384,12 +1328,12 @@ uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam &param, Entity
 	
 void Scene1608::updateKlaymanCliprect() {
 	if (_kmScene1608->getX() <= 375)
-		_kmScene1608->setClipRect(_rect1);
+		_kmScene1608->setClipRect(_clipRect1);
 	else
-		_kmScene1608->setClipRect(_rect2);
+		_kmScene1608->setClipRect(_clipRect2);
 }
 
-Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
 
 	// TODO _vm->gameModule()->initScene3011Vars();
@@ -1400,15 +1344,13 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0x92124A14);
 	setPalette(0x92124A14);
+	insertMouse435(0x24A10929, 20, 620);
 	
 	for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++)
 		_asSymbols[symbolPosition] = insertSprite<AsScene3011Symbol>(symbolPosition, false);
 	
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
 	_vm->_collisionMan->addSprite(_ssButton);
-
-	insertMouse435(0x24A10929, 20, 620);
-
 	loadSound(0, 0x68E25540);
 
 }
@@ -1428,9 +1370,8 @@ void Scene1609::update() {
 			_countdown1 = 12;
 		}
 	}
-	if (_isSolved && !isSoundPlaying(0)) {
+	if (_isSolved && !isSoundPlaying(0))
 		leaveScene(1);
-	}
 	Scene::update();
 }
 
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index a2d5464..28aad13 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -37,6 +37,7 @@ public:
 	Module1600(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1600();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };
@@ -105,18 +106,6 @@ protected:
 	void updateSound();
 };
 
-class AsScene1608Door : public AnimatedSprite {
-public:
-	AsScene1608Door(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 AsCommonIdleCarLower : public AnimatedSprite {
 public:
 	AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y);
@@ -142,7 +131,6 @@ public:
 protected:
 	AsCommonCar *_asCar;
 	Sprite *_asKey;
-	Sprite *_asDoor;
 	Sprite *_asIdleCarLower;
 	Sprite *_asIdleCarFull;
 	Sprite *_sprite1;
@@ -150,9 +138,9 @@ protected:
 	Sprite *_sprite3;
 	Sprite *_asTape;
 	Klayman *_kmScene1608;
-	NRect _rect1;
-	NRect _rect2;
-	NRect _rect3;
+	NRect _clipRect1;
+	NRect _clipRect2;
+	NRect _clipRect3;
 	int _carStatus;
 	bool _carClipFlag;
 	bool _klaymanInCar;
@@ -172,7 +160,7 @@ protected:
 
 class Scene1609 : public Scene {
 public:
-	Scene1609(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1609(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	Sprite *_ssButton;
 	AsScene3011Symbol *_asSymbols[12];


Commit: 904d9430bf7084e0ca449d69da6e1197d36b3779
    https://github.com/scummvm/scummvm/commit/904d9430bf7084e0ca449d69da6e1197d36b3779
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module1700 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 77869fd..46fc2b4 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -317,9 +317,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 2;
-	_vm->gameState().sceneNum = 7;
-	createModule(1600, -1);
+	_vm->gameState().which = 3;
+	_vm->gameState().sceneNum = 4;
+	createModule(1700, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index df64e19..aa14529 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -42,15 +42,14 @@ Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 50, 600, 5, 150);
 	_vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 0) {
+	else if (which == 0)
 		createScene(0, -1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(4, 1);
-	} else {
+	else
 		createScene(4, 3);
-	}
 
 }
 
@@ -60,23 +59,28 @@ Module1700::~Module1700() {
 
 void Module1700::createScene(int sceneNum, int which) {
 	debug("Module1700::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0);
 		createSmackerScene(0x3028A005, true, true, false);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		createNavigationScene(0x004AE8B8, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		createNavigationScene(0x004AE8E8, which);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0);
 		createSmackerScene(0x01190041, true, true, false);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0);
 		_vm->_soundMan->startMusic(0x31114225, 0, 2);
 		_childObject = new Scene1705(_vm, this, which);
@@ -88,24 +92,23 @@ void Module1700::createScene(int sceneNum, int which) {
 
 void Module1700::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			_vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 0, 0, 0, 0);
 			createScene(1, 0);
 			break;
 		case 1:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(2, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(1, 1);
-			}
 			break;
 		case 2:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(3, -1);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(1, 1);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2) {
 				if (!isSoundPlaying(0)) {
 					setSoundVolume(0, 60);
 					playSound(0, 0x58B45E58);
@@ -126,18 +129,10 @@ void Module1700::updateScene() {
 // Scene1705
 
 static const uint32 kScene1705FileHashes[] = {
-	0x910EA801,
-	0x920EA801,
-	0x940EA801,
-	0x980EA801,
-	0x800EA801,
-	0xB00EA801,
-	0xD00EA801,
-	0x100EA801,
-	0x900EA800,
-	0xD10EA801,
-	0x110EA801,
-	0x910EA800
+	0x910EA801, 0x920EA801, 0x940EA801,
+	0x980EA801, 0x800EA801, 0xB00EA801,
+	0xD00EA801, 0x100EA801, 0x900EA800,
+	0xD10EA801, 0x110EA801, 0x910EA800
 };
 
 SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex)
@@ -193,49 +188,49 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene1705::update);
 
 	setHitRects(0x004B69D8);
-
 	setBackground(0x03118226);
-
 	setPalette(0x03118226);
 	_palette->addBasePalette(0x91D3A391, 0, 64, 0);
 	_palette->copyBasePalette(0, 256, 0);
 	addEntity(_palette);
-
 	insertMouse433(0x18222039);
 
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0);
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1);
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2);
-
 	_sprite = insertStaticSprite(0x31313A22, 1100);
-
 	_ssTape = insertSprite<SsScene1705Tape>(this, 15, 1100, 238, 439, 0x02363852);
 	_vm->_collisionMan->addSprite(_ssTape);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1705>(231, 434);
 		setMessageList(0x004B69E8);
 		sendMessage(this, 0x2000, 0);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 1) {
+		// Klaymen teleporting in
 		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A08, false);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 2) {
+		// Klaymen teleporting out
 		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6AA0, false);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else if (which == 3) {
+		// Klaymen returning from teleporter console
 		insertKlayman<KmScene1705>(431, 434);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B6A18, false);
 		sendMessage(this, 0x2000, 1);
 		_klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480);
 	} else {
+		// Klaymen falling through the hole
 		insertKlayman<KmScene1705>(231, 74);
 		sendMessage(_klayman, 0x2000, 0);
 		setMessageList(0x004B69F0);
diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h
index c0ec9e5..26e1a5e 100644
--- a/engines/neverhood/module1700.h
+++ b/engines/neverhood/module1700.h
@@ -35,6 +35,7 @@ public:
 	Module1700(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1700();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };


Commit: dd26512c0db0eb5189c761cd7b1f7d779bda7617
    https://github.com/scummvm/scummvm/commit/dd26512c0db0eb5189c761cd7b1f7d779bda7617
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module1800 (like the ones before)

Changed paths:
    engines/neverhood/module1800.cpp
    engines/neverhood/module1800.h



diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index e4b189b..fbb9483 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -43,15 +43,14 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->setSoundListParams(kModule1800SoundList, true, 50, 600, 10, 150);
 	_vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 2) {
+	else if (which == 2)
 		createScene(5, 0);
-	} else if (which == 3) {
+	else if (which == 3)
 		createScene(0, 0);
-	} else {
+	else
 		createScene(3, 1);
-	} 
 
 }
 
@@ -63,39 +62,49 @@ void Module1800::createScene(int sceneNum, int which) {
 	static const byte kNavigationTypes00[] = {1, 0, 2, 0};
 	static const byte kNavigationTypes01[] = {5};
 	debug("Module1800::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		createNavigationScene(0x004AFD38, which, kNavigationTypes00);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		createNavigationScene(0x004AFD98, which, kNavigationTypes01);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		createSmackerScene(0x006C0085, true, true, false);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		createNavigationScene(0x004AFDB0, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		createNavigationScene(0x004AFDE0, which);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		createNavigationScene(0x004AFE40, which);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->_soundMan->deleteGroup(0x04A14718);
 		createSmackerScene(0x08D84010, true, true, false);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_vm->_soundMan->setSoundListParams(kModule1800SoundList, false, 0, 0, 0, 0);
 		createSmackerScene(0x0168B121, true, true, false);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_childObject = new CreditsScene(_vm, this, false);
 		break;
-	case 9:
-		// NOTE: Newly introduced sceneNum 9 (was duplicate 3 with own update handler)
+	case 1009:
+		_vm->gameState().sceneNum = 3;
+		// NOTE: Newly introduced sceneNum 1009 (was duplicate 3 with own update handler)
 		createSmackerScene(0x0A840C01, true, true, false);
 		break;
 	}
@@ -105,50 +114,45 @@ void Module1800::createScene(int sceneNum, int which) {
 
 void Module1800::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(4, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(1, -1);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createScene(3, 0);
-			}
 			break;
 		case 1:
-			if (_navigationAreaType == 3) {
+			if (_navigationAreaType == 3)
 				createScene(7, -1);
-			} else {
+			else
 				createScene(2, -1);
-			}
 			break;
 		case 2:
 			createScene(0, 2);
 			break;
 		case 3:
-			if (_moduleResult == 0) {
-				createScene(9, -1);
-			} else if (_moduleResult == 1) {
+			if (_moduleResult == 0)
+				createScene(1009, -1);
+			else if (_moduleResult == 1)
 				createScene(0, 1);
-			}
 			break;
 		case 4:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(6, -1);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(5, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(0, 3);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createScene(4, 3);
-			}
 			break;
 		case 5:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				leaveModule(2);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(4, 3);
-			}
 			break;
 		case 6:
 			createScene(8, -1);
@@ -161,16 +165,15 @@ void Module1800::updateScene() {
 			leaveModule(1);
 			// TODO GameState stuff // Restarts the game?
 			break;
-		case 9:
+		case 1009:
 			leaveModule(0);
 			break;
 		}
 	} else {
 		switch (_vm->gameState().sceneNum) {
 		case 0:
-			if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) {
+			if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2)
 				_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			}
 			break;
 		}
 	}
diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h
index 8ec8dfe..3c1d02e 100644
--- a/engines/neverhood/module1800.h
+++ b/engines/neverhood/module1800.h
@@ -36,6 +36,7 @@ public:
 	Module1800(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1800();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };


Commit: 2fbfd673ad4ca72652ff3d90656ced2020e31e6f
    https://github.com/scummvm/scummvm/commit/2fbfd673ad4ca72652ff3d90656ced2020e31e6f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module1900 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module1900.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 46fc2b4..bb58eb4 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -317,9 +317,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 3;
-	_vm->gameState().sceneNum = 4;
-	createModule(1700, -1);
+	_vm->gameState().which = 1;
+	_vm->gameState().sceneNum = 0;
+	createModule(1900, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index da02243..269fd84 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -37,11 +37,10 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	// NOTE: The original has a Scene1908 here as well but it's not used here but in another module... 
 	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 	_vm->_soundMan->addSoundList(0x04E1C09C, kModule1900SoundList);
 	_vm->_soundMan->setSoundListParams(kModule1900SoundList, true, 50, 600, 5, 150);
@@ -54,13 +53,15 @@ Module1900::~Module1900() {
 
 void Module1900::createScene(int sceneNum, int which) {
 	debug("Module1900::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_childObject = new Scene1901(_vm, this, which);
 		break;
 	case 6:
-		_childObject = new Scene1907(_vm, this, which);
+		_vm->gameState().sceneNum = 6;
+		_childObject = new Scene1907(_vm, this);
 		break;
 	}
 	SetUpdateHandler(&Module1900::updateScene);
@@ -69,13 +70,12 @@ void Module1900::createScene(int sceneNum, int which) {
 
 void Module1900::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(6, 0);
-			} else {
+			else
 				leaveModule(0);
-			}
 			break;
 		case 6:
 			createScene(0, 1);
@@ -96,25 +96,27 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x01303227);
 	setPalette(0x01303227);
 	insertMouse433(0x0322301B);
-	
+
 	insertStaticSprite(0x42213133, 1100);
 	
-	if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
+	if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED))
 		insertStaticSprite(0x40A40168, 100);
-	} else if (getGlobalVar(V_STAIRS_DOWN)) {
+	else if (getGlobalVar(V_STAIRS_DOWN)) {
 		insertStaticSprite(0x124404C4, 100);
 		setGlobalVar(V_STAIRS_DOWN_ONCE, 1);
-	} else {
+	} else
 		insertStaticSprite(0x02840064, 100);
-	}
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene1901>(120, 380);
 		setMessageList(0x004B3408);
 	} else if (which == 1) {
+		// Klaymen returning from the puzzle
 		insertKlayman<KmScene1901>(372, 380);
 		setMessageList(0x004B3410);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene1901>(0, 380);
 		setMessageList(0x004B3400);
 	}
@@ -125,73 +127,43 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
 }
 
 static const NPoint kAsScene1907SymbolGroundPositions[] = {
-	{160, 310},
-	{ 90, 340},
-	{210, 335},
-	{210, 380},
-	{310, 340},
-	{290, 400},
-	{400, 375},
-	{370, 435},
-	{475, 415}
+	{160, 310}, { 90, 340}, {210, 335},
+	{210, 380}, {310, 340}, {290, 400},
+	{400, 375}, {370, 435}, {475, 415}
 };
 
 static const NPoint kAsScene1907SymbolPluggedInPositions[] = { 
-	{275, 125},
-	{244, 125},
-	{238, 131},
-	{221, 135},
-	{199, 136},
-	{168, 149},
-	{145, 152},
-	{123, 154},
-	{103, 157}
+	{275, 125}, {244, 125}, {238, 131},
+	{221, 135}, {199, 136}, {168, 149},
+	{145, 152}, {123, 154}, {103, 157}
 };
 
 static const NPoint kAsScene1907SymbolGroundHitPositions[] = {
-	{275, 299}, 
-	{244, 299}, 
-	{238, 305}, 
-	{221, 309},
-	{199, 310},
-	{168, 323}, 
-	{145, 326}, 
-	{123, 328}, 
-	{103, 331} 
+	{275, 299}, {244, 299}, {238, 305}, 
+	{221, 309}, {199, 310}, {168, 323}, 
+	{145, 326}, {123, 328}, {103, 331} 
 };
 
 static const NPoint kAsScene1907SymbolPluggedInDownPositions[] = {
-	{275, 136},
-	{244, 156},
-	{238, 183},
-	{221, 207},
-	{199, 228},
-	{168, 262},
-	{145, 285},
-	{123, 307},
-	{103, 331}
+	{275, 136}, {244, 156}, {238, 183},
+	{221, 207}, {199, 228}, {168, 262},
+	{145, 285}, {123, 307}, {103, 331}
 };
 
 static const uint32 kAsScene1907SymbolFileHashes[] = {
-	0x006A1034,
-	0x006A1010,
-	0x006A1814,
-	0x006A1016,
-	0x006A0014,
-	0x002A1014,
-	0x00EA1014,
-	0x206A1014,
-	0x046A1414
+	0x006A1034, 0x006A1010, 0x006A1814,
+	0x006A1016, 0x006A0014, 0x002A1014,
+	0x00EA1014, 0x206A1014, 0x046A1414
 };
 
-int AsScene1907Symbol::_symbolFlag1 = 0;
-int AsScene1907Symbol::_symbolFlag2 = 0;
+bool AsScene1907Symbol::_plugInFailed = false;
+int AsScene1907Symbol::_plugInTryCount = 0;
 
 AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex)
 	: AnimatedSprite(vm, 1000 - positionIndex), _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) {
 
-	_symbolFlag1 = 0;
-	_symbolFlag2 = 0;
+	_plugInFailed = false;
+	_plugInTryCount = 0;
 	
 	if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
 		_isPluggedIn = true;
@@ -230,20 +202,19 @@ void AsScene1907Symbol::update() {
 	AnimatedSprite::updateAnim();
 	handleSpriteUpdate();
 	AnimatedSprite::updatePosition();
-	if (_symbolFlag1 && !_symbolFlag2)
-		_symbolFlag1 = 0;
+	if (_plugInFailed && _plugInTryCount == 0)
+		_plugInFailed = false;
 }
 
 uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (!_isPluggedIn && !_symbolFlag1) {
+		if (!_isPluggedIn && !_plugInFailed) {
 			tryToPlugIn();
 			messageResult = 1;
-		} else {
+		} else
 			messageResult = 0;
-		}
 		break;
 	}
 	return messageResult;
@@ -324,14 +295,12 @@ void AsScene1907Symbol::suMoveDown() {
 void AsScene1907Symbol::suMoveUp() {
 	_y -= _yIncr;
 	if (getGlobalVar(V_WALL_BROKEN)) {
-		if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) {
+		if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y)
 			_yIncr--;
-		} else {
+		else
 			_yIncr++;
-		}
-	} else {
+	} else
 		_yIncr = 2;
-	}
 	if (_yIncr > 9)
 		_yIncr = 9;
 	else if (_yIncr < 1)
@@ -345,7 +314,7 @@ void AsScene1907Symbol::suMoveUp() {
 
 void AsScene1907Symbol::tryToPlugIn() {
 	_isPluggedIn = true;
-	_symbolFlag2++;
+	_plugInTryCount++;
 	_newPositionIndex = _parentScene->getNextPosition();
 	_parentScene->setPositionFree(_currPositionIndex, true);
 	sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex);
@@ -361,7 +330,7 @@ void AsScene1907Symbol::tryToPlugIn() {
 	if (_elementIndex == _newPositionIndex) {
 		NextState(&AsScene1907Symbol::stPlugIn);
 	} else {
-		_symbolFlag1 = 1;
+		_plugInFailed = true;
 		NextState(&AsScene1907Symbol::stPlugInFail);
 	}
 }
@@ -406,8 +375,8 @@ void AsScene1907Symbol::stFallOffHitGround() {
 
 void AsScene1907Symbol::cbFallOffHitGroundEvent() {
 	_currPositionIndex = _newPositionIndex;
-	if (_symbolFlag2)
-		_symbolFlag2--;
+	if (_plugInTryCount > 0)
+		_plugInTryCount--;
 	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1);
 	_newStickFrameIndex = 0;
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -434,7 +403,7 @@ void AsScene1907Symbol::stPlugInFail() {
 }
 
 void AsScene1907Symbol::moveUp() {
-	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteUpdate(&AsScene1907Symbol::suMoveUp);
@@ -443,7 +412,7 @@ void AsScene1907Symbol::moveUp() {
 }
 
 void AsScene1907Symbol::moveDown() {
-	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//????
+	startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);
 	stopAnimation();
 	SetMessageHandler(&AsScene1907Symbol::handleMessage);
 	SetSpriteUpdate(&AsScene1907Symbol::suMoveDown);
@@ -546,7 +515,7 @@ void AsScene1907WaterHint::hide() {
 	SetMessageHandler(&Sprite::handleMessage);
 }
 
-Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which)	
+Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule)	
 	: Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), 
 	_moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) {
 	
@@ -662,11 +631,12 @@ void Scene1907::plugInFailed() {
 int Scene1907::getRandomPositionIndex() {
 	bool flag = false;
 	int index = 0;
-	for (int i = 0; i < 9; i++) {
+	// Check if any position is free
+	for (int i = 0; i < 9; i++)
 		if (_positionFree[i])
 			flag = true;
-	}
 	if (flag) {
+		// Get a random free position
 		flag = false;
 		while (!flag) {
 			index = _vm->_rnd->getRandomNumber(9 - 1);
diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h
index 5f26c9e..72dbf63 100644
--- a/engines/neverhood/module1900.h
+++ b/engines/neverhood/module1900.h
@@ -35,6 +35,7 @@ public:
 	Module1900(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module1900();
 protected:
+	int _sceneNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createScene(int sceneNum, int which);
 	void updateScene();
@@ -75,8 +76,8 @@ protected:
 	int _deltaX, _smallDeltaX;
 	int _deltaY, _smallDeltaY;
 	// Dumb, change if possible
-	static int _symbolFlag1;
-	static int _symbolFlag2;
+	static bool _plugInFailed;
+	static int _plugInTryCount;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmTryToPlugIn(int messageNum, const MessageParam &param, Entity *sender);
@@ -117,7 +118,7 @@ protected:
 
 class Scene1907 : public Scene {
 public:
-	Scene1907(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene1907(NeverhoodEngine *vm, Module *parentModule);
 	void plugInFailed();
 	void setPositionFree(int index, bool value) { _positionFree[index] = value; }
 	int getNextPosition() { return _pluggedInCount++; }


Commit: 9d987a97d3d7a6a740383889dc2a676684d06676
    https://github.com/scummvm/scummvm/commit/9d987a97d3d7a6a740383889dc2a676684d06676
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2000 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2000.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index bb58eb4..896c8cc 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -317,9 +317,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 1;
+	_vm->gameState().which = 3;
 	_vm->gameState().sceneNum = 0;
-	createModule(1900, -1);
+	createModule(2000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index a97cbaa..ce871de 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -29,13 +29,12 @@ namespace Neverhood {
 Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 0) {
+	else if (which == 0)
 		createScene(0, 1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(0, 3);
-	}
 
 }
 
@@ -45,15 +44,18 @@ Module2000::~Module2000() {
 
 void Module2000::createScene(int sceneNum, int which) {
 	debug("Module2000::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_childObject = new Scene2001(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		setGlobalVar(V_WORLDS_JOINED, 1);
 		setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1);
 		createSmackerScene(0x204B2031, true, true, false);
@@ -65,26 +67,23 @@ void Module2000::createScene(int sceneNum, int which) {
 
 void Module2000::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				leaveModule(0);
-			} else {
+			else
 				createScene(1, 0);
-			}
 			break;
 		case 1:
 			if (_moduleResult == 0) {
-				if (getGlobalVar(V_WORLDS_JOINED)) {
+				if (getGlobalVar(V_WORLDS_JOINED))
 					createScene(1, 0);
-				} else {
+				else
 					createScene(2, -1);
-				}
-			} else if (_moduleResult == 1) {
+			} else if (_moduleResult == 1)
 				createScene(1, 1);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(0, 0);
-			}
 			break;
 		case 2:
 			createScene(1, 0);
@@ -109,25 +108,30 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x0D641724, 1100);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2001>(300, 345);
 		setMessageList(0x004B3538);
 		sendMessage(this, 0x2000, 0);
 	} else if (which == 1) {
+		// Klaymen teleporting in
 		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3540, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 2) {
+		// Klaymen teleporting out
 		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B35F0, false);
 		sendMessage(this, 0x2000, 1);
 	} else if (which == 3) {
+		// Klaymen returning from teleporter console
 		insertKlayman<KmScene2001>(116, 345);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B3550, false);
 		sendMessage(this, 0x2000, 1);
 	} else {
+		// Klaymen standing around
 		insertKlayman<KmScene2001>(390, 345);
 		setMessageList(0x004B3530);
 		sendMessage(this, 0x2000, 0);
diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h
index 8533092..9859c73 100644
--- a/engines/neverhood/module2000.h
+++ b/engines/neverhood/module2000.h
@@ -35,6 +35,7 @@ public:
 	Module2000(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2000();
 protected:
+	int _sceneNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createScene(int sceneNum, int which);
 	void updateScene();


Commit: 0dd4995af35aac2aabb5c535e6fef3668eedae93
    https://github.com/scummvm/scummvm/commit/0dd4995af35aac2aabb5c535e6fef3668eedae93
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2100 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2100.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 896c8cc..adf2c49 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -319,7 +319,7 @@ void GameModule::startup() {
 
 	_vm->gameState().which = 3;
 	_vm->gameState().sceneNum = 0;
-	createModule(2000, -1);
+	createModule(2100, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index cbd11b6..7bbb9e8 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -31,15 +31,14 @@ Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_vm->_soundMan->addMusic(0x10A10C14, 0x11482B95);
 	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(0, 0);
-	} else if (which == 2) {
+	else if (which == 2)
 		createScene(0, 3);
-	} else {
+	else
 		createScene(0, 1);
-	}
 
 }
 
@@ -49,9 +48,10 @@ Module2100::~Module2100() {
 
 void Module2100::createScene(int sceneNum, int which) {
 	debug("Module2100::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_vm->_soundMan->startMusic(0x11482B95, 0, 1);
 		_childObject = new Scene2101(_vm, this, which);
 		break;
@@ -62,14 +62,13 @@ void Module2100::createScene(int sceneNum, int which) {
 
 void Module2100::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (_moduleResult == 1) {
 				setGlobalVar(V_DOOR_PASSED, 1);
 				leaveModule(0);
-			} else {
+			} else
 				leaveModule(1);
-			}
 			break;
 		}
 	}
@@ -77,7 +76,7 @@ void Module2100::updateScene() {
 
 // Scene2101
 
-AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag)
+AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool isOpen)
 	: AnimatedSprite(vm, 1100) {
 
 	createSurface(100, 328, 347);
@@ -85,12 +84,11 @@ AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag)
 	_y = 240;
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene2101Door::handleMessage);
-	if (flag) {
+	if (isOpen) {
 		startAnimation(0x0C202B9C, -1, -1);
 		_newStickFrameIndex = STICK_LAST_FRAME;
-	} else {
+	} else
 		setVisible(false);
-	}
 }
 
 uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -120,8 +118,8 @@ void AsScene2101Door::stCloseDoor() {
 	startAnimation(0xC222A8D4, 0, -1);
 	_newStickFrameIndex = STICK_LAST_FRAME;
 	setVisible(true);
-	NextState(&AsScene2101Door::stCloseDoorDone);
 	playSound(0, calcHash("fxDoorClose32"));
+	NextState(&AsScene2101Door::stCloseDoorDone);
 }
 
 void AsScene2101Door::stCloseDoorDone() {
@@ -164,18 +162,18 @@ SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene
 	if (_soundFileHash == 0)
 		_soundFileHash = 0x44141000;
 	createSurface(1010, 61, 30);
-	if (_fileHash1) {
+	if (_fileHash1)
 		loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
-	} else
+	else
 		setVisible(false);
 }
 
 void SsCommonFloorButton::update() {
 	if (_countdown != 0 && (--_countdown == 0)) {
 		sendMessage(_parentScene, 0x1022, 1010);
-		if (_fileHash1) {
+		if (_fileHash1)
 			loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
-		} else
+		else
 			setVisible(false);
 	}
 }	
@@ -223,6 +221,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 		_doorStatus = 1;
 		_countdown1 = 0;
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene2101>(640, 438);
 		setMessageList(0x004B8E50);
 		sendMessage(this, 0x2000, 0);
@@ -230,6 +229,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 		_doorStatus = 2;
 		_countdown1 = 48;
 	} else if (which == 2) {
+		// Klaymen teleporting out
 		insertKlayman<KmScene2101>(115, 438);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B8F58);
@@ -238,6 +238,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 		_doorStatus = 1;
 		_countdown1 = 0;
 	} else if (which == 3) {
+		// Klaymen returning from the teleporter console
 		insertKlayman<KmScene2101>(115, 438);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B8EB0);
@@ -246,6 +247,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 		_doorStatus = 1;
 		_countdown1 = 0;
 	} else {
+		// Klaymen teleporting in
 		insertKlayman<KmScene2101>(115, 438);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004B8EA0);
@@ -283,9 +285,8 @@ void Scene2101::update() {
 				}
 			}
 		}
-	} else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) {
+	} else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/)
 		setMessageList2(0x004B8F50);
-	}
 	Scene::update();
 }
 
@@ -293,17 +294,15 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x02144CB1) {
+		if (param.asInteger() == 0x02144CB1)
 			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
-		} else if (param.asInteger() == 0x21E64A00) {
-			if (_doorStatus == 0) {
+		else if (param.asInteger() == 0x21E64A00) {
+			if (_doorStatus == 0)
 				setMessageList(0x004B8E80);
-			} else {
+			else
 				setMessageList(0x004B8EC8);
-			}
-		} else if (param.asInteger() == 0x41442820) {
+		} else if (param.asInteger() == 0x41442820)
 			cancelMessageList();
-		}
 		break;
 	case 0x2000:
 		if (param.asInteger() != 0) {
@@ -326,9 +325,8 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (_klayman->getX() >= 228 && _klayman->getX() <= 500) {
 				sendEntityMessage(_klayman, 0x1014, sender);
 				setMessageList(0x004B8F78);
-			} else if (_klayman->getX() < 228) {
+			} else if (_klayman->getX() < 228)
 				setMessageList2(0x004B8F00);
-			}
 		}
 		break;
 	}
diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h
index cf7a613..8ec12f7 100644
--- a/engines/neverhood/module2100.h
+++ b/engines/neverhood/module2100.h
@@ -34,6 +34,7 @@ public:
 	Module2100(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2100();
 protected:
+	int _sceneNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createScene(int sceneNum, int which);
 	void updateScene();
@@ -43,7 +44,7 @@ protected:
 
 class AsScene2101Door : public AnimatedSprite {
 public:
-	AsScene2101Door(NeverhoodEngine *vm, bool flag);
+	AsScene2101Door(NeverhoodEngine *vm, bool isOpen);
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void stOpenDoor();


Commit: 1993d4165a8d2e3d2b956113b903899e0de4c6fa
    https://github.com/scummvm/scummvm/commit/1993d4165a8d2e3d2b956113b903899e0de4c6fa
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2200 (like the ones before)

- Rename SceneInfo140 to HallOfRecordsInfo

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index adf2c49..5fec376 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -307,6 +307,7 @@ void GameModule::startup() {
 		setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1);
 	//setGlobalVar(V_PROJECTOR_LOCATION, 4);
 	setGlobalVar(V_KEYDOOR_UNLOCKED, 1);
+	setGlobalVar(V_LIGHTS_ON, 1);
 	// <<<DEBUG
 
 #if 1
@@ -317,9 +318,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 3;
-	_vm->gameState().sceneNum = 0;
-	createModule(2100, -1);
+	_vm->gameState().which = 2;
+	_vm->gameState().sceneNum = 41;
+	createModule(2200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 102704a..8616592 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -35,11 +35,10 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_vm->_soundMan->addMusic(0x11391412, 0x601C908C); 
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 }
 
@@ -48,158 +47,205 @@ Module2200::~Module2200() {
 }
 
 void Module2200::createScene(int sceneNum, int which) {
-	// CHECKME if this can be used regardless of the new sceneNum
-	if (sceneNum == 7 && which >= 0)
-		_vm->gameState().which = _vm->gameState().sceneNum; 
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_childObject = new Scene2201(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->startMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2202(_vm, this, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->startMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2203(_vm, this, which);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_vm->_soundMan->stopMusic(0x601C908C, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 3);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->stopMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2205(_vm, this, which);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		_vm->_soundMan->stopMusic(0x601C908C, 0, 2);
 		_childObject = new Scene2206(_vm, this, which);
 		break;
 	case 6:
-		_childObject = new Scene2207(_vm, this, which);
+		_vm->gameState().sceneNum = 6;
+		_childObject = new Scene2207(_vm, this);
 		break;
 	case 7:
+		if (which >= 0)
+			_vm->gameState().which = _vm->gameState().sceneNum;
+		_vm->gameState().sceneNum = 7;
 		_childObject = new Scene2208(_vm, this, which);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_childObject = new Scene2208(_vm, this, which);
 		break;
 	case 9:
+		_vm->gameState().sceneNum = 9;
 		createHallOfRecordsScene(which, 0x004B7180);
 		break;
 	case 10:
+		_vm->gameState().sceneNum = 10;
 		createHallOfRecordsScene(which, 0x004B7198);
 		break;
 	case 11:
+		_vm->gameState().sceneNum = 11;
 		createHallOfRecordsScene(which, 0x004B71B0);
 		break;
 	case 12:
+		_vm->gameState().sceneNum = 12;
 		createHallOfRecordsScene(which, 0x004B71C8);
 		break;
 	case 13:
+		_vm->gameState().sceneNum = 13;
 		createHallOfRecordsScene(which, 0x004B71E0);
 		break;
 	case 14:
+		_vm->gameState().sceneNum = 14;
 		createHallOfRecordsScene(which, 0x004B71F8);
 		break;
 	case 15:
+		_vm->gameState().sceneNum = 15;
 		createHallOfRecordsScene(which, 0x004B7210);
 		break;
 	case 16:
+		_vm->gameState().sceneNum = 16;
 		createHallOfRecordsScene(which, 0x004B7228);
 		break;
 	case 17:
+		_vm->gameState().sceneNum = 17;
 		createHallOfRecordsScene(which, 0x004B7240);
 		break;
 	case 18:
+		_vm->gameState().sceneNum = 18;
 		createHallOfRecordsScene(which, 0x004B7258);
 		break;
 	case 19:
+		_vm->gameState().sceneNum = 19;
 		createHallOfRecordsScene(which, 0x004B7270);
 		break;
 	case 20:
+		_vm->gameState().sceneNum = 20;
 		createHallOfRecordsScene(which, 0x004B7288);
 		break;
 	case 21:
+		_vm->gameState().sceneNum = 21;
 		createHallOfRecordsScene(which, 0x004B72A0);
 		break;
 	case 22:
+		_vm->gameState().sceneNum = 22;
 		createHallOfRecordsScene(which, 0x004B72B8);
 		break;
 	case 23:
+		_vm->gameState().sceneNum = 23;
 		createHallOfRecordsScene(which, 0x004B72D0);
 		break;
 	case 24:
+		_vm->gameState().sceneNum = 24;
 		createHallOfRecordsScene(which, 0x004B72E8);
 		break;
 	case 25:
+		_vm->gameState().sceneNum = 25;
 		createHallOfRecordsScene(which, 0x004B7300);
 		break;
 	case 26:
+		_vm->gameState().sceneNum = 26;
 		createHallOfRecordsScene(which, 0x004B7318);
 		break;
 	case 27:
+		_vm->gameState().sceneNum = 27;
 		createHallOfRecordsScene(which, 0x004B7330);
 		break;
 	case 28:
+		_vm->gameState().sceneNum = 28;
 		createHallOfRecordsScene(which, 0x004B7348);
 		break;
 	case 29:
+		_vm->gameState().sceneNum = 29;
 		createHallOfRecordsScene(which, 0x004B7360);
 		break;
 	case 30:
+		_vm->gameState().sceneNum = 30;
 		createHallOfRecordsScene(which, 0x004B7378);
 		break;
 	case 31:
+		_vm->gameState().sceneNum = 31;
 		createHallOfRecordsScene(which, 0x004B7390);
 		break;
 	case 32:
+		_vm->gameState().sceneNum = 32;
 		createHallOfRecordsScene(which, 0x004B73A8);
 		break;
 	case 33:
+		_vm->gameState().sceneNum = 33;
 		createHallOfRecordsScene(which, 0x004B73C0);
 		break;
 	case 34:
+		_vm->gameState().sceneNum = 34;
 		createHallOfRecordsScene(which, 0x004B73D8);
 		break;
 	case 35:
+		_vm->gameState().sceneNum = 35;
 		createHallOfRecordsScene(which, 0x004B73F0);
 		break;
 	case 36:
+		_vm->gameState().sceneNum = 36;
 		createHallOfRecordsScene(which, 0x004B7408);
 		break;
 	case 37:
+		_vm->gameState().sceneNum = 37;
 		createHallOfRecordsScene(which, 0x004B7420);
 		break;
 	case 38:
+		_vm->gameState().sceneNum = 38;
 		createHallOfRecordsScene(which, 0x004B7438);
 		break;
 	case 39:
+		_vm->gameState().sceneNum = 39;
 		createHallOfRecordsScene(which, 0x004B7450);
 		break;
 	case 40:
+		_vm->gameState().sceneNum = 40;
 		createHallOfRecordsScene(which, 0x004B7468);
 		break;
 	case 41:
+		_vm->gameState().sceneNum = 41;
 		_childObject = new Scene2242(_vm, this, which);
 		break;
 	case 42:
+		_vm->gameState().sceneNum = 42;
 		createHallOfRecordsScene(which, 0x004B7480);
 		break;
 	case 43:
+		_vm->gameState().sceneNum = 43;
 		createHallOfRecordsScene(which, 0x004B7498);
 		break;
 	case 44:
+		_vm->gameState().sceneNum = 44;
 		createHallOfRecordsScene(which, 0x004B74B0);
 		break;
 	case 45:
+		_vm->gameState().sceneNum = 45;
 		createHallOfRecordsScene(which, 0x004B74C8);
 		break;
 	case 46:
+		_vm->gameState().sceneNum = 46;
 		_childObject = new Scene2247(_vm, this, which);
 		break;
 	case 47:
+		_vm->gameState().sceneNum = 47;
 		if (!getGlobalVar(V_WORLDS_JOINED)) {
 			if (getGlobalVar(V_LIGHTS_ON))
 				createStaticScene(0x83110287, 0x10283839);
@@ -222,50 +268,46 @@ void Module2200::createScene(int sceneNum, int which) {
 
 void Module2200::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(2, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(1, 0);
-			} else {
+			else
 				leaveModule(0);
-			}
 			break;
 		case 1:
 			createScene(0, 2);
 			break;
 		case 2:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(4, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(3, 0);
-			} else {
+			else
 				createScene(0, 1);
-			}
 			break;
 		case 3:
 			createScene(2, 2);
 			break;
 		case 4:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(5, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(4, 2);
-			} else {
+			else
 				createScene(2, 1);
-			}
 			break;
 		case 5:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(46, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(6, 0);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createScene(8, 0);
-			} else {
+			else
 				createScene(4, 1);
-			}
 			break;
 		case 6:
 			createScene(5, 2);
@@ -399,8 +441,8 @@ void Module2200::updateScene() {
 
 #undef HallOfRecordsSceneLink
 			
-void Module2200::createHallOfRecordsScene(int which, uint32 sceneInfo140Id) {
-	_childObject = new HallOfRecordsScene(_vm, this, which, sceneInfo140Id);
+void Module2200::createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId) {
+	_childObject = new HallOfRecordsScene(_vm, this, which, hallOfRecordsInfoId);
 }
 
 // Scene2201
@@ -415,15 +457,15 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm)
 	SetUpdateHandler(&AnimatedSprite::update);
 }
 
-AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1)
-	: AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _doorOpen(flag1) {
+AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool isOpen)
+	: AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) {
 
 	_x = 408;
 	_y = 290;	
 	createSurface(900, 63, 266);
 	SetUpdateHandler(&AsScene2201Door::update);
 	SetMessageHandler(&AsScene2201Door::handleMessage);
-	if (_doorOpen) {
+	if (_isOpen) {
 		startAnimation(0xE2CB0412, -1, -1);
 		_countdown = 48;
 		_newStickFrameIndex = STICK_LAST_FRAME;
@@ -435,9 +477,8 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *
 }
 
 void AsScene2201Door::update() {
-	if (_countdown != 0 && _doorOpen && (--_countdown == 0)) {
+	if (_countdown != 0 && _isOpen && (--_countdown == 0))
 		stCloseDoor();
-	}
 	AnimatedSprite::update();
 }
 
@@ -446,24 +487,24 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x11001090) {
-			if (_doorOpen)
+			if (_isOpen)
 				_ssDoorLight->setVisible(true);
 		} else if (param.asInteger() == 0x11283090) {
-			if (!_doorOpen)
+			if (!_isOpen)
 				_ssDoorLight->setVisible(false);
 		}
 		break;
 	case 0x2000:
-		if (_doorOpen)
+		if (_isOpen)
 			_countdown = 144;
-		messageResult = _doorOpen ? 1 : 0;
+		messageResult = _isOpen ? 1 : 0;
 		break;
 	case 0x3002:
 		gotoNextState();
 		break;
 	case 0x4808:
 		_countdown = 144;
-		if (!_doorOpen)
+		if (!_isOpen)
 			stOpenDoor();
 		break;
 	}
@@ -471,14 +512,14 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam &param,
 }
 
 void AsScene2201Door::stOpenDoor() {
-	_doorOpen = true;
+	_isOpen = true;
 	startAnimation(0xE2CB0412, 0, -1);
 	_newStickFrameIndex = STICK_LAST_FRAME;
 	playSound(0, calcHash("fxDoorOpen33"));
 }
 
 void AsScene2201Door::stCloseDoor() {
-	_doorOpen = false;
+	_isOpen = false;
 	startAnimation(0xE2CB0412, -1, -1);
 	_playBackwards = true;
 	_newStickFrameIndex = 0;
@@ -507,14 +548,12 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	loadDataResource(0x04104242);
 	loadHitRectList();
-
 	setBackground(0x40008208);
 	setPalette(0x40008208);
 	insertMouse433(0x0820C408);
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 7, 1100, 459, 432, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape); 
-
 	_ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
 	for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++)
@@ -526,42 +565,40 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[1].x2 = 640;
 	_clipRects[1].y2 = 480;
 	
-	if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
+	if (!getGlobalVar(V_TILE_PUZZLE_SOLVED))
 		insertStaticSprite(0x00026027, 900);
-	}
 	
 	tempSprite = insertStaticSprite(0x030326A0, 1100);
 	_clipRects[0].x1 = tempSprite->getDrawRect().x;
-	
 	insertStaticSprite(0x811DA061, 1100);
-
 	tempSprite = insertStaticSprite(0x11180022, 1100);
 	_clipRects[1].x1 = tempSprite->getDrawRect().x;
-
 	tempSprite = insertStaticSprite(0x0D411130, 1100);
 	_clipRects[0].y2 = tempSprite->getDrawRect().y2();
 	_clipRects[1].y1 = tempSprite->getDrawRect().y2();
-	
 	_ssDoorLight = insertStaticSprite(0xA4062212, 900);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2201>(300, 427, _clipRects, 2);
 		setMessageList(0x004B8118);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else if (which == 1) {
+		// Klaymen entering from the back
 		insertKlayman<KmScene2201>(412, 393, _clipRects, 2);
 		setMessageList(0x004B8130);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else if (which == 2) {
+		// Klaymen returning from the puzzle
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene2201>(379, 427, _clipRects, 2);
 			_klayman->setDoDeltaX(1);
-		} else {
+		} else
 			insertKlayman<KmScene2201>(261, 427, _clipRects, 2);
-		}
 		setMessageList(0x004B8178);
 		_asDoor = insertSprite<AsScene2201Door>(_klayman, _ssDoorLight, false);
 	} else {
+		// Klaymen entering from the left
 		NPoint pt = _dataResource.getPoint(0x0304D8DC);
 		insertKlayman<KmScene2201>(pt.x, pt.y, _clipRects, 2);
 		setMessageList(0x004B8120);
@@ -591,34 +628,30 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x402064D8) {
+		if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssDoorButton);
-		} else if (param.asInteger() == 0x35803198) {
-			if (sendMessage(_asDoor, 0x2000, 0)) {
+		else if (param.asInteger() == 0x35803198) {
+			if (sendMessage(_asDoor, 0x2000, 0))
 				setMessageList(0x004B81A0);
-			} else {
+			else
 				setMessageList(0x004B81B8);
-			} 
 		} else if (param.asInteger() == 0x51445010) {
-			if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
+			if (getGlobalVar(V_TILE_PUZZLE_SOLVED))
 				setMessageList(0x004B8108);
-			} else {
+			else
 				setMessageList(0x004B8150);
-			}
-		} else if (param.asInteger() == 0x1D203082) {
+		} else if (param.asInteger() == 0x1D203082)
 			setMessageList(0x004B8180);
-		} else if (param.asInteger() == 0x00049091) {
-			if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
+		else if (param.asInteger() == 0x00049091) {
+			if (getGlobalVar(V_TILE_PUZZLE_SOLVED))
 				setMessageList(0x004B8138);
-			} else {
+			else
 				setMessageList(0x004B8108);
-			}
 		}
 		break;
 	case 0x480B:
-		if (sender == _ssDoorButton) {
+		if (sender == _ssDoorButton)
 			sendMessage(_asDoor, 0x4808, 0);
-		}
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
@@ -630,82 +663,65 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-static const NPoint kSsScene2202PuzzleTilePoints[] = {
-	{196, 105},
-	{323, 102},
-	{445, 106},
-	{192, 216},
-	{319, 220},
-	{446, 216},
-	{188, 320},
-	{319, 319},
-	{443, 322}
+static const NPoint kSsScene2202PuzzleCubePoints[] = {
+	{196, 105}, {323, 102}, {445, 106},
+	{192, 216}, {319, 220}, {446, 216},
+	{188, 320}, {319, 319}, {443, 322}
 };
 
-static const uint32 kSsScene2202PuzzleTileFileHashes1[] = {
-	0xA500800C,
-	0x2182910C,
-	0x2323980C,
-	0x23049084,
-	0x21008080,
-	0x2303900C,
-	0x6120980C,
-	0x2504D808
+static const uint32 kSsScene2202PuzzleCubeFileHashes1[] = {
+	0xA500800C, 0x2182910C, 0x2323980C,
+	0x23049084, 0x21008080, 0x2303900C,
+	0x6120980C, 0x2504D808
 };
 
-static const uint32 kSsScene2202PuzzleTileFileHashes2[] = {
-	0x0AAD8080,
-	0x0A290291,
-	0x0A2BA398,
-	0x822B8490,
-	0x86298080,
-	0x0A2B8390,
-	0x0A69A098,
-	0x0E2D84D8
+static const uint32 kSsScene2202PuzzleCubeFileHashes2[] = {
+	0x0AAD8080, 0x0A290291, 0x0A2BA398,
+	0x822B8490, 0x86298080, 0x0A2B8390,
+	0x0A69A098, 0x0E2D84D8
 };
 
-SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value)
-	: StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) {
+SsScene2202PuzzleCube::SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _cubeSymbol(cubeSymbol), _cubePosition(cubePosition), _isMoving(false) {
 
 	int surfacePriority;	
 
-	SetUpdateHandler(&SsScene2202PuzzleTile::update);
-	SetMessageHandler(&SsScene2202PuzzleTile::handleMessage);
-	if (_tileIndex >= 0 && _tileIndex <= 2)
+	SetUpdateHandler(&SsScene2202PuzzleCube::update);
+	SetMessageHandler(&SsScene2202PuzzleCube::handleMessage);
+	if (_cubePosition >= 0 && _cubePosition <= 2)
 		surfacePriority = 100;
-	else if (_tileIndex >= 3 && _tileIndex <= 5)
+	else if (_cubePosition >= 3 && _cubePosition <= 5)
 		surfacePriority = 300;
 	else
 		surfacePriority = 500;
-	loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0,
-		kSsScene2202PuzzleTilePoints[_tileIndex].x, kSsScene2202PuzzleTilePoints[_tileIndex].y);
+	loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0,
+		kSsScene2202PuzzleCubePoints[_cubePosition].x, kSsScene2202PuzzleCubePoints[_cubePosition].y);
 	loadSound(0, 0x40958621);
 	loadSound(1, 0x51108241);
 }
 
-void SsScene2202PuzzleTile::update() {
+void SsScene2202PuzzleCube::update() {
 	handleSpriteUpdate();
 	updatePosition();
 }
 
-uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 SsScene2202PuzzleCube::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
-		if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) {
-			sendMessage(_parentScene, 0x2000, _tileIndex);
-		}
+		if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED))
+			sendMessage(_parentScene, 0x2000, _cubePosition);
 		messageResult = 1;
 		break;
 	case 0x2001:
 		_isMoving = true;
-		moveTile(param.asInteger());
+		moveCube(param.asInteger());
 		break;
 	}
 	return messageResult;
 }
 				
-void SsScene2202PuzzleTile::suMoveTileX() {
+void SsScene2202PuzzleCube::suMoveCubeX() {
 
 	bool done = false;
 
@@ -732,15 +748,14 @@ void SsScene2202PuzzleTile::suMoveTileX() {
 			_counterDirection = true;
 	}
 	
-	if (done) {
+	if (done)
 		stopMoving();			
-	}
 
 	updateBounds();
 
 }
 
-void SsScene2202PuzzleTile::suMoveTileY() {
+void SsScene2202PuzzleCube::suMoveCubeY() {
 
 	bool done = false;
 
@@ -767,29 +782,26 @@ void SsScene2202PuzzleTile::suMoveTileY() {
 			_counterDirection = true;
 	}
 	
-	if (done) {
+	if (done)
 		stopMoving();			
-	}
 
 	updateBounds();
 
 }
 
-void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
+void SsScene2202PuzzleCube::moveCube(int16 newCubePosition) {
 
-	loadSprite(kSsScene2202PuzzleTileFileHashes1[_value], kSLFCenteredDrawOffset);
+	loadSprite(kSsScene2202PuzzleCubeFileHashes1[_cubeSymbol], kSLFCenteredDrawOffset);
 
-	setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1);
-	setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value);
-	
-	_tileIndex = newTileIndex;
+	setSubVar(VA_CUBE_POSITIONS, _cubePosition, (uint32)-1);
+	setSubVar(VA_CUBE_POSITIONS, newCubePosition, (uint32)_cubeSymbol);
 	
+	_cubePosition = newCubePosition;
 	_errValue = 0;
 	_counterDirection = false;
 	_counter = 0;
-
-	_newX = kSsScene2202PuzzleTilePoints[newTileIndex].x;
-	_newY = kSsScene2202PuzzleTilePoints[newTileIndex].y;
+	_newX = kSsScene2202PuzzleCubePoints[newCubePosition].x;
+	_newY = kSsScene2202PuzzleCubePoints[newCubePosition].y;
 
 	if (_x == _newX && _y == _newY)
 		return;
@@ -821,7 +833,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 	}
 
 	if (_xDelta > _yDelta) {
-		SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileX);
+		SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeX);
 		if (_xIncr > 0) {
 			if (_newX - _x >= 180)
 				_xFlagPos = _newX - 90;
@@ -835,7 +847,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 		}
 		playSound(0);
 	} else {
-		SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileY);
+		SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeY);
 		if (_yIncr > 0) {
 			if (_newY - _y >= 180)
 				_xFlagPos = _newY - 90;
@@ -852,16 +864,16 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
 	
 }
 
-void SsScene2202PuzzleTile::stopMoving() {
-	loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset);
+void SsScene2202PuzzleCube::stopMoving() {
+	loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset);
 	SetSpriteUpdate(NULL);
 	_isMoving = false;
-	sendMessage(_parentScene, 0x2002, _tileIndex);
+	sendMessage(_parentScene, 0x2002, _cubePosition);
 }
 
 Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isTileMoving(false),
-	_ssMovingTile(NULL), _ssDoneMovingTile(NULL) {
+	: Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isCubeMoving(false),
+	_ssMovingCube(NULL), _ssDoneMovingCube(NULL) {
 
 	// TODO initScene2201Vars();
 	SetMessageHandler(&Scene2202::handleMessage);
@@ -872,11 +884,11 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	addEntity(_palette);
 	insertMouse435(0x00A08089, 20, 620);
 
-	for (uint32 index = 0; index < 9; index++) {
-		int16 value = (int16)getSubVar(VA_CUBE_POSITIONS, index);
-		if (value >= 0) {
-			Sprite *puzzleTileSprite = insertSprite<SsScene2202PuzzleTile>(this, index, value);
-			_vm->_collisionMan->addSprite(puzzleTileSprite);
+	for (uint32 cubePosition = 0; cubePosition < 9; cubePosition++) {
+		int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition);
+		if (cubeSymbol >= 0) {
+			Sprite *puzzleCubeSprite = insertSprite<SsScene2202PuzzleCube>(this, cubePosition, cubeSymbol);
+			_vm->_collisionMan->addSprite(puzzleCubeSprite);
 		}
 	}
 
@@ -899,9 +911,8 @@ Scene2202::~Scene2202() {
 void Scene2202::update() {
 	Scene::update();
 
-	if (_leaveScene && !isSoundPlaying(1)) {
+	if (_leaveScene && !isSoundPlaying(1))
 		leaveScene(0);
-	}
 
 	if (_isSolved && !isSoundPlaying(0)) {
 		playSound(1);
@@ -909,19 +920,19 @@ void Scene2202::update() {
 		_leaveScene = true;
 	}
 
-	if (_ssMovingTile && !_isTileMoving) {
-		int16 freeTileIndex = getFreeTileIndex(_movingTileIndex);
-		if (freeTileIndex != -1) {
-			setSurfacePriority(_ssMovingTile->getSurface(), 700);
-			sendMessage(_ssMovingTile, 0x2001, freeTileIndex);
-			_ssMovingTile = NULL;
-			_isTileMoving = true;
+	if (_ssMovingCube && !_isCubeMoving) {
+		int16 freeCubePosition = getFreeCubePosition(_movingCubePosition);
+		if (freeCubePosition != -1) {
+			setSurfacePriority(_ssMovingCube->getSurface(), 700);
+			sendMessage(_ssMovingCube, 0x2001, freeCubePosition);
+			_ssMovingCube = NULL;
+			_isCubeMoving = true;
 		}
 	}
 
-	if (_ssDoneMovingTile) {
-		setSurfacePriority(_ssDoneMovingTile->getSurface(), _surfacePriority);
-		_ssDoneMovingTile = NULL;
+	if (_ssDoneMovingCube) {
+		setSurfacePriority(_ssDoneMovingCube->getSurface(), _surfacePriority);
+		_ssDoneMovingCube = NULL;
 		if (testIsSolved()) {
 			playSound(0);
 			setGlobalVar(V_TILE_PUZZLE_SOLVED, 1);
@@ -935,39 +946,37 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
 			leaveScene(0);
-		}
 		break;
 	case 0x2000:
-		_movingTileIndex = (int16)param.asInteger();
-		_ssMovingTile = (Sprite*)sender;
+		_movingCubePosition = (int16)param.asInteger();
+		_ssMovingCube = (Sprite*)sender;
 		break;
 	case 0x2002:
-		_isTileMoving = false;
-		_ssDoneMovingTile = (Sprite*)sender;
-		if (param.asInteger() <= 2) {
+		_isCubeMoving = false;
+		_ssDoneMovingCube = (Sprite*)sender;
+		if (param.asInteger() <= 2)
 			_surfacePriority = 100;
-		} else if (param.asInteger() >= 3 && param.asInteger() <= 5) {
+		else if (param.asInteger() >= 3 && param.asInteger() <= 5)
 			_surfacePriority = 300;
-		} else {
+		else
 			_surfacePriority = 500;
-		}
 		break;
 	}
 	return 0;
 }
 
-int16 Scene2202::getFreeTileIndex(int16 index) {
-	if (index >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 3) == -1) {
-		return index - 3;
-	} else if (index <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 3) == -1) {
-		return index + 3;
-	} else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 1) == -1) {
-		return index - 1;
-	} else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 1) == -1) {
-		return index + 1;
-	} else
+int16 Scene2202::getFreeCubePosition(int16 cubePosition) {
+	if (cubePosition >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 3) == -1)
+		return cubePosition - 3;
+	else if (cubePosition <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 3) == -1)
+		return cubePosition + 3;
+	else if (cubePosition != 0 && cubePosition != 3 && cubePosition != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 1) == -1)
+		return cubePosition - 1;
+	else if (cubePosition != 2 && cubePosition != 5 && cubePosition != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 1) == -1)
+		return cubePosition + 1;
+	else
 		return -1;
 }
 
@@ -1087,8 +1096,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x82C80334);
 	setPalette(0x82C80334);
 	insertMouse433(0x80330824);
-
 	setHitRects(0x004B8320);
+	setRectList(0x004B8420);
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 1) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 282, 432);
@@ -1097,37 +1106,35 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 1, 1100, 435, 432, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
-
 	_asLeftDoor = insertSprite<AsScene2203Door>(this, 0);
 	_asRightDoor = insertSprite<AsScene2203Door>(this, 1);
-	
 	_ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100);
 	_ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100);
-	
 	_leftDoorClipRect.set(_ssSmallLeftDoor->getDrawRect().x, 0, 640, 480);
 	_rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480);
-
 	sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor);
 	sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor);
-	
 	_vm->_collisionMan->addSprite(_asLeftDoor);
 	_vm->_collisionMan->addSprite(_asRightDoor);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2203>(200, 427);
 		setMessageList(0x004B8340);
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene2203>(640, 427);
 		setMessageList(0x004B8350);
 	} else if (which == 2) {
+		// Klaymen returning from the displayer
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
 			insertKlayman<KmScene2203>(362, 427);
 			_klayman->setDoDeltaX(1);
-		} else {
+		} else
 			insertKlayman<KmScene2203>(202, 427);
-		}
 		setMessageList(0x004B8358);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2203>(0, 427);
 		setMessageList(0x004B8348);
 	}
@@ -1140,8 +1147,6 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setClipRect(_leftDoorClipRect);
 	}
 	
-	setRectList(0x004B8420);
-
 }
 
 Scene2203::~Scene2203() {
@@ -1153,25 +1158,22 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x2001:
 		sendEntityMessage(_klayman, 0x1014, sender);
-		if (sender == _asLeftDoor) {
+		if (sender == _asLeftDoor)
 			setMessageList2(0x004B83B0);
-		} else {
+		else
 			setMessageList2(0x004B83C8);
-		}
 		break;
 	case 0x2002:
-		if (sender == _asLeftDoor) {
+		if (sender == _asLeftDoor)
 			setMessageList2(0x004B8370);
-		} else {
+		else
 			setMessageList2(0x004B8360);
-		}
 		break;
 	case 0x2003:
-		if (sender == _asLeftDoor) {
+		if (sender == _asLeftDoor)
 			_ssSmallLeftDoor->setVisible(false);
-		} else {
+		else
 			_ssSmallRightDoor->setVisible(false);
-		}
 		break;
 	case 0x4808:
 		if (sender == _asLeftDoor) {
@@ -1220,7 +1222,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2205::update);
 	
 	setHitRects(0x004B0620);
-
+	loadDataResource(0x00144822);
 	if (getGlobalVar(V_LIGHTS_ON)) {
 		_isLightOn = true;
 		setBackground(0x0008028D);
@@ -1236,41 +1238,36 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertMouse433(0xA0289D08);
 		_ssLightSwitch = insertSprite<SsCommonPressButton>(this, 0x2D339030, 0xDAC86E84, 100, 0);
 	}
-
 	_palette->addBasePalette(0xD00A028D, 0, 256, 0);
-	
 	_ssDoorFrame = insertSprite<SsScene2205DoorFrame>();
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2205>(320, 417);
 		setMessageList(0x004B0658);
-		if (!getGlobalVar(V_LIGHTS_ON)) {
+		if (!getGlobalVar(V_LIGHTS_ON))
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
-		}
 		_isKlaymanInLight = false;
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene2205>(640, 417);
 		setMessageList(0x004B0648);
-		if (!getGlobalVar(V_LIGHTS_ON)) {
+		if (!getGlobalVar(V_LIGHTS_ON))
 			_palette->addPalette(0x68033B1C, 0, 65, 0);
-		}
 		_isKlaymanInLight = false;
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2205>(0, 417);
 		setMessageList(0x004B0640);
 		_isKlaymanInLight = true;
 	}
 
 	_klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480);
-
-	loadDataResource(0x00144822);
 	_klayman->setSoundFlag(true);
-
 }
 	
 void Scene2205::update() {
 	Scene::update();
-
 	if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) {
 		_palette->addPalette(0x0008028D, 0, 256, 0);
 		changeBackground(0x0008028D);
@@ -1291,7 +1288,6 @@ void Scene2205::update() {
 		}
 		_isLightOn = false;
 	}
-
 	if (!getGlobalVar(V_LIGHTS_ON)) {
 		if (_isKlaymanInLight && _klayman->getX() > 85) {
 			_palette->addBasePalette(0x68033B1C, 0, 65, 0);
@@ -1303,20 +1299,18 @@ void Scene2205::update() {
 			_isKlaymanInLight = true;
 		}
 	}
-	
 }
 
 uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x6449569A) {
+		if (param.asInteger() == 0x6449569A)
 			setMessageList(0x004B0690);
-		} else if (param.asInteger() == 0x2841369C) {
+		else if (param.asInteger() == 0x2841369C)
 			setMessageList(0x004B0630);
-		} else if (param.asInteger() == 0x402064D8) {
+		else if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssLightSwitch);
-		}
 		break;
 	case 0x480B:
 		setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1);
@@ -1326,21 +1320,15 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 static const int16 kScene2206XPositions[] = {
-	384, 
-	480, 
-	572
+	384, 480, 572
 };
 
 static const uint32 kScene2206MessageIds1[] = {
-	0x004B8998,
-	0x004B89B8,
-	0x004B89D8
+	0x004B8998, 0x004B89B8, 0x004B89D8
 };
 
 static const uint32 kScene2206MessageIds2[] = {
-	0x004B89F8,
-	0x004B8A20,
-	0x004B8A48
+	0x004B89F8, 0x004B8A20, 0x004B8A48
 };
 
 static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = {
@@ -1371,15 +1359,15 @@ uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam &
 	switch (messageNum) {
 	case 0x4808:
 		_deltaIndex = 0;
+		playSound(0, 0x032746E0);
 		SetMessageHandler(NULL);
 		SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen);
-		playSound(0, 0x032746E0);
 		break;
 	case 0x4809:
 		_deltaIndex = 0;
+		playSound(0, 0x002642C0);
 		SetMessageHandler(NULL);
 		SetSpriteUpdate(&AsScene2206DoorSpikes::suClose);
-		playSound(0, 0x002642C0);
 		break;
 	}
 	return messageResult;
@@ -1422,9 +1410,9 @@ uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam &pa
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x4803:
+		_yDelta = 0;
 		SetMessageHandler(NULL);
 		SetSpriteUpdate(&AsScene2206Platform::suMoveDown);
-		_yDelta = 0;
 		break;
 	}
 	return messageResult;
@@ -1441,9 +1429,8 @@ SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene
 	if (getGlobalVar(V_HAS_TEST_TUBE)) {
 		setVisible(false);
 		SetMessageHandler(NULL);
-	} else {
+	} else
 		SetMessageHandler(&SsScene2206TestTube::handleMessage);
-	}
 	_collisionBoundsOffset = _drawOffset;
 	updateBounds();
 }
@@ -1499,38 +1486,37 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_asPlatform->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2());
-
 	setBackground(fileHash);
-
 	setPalette(fileHash);
 	addEntity(_palette);
-
 	_palette->addBasePalette(fileHash, 0, 256, 0);
-
-	if (!getGlobalVar(V_LIGHTS_ON)) {
+	if (!getGlobalVar(V_LIGHTS_ON))
 		_palette->addPalette(0x0263D144, 0, 65, 0);
-	}
-	
 	_vm->_collisionMan->addSprite(_ssTestTube);
 	
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2206>(200, 430);
 		setMessageList(0x004B88A8);
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene2206>(640, 430);
 		setMessageList(0x004B88B8);
 	} else if (which == 2) {
+		// Klaymen entering from the back
 		insertKlayman<KmScene2206>(205, 396);
 		setMessageList(0x004B88C8);
 		_palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0);
 		klaymanBehindSpikes();
 		playSound(0, 0x53B8284A);
 	} else if (which == 3) {
+		// Klaymen entering from reading a text column
 		insertKlayman<KmScene2206>(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430);
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B8A70);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2206>(0, 430);
 		setMessageList(0x004B88B0);
 	}
@@ -1548,11 +1534,11 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x800C6694) {
+		if (param.asInteger() == 0x800C6694)
 			readClickedColumn();
-		} else if (param.asInteger() == 0x402064D8) {
+		else if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x11C40840) {
+		else if (param.asInteger() == 0x11C40840) {
 			if (getGlobalVar(V_SPIKES_RETRACTED))
 				setMessageList(0x004B8948);
 			else
@@ -1616,26 +1602,17 @@ void Scene2206::readClickedColumn() {
 	setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7);
 	setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex"));
 	setGlobalVar(V_COLUMN_BACK_NAME, 0);
-	if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144) {
+	if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144)
 		setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]);
-	} else {
+	else
 		setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]);
-	}
 }
 
 static const uint32 kScene2207FileHashes[] = {
-	0x33B1E12E,
-	0x33D1E12E,
-	0x3311E12E,
-	0x3291E12E,
-	0x3191E12E,
-	0x3791E12E,
-	0x3B91E12E,
-	0x2391E12E,
-	0x1391E12E,
-	0x3BB1E12E,
-	0x23B1E12E,
-	0x13B1E12E
+	0x33B1E12E, 0x33D1E12E, 0x3311E12E,
+	0x3291E12E, 0x3191E12E, 0x3791E12E,
+	0x3B91E12E, 0x2391E12E, 0x1391E12E,
+	0x3BB1E12E, 0x23B1E12E, 0x13B1E12E
 };
 
 AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene)
@@ -1650,10 +1627,10 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene
 	_y = pt.y;
 	createSurface(1100, 129, 103);
 	startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0);
+	_newStickFrameIndex = 0;
 	SetUpdateHandler(&AsScene2207Elevator::update);
-	SetSpriteUpdate(&AsScene2207Elevator::suSetPosition);
 	SetMessageHandler(&AsScene2207Elevator::handleMessage);
-	_newStickFrameIndex = 0;
+	SetSpriteUpdate(&AsScene2207Elevator::suSetPosition);
 }
 
 AsScene2207Elevator::~AsScene2207Elevator() {
@@ -1667,9 +1644,9 @@ void AsScene2207Elevator::update() {
 		startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
 		_newStickFrameIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
-			if (_destPointIndexDelta != 0) {
+			if (_destPointIndexDelta != 0)
 				_destPointIndexDelta = 0;
-			} else {
+			else {
 				_vm->_soundMan->deleteSound(0xD3B02847);
 				playSound(0, 0x53B8284A);
 			}
@@ -1683,20 +1660,19 @@ void AsScene2207Elevator::update() {
 		startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex);
 		_newStickFrameIndex = _pointIndex;		
 		if (_destPointIndex + _destPointIndexDelta == _pointIndex) {
-			if (_destPointIndexDelta != 0) {
+			if (_destPointIndexDelta != 0)
 				_destPointIndexDelta = 0;
-			} else {
+			else {
 				_vm->_soundMan->deleteSound(0xD3B02847);
 				playSound(0, 0x53B8284A);
 			}
 		}
 	}
 
-	if (_pointIndex > 20 && _surface->getPriority() != 900) {
+	if (_pointIndex > 20 && _surface->getPriority() != 900)
 		sendMessage(_parentScene, 0x2002, 900);
-	} else if (_pointIndex < 20 && _surface->getPriority() != 1100) {
+	else if (_pointIndex < 20 && _surface->getPriority() != 1100)
 		sendMessage(_parentScene, 0x2002, 1100);
-	}
 	
 	AnimatedSprite::update();
 	
@@ -1738,13 +1714,12 @@ void AsScene2207Elevator::moveToY(int16 y) {
 	}	
 
 	if (_destPointIndex != _pointIndex) {
-		if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) {
+		if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1)
 			_destPointIndexDelta = 0;
-		} else if (_destPointIndex < _pointIndex) {
+		else if (_destPointIndex < _pointIndex)
 			_destPointIndexDelta = -2;
-		} else {
+		else
 			_destPointIndexDelta = 2;
-		}
 		_vm->_soundMan->addSound(0x02700413, 0xD3B02847);
 		_vm->_soundMan->playSoundLooping(0xD3B02847);
 	}
@@ -1756,14 +1731,14 @@ void AsScene2207Elevator::moveToY(int16 y) {
 AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 	
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2207Lever::handleMessage);
+	_x = x;
+	_y = y;
 	createSurface(1010, 71, 73);
 	setDoDeltaX(doDeltaX);
 	startAnimation(0x80880090, 0, -1);
 	_newStickFrameIndex = 0;
-	_x = x;
-	_y = y;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2207Lever::handleMessage);
 }
 
 uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1795,8 +1770,8 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam &param
 
 void AsScene2207Lever::stLeverDown() {
 	startAnimation(0x80880090, 1, -1);
-	FinalizeState(&AsScene2207Lever::stLeverDownEvent);
 	playSound(0, 0x40581882);
+	FinalizeState(&AsScene2207Lever::stLeverDownEvent);
 }
 
 void AsScene2207Lever::stLeverDownEvent() {
@@ -1805,9 +1780,9 @@ void AsScene2207Lever::stLeverDownEvent() {
 
 void AsScene2207Lever::stLeverUp() {
 	startAnimation(0x80880090, 6, -1);
-	FinalizeState(&AsScene2207Lever::stLeverUpEvent);
 	_playBackwards = true;
 	playSound(0, 0x40581882);
+	FinalizeState(&AsScene2207Lever::stLeverUpEvent);
 }
 
 void AsScene2207Lever::stLeverUpEvent() {
@@ -1817,16 +1792,16 @@ void AsScene2207Lever::stLeverUpEvent() {
 AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene)
 	: AnimatedSprite(vm, 1200), _idle(true) {
 	
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage);
-	createSurface1(0xCCFD6090, 100);
 	_x = 309;
 	_y = 320;
+	createSurface1(0xCCFD6090, 100);
 	startAnimation(0xCCFD6090, 0, -1);
 	_newStickFrameIndex = 0;
 	loadSound(1, 0x40330872);
 	loadSound(2, 0x72A2914A);
 	loadSound(3, 0xD4226080);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage);
 }
 
 AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() {
@@ -1847,15 +1822,14 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag
 				stopSound(2);
 				stopSound(3);
 				_vm->_soundMan->deleteSound(0x12121943);
-			} else if (param.asInteger() == 0x3A980501) {
+			} else if (param.asInteger() == 0x3A980501)
 				playSound(1);
-			} else if (param.asInteger() == 0x2A2AD498) {
+			else if (param.asInteger() == 0x2A2AD498)
 				playSound(2);
-			} else if (param.asInteger() == 0xC4980008) {
+			else if (param.asInteger() == 0xC4980008)
 				playSound(3);
-			} else if (param.asInteger() == 0x06B84228) {
+			else if (param.asInteger() == 0x06B84228)
 				playSound(0, 0xE0702146);
-			}
 		}
 		break;
 	case 0x2006:
@@ -1899,13 +1873,13 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() {
 AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1200), _idle(true) {
 	
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage);
-	createSurface1(0x8CAA0099, 100);
 	_x = 309;
 	_y = 320;
+	createSurface1(0x8CAA0099, 100);
 	startAnimation(0x8CAA0099, 0, -1);
 	_newStickFrameIndex = 0;
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage);
 }
 
 uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1952,7 +1926,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
 	updatePosition();	
 }
 
-Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
+Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
 	_vm->gameModule()->initCannonSymbolsPuzzle();
@@ -1965,66 +1939,47 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	insertKlayman<KmScene2207>(0, 0);
 	_klayman->setRepl(64, 0);
-	
 	setMessageList(0x004B38E8);
-	
 	_asElevator = insertSprite<AsScene2207Elevator>(this);
 	
 	if (getGlobalVar(V_LIGHTS_ON)) {
-
 		setBackground(0x88C00241);
 		setPalette(0x88C00241);
 		insertMouse433(0x00245884);
-	
 		_ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200);
 		_ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100);
 		_ssMaskPart3 = insertStaticSprite(0x0043B038, 1100);
-	
 		_asTape = insertSprite<AsScene1201Tape>(this, 4, 1100, 277, 428, 0x9148A011);
 		_vm->_collisionMan->addSprite(_asTape); 
-	
 		_asLever = insertSprite<AsScene2207Lever>(this, 527, 333, 0);
 		_vm->_collisionMan->addSprite(_asLever);
-		
 		_asWallRobotAnimation = insertSprite<AsScene2207WallRobotAnimation>(this);
 		_asWallCannonAnimation = insertSprite<AsScene2207WallCannonAnimation>();
-		
 		_asWallRobotAnimation->setVisible(false);
 		_asWallCannonAnimation->setVisible(false);
-
 		_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x2C4061C4, 100, 0);
-	
 		_asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480);
 		_klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2());
 		_asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2());
-	
 	} else {
-
 		setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1);
-
 		setBackground(0x05C02A55);
 		setPalette(0x05C02A55);
 		insertMouse433(0x02A51054);
-
 		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
-
 		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0);
 		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1);
 		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 2)], 2);
-
 		_asTape = NULL;
 		_asLever = NULL;
 		_asWallRobotAnimation = NULL;
 		_asWallCannonAnimation = NULL;
 		_ssButton = NULL;
-
 		_klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480);
 		_asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480);
-
 	}
 
 	_dataResource.load(0x00524846);
-
 	setRectList(0x004B38B8);
 
 	sendEntityMessage(_klayman, 0x1014, _asElevator);
@@ -2041,9 +1996,8 @@ void Scene2207::update() {
 		setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority);
 		_elevatorSurfacePriority = 0;
 	}
-	if (_klayman->getY() == 423) {
+	if (_klayman->getY() == 423)
 		_klaymanAtElevator = _klayman->getX() > 459 && _klayman->getX() < 525;
-	}
 }
 
 uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -2055,38 +2009,34 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam &param, Entit
 				sendMessage(_asElevator, 0x2000, _mouseClickPos.y);
 				sendEntityMessage(_klayman, 0x1014, _asElevator);
 				sendMessage(_klayman, 0x2001, 0);
-			} else {
+			} else
 				cancelMessageList();
-			}
 		} else if (param.asInteger() == 0x34569073) {
 			if (_klaymanAtElevator) {
 				_isKlaymanBusy = true;
 				sendMessage(_asElevator, 0x2000, 0);
 				sendEntityMessage(_klayman, 0x1014, _asElevator);
 				sendMessage(_klayman, 0x2001, 0);
-			} else {
+			} else
 				cancelMessageList();
-			}
 		} else if (param.asInteger() == 0x4054C877) {
 			if (_klaymanAtElevator) {
 				sendMessage(_asElevator, 0x2000, 480);
 				sendEntityMessage(_klayman, 0x1014, _asElevator);
 				sendMessage(_klayman, 0x2001, 0);
-			} else {
+			} else
 				cancelMessageList();
-			}
 		} else if (param.asInteger() == 0x0CBC6211) {
 			sendEntityMessage(_klayman, 0x1014, _asElevator);
 			sendMessage(_klayman, 0x2001, 0);
 			setRectList(0x004B38B8);
-		} else if (param.asInteger() == 0x402064D8) {
+		} else if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x231DA241) {
-			if (_ssButton) {
+		else if (param.asInteger() == 0x231DA241) {
+			if (_ssButton)
 				setMessageList(0x004B38F0);
-			} else {
+			else
 				setMessageList(0x004B37D8);
-			}
 		}
 		break;
 	case 0x2002:
@@ -2183,14 +2133,11 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	_background->createSurface(0, 640, 528);
 	_background->getSpriteResource().getPosition().y = 480;
 	addBackground(_background);
-	
 	setPalette(0x08100289);
-	addEntity(_palette); // Why?
-
+	addEntity(_palette);
 	insertMouse435(0x0028D089, 40, 600);
 	
 	createFontSurface();
-	
 	_backgroundSurface = new BaseSurface(_vm, 0, 640, 480);
 	spriteResource.load2(0x08100289);
 	_backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
@@ -2207,17 +2154,13 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2208::handleMessage);
 
 	_visibleRowsCount = 10;
-
 	_newRowIndex = (int16)getGlobalVar(V_CLICKED_COLUMN_ROW);
 	if (_newRowIndex + _visibleRowsCount > _maxRowIndex)
 		_newRowIndex = _maxRowIndex - _visibleRowsCount;
 	if (_newRowIndex < 6)
 		_newRowIndex = 0;
-
 	_rowScrollY = 0;
-
 	_backgroundScrollY = 48 * _newRowIndex;		
-
 	_currRowIndex = _newRowIndex;
 
 	for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++)
@@ -2253,9 +2196,8 @@ void Scene2208::update() {
 	}
 
 	if (_currRowIndex < _newRowIndex) {
-		if (_rowScrollY == 0) {
+		if (_rowScrollY == 0)
 			drawRow(_currRowIndex + _visibleRowsCount);
-		}
 		_backgroundScrollY += 4;
 		_rowScrollY += 4;
 		if (_rowScrollY == 48) {
@@ -2284,9 +2226,8 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 40 || param.asPoint().x >= 600) {
+		if (param.asPoint().x <= 40 || param.asPoint().x >= 600)
 			leaveScene(0);
-		}
 		break;
 	}
 	return messageResult;
@@ -2372,17 +2313,21 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_collisionMan->addSprite(_asTape); 
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2242>(200, 430);
 		setMessageList(0x004B3C18);
 	} else if (which == 1) {
+		// Klaymen entering from looking through the window
 		insertKlayman<KmScene2242>(530, 430);
 		setMessageList(0x004B3D60);
 	} else if (which == 2) {
+		// Klaymen returning from reading a text column
 		insertKlayman<KmScene2242>(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430);
 		setMessageList(0x004B3D48);
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2242>(0, 430);
 		setMessageList(0x004B3C20);
 	}
@@ -2414,9 +2359,8 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x800C6694) {
+		if (param.asInteger() == 0x800C6694)
 			readClickedColumn();
-		}
 		break;
 	case 0x4826:
 		if (sender == _asTape) {
@@ -2442,11 +2386,10 @@ void Scene2242::readClickedColumn() {
 		index = 1;
 	}
 	setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7);
-	if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) {
+	if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133)
 		setMessageList2(kScene2242MessageListIds1[index]);
-	} else {
+	else
 		setMessageList2(kScene2242MessageListIds2[index]);
-	}
 }
 
 static const int16 kHallOfRecordsKlaymanXPos[] = {
@@ -2464,38 +2407,42 @@ static const uint32 kHallOfRecordsSceneMessageListIds1[] = {
 	0x004B2AF8,	0x004B2B20,	0x004B2B48
 };
 
-HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id)
+HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId)
 	: Scene(vm, parentModule, true) {
 	
-	_sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id);
+	_hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId);
 
 	SetMessageHandler(&HallOfRecordsScene::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
-	if (!getGlobalVar(V_LIGHTS_ON) && _sceneInfo140->bgFilename2) {
+	if (!getGlobalVar(V_LIGHTS_ON) && _hallOfRecordsInfo->bgFilename2) {
 		setRectList(0x004B2BF8);
-		setBackground(_sceneInfo140->bgFilename2);
-		setPalette(_sceneInfo140->bgFilename2);
+		setBackground(_hallOfRecordsInfo->bgFilename2);
+		setPalette(_hallOfRecordsInfo->bgFilename2);
 		insertMouse433(0x14320138);
 	} else {
 		setRectList(0x004B2BB8);
-		setBackground(_sceneInfo140->bgFilename1);
-		setPalette(_sceneInfo140->bgFilename1);
+		setBackground(_hallOfRecordsInfo->bgFilename1);
+		setPalette(_hallOfRecordsInfo->bgFilename1);
 		insertMouse433(0x63A40028);
 	}
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmHallOfRecords>(200, 430);
 		setMessageList(0x004B2900);
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmHallOfRecords>(640, 430);
 		setMessageList(0x004B2910);
 	} else if (which == 2) {
-		insertKlayman<KmHallOfRecords>(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _sceneInfo140->xPosIndex], 430);
+		// Klaymen returning from reading a text column
+		insertKlayman<KmHallOfRecords>(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _hallOfRecordsInfo->xPosIndex], 430);
 		setMessageList(0x004B2B70);
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmHallOfRecords>(0, 430);
 		setMessageList(0x004B2908);
 	}
@@ -2513,9 +2460,8 @@ uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &par
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x800C6694) {
+		if (param.asInteger() == 0x800C6694)
 			readClickedColumn();
-		}
 		break;
 	}
 	return messageResult;
@@ -2523,22 +2469,20 @@ uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &par
 
 void HallOfRecordsScene::readClickedColumn() {
 	int16 index = (_mouseClickPos.x - 23) / 89;
-	if (index >= _sceneInfo140->count) {
+	if (index >= _hallOfRecordsInfo->count)
 		setMessageList2(0x004B2920);
-	} else {
-		setGlobalVar(V_CLICKED_COLUMN_INDEX, _sceneInfo140->xPosIndex + index);
+	else {
+		setGlobalVar(V_CLICKED_COLUMN_INDEX, _hallOfRecordsInfo->xPosIndex + index);
 		setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7);
-		setGlobalVar(V_COLUMN_TEXT_NAME, _sceneInfo140->txFilename);
-		if (index == 0 && _sceneInfo140->bgFilename3) {
-			setGlobalVar(V_COLUMN_BACK_NAME, _sceneInfo140->bgFilename3);
-		} else {
+		setGlobalVar(V_COLUMN_TEXT_NAME, _hallOfRecordsInfo->txFilename);
+		if (index == 0 && _hallOfRecordsInfo->bgFilename3)
+			setGlobalVar(V_COLUMN_BACK_NAME, _hallOfRecordsInfo->bgFilename3);
+		else
 			setGlobalVar(V_COLUMN_BACK_NAME, 0);
-		}
-		if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) {
+		if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133)
 			setMessageList2(kHallOfRecordsSceneMessageListIds1[index]);
-		} else {
+		else
 			setMessageList2(kHallOfRecordsSceneMessageListIds2[index]);
-		}
 	}
 }
 
@@ -2557,9 +2501,6 @@ static const uint32 kScene2247MessageListIds1[] = {
 Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 	
-	//DEBUG
-	setGlobalVar(V_LIGHTS_ON, 1);
-
 	SetMessageHandler(&Scene2247::handleMessage);
 	SetUpdateHandler(&Scene::update);
 
@@ -2576,17 +2517,21 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2247>(200, 430);
 		setMessageList(0x004B5428);
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene2247>(640, 430);
 		setMessageList(0x004B5438);
 	} else if (which == 2) {
+		// Klaymen returning from reading a text column
 		insertKlayman<KmScene2247>(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430);
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X))
 			_klayman->setDoDeltaX(1);
 		setMessageList(0x004B5530);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2247>(0, 430);
 		setMessageList(0x004B5430);
 	}
@@ -2603,9 +2548,8 @@ uint32 Scene2247::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x800C6694) {
+		if (param.asInteger() == 0x800C6694)
 			readClickedColumn();
-		}
 		break;
 	}
 	return messageResult;
@@ -2624,11 +2568,10 @@ void Scene2247::readClickedColumn() {
 	}
 	setGlobalVar(V_CLICKED_COLUMN_INDEX, 0);
 	setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7);
-	if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) {
+	if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133)
 		setMessageList2(kScene2247MessageListIds1[index]);
-	} else {
+	else
 		setMessageList2(kScene2247MessageListIds2[index]);
-	}
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 625990b..34be267 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -38,9 +38,10 @@ public:
 	Module2200(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2200();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
-	void createHallOfRecordsScene(int which, uint32 sceneInfo140Id);
+	void createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId);
 };
 
 // Scene2201
@@ -63,11 +64,11 @@ public:
 
 class AsScene2201Door : public AnimatedSprite {
 public:
-	AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1);
+	AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool isOpen);
 protected:
 	Klayman *_klayman;
 	Sprite *_ssDoorLight;
-	bool _doorOpen;
+	bool _isOpen;
 	int _countdown;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -95,13 +96,13 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-class SsScene2202PuzzleTile : public StaticSprite {
+class SsScene2202PuzzleCube : public StaticSprite {
 public:
-	SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value);
+	SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol);
 protected:
 	Scene *_parentScene;	
-	int16 _value;
-	int16 _tileIndex;
+	int16 _cubeSymbol;
+	int16 _cubePosition;
 	int16 _newX, _newY;
 	int16 _xDelta, _yDelta;
 	int16 _xIncr;
@@ -113,9 +114,9 @@ protected:
 	bool _isMoving;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suMoveTileX();
-	void suMoveTileY();
-	void moveTile(int16 newTileIndex);
+	void suMoveCubeX();
+	void suMoveCubeY();
+	void moveCube(int16 newCubePosition);
 	void stopMoving();
 };
 
@@ -124,16 +125,16 @@ public:
 	Scene2202(NeverhoodEngine *vm, Module *parentModule, int which);
 	~Scene2202();
 protected:
-	Sprite *_ssMovingTile;
-	Sprite *_ssDoneMovingTile;
-	bool _isTileMoving;
-	int16 _movingTileIndex;
+	Sprite *_ssMovingCube;
+	Sprite *_ssDoneMovingCube;
+	bool _isCubeMoving;
+	int16 _movingCubePosition;
 	int _surfacePriority;
 	bool _leaveScene;
 	bool _isSolved;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	int16 getFreeTileIndex(int16 index);
+	int16 getFreeCubePosition(int16 index);
 	bool testIsSolved();	
 };
 
@@ -298,7 +299,7 @@ public:
 
 class Scene2207 : public Scene {
 public:
-	Scene2207(NeverhoodEngine *vm, Module *parentModule, int which);
+	Scene2207(NeverhoodEngine *vm, Module *parentModule);
 protected:
 	Sprite *_asElevator;
 	Sprite *_ssMaskPart1;
@@ -332,7 +333,7 @@ protected:
 	int16 _rowScrollY;
 	int16 _maxRowIndex;
 	int16 _visibleRowsCount;
-	Common::Array<const char*> _strings; // TODO: Move to TextResource
+	Common::Array<const char*> _strings;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createFontSurface();
@@ -353,10 +354,10 @@ protected:
 
 class HallOfRecordsScene : public Scene {
 public:
-	HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id);
+	HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId);
 	~HallOfRecordsScene();
 protected:
-	SceneInfo140 *_sceneInfo140;
+	HallOfRecordsInfo *_hallOfRecordsInfo;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void readClickedColumn();
 };
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 147a319..1a633e2 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -125,19 +125,19 @@ void StaticData::load(const char *filename) {
 		_navigationLists[id] = navigationList;
 	}
 
-	// Load SceneInfo140 items
-	uint32 sceneInfo140ItemsCount = fd.readUint32LE();
-	debug("sceneInfo140ItemsCount: %d", sceneInfo140ItemsCount);
-	for (uint32 i = 0; i < sceneInfo140ItemsCount; i++) {
-		SceneInfo140 *sceneInfo140 = new SceneInfo140();
+	// Load HallOfRecordsInfo items
+	uint32 hallOfRecordsInfoItemsCount = fd.readUint32LE();
+	debug("hallOfRecordsInfoItemsCount: %d", hallOfRecordsInfoItemsCount);
+	for (uint32 i = 0; i < hallOfRecordsInfoItemsCount; i++) {
+		HallOfRecordsInfo *hallOfRecordsInfo = new HallOfRecordsInfo();
 		uint32 id = fd.readUint32LE();
-		sceneInfo140->bgFilename1 = fd.readUint32LE();
-		sceneInfo140->bgFilename2 = fd.readUint32LE();
-		sceneInfo140->txFilename = fd.readUint32LE();
-		sceneInfo140->bgFilename3 = fd.readUint32LE();
-		sceneInfo140->xPosIndex = fd.readByte();
-		sceneInfo140->count = fd.readByte();
-		_sceneInfo140Items[id] = sceneInfo140;
+		hallOfRecordsInfo->bgFilename1 = fd.readUint32LE();
+		hallOfRecordsInfo->bgFilename2 = fd.readUint32LE();
+		hallOfRecordsInfo->txFilename = fd.readUint32LE();
+		hallOfRecordsInfo->bgFilename3 = fd.readUint32LE();
+		hallOfRecordsInfo->xPosIndex = fd.readByte();
+		hallOfRecordsInfo->count = fd.readByte();
+		_hallOfRecordsInfoItems[id] = hallOfRecordsInfo;
 	}
 
 	// Load SceneInfo2700 items
@@ -185,10 +185,10 @@ NavigationList *StaticData::getNavigationList(uint32 id) {
 	return _navigationLists[id];
 }
 
-SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) {
-	if (!_sceneInfo140Items[id])
-		error("StaticData::getSceneInfo140Item() SceneInfo140 with id %08X not found", id);
-	return _sceneInfo140Items[id];
+HallOfRecordsInfo *StaticData::getHallOfRecordsInfoItem(uint32 id) {
+	if (!_hallOfRecordsInfoItems[id])
+		error("StaticData::getHallOfRecordsInfoItem() HallOfRecordsInfo with id %08X not found", id);
+	return _hallOfRecordsInfoItems[id];
 }
 
 SceneInfo2700 *StaticData::getSceneInfo2700(uint32 id) {
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index 2a2db55..69a407b 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -68,7 +68,7 @@ struct NavigationItem {
 
 typedef Common::Array<NavigationItem> NavigationList;
 
-struct SceneInfo140 {
+struct HallOfRecordsInfo {
 	uint32 bgFilename1;
 	uint32 bgFilename2;
 	uint32 txFilename;
@@ -100,14 +100,14 @@ public:
 	RectList *getRectList(uint32 id);
 	MessageList *getMessageList(uint32 id);
 	NavigationList *getNavigationList(uint32 id);
-	SceneInfo140 *getSceneInfo140Item(uint32 id);
+	HallOfRecordsInfo *getHallOfRecordsInfoItem(uint32 id);
 	SceneInfo2700 *getSceneInfo2700(uint32 id);
 protected:
 	Common::HashMap<uint32, HitRectList*> _hitRectLists;
 	Common::HashMap<uint32, RectList*> _rectLists;
 	Common::HashMap<uint32, MessageList*> _messageLists;
 	Common::HashMap<uint32, NavigationList*> _navigationLists;
-	Common::HashMap<uint32, SceneInfo140*> _sceneInfo140Items;
+	Common::HashMap<uint32, HallOfRecordsInfo*> _hallOfRecordsInfoItems;
 	Common::HashMap<uint32, SceneInfo2700*> _sceneInfo2700Items;
 };
 


Commit: 61e2a6f81d570c52485f610e84316ce63c9bfcba
    https://github.com/scummvm/scummvm/commit/61e2a6f81d570c52485f610e84316ce63c9bfcba
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2300 (like the ones before)

- Also fix previous modules (oops)

Changed paths:
    engines/neverhood/module1100.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2300.h



diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 6dcc5f9..cc6284b 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -66,7 +66,7 @@ void Module1100::createScene(int sceneNum, int which) {
 	static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0};
 	debug("Module1100::createScene(%d, %d)", sceneNum, which);
 	_sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	switch (_sceneNum) {
 	case 0:
 		_vm->gameState().sceneNum = 0;
 		_countdown = 65;
@@ -206,7 +206,7 @@ void Module1100::updateScene() {
 			break;
 		}
 	} else {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) {
 				_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index fbb9483..30bffb9 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -170,7 +170,7 @@ void Module1800::updateScene() {
 			break;
 		}
 	} else {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2)
 				_vm->_soundMan->setTwoSoundsPlayFlag(false);
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 9b1945a..2c43afe 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -36,9 +36,9 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList);
 	_vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150);
 
-	_flag = getGlobalVar(V_WALL_BROKEN) == 0;
+	_isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0;
 	
-	if (_flag) {
+	if (_isWallBroken) {
 		_vm->_soundMan->setSoundVolume(0x90F0D1C3, 0);
 		_vm->_soundMan->playSoundLooping(0x90F0D1C3);
 	} else {
@@ -48,19 +48,18 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0);
 	_vm->_soundMan->playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(2, 0);
-	} else if (which == 2) {
+	else if (which == 2)
 		createScene(3, 0);
-	} else if (which == 3) {
+	else if (which == 3)
 		createScene(4, -1);
-	} else if (which == 4) {
+	else if (which == 4)
 		createScene(1, 3);
-	} else {
+	else
 		createScene(0, 1);
-	}
 
 }
 
@@ -70,34 +69,39 @@ Module2300::~Module2300() {
 
 void Module2300::createScene(int sceneNum, int which) {
 	debug("Module2300::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		createNavigationScene(0x004B67B8, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		createNavigationScene(0x004B67E8, which);
-		if (_flag) {
+		if (_isWallBroken) {
 			_soundVolume = 15;
 			_vm->_soundMan->setSoundVolume(0x90F0D1C3, 15);
 		}
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		createNavigationScene(0x004B6878, which);
 		break;
 	case 3:
-		if (getGlobalVar(V_WALL_BROKEN)) {
+		_vm->gameState().sceneNum = 3;
+		if (getGlobalVar(V_WALL_BROKEN))
 			createNavigationScene(0x004B68F0, which);
-		} else {
+		else {
 			_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 			createNavigationScene(0x004B68A8, which);
-			if (_flag) {
+			if (_isWallBroken) {
 				_soundVolume = 87;
 				_vm->_soundMan->setSoundVolume(0x90F0D1C3, 87);
 			}
 		}
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x20080A0B, true, true, false);
 		break;
@@ -108,42 +112,38 @@ void Module2300::createScene(int sceneNum, int which) {
 
 void Module2300::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(1, 4);
-			} else {
+			else
 				leaveModule(0);
-			}
 			break;
 		case 1:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(0, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(2, 1);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createScene(1, 3);
-			} else if (_moduleResult == 4) {
+			else if (_moduleResult == 4)
 				createScene(3, 1);
-			} else if (_moduleResult == 5) {
+			else if (_moduleResult == 5)
 				leaveModule(3);
-			} else {
+			else
 				leaveModule(4);
-			}
 			break;
 		case 2:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				leaveModule(3);
-			} else {
+			else
 				createScene(1, 5);
-			}
 			break;
 		case 3:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				leaveModule(2);
-			} else {
+			else
 				createScene(1, 1);
-			}
 			break;
 		case 4:
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
@@ -151,9 +151,9 @@ void Module2300::updateScene() {
 			break;
 		}
 	} else {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 1:
-			if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && 
+			if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && 
 				navigationScene()->getFrameNumber() % 2) {
 				_soundVolume++;
 				_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
@@ -166,7 +166,7 @@ void Module2300::updateScene() {
 			}
 			break;
 		case 3:
-			if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) {
+			if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) {
 				_soundVolume--;
 				_vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume);
 			}
diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h
index ed39a45..64f6c6d 100644
--- a/engines/neverhood/module2300.h
+++ b/engines/neverhood/module2300.h
@@ -36,7 +36,8 @@ public:
 	Module2300(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2300();
 protected:
-	bool _flag;
+	int _sceneNum;
+	bool _isWallBroken;
 	int _soundVolume;
 	void createScene(int sceneNum, int which);
 	void updateScene();


Commit: 38df3c0d62624bd078b9b7bad7d51110053d6e01
    https://github.com/scummvm/scummvm/commit/38df3c0d62624bd078b9b7bad7d51110053d6e01
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2400 (like the ones before)

- Fix Klayman::stTurnToFront()

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 5fec376..cd6c88e 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -308,6 +308,13 @@ void GameModule::startup() {
 	//setGlobalVar(V_PROJECTOR_LOCATION, 4);
 	setGlobalVar(V_KEYDOOR_UNLOCKED, 1);
 	setGlobalVar(V_LIGHTS_ON, 1);
+	setGlobalVar(V_WATER_RUNNING, 1);
+	setGlobalVar(V_HAS_TEST_TUBE, 1);
+	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 0, 3);
+	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 1, 1);
+	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 2, 2);
+	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 3, 0);
+	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4);
 	// <<<DEBUG
 
 #if 1
@@ -318,9 +325,9 @@ void GameModule::startup() {
 	//DEBUG<<<
 	*/
 
-	_vm->gameState().which = 2;
-	_vm->gameState().sceneNum = 41;
-	createModule(2200, -1);
+	_vm->gameState().which = 0;
+	_vm->gameState().sceneNum = 0;
+	createModule(2400, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9e9f136..88a878c 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -1825,7 +1825,7 @@ void Klayman::stTurnToFront() {
 	if (!stStartAction(AnimationCallback(&Klayman::stTurnToFront))) {
 		_status2 = 0;
 		_acceptInput = false;
-		startAnimationByHash(0xCA221107, 0x8520108C, 0);
+		startAnimationByHash(0xCA221107, 0, 0x8520108C);
 		SetUpdateHandler(&Klayman::update);
 		SetMessageHandler(&Klayman::hmWalkToFront);
 		SetSpriteUpdate(&Klayman::suUpdateDestX);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index ccc47d0..3acb8b4 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -29,11 +29,10 @@ Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_vm->_soundMan->addMusic(0x202D1010, 0xB110382D);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, _vm->gameState().which);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 }
 
@@ -43,39 +42,48 @@ Module2400::~Module2400() {
 
 void Module2400::createScene(int sceneNum, int which) {
 	debug("Module2400::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_vm->_soundMan->stopMusic(0xB110382D, 0, 0);
 		_childObject = new Scene2401(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->startMusic(0xB110382D, 0, 2);
 		_childObject = new Scene2402(_vm, this, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->startMusic(0xB110382D, 0, 0);
 		_childObject = new Scene2403(_vm, this, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->stopMusic(0xB110382D, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 0);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		_vm->_soundMan->startMusic(0xB110382D, 0, 2);
 		_childObject = new Scene2406(_vm, this, which);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->_soundMan->stopMusic(0xB110382D, 0, 2);
 		createSmackerScene(0x20D80001, true, true, false);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		createStaticScene(0x81523218, 0x2321C81D);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		createStaticScene(0x08100210, 0x00214089);
 		break;
 	case 9:
+		_vm->gameState().sceneNum = 9;
 		createStaticScene(0x8C020505, 0x205018C8);
 		break;
 	}
@@ -85,7 +93,7 @@ void Module2400::createScene(int sceneNum, int which) {
 
 void Module2400::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (_moduleResult == 1)
 				createScene(1, 0);
@@ -138,42 +146,25 @@ void Module2400::updateScene() {
 }
 
 static const NPoint kScene2401Points[] = {
-	{384, 389},
-	{406, 389},
-	{429, 389},
-	{453, 389},
-	{477, 389}
+	{384, 389}, {406, 389}, {429, 389},
+	{453, 389}, {477, 389}
 };
 
 static const uint32 kScene2401FileHashes1[] = {
-	0x02842920,
-	0x02882920,
-	0x02902920,
-	0x02A02920,
-	0x02C02920,
-	0x02002920,
-	0x03802920,
-	0x00802920,
-	0x06802920,
+	0x02842920, 0x02882920, 0x02902920,
+	0x02A02920, 0x02C02920, 0x02002920,
+	0x03802920, 0x00802920, 0x06802920,
 	0x03842920
 };
 
 static const uint32 kScene2401FileHashes2[] = {
-	0xD0910020,
-	0xD0910038,
-	0xD0910008,
-	0xD0910068,
-	0xD09100A8,
-	0
+	0xD0910020, 0xD0910038, 0xD0910008,
+	0xD0910068, 0xD09100A8, 0
 };
 
 static const uint32 kScene2401FileHashes3[] = {
-	0xD0910020,
-	0xD0910038,
-	0xD0910008,
-	0xD0910068,
-	0xD09100A8,
-	0
+	0xD0910020, 0xD0910038, 0xD0910008,
+	0xD0910068, 0xD09100A8, 0
 };
 
 static const NRect kScene2401Rects[] = {
@@ -185,31 +176,25 @@ static const NRect kScene2401Rects[] = {
 };
 
 static const uint32 kAsScene2401WaterSpitFileHashes2[] = {
-	0x5C044690,
-	0x5C644690,
-	0x5CA44690,
-	0x5D244690,
-	0x5E244690
+	0x5C044690, 0x5C644690, 0x5CA44690,
+	0x5D244690, 0x5E244690
 };
 
 static const uint32 kAsScene2401WaterSpitFileHashes1[] = {
-	0xF4418408,
-	0xF4418808,
-	0xF4419008,
-	0xF441A008,
-	0xCD4F8411
+	0xF4418408, 0xF4418808, 0xF4419008,
+	0xF441A008, 0xCD4F8411
 };
 
 AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1200) {
 	
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2401WaterSpit::handleMessage);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	createSurface(100, 146, 74);
 	_x = 240;
 	_y = 447;
+	createSurface(100, 146, 74);
 	setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2401WaterSpit::handleMessage);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
 }
 
 uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -223,9 +208,9 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p
 		_x = 240;
 		_y = 447;
 		_soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger());
-		playSound(0, 0x48640244);
 		startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1);
 		setVisible(true);
+		playSound(0, 0x48640244);
 		break;
 	case 0x3002:
 		stopAnimation();
@@ -238,12 +223,12 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p
 AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm)
 	: AnimatedSprite(vm, 1200), _isWaterFlowing(false) {
 	
-	createSurface1(0x10203116, 100);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene2401FlowingWater::handleMessage);
 	_x = 88;
 	_y = 421;
+	createSurface1(0x10203116, 100);
 	setVisible(false);
+	SetUpdateHandler(&AnimatedSprite::update);
+	SetMessageHandler(&AsScene2401FlowingWater::handleMessage);
 }
 
 AsScene2401FlowingWater::~AsScene2401FlowingWater() {
@@ -254,9 +239,8 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (_isWaterFlowing && param.asInteger() == 0x02421405) {
+		if (_isWaterFlowing && param.asInteger() == 0x02421405)
 			startAnimationByHash(0x10203116, 0x01084280, 0);
-		}
 		break;
 	case 0x2002:
 		if (!_isWaterFlowing) {
@@ -282,12 +266,12 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam
 AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y)
 	: AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) {
 	
-	createSurface1(0xB8596884, 100);
-	SetUpdateHandler(&AsScene2401WaterFlushing::update);
-	SetMessageHandler(&AsScene2401WaterFlushing::handleMessage);
 	_x = x;
 	_y = y;
+	createSurface1(0xB8596884, 100);
 	setVisible(false);
+	SetUpdateHandler(&AsScene2401WaterFlushing::update);
+	SetMessageHandler(&AsScene2401WaterFlushing::handleMessage);
 }
 
 void AsScene2401WaterFlushing::update() {
@@ -325,12 +309,10 @@ uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessagePara
 AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
 	: AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) {
 	
-	createSurface1(0x44687810, 100);
 	_x = 320;
 	_y = 240;
+	createSurface1(0x44687810, 100);
 	_newStickFrameIndex = STICK_LAST_FRAME;
-	SetUpdateHandler(&AsScene2401Door::update);
-	SetMessageHandler(&AsScene2401Door::handleMessage);
 	if (_isOpen) {
 		stopAnimation();
 		setVisible(false);
@@ -339,6 +321,8 @@ AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen)
 		startAnimation(0x44687810, 0, -1);
 		_newStickFrameIndex = 0;
 	}
+	SetUpdateHandler(&AsScene2401Door::update);
+	SetMessageHandler(&AsScene2401Door::handleMessage);
 }
 
 void AsScene2401Door::update() {
@@ -384,14 +368,11 @@ void AsScene2401Door::stDoorOpenFinished() {
 }
 
 Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false),
+	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _unkFlag(false),
 	_soundToggle(false), _asWaterSpitIndex(0) {
 
 	_vm->gameModule()->initWaterPipesPuzzle();
 
-	setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water
-	setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube
-
 	SetMessageHandler(&Scene2401::handleMessage);
 	SetUpdateHandler(&Scene2401::update);
 
@@ -422,16 +403,19 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asWaterSpit[1] = insertSprite<AsScene2401WaterSpit>();
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2401>(200, 447);
 		setMessageList(0x004B2F70);
 		_asDoor = insertSprite<AsScene2401Door>(false);
 	} else if (which == 1) {
+		// Klaymen entering from the back
 		insertKlayman<KmScene2401>(280, 413);
 		setMessageList(0x004B2F80);
 		_palette->addBasePalette(0xB103B604, 0, 65, 0);
 		_palette->addPalette(0xB103B604, 0, 65, 0);
 		_asDoor = insertSprite<AsScene2401Door>(true);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2401>(-20, 447);
 		setMessageList(0x004B2F78);
 		_asDoor = insertSprite<AsScene2401Door>(false);
@@ -446,10 +430,10 @@ void Scene2401::update() {
 			_ssWaterPipes[_pipeStatus - 1]->setVisible(false);
 		if (_pipeStatus >= 10) {
 			bool puzzleSolved = true, waterInside = false;
-			for (uint i = 0; i < 5; i++) {
-				if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, i))
+			for (uint pipeIndex = 0; pipeIndex < 5; pipeIndex++) {
+				if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, pipeIndex))
 					puzzleSolved = false;
-				if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != 0)
+				if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != 0)
 					waterInside = true;
 			}
 			if (puzzleSolved) {
@@ -475,9 +459,8 @@ void Scene2401::update() {
 		_pipeStatus++;
 	}
 
-	if (_countdown2 != 0 && (--_countdown2) == 0) {
+	if (_countdown2 != 0 && (--_countdown2) == 0)
 		sendMessage(_asFlowingWater, 0x2003, 0);
-	}
 	
 	Scene::update();
 
@@ -492,33 +475,29 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 		else if (param.asInteger() == 0x02144CB1)
 			sendEntityMessage(_klayman, 0x1014, _ssFloorButton);
 		else if (param.asInteger() == 0x11C40840) {
-			if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) {
+			if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0))
 				setMessageList(0x004B3090);
-			} else {
+			else
 				setMessageList(0x004B30B0);
-			}
 		} else if (param.asInteger() == 0x412722C0) {
 			if (_countdown2 > 0 && getGlobalVar(V_HAS_TEST_TUBE)) {
 				_countdown2 = 144;
 				setMessageList(0x004B3020);
-			} else {
+			} else
 				setMessageList(0x004B3050);
-			}
 		} else if (param.asInteger() == 0x21142050) {
-			if (_flag && _countdown1 == 0 && getGlobalVar(V_NOTES_PUZZLE_SOLVED) == 0) {
+			if (_unkFlag && _countdown1 == 0 && !getGlobalVar(V_NOTES_PUZZLE_SOLVED))
 				setMessageList(0x004B2FA8);
-			} else {
+			else
 				setMessageList(0x004B2FC8);
-			}
-		} else if (param.asInteger() == 0x87441031) {
+		} else if (param.asInteger() == 0x87441031)
 			setSurfacePriority(_sprite1->getSurface(), 1100);
-		} else if (param.asInteger() == 0x80C40322) {
+		else if (param.asInteger() == 0x80C40322) {
 			setSurfacePriority(_sprite1->getSurface(), 200);
 			cancelMessageList();
-			_flag = true;
-		} else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) {
+			_unkFlag = true;
+		} else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12)
 			_countdown2 = 12;
-		}
 		break;
 	case 0x2000:
 		messageResult = 0;
@@ -558,29 +537,21 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 void Scene2401::playPipeSound(uint32 fileHash) {
-	if (_soundToggle)
-		playSound(0, fileHash);
-	else
-		playSound(1, fileHash);
+	playSound(_soundToggle ? 0 : 1, fileHash);
 	_soundToggle = !_soundToggle;
 }
 
 static const uint32 kScene2402FileHashes[] = {
-	0xD0910020,
-	0xD0910038,
-	0xD0910008,
-	0xD0910068,
-	0xD09100A8
+	0xD0910020, 0xD0910038, 0xD0910008,
+	0xD0910068, 0xD09100A8
 };
 
 AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) {
 
-	SetUpdateHandler(&AsScene2402Door::update);
-	SetMessageHandler(&AsScene2402Door::handleMessage);
-	createSurface1(0x80495831, 100);
 	_x = 320;
 	_y = 240;
+	createSurface1(0x80495831, 100);
 	if (_isOpen) {
 		startAnimation(0x80495831, -1, -1);
 		_newStickFrameIndex = STICK_LAST_FRAME;
@@ -589,6 +560,8 @@ AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool i
 		stopAnimation();
 		setVisible(false);
 	}	
+	SetUpdateHandler(&AsScene2402Door::update);
+	SetMessageHandler(&AsScene2402Door::handleMessage);
 }
 
 void AsScene2402Door::update() {
@@ -634,12 +607,11 @@ void AsScene2402Door::stDoorClosingFinished() {
 AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 	: AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) {
 
-	createSurface(100, 127, 90);
-	SetMessageHandler(&Sprite::handleMessage);
 	_x = 260;
 	_y = 210;
+	createSurface(100, 127, 90);
 	setDoDeltaX(1);
-
+	SetMessageHandler(&Sprite::handleMessage);
 	if (!getGlobalVar(V_TV_JOKE_TOLD)) {
 		loadSound(0, 0x58208810);
 		_countdown1 = 48;
@@ -656,7 +628,6 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman)
 		_countdown1 = 0;
 		SetUpdateHandler(&AsScene2402TV::upFocusKlayman);
 	}
-
 }
 
 AsScene2402TV::~AsScene2402TV() {
@@ -675,11 +646,10 @@ void AsScene2402TV::upWait() {
 void AsScene2402TV::upFocusKlayman() {
 	int16 frameIndex = CLIP<int16>((_klayman->getX() - _x + 150) / 10, 0, 29);
 	if (frameIndex != _currFrameIndex) {
-		if (frameIndex > _currFrameIndex) {
+		if (frameIndex > _currFrameIndex)
 			_currFrameIndex++;
-		} else if (frameIndex < _currFrameIndex) {
+		else if (frameIndex < _currFrameIndex)
 			_currFrameIndex--;
-		}
 		startAnimation(0x050A0103, _currFrameIndex, -1);
 		_newStickFrameIndex = _currFrameIndex;
 		if (_countdown2 == 0) {
@@ -687,9 +657,8 @@ void AsScene2402TV::upFocusKlayman() {
 			_vm->_soundMan->playSoundLooping(0xC42D4528); 
 		}
 		_countdown2 = 5;
-	} else if (_countdown2 != 0 && (--_countdown2 == 0)) {
+	} else if (_countdown2 != 0 && (--_countdown2 == 0))
 		_vm->_soundMan->deleteSound(0xC42D4528);
-	}
 	AnimatedSprite::update();
 }
 
@@ -704,9 +673,8 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x431EA0B0) {
+		if (param.asInteger() == 0x431EA0B0)
 			playSound(0);
-		}
 		break;
 	case 0x3002:
 		gotoNextState();
@@ -732,16 +700,20 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
 	
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2402>(198, 404);
 		setMessageList(0x004AF7C8);
 	} else if (which == 1) {
+		// Klaymen entering from the right
 		insertKlayman<KmScene2402>(660, 404);
 		setMessageList(0x004AF7D8);
 	} else if (which == 2) {
+		// Klaymen returning from looking through the window
 		insertKlayman<KmScene2402>(409, 404);
 		_klayman->setDoDeltaX(getGlobalVar(V_KLAYMAN_IS_DELTA_X) ? 1 : 0);
 		setMessageList(0x004AF888);
 	} else {
+		// Klaymen entering from the left
 		insertKlayman<KmScene2402>(0, 404);
 		setMessageList(0x004AF7D0);
 	}
@@ -780,9 +752,9 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entit
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x402064D8) {
+		if (param.asInteger() == 0x402064D8)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x01C66840) {
+		else if (param.asInteger() == 0x01C66840) {
 			if (sendMessage(_asDoor, 0x2000, 0))
 				setMessageList(0x004AF800);
 			else
@@ -809,10 +781,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 		
 void Scene2402::playPipeSound(uint32 fileHash) {
-	if (_soundToggle)
-		playSound(0, fileHash);
-	else
-		playSound(1, fileHash);
+	playSound(_soundToggle ? 0 : 1, fileHash);
 	_soundToggle = !_soundToggle;
 }
 
@@ -832,22 +801,26 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asLightCord->setClipRect(0, 25, 640, 480);
 	
 	if (which < 0) {
+		// Restoring game
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2403>(220, 449);
 		setMessageList(0x004B5C98);
 		setRectList(0x004B5E18);
 	} else if (which == 1) {
+		// Klaymen returning from looking through the window
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2403>(433, 449);
 		setMessageList(0x004B5D70);
 		setRectList(0x004B5E18);
 	} else if (which == 2) {
+		// Klaymen standing around after the critter video
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2403>(440, 449);
 		_klayman->setDoDeltaX(1);
 		setMessageList(0x004B5C98);
 		setRectList(0x004B5E18);
 	} else {
+		// Klaymen coming up from ladder
 		_isClimbingLadder = true;
 		insertKlayman<KmScene2403>(122, 599);
 		setMessageList(0x004B5CA0);
@@ -860,20 +833,17 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite3 = insertSprite<AsScene1002KlaymanLadderHands>(_klayman);
 	tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2());
 	_klayman->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2());	
-
 	loadSound(1, calcHash("fxFogHornSoft"));
-
 }
 
 uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
-		if (param.asInteger() == 0x040424D0) {
+		if (param.asInteger() == 0x040424D0)
 			sendEntityMessage(_klayman, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x180CE614) {
+		else if (param.asInteger() == 0x180CE614)
 			sendEntityMessage(_klayman, 0x1014, _asLightCord);
-		}
 		break;
 	case 0x2000:
 		_isClimbingLadder = true;
@@ -895,9 +865,8 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 		}
 		break;
 	case 0x480F:
-		if (sender == _asLightCord) {
+		if (sender == _asLightCord)
 			leaveScene(2);
-		}
 		break;
 	case 0x4826:
 		if (sender == _asTape && !_isClimbingLadder) {
@@ -929,7 +898,6 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011);
 	_vm->_collisionMan->addSprite(_asTape);
-
 	tempSprite2 = insertStaticSprite(0x19625293, 1100);
 	_clipRects[0].x1 = 0;
 	_clipRects[0].y1 = 0;
@@ -947,33 +915,37 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	tempSprite2 = insertStaticSprite(0x22300924, 1300);
-
 	_clipRects[1].x1 = tempSprite1->getDrawRect().x;
 	_clipRects[1].y1 = tempSprite2->getDrawRect().y;
 	_clipRects[1].x2 = 640;
 	_clipRects[1].y2 = 480;
 
 	if (which < 0) {
+		// Restoring game
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(307, 404, _clipRects, 2);
 		setMessageList(0x004B76C8);
 		setRectList(0x004B78C8);
 	} else if (which == 1) {
+		// Klaymen coming down the ladder
 		_isClimbingLadder = true;
 		insertKlayman<KmScene2406>(253, -16, _clipRects, 2);
 		setMessageList(0x004B76D8);
 		setRectList(0x004B78D8);
 	} else if (which == 2) {
+		// Klaymen returning from the diskplayer
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(480, 404, _clipRects, 2);
 		setMessageList(0x004B77C0);
 		setRectList(0x004B78C8);
 	} else if (which == 3) {
+		// Klaymen returning from looking through the window
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(387, 404, _clipRects, 2);
 		setMessageList(0x004B7810);
 		setRectList(0x004B78C8);
 	} else {
+		// Klaymen entering from the left
 		_isClimbingLadder = false;
 		insertKlayman<KmScene2406>(0, 404, _clipRects, 2);
 		setMessageList(0x004B76D0);
@@ -990,11 +962,10 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam &param, Entit
 	switch (messageNum) {
 	case 0x100D:
 		if (param.asInteger() == 0x41062804) {
-			if (getGlobalVar(V_SPIKES_RETRACTED)) {
+			if (getGlobalVar(V_SPIKES_RETRACTED))
 				setMessageList(0x004B7758);
-			} else {
+			else
 				setMessageList(0x004B7738);
-			}
 		}
 		break;
 	case 0x2000:
diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h
index 8074c58..908c9d6 100644
--- a/engines/neverhood/module2400.h
+++ b/engines/neverhood/module2400.h
@@ -44,6 +44,7 @@ public:
 	Module2400(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2400();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -100,7 +101,7 @@ protected:
 	Sprite *_asWaterFlushing[5];
 	Sprite *_asDoor;
 	bool _soundToggle;
-	bool _flag;
+	bool _unkFlag;
 	int _countdown1;
 	int _countdown2;
 	int _pipeStatus;


Commit: 28e613c68bf9d7fd12d151c9fb0f496b6c6cf0ee
    https://github.com/scummvm/scummvm/commit/28e613c68bf9d7fd12d151c9fb0f496b6c6cf0ee
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2500 (like the ones before)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index cd6c88e..e35ced3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -326,8 +326,8 @@ void GameModule::startup() {
 	*/
 
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 0;
-	createModule(2400, -1);
+	_vm->gameState().sceneNum = 3;
+	createModule(2500, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index de6e19e..3479387 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -28,30 +28,25 @@ namespace Neverhood {
 // TODO Maybe move these to the DAT
 
 static const uint32 kScene2505StaticSprites[] = {
-	0x4000A226,
-	0
+	0x4000A226, 0
 };
 
 static const NRect kScene2505ClipRect = NRect(0, 0, 564, 480);
 
 static const uint32 kScene2506StaticSprites[] = {
-	0x4027AF02,
-	0
+	0x4027AF02, 0
 };
 
 static const NRect kScene2506ClipRect = NRect(0, 0, 640, 441);
 
 static const uint32 kScene2508StaticSprites1[] = {
-	0x2F08E610,
-	0xD844E6A0,
-	0
+	0x2F08E610, 0xD844E6A0, 0
 };
 
 static const NRect kScene2508ClipRect1 = NRect(0, 0, 594, 448);
 
 static const uint32 kScene2508StaticSprites2[] = {
-	0x2F08E610,
-	0
+	0x2F08E610, 0
 };
 
 static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448);
@@ -63,11 +58,10 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->startMusic(0x05343184, 0, 0);
 	SetMessageHandler(&Module2500::handleMessage);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, _vm->gameState().which);
-	} else {
+	else
 		createScene(0, 0);
-	}
 
 	loadSound(0, 0x00880CCC);
 	loadSound(1, 0x00880CC0);
@@ -82,16 +76,19 @@ Module2500::~Module2500() {
 
 void Module2500::createScene(int sceneNum, int which) {
 	debug("Module2500::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_childObject = new Scene2501(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->gameState().which = which;
 		createScene2704(which, 0x004B01B8, 220);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->gameState().which = which;
 		if (getGlobalVar(V_WORLDS_JOINED))
 			createScene2704(which, 0x004B01E0, 150);
@@ -99,22 +96,27 @@ void Module2500::createScene(int sceneNum, int which) {
 			createScene2704(which, 0x004B0208, 150);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_childObject = new Scene2504(_vm, this, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->gameState().which = which;
 		createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect);
 		break;
 	case 5:
 		setGlobalVar(V_CAR_DELTA_X, 1);
+		_vm->gameState().sceneNum = 5;
 		_vm->gameState().which = which;
 		createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->gameState().which = which;
 		createScene2704(which, 0x004B02A0, 150);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_vm->gameState().which = which;
 		if (getGlobalVar(V_ENTRANCE_OPEN))
 			createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1);
@@ -122,9 +124,11 @@ void Module2500::createScene(int sceneNum, int which) {
 			createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_childObject = new Scene1608(_vm, this, which);
 		break;
 	case 9:
+		_vm->gameState().sceneNum = 9;
 		if (getGlobalVar(V_ENTRANCE_OPEN))
 			createStaticScene(0xC62A0645, 0xA0641C6A);
 		else
@@ -137,7 +141,7 @@ void Module2500::createScene(int sceneNum, int which) {
 
 void Module2500::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (_moduleResult == 1)
 				createScene(2, 0);
@@ -232,13 +236,13 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x99BE9015); // Don't add this to the sprite list
 	addEntity(_ssTrackShadowBackground);
-
 	_asCar = createSprite<AsCommonCar>(this, 211, 400); // Create but don't add to the sprite list yet
 	_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(211, 400);
 	_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(211, 400);
 	insertStaticSprite(0xC42AC521, 1500);
 
 	if (which < 0) {
+		// Restoring game
 		insertKlayman<KmScene2501>(162, 393);
 		_kmScene2501 = _klayman;
 		_klaymanInCar = false;
@@ -250,6 +254,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asCar->setVisible(false);
 		_currTrackIndex = 0;
 	} else if (which == 1 || which == 2) {
+		// 1: Klaymen entering riding the car on the left track
+		// 2: Klaymen entering riding the car on the bottom track
 		addSprite(_asCar);
 		_kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393);
 		_klaymanInCar = true;
@@ -261,6 +267,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarFull->setVisible(false);
 		_currTrackIndex = which;
 	} else {
+		// Klaymen entering the car
 		insertKlayman<KmScene2501>(162, 393);
 		_kmScene2501 = _klayman;
 		_klaymanInCar = false;
@@ -392,26 +399,24 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2005:
-		if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) {
+		if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0)
 			changeTrack();
-		} else if (_sceneInfos[_currTrackIndex]->which1 == 0) {
+		else if (_sceneInfos[_currTrackIndex]->which1 == 0) {
 			SetMessageHandler(&Scene2501::hmCarAtHome);
 			SetUpdateHandler(&Scene2501::upCarAtHome);
 			sendMessage(_asCar, 0x200F, 1);
-		} else if (_sceneInfos[_currTrackIndex]->which1 > 0) {
+		} else if (_sceneInfos[_currTrackIndex]->which1 > 0)
 			leaveScene(_sceneInfos[_currTrackIndex]->which1);
-		}
 		break;
 	case 0x2006:
-		if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) {
+		if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0)
 			changeTrack();
-		} else if (_sceneInfos[_currTrackIndex]->which2 == 0) {
+		else if (_sceneInfos[_currTrackIndex]->which2 == 0) {
 			SetMessageHandler(&Scene2501::hmCarAtHome);
 			SetUpdateHandler(&Scene2501::upCarAtHome);
 			sendMessage(_asCar, 0x200F, 1);
-		} else if (_sceneInfos[_currTrackIndex]->which2 > 0) {
+		} else if (_sceneInfos[_currTrackIndex]->which2 > 0)
 			leaveScene(_sceneInfos[_currTrackIndex]->which2);
-		}
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -437,11 +442,10 @@ void Scene2501::changeTrack() {
 	_currTrackIndex = _newTrackIndex;
 	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
 	_asCar->setPathPoints(_trackPoints);
-	if (_currTrackIndex == 0) {
+	if (_currTrackIndex == 0)
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
-	} else {
+	else
 		sendMessage(_asCar, 0x2002, 0);
-	}
 	sendPointMessage(_asCar, 0x2004, _clickPoint);
 	_newTrackIndex = -1;
 }
@@ -503,11 +507,10 @@ void SsScene2504Button::update() {
 		_isSoundPlaying = false;
 	}
 	if (_countdown != 0 && (--_countdown) == 0) {
-		if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) {
+		if (getSubVar(VA_LOCKS_DISABLED, 0x01180951))
 			playSound(0);
-		} else {
+		else
 			playSound(1);
-		}
 		_isSoundPlaying = true;
 	}
 }
@@ -519,11 +522,10 @@ uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam &para
 		if (_countdown == 0 && !_isSoundPlaying) {
 			setVisible(true);
 			_countdown = 2;
-			if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) {
+			if (getSubVar(VA_LOCKS_DISABLED, 0x01180951))
 				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0);
-			} else {
+			else
 				setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1);
-			}
 			playSound(2);
 		}
 		messageResult = 1;
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index 3e018f9..38a1a43 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -39,6 +39,7 @@ public:
 	Module2500(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2500();
 protected:
+	int _sceneNum;
 	int _soundIndex;
 	void createScene(int sceneNum, int which);
 	void updateScene();


Commit: 36204f573dd1903382de4c629d1e53242327ddcb
    https://github.com/scummvm/scummvm/commit/36204f573dd1903382de4c629d1e53242327ddcb
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:35-07:00

Commit Message:
NEVERHOOD: Clean up Module2600 (like the ones before)

Changed paths:
    engines/neverhood/module2600.cpp
    engines/neverhood/module2600.h



diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index d1b95be..4ddcc38 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -36,13 +36,12 @@ static const uint32 kModule2600SoundList[] = {
 Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Module(vm, parentModule) {
 	
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(4, 1);
-	} else {
+	else
 		createScene(0, 1);
-	}
 
 	_vm->_soundMan->addSoundList(0x40271018, kModule2600SoundList);
 	_vm->_soundMan->setSoundListParams(kModule2600SoundList, true, 50, 600, 5, 150);
@@ -56,67 +55,74 @@ Module2600::~Module2600() {
 
 void Module2600::createScene(int sceneNum, int which) {
 	debug("Module2600::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		createNavigationScene(0x004B8608, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		createNavigationScene(0x004B8638, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		createNavigationScene(0x004B86C8, which);
 		break;
 	case 3:
-		if (getGlobalVar(V_CREATURE_ANGRY)) {
+		_vm->gameState().sceneNum = 3;
+		if (getGlobalVar(V_CREATURE_ANGRY))
 			createNavigationScene(0x004B8758, which);
-		} else {
+		else
 			createNavigationScene(0x004B86F8, which);
-		}
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		createNavigationScene(0x004B87B8, which);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		createNavigationScene(0x004B8698, which);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_vm->_soundMan->deleteGroup(0x40271018);
 		createSmackerScene(0x30090001, true, true, false);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_childObject = new Scene2609(_vm, this, which);
 		break;
 	case 1002:
-		if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) {
+		_vm->gameState().sceneNum = 2;
+		if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1)
 			createSmackerScene(0x018C0404, true, true, false);
-		} else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) {
+		else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2)
 			createSmackerScene(0x018C0407, true, true, false);
-		} else {
+		else
 			createSmackerScene(0x818C0405, true, true, false);
-		}
-		if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) {
+		if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2)
 			setGlobalVar(V_FRUIT_COUNTING_INDEX, 0);
-		} else {
+		else
 			incGlobalVar(V_FRUIT_COUNTING_INDEX, +1);
-		}
 		break;
 	case 1003:
+		_vm->gameState().sceneNum = 3;
 		createSmackerScene(0x001C0007, true, true, false);
 		break;
 	case 1006:
-		if (getGlobalVar(V_WATER_RUNNING)) {
+		_vm->gameState().sceneNum = 6;
+		if (getGlobalVar(V_WATER_RUNNING))
 			createSmackerScene(0x049A1181, true, true, false);
-		} else {
+		else
 			createSmackerScene(0x04981181, true, true, false);
-		}
 		break;
 	case 1008:
-		if (getGlobalVar(V_WATER_RUNNING)) {
+		_vm->gameState().sceneNum = 8;
+		if (getGlobalVar(V_WATER_RUNNING))
 			createSmackerScene(0x42B80941, true, true, false);
-		} else {
+		else
 			createSmackerScene(0x42980941, true, true, false);
-		}
 		break;
 	}
 	SetUpdateHandler(&Module2600::updateScene);
@@ -125,63 +131,57 @@ void Module2600::createScene(int sceneNum, int which) {
 
 void Module2600::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createScene(1, 3);
-			} else {
+			else
 				leaveModule(0);
-			}
 			break;
 		case 1:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(6, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(0, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createScene(2, 1);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createScene(3, 0);
-			}
 			break;
 		case 2:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(1, 0);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(1002, -1);
-			}
 			break;
 		case 3:
 			if (_moduleResult == 0) {
-				if (getGlobalVar(V_CREATURE_ANGRY)) {
+				if (getGlobalVar(V_CREATURE_ANGRY))
 					createScene(4, 0);
-				} else {
+				else
 					createScene(1003, -1);
-				}
-			} else if (_moduleResult == 2) {
+			} else if (_moduleResult == 2)
 				createScene(1, 1);
-			} else if (_moduleResult == 3) {
-				if (getGlobalVar(V_CREATURE_ANGRY)) {
+			else if (_moduleResult == 3) {
+				if (getGlobalVar(V_CREATURE_ANGRY))
 					createScene(4, 0);
-				} else {
+				else {
 					setGlobalVar(V_CREATURE_ANGRY, 1);
 					createScene(7, -1);
 				}
 			}
 			break;
 		case 4:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				leaveModule(1);
-			} else {
+			else
 				createScene(3, 1);
-			}
 			break;
 		case 6:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createScene(1006, -1);
-			} else if (_moduleResult == 1) {
+			else if (_moduleResult == 1)
 				createScene(1, 2);
-			}
 			break;
 		case 7:
 			leaveModule(0);
@@ -208,6 +208,9 @@ void Module2600::updateScene() {
 SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 	: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
 	
+	SetUpdateHandler(&SsScene2609Button::update);
+	SetMessageHandler(&SsScene2609Button::handleMessage);
+
 	loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
 	if (!getGlobalVar(V_WATER_RUNNING))
 		setVisible(false);
@@ -215,8 +218,6 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
 	loadSound(1, 0x7027FD64);
 	loadSound(2, 0x44043000);
 	loadSound(3, 0x44045000);
-	SetUpdateHandler(&SsScene2609Button::update);
-	SetMessageHandler(&SsScene2609Button::handleMessage);
 }
 
 void SsScene2609Button::update() {
@@ -295,6 +296,9 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _isBusy(false) {
 	
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&Scene2609::handleMessage);
+
 	setBackground(0x51409A16);
 	setPalette(0x51409A16);
 	_asWater = insertSprite<AsScene2609Water>();
@@ -303,8 +307,6 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse435(0x09A1251C, 20, 620);
 	insertStaticSprite(0x02138002, 1200);
 	insertStaticSprite(0x825E2827, 1200);
-	SetMessageHandler(&Scene2609::handleMessage);
-	SetUpdateHandler(&Scene::update);
 }
 
 uint32 Scene2609::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h
index 107ee91..8f2f377 100644
--- a/engines/neverhood/module2600.h
+++ b/engines/neverhood/module2600.h
@@ -36,6 +36,7 @@ public:
 	Module2600(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2600();
 protected:
+	int _sceneNum;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 };


Commit: 8d5a4f736e1160463ee7bd85ed67e9b9f742509e
    https://github.com/scummvm/scummvm/commit/8d5a4f736e1160463ee7bd85ed67e9b9f742509e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:36-07:00

Commit Message:
NEVERHOOD: Add tables for new scenes in Module2700

Changed paths:
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp
index dc77d71..323066d 100644
--- a/devtools/create_neverhood/create_neverhood.cpp
+++ b/devtools/create_neverhood/create_neverhood.cpp
@@ -87,7 +87,6 @@ struct HitRect {
 	uint16 messageNum;
 	
 	void load(uint32 offset) {
-		printf("Loading HitRect @ %08X...\n", offset);
 		byte *item = getData(offset);
 		x1 = READ_LE_UINT16(item + 0);
 		y1 = READ_LE_UINT16(item + 2);
@@ -117,7 +116,6 @@ struct MessageItem {
 	MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {}
 	
 	void load(uint32 offset) {
-		printf("Loading MessageItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		messageNum = READ_LE_UINT16(item + 0);
 		messageParam = READ_LE_UINT32(item + 4);
@@ -140,7 +138,6 @@ struct SubRectItem {
 	uint32 messageListOffset;
 
 	void load(uint32 offset) {
-		printf("Loading SubRectItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		x1 = READ_LE_UINT16(item + 0);
 		y1 = READ_LE_UINT16(item + 2);
@@ -173,7 +170,6 @@ struct RectItem {
 	std::vector<SubRectItem> subRectItems;
 
 	void load(uint32 offset) {
-		printf("Loading RectItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		uint32 subItemOffset;
 		x1 = READ_LE_UINT16(item + 0);
@@ -217,7 +213,6 @@ struct NavigationItem {
 	uint32 mouseCursorFileHash;
 	
 	void load(uint32 offset) {
-		printf("Loading NavigationItem @ %08X...\n", offset);
 		byte *item = getData(offset);
 		fileHash = READ_LE_UINT32(item + 0); 
 		leftSmackerFileHash = READ_LE_UINT32(item + 4);
diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index eb210f8..1218526 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -124,6 +124,8 @@ static const uint32 rectListOffsets[] = {
 	1, 0x004B78D8,
 	// Scene2501	
 	1, 0x004B2608,
+	// Scene2732
+	1, 0x004AE360,
 	// Scene2801
 	1, 0x004B6CE0,
 	1, 0x004B6CD0,
@@ -438,6 +440,8 @@ static const uint32 messageListOffsets[] = {
 	// Scene2501
 	7, 0x004B2538,
 	6, 0x004B2570,
+	// Scene2732
+	1, 0x004AE328,
 	// Scene2801
 	1, 0x004B6BB8,
 	1, 0x004B6BC0,
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index 26a705e..e384ee1 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: c539060460b312a52ac1c0993b2d39c5f666c6fa
    https://github.com/scummvm/scummvm/commit/c539060460b312a52ac1c0993b2d39c5f666c6fa
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:36-07:00

Commit Message:
NEVERHOOD: Clean up Module2700 (like the ones before)

- Add Scene2703 and Scene2732

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e35ced3..6516485 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -326,8 +326,8 @@ void GameModule::startup() {
 	*/
 
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 3;
-	createModule(2500, -1);
+	_vm->gameState().sceneNum = 28;
+	createModule(2700, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 88a878c..782c376 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -3291,6 +3291,44 @@ void Klayman::stStartWalkingResume() {
 	FinalizeState(&Klayman::evStartWalkingDone);
 }
 
+void Klayman::upPeekInsideBlink() {
+	update();
+	++_blinkCounter;
+	if (_blinkCounter >= _blinkCounterMax)
+		stPeekInsideBlink();
+}
+
+void Klayman::stPeekInside() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 8, 37);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klayman::stPeekInsideBlink);
+}
+
+void Klayman::stPeekInsideReturn() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimation(0xAC20C012, 43, 49);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klayman::stPeekInsideBlink() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 38, 42);
+	_newStickFrameIndex = 42;
+	SetUpdateHandler(&Klayman::upPeekInsideBlink);
+	SetMessageHandler(&Klayman::hmLowLevel);
+	SetSpriteUpdate(NULL);
+	_blinkCounter = 0;
+	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+}
+
 //##############################################################################
 
 // KmScene1001
@@ -5563,6 +5601,23 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
+KmScene2732::KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+	: Klayman(vm, parentScene, x, y, 1000, 1000) {
+	// Empty
+}
+	
+uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4804:
+		GotoState(&Klayman::stPeekInside);
+		break;
+	case 0x483C:
+		GotoState(&Klayman::stPeekInsideReturn);
+		break;
+	}
+	return 0;
+}
+
 KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 1ac4519..ab2c523 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -348,6 +348,11 @@ public:
 	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
 	void evMoveVenusFlyTrapDone();
 
+	void stPeekInside();
+	void stPeekInsideReturn();
+	void stPeekInsideBlink();
+	void upPeekInsideBlink();
+
 	////////////////////////////////////////////////////////////////////////////
 
 	void stopWalking();
@@ -678,6 +683,13 @@ protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
+class KmScene2732 : public Klayman {
+public:
+	KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+protected:
+	uint32 xHandleMessage(int messageNum, const MessageParam &param);
+};
+
 class KmScene2801 : public Klayman {
 public:
 	KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 1e02e64..a625f87 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -91,12 +91,13 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		which = _vm->gameState().which;
+		// Scenes 0, 30 and 31 are "normal" scenes, whereas the other scenes are tracks.
+		// "gameState().which" indicates which track the car is at.
 		if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31)
 			which = -1;
 		createScene(_vm->gameState().sceneNum, which);
-	} else {
+	} else
 		createScene(0, 0);
-	}
 
 	loadSound(0, 0x00880CCC);
 	loadSound(1, 0x00880CC0);
@@ -111,17 +112,21 @@ Module2700::~Module2700() {
 
 void Module2700::createScene(int sceneNum, int which) {
 	debug("Module2700::createScene(%d, %d)", sceneNum, which);
-	if (sceneNum != 30 && sceneNum != 31)
-		_vm->gameState().which = which;
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
+		_vm->gameState().which = which;
 		_childObject = new Scene2701(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
+		_vm->gameState().which = which;
 		_childObject = new Scene2702(_vm, this, which);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
+		_vm->gameState().which = which;
 		if (which == 6 || which == 7)
 			createScene2703(which, 0x004B1710);
 		else if (which == 4 || which == 5)
@@ -132,41 +137,54 @@ void Module2700::createScene(int sceneNum, int which) {
 			createScene2703(which, 0x004B1788);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B17B0, 150);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B17D8, 150);
 		break;
 	case 5:
-		if (which >= 4) {
+		_vm->gameState().sceneNum = 5;
+		_vm->gameState().which = which;
+		if (which >= 4)
 			_childObject = new Scene2706(_vm, this, which);
-		} else if (which == 2 || which == 3) {
+		else if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1828, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1800, 150);
-		}
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1850, 150);
 		break;
 	case 7:
-		if (which == 2 || which == 3) {
+		_vm->gameState().sceneNum = 7;
+		_vm->gameState().which = which;
+		if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1878, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B18A0, 150);
-		}
 		break;
 	case 8:
-		if (which == 2 || which == 3) {
+		_vm->gameState().sceneNum = 8;
+		_vm->gameState().which = which;
+		if (which == 2 || which == 3)
 			createScene2704(which, 0x004B18C8, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B18F0, 150);
-		}
 		break;
 	case 9:
+		_vm->gameState().sceneNum = 9;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1918, 150, kScene2710StaticSprites, &kScene2710ClipRect);
 		break;
 	case 10:
+		_vm->gameState().sceneNum = 10;
+		_vm->gameState().which = which;
 		// TODO _vm->gameModule()->initScene2808Vars2();
 		_scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)];
 		_scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)];
@@ -177,100 +195,131 @@ void Module2700::createScene(int sceneNum, int which) {
 		createScene2704(which, 0x004B1950, 150, _scene2711StaticSprites, &kScene2711ClipRect);
 		break;
 	case 11:
+		_vm->gameState().sceneNum = 11;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B19E0, 150);
 		break;
 	case 12:
+		_vm->gameState().sceneNum = 12;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1A08, 150);
 		break;
 	case 13:
+		_vm->gameState().sceneNum = 13;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1A30, 150);
 		break;
 	case 14:
-		if (which == 4 || which == 5) {
+		_vm->gameState().sceneNum = 14;
+		_vm->gameState().which = which;
+		if (which == 4 || which == 5)
 			createScene2704(which, 0x004B1A58, 150);
-		} else if (which == 2 || which == 3) {
+		else if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1A80, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1AA8, 150);
-		}
 		break;
 	case 15:
-		if (which == 4 || which == 5) {
+		_vm->gameState().sceneNum = 15;
+		_vm->gameState().which = which;
+		if (which == 4 || which == 5)
 			createScene2704(which, 0x004B1AD0, 150);
-		} else if (which == 2 || which == 3) {
+		else if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1AF8, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1B20, 150);
-		}
 		break;
 	case 16:
-		if (which == 4 || which == 5) {
+		_vm->gameState().sceneNum = 16;
+		_vm->gameState().which = which;
+		if (which == 4 || which == 5)
 			createScene2704(which, 0x004B1B48, 150);
-		} else if (which == 2 || which == 3) {
+		else if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1B70, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1B98, 150);
-		}
 		break;
 	case 17:
-		if (which == 4 || which == 5) {
+		_vm->gameState().sceneNum = 17;
+		_vm->gameState().which = which;
+		if (which == 4 || which == 5)
 			createScene2704(which, 0x004B1BC0, 150);
-		} else if (which == 2 || which == 3) {
+		else if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1BE8, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1C10, 150);
-		}
 		break;
 	case 18:
-		if (which == 2 || which == 3) {
+		_vm->gameState().sceneNum = 18;
+		_vm->gameState().which = which;
+		if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1C38, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1C60, 150);
-		}
 		break;
 	case 19:
-		if (which == 2 || which == 3) {
+		_vm->gameState().sceneNum = 19;
+		_vm->gameState().which = which;
+		if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1CB0, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1C88, 150);
-		}
 		break;
 	case 20:
-		if (which == 2 || which == 3) {
+		_vm->gameState().sceneNum = 20;
+		_vm->gameState().which = which;
+		if (which == 2 || which == 3)
 			createScene2704(which, 0x004B1CD8, 150);
-		} else {
+		else
 			createScene2704(which, 0x004B1D00, 150);
-		}
 		break;
 	case 21:
+		_vm->gameState().sceneNum = 21;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1D28, 150);
 		break;
 	case 22:
+		_vm->gameState().sceneNum = 22;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1D50, 150);
 		break;
 	case 23:
+		_vm->gameState().sceneNum = 23;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1D78, 150, kScene2724StaticSprites, &kScene2724ClipRect);
 		break;
 	case 24:
+		_vm->gameState().sceneNum = 24;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1DB0, 150, kScene2725StaticSprites, &kScene2725ClipRect);
 		break;
 	case 25:
+		_vm->gameState().sceneNum = 25;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1DE8, 150);
 		break;
 	case 26:
+		_vm->gameState().sceneNum = 26;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1E10, 150);
 		break;
 	case 27:
+		_vm->gameState().sceneNum = 27;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1E38, 150);
 		break;
 	case 28:
+		_vm->gameState().sceneNum = 28;
+		_vm->gameState().which = which;
 		createScene2704(which, 0x004B1E60, 150);
 		break;
 	case 30:
+		_vm->gameState().sceneNum = 30;
 		createStaticScene(0x09507248, 0x0724C09D);
 		break;
 	case 31:
-//TODO		_childObject = new Scene2732(_vm, this, which);
+		_vm->gameState().sceneNum = 31;
+		_childObject = new Scene2732(_vm, this);
 		break;
 	}
 	SetUpdateHandler(&Module2700::updateScene);
@@ -282,10 +331,7 @@ void Module2700::createScene(int sceneNum, int which) {
 
 void Module2700::updateScene() {
 	if (!updateChild()) {
-	
-		debug("sceneNum = %d; _moduleResult = %d", _vm->gameState().sceneNum, _moduleResult);
-	
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			SceneLinkIf(1, 1, 0);
 			leaveModule(0);
@@ -444,15 +490,15 @@ void Module2700::updateScene() {
 			SceneLinkIf(1, 31, 0);
 			createScene(27, 1);
 			break;
-		case 29:
+		case 30:
 			createScene(13, 1);
 			break;
-		case 30:
+		case 31:
 			createScene(28, 1);
 			break;
 		}
 	} else {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 21:
 			if (!_raidoMusicInitialized) {
 				_vm->_soundMan->stopMusic(0x04020210, 0, 1);
@@ -469,10 +515,6 @@ void Module2700::updateScene() {
 	}
 }
 
-void Module2700::update() {
-
-}
-
 uint32 Module2700::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
@@ -486,8 +528,8 @@ uint32 Module2700::handleMessage(int messageNum, const MessageParam &param, Enti
 	return messageResult;
 }
 			
-void Module2700::createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites, const NRect *clipRect) {
-	// TODO
+void Module2700::createScene2703(int which, uint32 sceneInfoId) {
+	_childObject = new Scene2703(_vm, this, which, sceneInfoId);
 }
 
 void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
@@ -495,15 +537,9 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 }
 
 static const NPoint kCarShadowOffsets[] = {
-	{-63,  3},
-	{-48, 40},
-	{-33, 58},
-	{  0, 65},
-	{ 40, 53},
-	{ 56, 27},
-	{ 63,  0},
-	{-30, 26},
-	{  0, 30},
+	{-63,  3}, {-48, 40}, {-33, 58},
+	{  0, 65}, { 40, 53}, { 56, 27},
+	{ 63,  0}, {-30, 26}, {  0, 30},
 	{ 26, 25}
 };
 
@@ -588,21 +624,16 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(sceneInfo->bgFilename);
 	setPalette(sceneInfo->bgFilename);
-
 	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
-	
 	insertMouse433(0x08B08180);
 	
 	tempSprite = insertStaticSprite(0x1E086325, 1200);
-	
 	clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2());
 
 	if (sceneInfo->class437Filename) {
-
 		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
 		addEntity(_ssTrackShadowBackground);
-
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 		_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -613,10 +644,8 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
-
 	_dataResource.load(sceneInfo->dataResourceFilename);
 	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
 	_asCar->setPathPoints(_trackPoints);
@@ -670,9 +699,9 @@ uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam &param, Entity
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x >= 385) {
+		if (param.asPoint().x >= 385)
 			leaveScene(0);
-		} else {
+		else {
 			sendPointMessage(_asCar, 0x2004, param.asPoint());
 			SetMessageHandler(&Scene2701::hmRidingCar);
 		}
@@ -691,7 +720,7 @@ static const uint32 kScene2702Infos[2][3] = {
 
 
 Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _flag1(true), _newTrackIndex(-1), _count(3) {
+	: Scene(vm, parentModule, true), _isInLight(true), _newTrackIndex(-1), _count(3) {
 	
 	for (int i = 0; i < 2; i++)
 		for (int j = 0; j < 3; j++)
@@ -702,22 +731,18 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0x18808B00);
 	setPalette(0x18808B00);
-	
 	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
 	addEntity(_palette);
-	
 	insertMouse433(0x08B04180);
 
 	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x12002035);
 	addEntity(_ssTrackShadowBackground);
-	
 	_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 	_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	insertSprite<AsCommonCarConnector>(_asCar);
 	_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
-
 	_dataResource.load(0x04310014);
 	
 	if (which == 1) {
@@ -728,7 +753,7 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 		_currTrackIndex = 2;
 		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
-		_flag1 = false;
+		_isInLight = false;
 	} else if (which == 3) {
 		_currSceneInfos = _sceneInfos[0];
 		_currTrackIndex = 0;
@@ -737,13 +762,13 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 		_currTrackIndex = 2;
 		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
-		_flag1 = false;
+		_isInLight = false;
 	} else if (which == 5) {
 		_currSceneInfos = _sceneInfos[0];
 		_currTrackIndex = 1;
 		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
-		_flag1 = false;
+		_isInLight = false;
 	} else {
 		_currSceneInfos = _sceneInfos[1];
 		_currTrackIndex = 0;
@@ -766,18 +791,16 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 
 void Scene2702::update() {
 	Scene::update();
-	if (_flag1 && _asCar->getX() > 422) {
-		debug("fade #1");
+	if (_isInLight && _asCar->getX() > 422) {
 		_palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0);
 		_palette->startFadeToPalette(12);
-		_flag1 = false;
-	} else if (!_flag1 && _asCar->getX() <= 422) {
-		debug("fade #2");
+		_isInLight = false;
+	} else if (!_isInLight && _asCar->getX() <= 422) {
 		_palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65);
 		_palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0);
 		_palette->startFadeToPalette(12);
-		_flag1 = true;
+		_isInLight = true;
 	}
 }
 
@@ -831,11 +854,10 @@ void Scene2702::findClosestTrack(NPoint pt) {
 				sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
 			else
 				sendMessage(_asCar, 0x2003, 0);
-		} else if (_currTrackIndex == 2) {
+		} else if (_currTrackIndex == 2)
 			sendMessage(_asCar, 0x2003, 0);
-		} else {
+		else
 			sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
-		}
 	} else {
 		_newTrackIndex = -1;
 		sendMessage(_asCar, 0x2004, pt.x);
@@ -851,15 +873,132 @@ void Scene2702::changeTrack() {
 			sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		else
 			sendMessage(_asCar, 0x2002, 0);
-	} else if (_currTrackIndex == 2) {
+	} else if (_currTrackIndex == 2)
 		sendMessage(_asCar, 0x2002, 0);
-	} else {
+	else
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
-	}
 	sendMessage(_asCar, 0x2004, _newTrackDestX);
 	_newTrackIndex = -1;
 }
 
+Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId)
+	: Scene(vm, parentModule, true) {
+
+	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
+	
+	SetMessageHandler(&Scene2703::handleMessage);
+	SetUpdateHandler(&Scene2703::update);
+	
+	setBackground(sceneInfo->bgFilename);
+	setPalette(sceneInfo->bgFilename);
+	_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
+	_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
+	addEntity(_palette);
+	insertMouse433(sceneInfo->mouseCursorFilename);
+	
+	_palStatus = 2;
+	
+	if (sceneInfo->class437Filename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
+		addEntity(_ssTrackShadowBackground);
+		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
+		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+		_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+		_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
+	} else {
+		_ssTrackShadowBackground = NULL;
+		_asCarShadow = NULL;
+		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
+	}
+
+	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
+	_which1 = sceneInfo->which1;
+	_which2 = sceneInfo->which2;
+	_dataResource.load(sceneInfo->dataResourceFilename);
+	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
+	_asCar->setPathPoints(_trackPoints);
+	
+	if (sceneInfo->rectListName) {
+		_rectList = _dataResource.getRectArray(sceneInfo->rectListName);
+		// TODO _asCar->setPathRects(_rectList);
+	}
+
+	if (which == _which2) {
+		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
+			sendMessage(_asCar, 0x2009, 0);
+		else
+			sendMessage(_asCar, 0x2007, 150);
+	} else {
+		NPoint testPoint = (*_trackPoints)[0];
+		sendMessage(_asCar, 0x2002, 0);
+		if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480)
+			sendMessage(_asCar, 0x2009, 0);
+		else
+			sendMessage(_asCar, 0x2008, 150);
+	}
+	
+	if (which == 0) {
+		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
+		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
+		_palStatus = 1;
+	} else if (which == 2 || which == 4 || which == 6) {
+		_palette->addPalette(calcHash("paPodBlack"), 65, 31, 65);
+		_palette->addPalette(calcHash("paKlayBlack"), 0, 65, 0);
+		_palStatus = 0;
+	}
+	
+	_palette->copyBasePalette(0, 256, 0);
+	
+}
+
+void Scene2703::update() {
+	Scene::update();
+	if (_mouseClicked) {
+		sendPointMessage(_asCar, 0x2004, _mouseClickPos);
+		_mouseClicked = false;
+	}
+	if (_asCar->getX() > 469) {
+		if (_palStatus != 2) {
+			_palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65);
+			_palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0);
+			_palette->startFadeToPalette(12);
+			_palStatus = 2;
+		}
+	} else if (_asCar->getX() > 181) {
+		if (_palStatus != 1) {
+			_palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65);
+			_palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0);
+			_palette->startFadeToPalette(12);
+			_palStatus = 1;
+		}
+	} else if (_palStatus != 0) {
+		_palette->addBasePalette(calcHash("paPodBlack"), 65, 31, 65);
+		_palette->addBasePalette(calcHash("paKlayBlack"), 0, 65, 0);
+		_palette->startFadeToPalette(12);
+		_palStatus = 0;
+	}
+}
+
+uint32 Scene2703::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2005:
+		if (_which1 >= 0)
+			leaveScene(_which1);
+		break;
+	case 0x2006:
+		if (_which2 >= 0)
+			leaveScene(_which2);
+		break;
+	case 0x200D:
+		sendMessage(_parentModule, 0x200D, 0);
+		break;
+	}
+	return 0;
+}
+		
 Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
 	const uint32 *staticSprites, const NRect *clipRect)
 	: Scene(vm, parentModule, true) {
@@ -871,10 +1010,10 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	
 	setBackground(sceneInfo->bgFilename);
 	setPalette(sceneInfo->bgFilename);
-	
+
 	if (sceneInfo->exPaletteFilename1)
 		_palette->addPalette(sceneInfo->exPaletteFilename1, 0, 65, 0);
-	
+
 	if (sceneInfo->exPaletteFilename2)
 		_palette->addPalette(sceneInfo->exPaletteFilename2, 65, 31, 65);
 	
@@ -884,10 +1023,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	insertMouse433(sceneInfo->mouseCursorFilename);
 	
 	if (sceneInfo->class437Filename) {
-
 		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
 		addEntity(_ssTrackShadowBackground);
-
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 		_asCarTrackShadow = insertSprite<AsCommonCarTrackShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -899,10 +1036,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	}
 
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-	
 	_which1 = sceneInfo->which1;
 	_which2 = sceneInfo->which2;
-
 	_dataResource.load(sceneInfo->dataResourceFilename);
 	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
 	_asCar->setPathPoints(_trackPoints);
@@ -1092,4 +1227,22 @@ void Scene2706::changeTrack() {
 	_newTrackIndex = -1;
 }
 
+Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule)
+	: Scene(vm, parentModule, true) {
+	
+	Sprite *tempSprite;
+
+	setBackground(0x0220C041);
+	setPalette(0x0220C041);
+	insertMouse433(0x0C04502A);
+	setRectList(0x004AE360);
+
+	insertKlayman<KmScene2732>(108, 331);
+	setMessageList(0x004AE328);
+
+	tempSprite = insertStaticSprite(0x50C22C48, 1100);
+	_klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480);
+
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index 4973211..d17d12c 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -37,15 +37,15 @@ public:
 	Module2700(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2700();
 protected:
+	int _sceneNum;
 	int _soundIndex;
 	bool _raidoMusicInitialized;
 	uint32 _scene2711StaticSprites[6];
 	uint32 _musicFileHash;
 	void createScene(int sceneNum, int which);
 	void updateScene();
-	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
+	void createScene2703(int which, uint32 sceneInfoId);
 	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
@@ -110,7 +110,7 @@ protected:
 	int16 _newTrackDestX;
 	int _currTrackIndex, _newTrackIndex;
 	int _count;
-	bool _flag1;
+	bool _isInLight;
 	SceneInfo2700 *_sceneInfos[2][3];
 	SceneInfo2700 **_currSceneInfos;
 	NPointArray *_trackPoints;
@@ -120,6 +120,24 @@ protected:
 	void changeTrack();
 };
 
+class Scene2703 : public Scene {
+public:
+	Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId);
+protected:
+	AsCommonCar *_asCar;
+	Sprite *_ssTrackShadowBackground;
+	Sprite *_asCarShadow;
+	Sprite *_asCarConnector;
+	Sprite *_asCarTrackShadow;
+	Sprite *_asCarConnectorShadow;
+	int _palStatus;
+	int _which1, _which2;
+	NPointArray *_trackPoints;
+	NRectArray *_rectList;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class Scene2704 : public Scene {
 public:
 	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
@@ -156,6 +174,11 @@ protected:
 	void changeTrack();
 };
 
+class Scene2732 : public Scene {
+public:
+	Scene2732(NeverhoodEngine *vm, Module *parentModule);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MODULE2700_H */


Commit: 4df22cf9795eb5612865e4a977f03986c4d4aeb1
    https://github.com/scummvm/scummvm/commit/4df22cf9795eb5612865e4a977f03986c4d4aeb1
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:36-07:00

Commit Message:
NEVERHOOD: Remove track rectList code because none of the tracks has a rectList

Changed paths:
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h



diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index c14e2b3..db8eeab 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -210,7 +210,6 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	_newDeltaXType = -1;
 	_soundCounter = 0;
 	_pathPoints = NULL;
-	_rectList = NULL; // TODO Check if this is used
 	
 	startAnimation(0xD4220027, 0, -1);
 	setDoDeltaX(getGlobalVar(V_CAR_DELTA_X));
@@ -408,7 +407,6 @@ void AsCommonCar::stCarAtHome() {
 	_isIdle = false;
 	_isMoving = false;
 	_rectFlag = false;
-	_rectList = NULL;
 	NextState(&AsCommonCar::stLeanForwardIdle);
 	startAnimation(0x35698F78, 0, -1);
 	setDoDeltaX(doDeltaX ? 1 : 0);
@@ -452,27 +450,10 @@ void AsCommonCar::updateMovement() {
 		SetUpdateHandler(&AsCommonCar::update);
 		SetMessageHandler(&AsCommonCar::hmAnimation);
 		NextState(&AsCommonCar::stUpdateMoveDirection);
-	} else {
-		bool inRect = false;
-		uint index = 0;
-		if (_rectList && _rectList->size() > 0) {
-			while (index < _rectList->size()) {
-				NRect r = (*_rectList)[index];
-				if (_x >= r.x1 && _x <= r.x2 && _y >= r.y1 && _y <= r.y2)
-					break;
-			}
-			if (index < _rectList->size() && !_rectFlag)
-				inRect = true;
-			_rectFlag = index < _rectList->size();
-		}
-		if (inRect) {
-			gotoNextState();
-			stHandleRect();
-		} else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) {
-			gotoNextState();
-			_currMoveDirection = _newMoveDirection;
-			stUpdateMoveDirection();
-		}
+	} else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) {
+		gotoNextState();
+		_currMoveDirection = _newMoveDirection;
+		stUpdateMoveDirection();
 	}
 }
 
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 28aad13..2a7d547 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -50,7 +50,6 @@ public:
 protected:
 	Scene *_parentScene;
 	NPointArray *_pathPoints;
-	NRectArray *_rectList;
 	int _newMoveDirection;
 	int _currMoveDirection;
 	int _exitDirection;
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index a625f87..9a8a2f9 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -918,11 +918,6 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
 	_asCar->setPathPoints(_trackPoints);
 	
-	if (sceneInfo->rectListName) {
-		_rectList = _dataResource.getRectArray(sceneInfo->rectListName);
-		// TODO _asCar->setPathRects(_rectList);
-	}
-
 	if (which == _which2) {
 		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
@@ -1042,11 +1037,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
 	_asCar->setPathPoints(_trackPoints);
 	
-	if (sceneInfo->rectListName) {
-		_rectList = _dataResource.getRectArray(sceneInfo->rectListName);
-		// TODO _asCar->setPathRects(_rectList);
-	}
-
 	if (which == _which2) {
 		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index d17d12c..68c471c 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -133,7 +133,6 @@ protected:
 	int _palStatus;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
-	NRectArray *_rectList;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -151,7 +150,6 @@ protected:
 	Sprite *_asCarConnectorShadow;
 	int _which1, _which2;
 	NPointArray *_trackPoints;
-	NRectArray *_rectList;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: 228d9264c8e9f5e1930e8b69ce809783d303bbbc
    https://github.com/scummvm/scummvm/commit/228d9264c8e9f5e1930e8b69ce809783d303bbbc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: Start with menu widget stuff (doesn't do anything yet!)

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index fdde1a2..bec640e 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -354,4 +354,100 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
+WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule)
+	: Scene(vm, parentModule, true), _currWidget(NULL) {
+}
+
+void WidgetScene::getMousPos(NPoint &pt) {
+	pt.x = _mouseCursor->getX();
+	pt.y = _mouseCursor->getY();
+}
+
+void WidgetScene::setCurrWidget(Widget *newWidget) {
+	if (newWidget && newWidget != _currWidget) {
+		if (_currWidget)
+			_currWidget->exitWidget();
+		newWidget->enterWidget();
+		_currWidget = newWidget;
+	}
+}
+
+Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	int baseObjectPriority, int baseSurfacePriority, bool visible)
+	: StaticSprite(vm, baseObjectPriority), _itemID(itemID), _parentScene(parentScene),
+	_baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority), _visible(visible) {
+
+	SetUpdateHandler(&Widget::update);
+	SetMessageHandler(&Widget::handleMessage);
+	
+	setPosition(x, y);
+}
+
+void Widget::show() {
+	if (_surface)
+		_surface->setVisible(true);
+	_visible = true;
+}
+
+void Widget::hide() {
+	if (_surface)
+		_surface->setVisible(false);
+	_visible = false;
+}
+
+void Widget::onClick() {
+	_parentScene->setCurrWidget(this);
+	// TODO Somehow _parentScene->onClick(_itemID, 0);
+}
+
+void Widget::setPosition(int16 x, int16 y) {
+	_x = x;
+	_y = y;
+	updateBounds();
+}
+
+void Widget::refresh() {
+	_needRefresh = true;
+	StaticSprite::updatePosition();
+	_collisionBoundsOffset.set(0, 0,
+		_spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	updateBounds();
+}
+
+void Widget::addSprite() {
+	// Empty
+}
+
+int16 Widget::getWidth() {
+	return _spriteResource.getDimensions().width;
+}
+
+int16 Widget::getHeight() {
+	return _spriteResource.getDimensions().height;
+}
+
+void Widget::enterWidget() {
+	// Empty
+}
+
+void Widget::exitWidget() {
+	// Empty
+}
+
+void Widget::update() {
+	handleSpriteUpdate();
+	StaticSprite::updatePosition();
+}
+
+uint32 Widget::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1011:
+		onClick();
+		messageResult = 1;
+		break;
+	}
+	return messageResult;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 77cef44..1b6ba8a 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -79,6 +79,41 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class Widget;
+
+class WidgetScene : public Scene {
+public:
+	WidgetScene(NeverhoodEngine *vm, Module *parentModule);
+	void getMousPos(NPoint &pt);
+	virtual void setCurrWidget(Widget *newWidget);
+protected:
+	Widget *_currWidget;
+};
+
+class Widget : public StaticSprite {
+public:
+	Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+		int baseObjectPriority, int baseSurfacePriority, bool visible);
+	virtual void show();
+	virtual void hide();
+	virtual void onClick();
+	virtual void setPosition(int16 x, int16 y);
+	virtual void refresh();
+	virtual void addSprite();
+	virtual int16 getWidth();
+	virtual int16 getHeight();
+	virtual void enterWidget();
+	virtual void exitWidget();
+protected:
+	int16 _itemID;
+	WidgetScene *_parentScene;
+	int _baseObjectPriority;
+	int _baseSurfacePriority;
+	bool _visible;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MENUMODULE_H */


Commit: eecd9b8b2a2eda9641bf7bbd5bd5860123d102b4
    https://github.com/scummvm/scummvm/commit/eecd9b8b2a2eda9641bf7bbd5bd5860123d102b4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: Add TextLabelWidget (still doesn't do anything)

Changed paths:
    engines/neverhood/graphics.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 3ca3339..d6808e3 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -149,6 +149,7 @@ public:
 	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
 	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen);
 	int16 getStringWidth(const byte *string, int stringLen);
+	uint16 getCharHeight() const { return _charHeight; }
 protected:
 	uint16 _numRows;
 	byte _firstChar;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index bec640e..01fcd41 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -450,4 +450,52 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam &param, Entity *
 	return messageResult;
 }
 
+TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	int baseObjectPriority, int baseSurfacePriority, bool visible,
+	const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface)
+	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority, visible),
+	_string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _textSurface(textSurface) {
+	
+}
+
+void TextLabelWidget::addSprite() {
+	_parentScene->addSprite(this);
+	_vm->_collisionMan->addSprite(this);
+}
+
+int16 TextLabelWidget::getWidth() {
+	return _textSurface->getStringWidth(_string, _stringLen);
+}
+
+int16 TextLabelWidget::getHeight() {
+	return _textSurface->getCharHeight();
+}
+
+void TextLabelWidget::drawString(int maxStringLength) {
+	_textSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength));
+	_visible = true;
+	_collisionBoundsOffset.set(_tx, _ty, getWidth(), getHeight());
+	updateBounds();
+}
+
+void TextLabelWidget::clear() {
+	_visible = false;
+	_collisionBoundsOffset.set(0, 0, 0, 0);
+	updateBounds();
+}
+
+void TextLabelWidget::onClick() {
+	Widget::onClick();
+	// TODO Click handler?
+}
+
+void TextLabelWidget::setString(const byte *string, int stringLen) {
+	_string = string;
+	_stringLen = stringLen;
+}
+
+void TextLabelWidget::setY(int16 y) {
+	_ty = y;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 1b6ba8a..8381b4e 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -114,6 +114,28 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+class TextLabelWidget : public Widget {
+public:
+	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+		int baseObjectPriority, int baseSurfacePriority, bool visible,
+		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface);	
+	virtual void onClick();
+	virtual void addSprite();
+	virtual int16 getWidth();
+	virtual int16 getHeight();
+	void drawString(int maxStringLength);
+	void clear();
+	void setString(const byte *string, int stringLen);
+	TextSurface *getTextSurface() const { return _textSurface; }
+	void setY(int16 y);
+protected:
+	BaseSurface *_drawSurface;
+	int16 _tx, _ty;
+	TextSurface *_textSurface;
+	const byte *_string;
+	int _stringLen;
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MENUMODULE_H */


Commit: 0022c57858f5cac3544692ad134a2446c4f3be3a
    https://github.com/scummvm/scummvm/commit/0022c57858f5cac3544692ad134a2446c4f3be3a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: Add SavegameListBox

Changed paths:
    engines/neverhood/graphics.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index d6808e3..b528690 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -149,6 +149,7 @@ public:
 	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
 	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen);
 	int16 getStringWidth(const byte *string, int stringLen);
+	uint16 getCharWidth() const { return _charWidth; }
 	uint16 getCharHeight() const { return _charHeight; }
 protected:
 	uint16 _numRows;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 01fcd41..7e1198a 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -358,7 +358,7 @@ WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _currWidget(NULL) {
 }
 
-void WidgetScene::getMousPos(NPoint &pt) {
+void WidgetScene::getMousePos(NPoint &pt) {
 	pt.x = _mouseCursor->getX();
 	pt.y = _mouseCursor->getY();
 }
@@ -397,7 +397,7 @@ void Widget::hide() {
 
 void Widget::onClick() {
 	_parentScene->setCurrWidget(this);
-	// TODO Somehow _parentScene->onClick(_itemID, 0);
+	// TODO _parentScene->onClick(_itemID, 0);
 }
 
 void Widget::setPosition(int16 x, int16 y) {
@@ -406,7 +406,7 @@ void Widget::setPosition(int16 x, int16 y) {
 	updateBounds();
 }
 
-void Widget::refresh() {
+void Widget::refreshPosition() {
 	_needRefresh = true;
 	StaticSprite::updatePosition();
 	_collisionBoundsOffset.set(0, 0,
@@ -494,8 +494,117 @@ void TextLabelWidget::setString(const byte *string, int stringLen) {
 	_stringLen = stringLen;
 }
 
-void TextLabelWidget::setY(int16 y) {
-	_ty = y;
+void TextLabelWidget::setTY(int16 ty) {
+	_ty = ty;
+}
+
+SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	int baseObjectPriority, int baseSurfacePriority, bool visible,
+	StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect)
+	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority, visible),
+	_savegameList(savegameList), _textSurface1(textSurface1), _textSurface2(textSurface2), _fileHash1(fileHash1), _rect(rect),
+	_maxStringLength(0), _topIndex(0), _visibleItemsCount(0), _currIndex(0) {
+
+	_maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface1->getCharHeight();
+	_maxStringLength = (_rect.x2 - _rect.x1) / _textSurface1->getCharWidth();
+}
+
+void SavegameListBox::onClick() {
+	NPoint mousePos;
+	int16 w = _rect.x2 - _rect.x1, h = _rect.y2 - _rect.y1;
+	_parentScene->getMousePos(mousePos);
+	mousePos.x -= _x + _rect.x1;
+	mousePos.y -= _y + _rect.y1;
+	if (mousePos.x >= 0 && mousePos.x <= w && mousePos.y >= 0 && mousePos.y <= h) {
+		int newIndex = _topIndex + mousePos.y / _textSurface1->getCharHeight();
+		if (newIndex <= _visibleItemsCount) {
+			_currIndex = newIndex;
+			refresh();
+			_parentScene->setCurrWidget(this);
+			// TODO _parentScene->onClick(_itemID, 5);
+		}
+	}
+}
+
+void SavegameListBox::addSprite() {
+	_spriteResource.load2(_fileHash1);
+	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	refreshPosition();
+	_parentScene->addSprite(this);
+	_vm->_collisionMan->addSprite(this);
+	if (_visible)
+		show();
+	else
+		hide();
+	buildItems();
+	_topIndex = 0;
+	_visibleItemsCount = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size());
+	refresh();
+}
+
+void SavegameListBox::buildItems() {
+	StringArray &savegameList = *_savegameList;
+	int16 itemX = _rect.x1, itemY = 0;
+	for (uint i = 0; i < savegameList.size(); ++i) {
+		const byte *string = (const byte*)savegameList[i].c_str();
+		int stringLen = (int)savegameList[i].size();
+		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
+			_baseSurfacePriority + 1, _visible, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface1);
+		label->addSprite();
+		_textLabelItems.push_back(label);
+	}
+}
+
+void SavegameListBox::drawItems() {
+	for (int i = 0; i < (int)_textLabelItems.size(); ++i) {
+		TextLabelWidget *label = _textLabelItems[i];		
+		if (i >= _topIndex && i <= _visibleItemsCount) {
+			label->setY(_rect.y1 + (i - _topIndex) * _textSurface1->getCharHeight());
+			label->updateBounds();
+			label->drawString(_maxStringLength);
+		} else {
+			label->clear();
+		}
+	}
+}
+
+void SavegameListBox::refresh() {
+	refreshPosition();
+	drawItems();
+}
+
+void SavegameListBox::scrollUp() {
+	if (_topIndex > 0) {
+		--_topIndex;
+		--_visibleItemsCount;
+		refresh();
+	}
+}
+
+void SavegameListBox::scrollDown() {
+	if (_visibleItemsCount < (int)_textLabelItems.size()) {
+		++_topIndex;
+		++_visibleItemsCount;
+		refresh();
+	}
+}
+
+void SavegameListBox::pageUp() {
+	int distance = MIN(_topIndex, _maxVisibleItemsCount);
+	if (distance > 0) {
+		_topIndex -= distance;
+		_visibleItemsCount = distance;
+		refresh();
+	}
+}
+
+void SavegameListBox::pageDown() {
+	int distance = MIN((int)_textLabelItems.size() - _visibleItemsCount - 1, _maxVisibleItemsCount);
+	if (distance > 0) {
+		_topIndex += distance;
+		_visibleItemsCount += distance;
+		refresh();
+	}
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 8381b4e..1d7678d 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -79,12 +79,14 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
+typedef Common::Array<Common::String> StringArray;
+
 class Widget;
 
 class WidgetScene : public Scene {
 public:
 	WidgetScene(NeverhoodEngine *vm, Module *parentModule);
-	void getMousPos(NPoint &pt);
+	void getMousePos(NPoint &pt);
 	virtual void setCurrWidget(Widget *newWidget);
 protected:
 	Widget *_currWidget;
@@ -98,7 +100,7 @@ public:
 	virtual void hide();
 	virtual void onClick();
 	virtual void setPosition(int16 x, int16 y);
-	virtual void refresh();
+	virtual void refreshPosition();
 	virtual void addSprite();
 	virtual int16 getWidth();
 	virtual int16 getHeight();
@@ -127,7 +129,7 @@ public:
 	void clear();
 	void setString(const byte *string, int stringLen);
 	TextSurface *getTextSurface() const { return _textSurface; }
-	void setY(int16 y);
+	void setTY(int16 ty);
 protected:
 	BaseSurface *_drawSurface;
 	int16 _tx, _ty;
@@ -136,6 +138,34 @@ protected:
 	int _stringLen;
 };
 
+class SavegameListBox : public Widget {
+public:
+	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+		int baseObjectPriority, int baseSurfacePriority, bool visible,
+		StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect);
+	virtual void onClick();
+	virtual void addSprite();
+	void buildItems();
+	void drawItems();
+	void refresh();
+	void scrollUp();
+	void scrollDown();
+	void pageUp();
+	void pageDown();
+protected:
+	NRect _rect;
+	uint32 _fileHash1;
+	int _maxStringLength;
+	Common::Array<TextLabelWidget*> _textLabelItems;
+	int _topIndex;
+	int _visibleItemsCount;
+	StringArray *_savegameList;
+	TextSurface *_textSurface1;
+	TextSurface *_textSurface2;
+	int _currIndex;
+	int _maxVisibleItemsCount;
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MENUMODULE_H */


Commit: 6be5c1171332764dacad9113250ede7e765bb361
    https://github.com/scummvm/scummvm/commit/6be5c1171332764dacad9113250ede7e765bb361
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: More work on the menu system:

- Add handling of ascii and system key input
- Fix TextSurface::drawChar()
- Pause audio when entering the menu, resume it again afterwards
- Add TextEditWidget
- Add SaveGameMenu (doesn't actually save anything yet and needs more work)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/graphics.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6516485..ce72a22 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -123,13 +123,6 @@ void GameModule::handleMouseUp(int16 x, int16 y) {
 	}				
 }
 
-void GameModule::handleEscapeKey() {
-	if (!_prevChildObject /* && _canRequestMainMenu TODO?*/)
-		_mainMenuRequested = true;
-	else
-		sendMessage(_childObject, 0x000C, 0);
-}
-
 void GameModule::handleSpaceKey() {
 	if (_childObject) {
 		debug(2, "GameModule::handleSpaceKey()");
@@ -137,6 +130,31 @@ void GameModule::handleSpaceKey() {
 	}				
 }
 
+void GameModule::handleAsciiKey(char key) {
+	if (_childObject) {
+		debug(2, "GameModule::handleAsciiKey()");
+		sendMessage(_childObject, 0x000A, (uint32)key);
+	}				
+}
+
+void GameModule::handleKeyDown(Common::KeyCode keyCode) {
+	if (_childObject) {
+		if (keyCode == Common::KEYCODE_ESCAPE)
+			handleEscapeKey();
+		else if (keyCode == Common::KEYCODE_SPACE)
+			handleSpaceKey();
+		debug(2, "GameModule::handleKeyDown()");
+		sendMessage(_childObject, 0x000B, keyCode);
+	}				
+}
+
+void GameModule::handleEscapeKey() {
+	if (!_prevChildObject /* && _canRequestMainMenu TODO?*/)
+		_mainMenuRequested = true;
+	else if (_childObject)
+		sendMessage(_childObject, 0x000C, 0);
+}
+
 void GameModule::initKeySlotsPuzzle() {
 	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) {
 		NonRepeatingRandomNumbers keySlots(_vm->_rnd, 16);
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 8fafe2b..81ebfb8 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -37,8 +37,10 @@ public:
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
 	void handleMouseUp(int16 x, int16 y);
-	void handleEscapeKey();
 	void handleSpaceKey();
+	void handleAsciiKey(char key);
+	void handleKeyDown(Common::KeyCode keyCode);
+	void handleEscapeKey();
 	void initKeySlotsPuzzle();
 	void initMemoryPuzzle();
 	void initWaterPipesPuzzle();
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index b87c447..81cec9f 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -180,7 +180,7 @@ TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, u
 		: BaseSurface(vm, 0, charWidth * charCount, charHeight * numRows),
 		_numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight),
 		_fileHash(fileHash), _charCount(charCount) {
-		
+
 		SpriteResource spriteResource(_vm);
 		spriteResource.load2(_fileHash);
 		drawSpriteResourceEx(spriteResource, false, false, 0, 0);
@@ -189,8 +189,8 @@ TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, u
 void TextSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) {
 	NDrawRect sourceRect;
 	chr -= _firstChar;
-	sourceRect.x = (chr % 16) * _charWidth;
-	sourceRect.y = (chr / 16) * _charHeight;
+	sourceRect.x = (chr % _charCount) * _charWidth;
+	sourceRect.y = (chr / _charCount) * _charHeight;
 	sourceRect.width = _charWidth;
 	sourceRect.height = _charHeight;
 	destSurface->copyFrom(_surface, x, y, sourceRect, true);
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 7e1198a..6a82c47 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -27,7 +27,8 @@ namespace Neverhood {
 enum {
 	MAIN_MENU		= 0,
 	CREDITS_SCENE	= 1,
-	MAKING_OF		= 2
+	MAKING_OF		= 2,
+	SAVE_GAME_MENU	= 3
 };
 
 static const uint32 kMakingOfSmackerFileHashList[] = {
@@ -48,22 +49,18 @@ static const uint32 kMakingOfSmackerFileHashList[] = {
 };
 
 MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
+	: Module(vm, parentModule), _savegameList(NULL) {
 	
 	SetMessageHandler(&MenuModule::handleMessage);
 	
-	// TODO Check if the background actually needs to be saved
-	_savedBackground = new Background(_vm, 0);
-	_savedBackground->createSurface(0, 640, 480);
-	// TODO Save current palette
-	// TODO Stop all sounds and music
-
 	_savedPaletteData = _vm->_screen->getPaletteData();
+	_vm->_mixer->pauseAll(true);
 
 	createScene(MAIN_MENU, -1);
 }
 
 MenuModule::~MenuModule() {
+	_vm->_mixer->pauseAll(false);
 	_vm->_screen->setPaletteData(_savedPaletteData);
 }
 
@@ -79,6 +76,9 @@ void MenuModule::createScene(int sceneNum, int which) {
 	case MAKING_OF:
 		createSmackerScene(kMakingOfSmackerFileHashList, false, true, true);
 		break;
+	case SAVE_GAME_MENU:
+		createSaveGameMenu();
+		break;
 	}
 	SetUpdateHandler(&MenuModule::updateScene);
 	_childObject->handleUpdate();
@@ -100,7 +100,7 @@ void MenuModule::updateScene() {
 				break;
 			case 2:
 				debug("SAVE GAME");
-				// TODO createSaveGameMenu();
+				createScene(SAVE_GAME_MENU, -1);
 				break;
 			case 3:
 				debug("RESUME GAME");
@@ -137,6 +137,9 @@ void MenuModule::updateScene() {
 		case MAKING_OF:
 			createScene(MAIN_MENU, -1);
 			break;
+		case SAVE_GAME_MENU:
+			handleSaveGameMenuAction(_moduleResult);
+			break;
 		default:
 			break;
 		}
@@ -148,60 +151,38 @@ uint32 MenuModule::handleMessage(int messageNum, const MessageParam &param, Enti
 	return Module::handleMessage(messageNum, param, sender);;
 }
 
-static const uint32 kMainMenuButtonFileHashes[] = {
-	0x36C62120,
-	0x56C62120,
-	0x96C62120,
-	0x16C62121,
-	0x16C62122,
-	0x16C62124,
-	0x16C62128,
-	0x16C62130,
-	0x16C62100
-};
+void MenuModule::createSaveGameMenu() {
+	// TODO Load actual savegames list :)
+	_savegameList = new StringArray();
+	_savegameList->push_back(Common::String("Annoying scene"));
+	_savegameList->push_back(Common::String("Stuff happens"));
+	for (uint i = 0; i < 33; ++i)
+		_savegameList->push_back(Common::String::format("Game %d", i));
+	_childObject = new SaveGameMenu(_vm, this, _savegameList);
+}
 
-MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex)
-	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) {
+void MenuModule::handleSaveGameMenuAction(int action) {
+	if (action != 0) {
+		createScene(MAIN_MENU, -1);
+	} else {
+		// TODO Actual saving later 0048A62E
+		createScene(MAIN_MENU, -1);
+	}
+	delete _savegameList;
+	_savegameList = NULL;
+}
 
-	loadSprite(kMainMenuButtonFileHashes[_buttonIndex], kSLFDefDrawOffset | kSLFDefPosition, 100);
+MenuButton::MenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex, uint32 fileHash, const NRect &collisionBounds)
+	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) {
 
-	// TODO Move to const array
-	switch (_buttonIndex) {
-	case 0:
-		_collisionBounds.set(52, 121, 110, 156);
-		break;
-	case 1:
-		_collisionBounds.set(52, 192, 109, 222);
-		break;
-	case 2:
-		_collisionBounds.set(60, 257, 119, 286);
-		break;
-	case 3:
-		_collisionBounds.set(67, 326, 120, 354);
-		break;
-	case 4:
-		_collisionBounds.set(70, 389, 128, 416);
-		break;
-	case 5:
-		_collisionBounds.set(523, 113, 580, 144);
-		break;
-	case 6:
-		_collisionBounds.set(525, 176, 577, 206);
-		break;
-	case 7:
-		_collisionBounds.set(527, 384, 580, 412);
-		break;
-	case 8:
-		_collisionBounds.set(522, 255, 580, 289);
-		break;
-	}
-	
+	loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 100);
+	_collisionBounds = collisionBounds;
 	setVisible(false);
-	SetUpdateHandler(&MainMenuButton::update);
-	SetMessageHandler(&MainMenuButton::handleMessage);
+	SetUpdateHandler(&MenuButton::update);
+	SetMessageHandler(&MenuButton::handleMessage);
 }
 
-void MainMenuButton::update() {
+void MenuButton::update() {
 	updatePosition();
 	if (_countdown != 0 && (--_countdown) == 0) {
 		setVisible(false);
@@ -209,7 +190,7 @@ void MainMenuButton::update() {
 	}
 }
 
-uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 MenuButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x1011:
@@ -226,6 +207,30 @@ uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam &param,
 MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true) {
 	
+	static const uint32 kMenuButtonFileHashes[] = {
+		0x36C62120,
+		0x56C62120,
+		0x96C62120,
+		0x16C62121,
+		0x16C62122,
+		0x16C62124,
+		0x16C62128,
+		0x16C62130,
+		0x16C62100
+	};
+	
+	static const NRect kMenuButtonCollisionBounds[] = {
+		NRect(52, 121, 110, 156),
+		NRect(52, 192, 109, 222),
+		NRect(60, 257, 119, 286),
+		NRect(67, 326, 120, 354),
+		NRect(70, 389, 128, 416),
+		NRect(523, 113, 580, 144),
+		NRect(525, 176, 577, 206),
+		NRect(527, 384, 580, 412),
+		NRect(522, 255, 580, 289)
+	};
+	
 	setBackground(0x08C0020C);
 	setPalette(0x08C0020C);
 	insertMouse433(0x00208084);
@@ -233,12 +238,13 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
 	insertStaticSprite(0x41137051, 100);
 	insertStaticSprite(0xC10B2015, 100);
 	
-	// TODO Only is music is disabled
+	// TODO Only if music is enabled
 	_musicOnButton = insertStaticSprite(0x0C24C0EE, 100);
 
 	for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) {
-		Sprite *mainMenuButton = insertSprite<MainMenuButton>(this, buttonIndex);
-		_vm->_collisionMan->addSprite(mainMenuButton);
+		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
+			kMenuButtonFileHashes[buttonIndex], kMenuButtonCollisionBounds[buttonIndex]);
+		_vm->_collisionMan->addSprite(menuButton);
 	}
 	
 	SetUpdateHandler(&Scene::update);	
@@ -341,7 +347,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, En
 		leaveScene(0);
 		break;
 	case 0x000B://TODO Implement this message
-		if (param.asInteger() == 27 && _canAbort)
+		if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort)
 			leaveScene(0);
 		break;
 	case 0x101D:
@@ -358,9 +364,11 @@ WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _currWidget(NULL) {
 }
 
-void WidgetScene::getMousePos(NPoint &pt) {
+NPoint WidgetScene::getMousePos() {
+	NPoint pt;
 	pt.x = _mouseCursor->getX();
 	pt.y = _mouseCursor->getY();
+	return pt;
 }
 
 void WidgetScene::setCurrWidget(Widget *newWidget) {
@@ -372,10 +380,13 @@ void WidgetScene::setCurrWidget(Widget *newWidget) {
 	}
 }
 
+void WidgetScene::handleEvent(int16 itemID, int eventType) {
+}
+
 Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority, bool visible)
+	int baseObjectPriority, int baseSurfacePriority)
 	: StaticSprite(vm, baseObjectPriority), _itemID(itemID), _parentScene(parentScene),
-	_baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority), _visible(visible) {
+	_baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority) {
 
 	SetUpdateHandler(&Widget::update);
 	SetMessageHandler(&Widget::handleMessage);
@@ -383,18 +394,6 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene
 	setPosition(x, y);
 }
 
-void Widget::show() {
-	if (_surface)
-		_surface->setVisible(true);
-	_visible = true;
-}
-
-void Widget::hide() {
-	if (_surface)
-		_surface->setVisible(false);
-	_visible = false;
-}
-
 void Widget::onClick() {
 	_parentScene->setCurrWidget(this);
 	// TODO _parentScene->onClick(_itemID, 0);
@@ -451,9 +450,9 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam &param, Entity *
 }
 
 TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority, bool visible,
+	int baseObjectPriority, int baseSurfacePriority,
 	const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface)
-	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority, visible),
+	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
 	_string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _textSurface(textSurface) {
 	
 }
@@ -473,13 +472,11 @@ int16 TextLabelWidget::getHeight() {
 
 void TextLabelWidget::drawString(int maxStringLength) {
 	_textSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength));
-	_visible = true;
 	_collisionBoundsOffset.set(_tx, _ty, getWidth(), getHeight());
 	updateBounds();
 }
 
 void TextLabelWidget::clear() {
-	_visible = false;
 	_collisionBoundsOffset.set(0, 0, 0, 0);
 	updateBounds();
 }
@@ -498,47 +495,215 @@ void TextLabelWidget::setTY(int16 ty) {
 	_ty = ty;
 }
 
+TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	int baseObjectPriority, int baseSurfacePriority,
+	const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect)
+	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
+	_maxStringLength(maxStringLength), _textSurface(textSurface), _fileHash(fileHash), _rect(rect),
+	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0) {
+
+	_entryString = (const char*)string;
+	_maxVisibleChars = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth();
+	_cursorPos = _entryString.size();
+	
+	SetUpdateHandler(&TextEditWidget::update);
+	SetMessageHandler(&TextEditWidget::handleMessage);
+}
+
+TextEditWidget::~TextEditWidget() {
+	delete _cursorSurface;
+}
+
+void TextEditWidget::onClick() {
+	NPoint mousePos = _parentScene->getMousePos();
+	mousePos.x -= _x + _rect.x1;
+	mousePos.y -= _y + _rect.y1;
+	if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 &&
+		mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) {
+		if (_entryString.size() == 1)
+			_cursorPos = 0;
+		else {
+			int newCursorPos = mousePos.x / _textSurface->getCharWidth();
+			if (mousePos.x % _textSurface->getCharWidth() > _textSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//###
+				++newCursorPos;
+			_cursorPos = MIN((int)_entryString.size(), newCursorPos);
+		}
+		_cursorSurface->setVisible(true);
+		refresh();
+	}
+	Widget::onClick();
+}
+
+void TextEditWidget::addSprite() {
+	SpriteResource cursorSpriteResource(_vm);
+
+	_spriteResource.load2(_fileHash);
+	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+	refreshPosition();
+	_parentScene->addSprite(this);
+	_vm->_collisionMan->addSprite(this);
+	_surface->setVisible(true);
+	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2,
+		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
+		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _textSurface);
+	_textLabelWidget->addSprite();
+	cursorSpriteResource.load2(_cursorFileHash);
+	_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
+	_cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
+	_cursorSurface->setVisible(true);
+	refresh();
+}
+
+void TextEditWidget::enterWidget() {
+	_cursorSurface->setVisible(true);
+	refresh();
+}
+
+void TextEditWidget::exitWidget() {
+	_cursorSurface->setVisible(false);
+	refresh();
+}
+
+void TextEditWidget::setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight) {
+	_cursorFileHash = cursorFileHash;
+	_cursorWidth = cursorWidth;
+	_cursorHeight = cursorHeight;
+}
+
+void TextEditWidget::drawCursor() {
+	if (_cursorSurface->getVisible() && _cursorPos >= 0 && _cursorPos <= _maxVisibleChars) {
+		NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight);
+		_surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _textSurface->getCharWidth(),
+			_rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect, true);
+	} else
+		_cursorSurface->setVisible(false);
+}
+
+void TextEditWidget::updateString() {
+	_textLabelWidget->setString((const byte *)_entryString.c_str(), _entryString.size());
+	_textLabelWidget->drawString(_maxVisibleChars);
+}
+
+void TextEditWidget::getString(Common::String &string) {
+	string = _entryString;
+}
+
+void TextEditWidget::setString(const Common::String &string) {
+	_entryString = string;
+	_cursorPos = _entryString.size();
+	refresh();
+}
+
+void TextEditWidget::handleAsciiKey(char ch) {
+	if ((int)_entryString.size() < _maxStringLength &&
+		((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == ' ')) {
+		_entryString.insertChar(ch, _cursorPos);
+		++_cursorPos;
+		refresh();
+	}
+}
+
+void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) {
+	bool doRefresh = true;
+	switch (keyCode) {
+	case Common::KEYCODE_DELETE:
+		if (_entryString.size() > 0 && _cursorPos < (int)_entryString.size())
+			_entryString.deleteChar(_cursorPos);
+		break;
+	case Common::KEYCODE_HOME:
+		_cursorPos = 0;
+		break;
+	case Common::KEYCODE_END:
+		_cursorPos = _entryString.size();
+		break;
+	case Common::KEYCODE_LEFT:
+		if (_entryString.size() > 0 && _cursorPos > 0)
+			--_cursorPos;
+		break;
+	case Common::KEYCODE_RIGHT:
+		if (_cursorPos < (int)_entryString.size())
+			++_cursorPos;
+		break;
+	case Common::KEYCODE_BACKSPACE:
+		if (_entryString.size() > 0 && _cursorPos > 0)
+			_entryString.deleteChar(--_cursorPos);
+		break;
+	default:
+		break;
+	}
+	if (doRefresh) {
+		_cursorSurface->setVisible(true);
+		_cursorTicks = 0;
+		refresh();
+	}
+}
+
+void TextEditWidget::refresh() {
+	refreshPosition();
+	updateString();
+	drawCursor();
+}
+
+void TextEditWidget::update() {
+	Widget::update();
+	if (_parentScene->getCurrWidget() == this && _cursorTicks++ == 10) {
+		_cursorSurface->setVisible(!_cursorSurface->getVisible());
+		refresh();
+		_cursorTicks = 0;
+	}
+}
+
+uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Widget::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x000A:
+		handleAsciiKey(param.asInteger());
+		break;
+	case 0x000B:
+		handleKeyDown((Common::KeyCode)param.asInteger());
+		break;
+	}
+	return messageResult;
+}
+
 SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority, bool visible,
-	StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect)
-	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority, visible),
-	_savegameList(savegameList), _textSurface1(textSurface1), _textSurface2(textSurface2), _fileHash1(fileHash1), _rect(rect),
-	_maxStringLength(0), _topIndex(0), _visibleItemsCount(0), _currIndex(0) {
+	int baseObjectPriority, int baseSurfacePriority,
+	StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect)
+	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
+	_savegameList(savegameList), _textSurface(textSurface), _bgFileHash(bgFileHash), _rect(rect),
+	_maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) {
 
-	_maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface1->getCharHeight();
-	_maxStringLength = (_rect.x2 - _rect.x1) / _textSurface1->getCharWidth();
+	_maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface->getCharHeight();
+	_maxStringLength = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth();
 }
 
 void SavegameListBox::onClick() {
-	NPoint mousePos;
-	int16 w = _rect.x2 - _rect.x1, h = _rect.y2 - _rect.y1;
-	_parentScene->getMousePos(mousePos);
+	NPoint mousePos = _parentScene->getMousePos();
 	mousePos.x -= _x + _rect.x1;
 	mousePos.y -= _y + _rect.y1;
-	if (mousePos.x >= 0 && mousePos.x <= w && mousePos.y >= 0 && mousePos.y <= h) {
-		int newIndex = _topIndex + mousePos.y / _textSurface1->getCharHeight();
-		if (newIndex <= _visibleItemsCount) {
+	if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 &&
+		mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) {
+		int newIndex = _firstVisibleItem + mousePos.y / _textSurface->getCharHeight();
+		if (newIndex <= _lastVisibleItem) {
 			_currIndex = newIndex;
 			refresh();
 			_parentScene->setCurrWidget(this);
-			// TODO _parentScene->onClick(_itemID, 5);
+			debug("_currIndex = %d", _currIndex);
+			_parentScene->handleEvent(_itemID, 5);
 		}
 	}
 }
 
 void SavegameListBox::addSprite() {
-	_spriteResource.load2(_fileHash1);
+	_spriteResource.load2(_bgFileHash);
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
 	_vm->_collisionMan->addSprite(this);
-	if (_visible)
-		show();
-	else
-		hide();
+	_surface->setVisible(true);
 	buildItems();
-	_topIndex = 0;
-	_visibleItemsCount = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size());
+	_firstVisibleItem = 0;
+	_lastVisibleItem = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size());
 	refresh();
 }
 
@@ -549,7 +714,7 @@ void SavegameListBox::buildItems() {
 		const byte *string = (const byte*)savegameList[i].c_str();
 		int stringLen = (int)savegameList[i].size();
 		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
-			_baseSurfacePriority + 1, _visible, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface1);
+			_baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface);
 		label->addSprite();
 		_textLabelItems.push_back(label);
 	}
@@ -558,13 +723,12 @@ void SavegameListBox::buildItems() {
 void SavegameListBox::drawItems() {
 	for (int i = 0; i < (int)_textLabelItems.size(); ++i) {
 		TextLabelWidget *label = _textLabelItems[i];		
-		if (i >= _topIndex && i <= _visibleItemsCount) {
-			label->setY(_rect.y1 + (i - _topIndex) * _textSurface1->getCharHeight());
+		if (i >= _firstVisibleItem && i < _lastVisibleItem) {
+			label->setY(_rect.y1 + (i - _firstVisibleItem) * _textSurface->getCharHeight());
 			label->updateBounds();
 			label->drawString(_maxStringLength);
-		} else {
+		} else
 			label->clear();
-		}
 	}
 }
 
@@ -574,37 +738,153 @@ void SavegameListBox::refresh() {
 }
 
 void SavegameListBox::scrollUp() {
-	if (_topIndex > 0) {
-		--_topIndex;
-		--_visibleItemsCount;
+	if (_firstVisibleItem > 0) {
+		--_firstVisibleItem;
+		--_lastVisibleItem;
 		refresh();
 	}
 }
 
 void SavegameListBox::scrollDown() {
-	if (_visibleItemsCount < (int)_textLabelItems.size()) {
-		++_topIndex;
-		++_visibleItemsCount;
+	if (_lastVisibleItem < (int)_textLabelItems.size()) {
+		++_firstVisibleItem;
+		++_lastVisibleItem;
 		refresh();
 	}
 }
 
 void SavegameListBox::pageUp() {
-	int distance = MIN(_topIndex, _maxVisibleItemsCount);
-	if (distance > 0) {
-		_topIndex -= distance;
-		_visibleItemsCount = distance;
+	int amount = MIN(_firstVisibleItem, _maxVisibleItemsCount);
+	if (amount > 0) {
+		_firstVisibleItem -= amount;
+		_lastVisibleItem -= amount;
 		refresh();
 	}
 }
 
 void SavegameListBox::pageDown() {
-	int distance = MIN((int)_textLabelItems.size() - _visibleItemsCount - 1, _maxVisibleItemsCount);
-	if (distance > 0) {
-		_topIndex += distance;
-		_visibleItemsCount += distance;
+	int amount = MIN((int)_textLabelItems.size() - _lastVisibleItem, _maxVisibleItemsCount);
+	if (amount > 0) {
+		_firstVisibleItem += amount;
+		_lastVisibleItem += amount;
 		refresh();
 	}
 }
 
+SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList)
+	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
+
+	static const uint32 kSaveGameMenuButtonFileHashes[] = {
+		0x8359A824,
+		0x0690E260,
+		0x0352B050,
+		0x1392A223,
+		0x13802260,
+		0x0B32B200
+	};
+	
+	static const NRect kSaveGameMenuButtonCollisionBounds[] = {
+		NRect(518, 106, 602, 160),
+		NRect(516, 378, 596, 434),
+		NRect(394, 108, 458, 206),
+		NRect(400, 204, 458, 276),
+		NRect(398, 292, 456, 352),
+		NRect(396, 352, 460, 444)
+	};
+
+	static const NRect kListBoxRect(0, 0, 320, 272);
+	static const NRect kTextEditRect(0, 0, 377, 17);
+	static const NRect kMouseRect(50, 47, 427, 64);
+
+	_textSurface = new TextSurface(_vm, 0x2328121A, 7, 32, 32, 11, 17);
+	
+	setBackground(0x30084E25);
+	setPalette(0x30084E25);
+	insertMouse433(0x84E21308, &kMouseRect);
+	insertStaticSprite(0x1340A5C2, 200);
+	insertStaticSprite(0x1301A7EA, 200);
+
+	_listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, 1000, 1000,
+		_savegameList, _textSurface, 0x1115A223, kListBoxRect);
+	_listBox->addSprite();
+
+	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000,
+		(const byte*)_savegameName.c_str(), 29, _textSurface, 0x3510A868, kTextEditRect);
+	_textEditWidget->setCursor(0x8290AC20, 2, 13);
+	_textEditWidget->addSprite();
+	_textEditWidget->setString(_savegameName);
+	setCurrWidget(_textEditWidget);
+	
+	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
+		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
+			kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]);
+		_vm->_collisionMan->addSprite(menuButton);
+	}
+
+
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&SaveGameMenu::handleMessage);
+}
+
+SaveGameMenu::~SaveGameMenu() {
+	delete _textSurface;
+}
+
+void SaveGameMenu::handleEvent(int16 itemID, int eventType) {
+	if (itemID == 69 && eventType == 5) {
+		uint currIndex = _listBox->getCurrIndex();
+		_textEditWidget->setString((*_savegameList)[currIndex]);
+		setCurrWidget(_textEditWidget);
+	}
+}
+
+uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x000A:
+		sendMessage(_textEditWidget, 0x000A, param.asInteger());
+		setCurrWidget(_textEditWidget);
+		break;
+	case 0x000B:
+		if (param.asInteger() == Common::KEYCODE_RETURN) {
+			// Return
+			// TODO 00486B05
+			// Get string from edit field and inform main module
+			leaveScene(0);
+		} else if (param.asInteger() == Common::KEYCODE_ESCAPE) {
+			// Escape
+			leaveScene(1);
+		} else {
+			sendMessage(_textEditWidget, 0x000B, param.asInteger());
+			setCurrWidget(_textEditWidget);
+		}
+		break;
+	case 0x2000:
+		// Handle menu button click
+		switch (param.asInteger()) {
+		case 0:
+			// TODO Same handling as Return
+			leaveScene(0);
+			break;
+		case 1:
+			leaveScene(1);
+			break;
+		case 2:
+			_listBox->pageUp();
+			break;
+		case 3:
+			_listBox->scrollUp();
+			break;
+		case 4:
+			_listBox->scrollDown();
+			break;
+		case 5:
+			_listBox->pageDown();
+			break;
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 1d7678d..7c1e6e1 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -30,6 +30,8 @@
 
 namespace Neverhood {
 
+typedef Common::Array<Common::String> StringArray;
+
 class MenuModule : public Module {
 public:
 	MenuModule(NeverhoodEngine *vm, Module *parentModule, int which);
@@ -37,17 +39,18 @@ public:
 protected:
 	int _sceneNum;
 	Common::String _savegameName;
-	Background *_savedBackground;
 	byte *_savedPaletteData;
-	// TODO _savegameList (list of strings?)
+	StringArray *_savegameList;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createSaveGameMenu();
+	void handleSaveGameMenuAction(int action);
 };
 
-class MainMenuButton : public StaticSprite {
+class MenuButton : public StaticSprite {
 public:
-	MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex);
+	MenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex, uint32 fileHash, const NRect &collisionBounds);
 protected:
 	Scene *_parentScene;
 	int _countdown;
@@ -79,15 +82,15 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
 
-typedef Common::Array<Common::String> StringArray;
-
 class Widget;
 
 class WidgetScene : public Scene {
 public:
 	WidgetScene(NeverhoodEngine *vm, Module *parentModule);
-	void getMousePos(NPoint &pt);
+	NPoint getMousePos();
 	virtual void setCurrWidget(Widget *newWidget);
+	virtual Widget *getCurrWidget() { return _currWidget; }
+	virtual void handleEvent(int16 itemID, int eventType);
 protected:
 	Widget *_currWidget;
 };
@@ -95,9 +98,7 @@ protected:
 class Widget : public StaticSprite {
 public:
 	Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority, bool visible);
-	virtual void show();
-	virtual void hide();
+		int baseObjectPriority, int baseSurfacePriority);
 	virtual void onClick();
 	virtual void setPosition(int16 x, int16 y);
 	virtual void refreshPosition();
@@ -111,7 +112,6 @@ protected:
 	WidgetScene *_parentScene;
 	int _baseObjectPriority;
 	int _baseSurfacePriority;
-	bool _visible;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -119,7 +119,7 @@ protected:
 class TextLabelWidget : public Widget {
 public:
 	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority, bool visible,
+		int baseObjectPriority, int baseSurfacePriority, 
 		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface);	
 	virtual void onClick();
 	virtual void addSprite();
@@ -138,11 +138,46 @@ protected:
 	int _stringLen;
 };
 
+class TextEditWidget : public Widget {
+public:
+	TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+		int baseObjectPriority, int baseSurfacePriority,
+		const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect);
+	~TextEditWidget();
+	virtual void onClick();
+	virtual void addSprite();
+	virtual void enterWidget();
+	virtual void exitWidget();
+	void setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight);
+	void drawCursor();
+	void updateString();
+	void getString(Common::String &string);
+	void setString(const Common::String &string);
+	void handleAsciiKey(char ch);
+	void handleKeyDown(Common::KeyCode keyCode);
+	void refresh();
+protected:
+	NRect _rect;
+	uint32 _fileHash;
+	int _maxVisibleChars;
+	int _maxStringLength;
+	int _cursorPos;
+	int _cursorTicks;
+	Common::String _entryString;
+	TextSurface *_textSurface;
+	TextLabelWidget *_textLabelWidget;
+	BaseSurface *_cursorSurface;
+	uint32 _cursorFileHash;
+	int16 _cursorWidth, _cursorHeight;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 class SavegameListBox : public Widget {
 public:
 	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority, bool visible,
-		StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect);
+		int baseObjectPriority, int baseSurfacePriority,
+		StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect);
 	virtual void onClick();
 	virtual void addSprite();
 	void buildItems();
@@ -152,20 +187,35 @@ public:
 	void scrollDown();
 	void pageUp();
 	void pageDown();
+	uint getCurrIndex() const { return _currIndex; }
 protected:
-	NRect _rect;
-	uint32 _fileHash1;
+	const NRect _rect;
+	uint32 _bgFileHash;
 	int _maxStringLength;
 	Common::Array<TextLabelWidget*> _textLabelItems;
-	int _topIndex;
-	int _visibleItemsCount;
+	int _firstVisibleItem;
+	int _lastVisibleItem;
 	StringArray *_savegameList;
-	TextSurface *_textSurface1;
-	TextSurface *_textSurface2;
-	int _currIndex;
+	TextSurface *_textSurface;
+	uint _currIndex;
 	int _maxVisibleItemsCount;
 };
 
+class SaveGameMenu : public WidgetScene {
+public:
+	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList);
+	~SaveGameMenu();
+	virtual void handleEvent(int16 itemID, int eventType);
+protected:
+	StringArray *_savegameList;
+	TextSurface *_textSurface;
+	SavegameListBox *_listBox;
+	TextEditWidget *_textEditWidget;
+	Common::String _savegameName;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
 } // End of namespace Neverhood
 
 #endif /* NEVERHOOD_MENUMODULE_H */
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 9141de0..208a157 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -112,16 +112,8 @@ Common::Error NeverhoodEngine::run() {
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
 				_keyState = event.kbd.keycode;
-				switch (_keyState) {
-				case Common::KEYCODE_ESCAPE:
-					_gameModule->handleEscapeKey();
-					break;
-				case Common::KEYCODE_SPACE:
-					_gameModule->handleSpaceKey();
-					break;
-				default:
-					break;
-				}
+				_gameModule->handleKeyDown(event.kbd.keycode);
+				_gameModule->handleAsciiKey(event.kbd.ascii);
 				break;
 			case Common::EVENT_KEYUP:
 				_keyState = Common::KEYCODE_INVALID;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 9e49c6b..aa4efac 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -100,28 +100,29 @@ void Scene::addEntity(Entity *entity) {
 }
 
 bool Scene::removeEntity(Entity *entity) {
-	for (uint index = 0; index < _entities.size(); index++) {
+	for (uint index = 0; index < _entities.size(); index++)
 		if (_entities[index] == entity) {
 			_entities.remove_at(index);
 			return true;
 		}
-	}
 	return false; 
 }
 
 void Scene::addSurface(BaseSurface *surface) {
-	int index = 0, insertIndex = -1;
-	for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
-		if ((*iter)->getPriority() > surface->getPriority()) {
-			insertIndex = index;
-			break;
+	if (surface) {
+		int index = 0, insertIndex = -1;
+		for (Common::Array<BaseSurface*>::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) {
+			if ((*iter)->getPriority() > surface->getPriority()) {
+				insertIndex = index;
+				break;
+			}
+			index++;
 		}
-		index++;
+		if (insertIndex >= 0)
+			_surfaces.insert_at(insertIndex, surface);
+		else
+			_surfaces.push_back(surface);		
 	}
-	if (insertIndex >= 0)
-		_surfaces.insert_at(insertIndex, surface);
-	else
-		_surfaces.push_back(surface);		
 }
 
 bool Scene::removeSurface(BaseSurface *surface) {
@@ -191,7 +192,7 @@ Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
 	return addSprite(new StaticSprite(_vm, fileHash, surfacePriority));
 }
 
-void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) {
+void Scene::insertMouse433(uint32 fileHash, const NRect *mouseRect) {
 	NRect rect(-1, -1, -1, -1);
 	if (mouseRect)
 		rect = *mouseRect;
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index c9e27f7..21f054e 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -59,7 +59,7 @@ public:
 	void setPalette(uint32 fileHash = 0);
 	void setHitRects(uint32 id);
 	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
-	void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL);
+	void insertMouse433(uint32 fileHash, const NRect *mouseRect = NULL);
 	void insertMouse435(uint32 fileHash, int16 x1, int16 x2);
 	void insertNavigationMouse(uint32 fileHash, int type);
 	void showMouse(bool visible);


Commit: 73e0372cefad2fa4eb95d4c02c66b3361b7599be
    https://github.com/scummvm/scummvm/commit/73e0372cefad2fa4eb95d4c02c66b3361b7599be
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: A little more work on the menu stuff

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 6a82c47..528d303 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -64,6 +64,13 @@ MenuModule::~MenuModule() {
 	_vm->_screen->setPaletteData(_savedPaletteData);
 }
 
+void MenuModule::setSavegameInfo(const Common::String &description, uint slot, bool newSavegame) {
+	_savegameDescription = description;
+	_savegameSlot = slot;
+	_newSavegame = newSavegame;
+	debug("SAVEGAME: description = [%s]; slot = %d; new = %d", description.c_str(), slot, newSavegame);
+}
+
 void MenuModule::createScene(int sceneNum, int which) {
 	_sceneNum = sceneNum;
 	switch (_sceneNum) {
@@ -491,20 +498,16 @@ void TextLabelWidget::setString(const byte *string, int stringLen) {
 	_stringLen = stringLen;
 }
 
-void TextLabelWidget::setTY(int16 ty) {
-	_ty = ty;
-}
-
 TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority,
-	const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect)
+	int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface,
+	uint32 fileHash, const NRect &rect)
 	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
 	_maxStringLength(maxStringLength), _textSurface(textSurface), _fileHash(fileHash), _rect(rect),
-	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0) {
+	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0),
+	_modified(false) {
 
-	_entryString = (const char*)string;
 	_maxVisibleChars = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth();
-	_cursorPos = _entryString.size();
+	_cursorPos = 0;
 	
 	SetUpdateHandler(&TextEditWidget::update);
 	SetMessageHandler(&TextEditWidget::handleMessage);
@@ -584,13 +587,14 @@ void TextEditWidget::updateString() {
 	_textLabelWidget->drawString(_maxVisibleChars);
 }
 
-void TextEditWidget::getString(Common::String &string) {
-	string = _entryString;
+Common::String& TextEditWidget::getString() {
+	return _entryString;
 }
 
 void TextEditWidget::setString(const Common::String &string) {
 	_entryString = string;
 	_cursorPos = _entryString.size();
+	_modified = false;
 	refresh();
 }
 
@@ -599,6 +603,7 @@ void TextEditWidget::handleAsciiKey(char ch) {
 		((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == ' ')) {
 		_entryString.insertChar(ch, _cursorPos);
 		++_cursorPos;
+		_modified = true;
 		refresh();
 	}
 }
@@ -606,10 +611,6 @@ void TextEditWidget::handleAsciiKey(char ch) {
 void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) {
 	bool doRefresh = true;
 	switch (keyCode) {
-	case Common::KEYCODE_DELETE:
-		if (_entryString.size() > 0 && _cursorPos < (int)_entryString.size())
-			_entryString.deleteChar(_cursorPos);
-		break;
 	case Common::KEYCODE_HOME:
 		_cursorPos = 0;
 		break;
@@ -624,9 +625,17 @@ void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) {
 		if (_cursorPos < (int)_entryString.size())
 			++_cursorPos;
 		break;
+	case Common::KEYCODE_DELETE:
+		if (_entryString.size() > 0 && _cursorPos < (int)_entryString.size()) {
+			_entryString.deleteChar(_cursorPos);
+			_modified = true;
+		}
+		break;
 	case Common::KEYCODE_BACKSPACE:
-		if (_entryString.size() > 0 && _cursorPos > 0)
+		if (_entryString.size() > 0 && _cursorPos > 0) {
 			_entryString.deleteChar(--_cursorPos);
+			_modified = true;
+		}
 		break;
 	default:
 		break;
@@ -808,11 +817,10 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 		_savegameList, _textSurface, 0x1115A223, kListBoxRect);
 	_listBox->addSprite();
 
-	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000,
-		(const byte*)_savegameName.c_str(), 29, _textSurface, 0x3510A868, kTextEditRect);
+	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, 29,
+		_textSurface, 0x3510A868, kTextEditRect);
 	_textEditWidget->setCursor(0x8290AC20, 2, 13);
 	_textEditWidget->addSprite();
-	_textEditWidget->setString(_savegameName);
 	setCurrWidget(_textEditWidget);
 	
 	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
@@ -847,12 +855,10 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 		break;
 	case 0x000B:
 		if (param.asInteger() == Common::KEYCODE_RETURN) {
-			// Return
-			// TODO 00486B05
-			// Get string from edit field and inform main module
+			((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
+				_listBox->getCurrIndex(), _textEditWidget->isModified());
 			leaveScene(0);
 		} else if (param.asInteger() == Common::KEYCODE_ESCAPE) {
-			// Escape
 			leaveScene(1);
 		} else {
 			sendMessage(_textEditWidget, 0x000B, param.asInteger());
@@ -863,7 +869,9 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 		// Handle menu button click
 		switch (param.asInteger()) {
 		case 0:
-			// TODO Same handling as Return
+			// TODO Same handling as Return, merge
+			((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
+				_listBox->getCurrIndex(), _textEditWidget->isModified());
 			leaveScene(0);
 			break;
 		case 1:
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 7c1e6e1..0f45795 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -36,11 +36,14 @@ class MenuModule : public Module {
 public:
 	MenuModule(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~MenuModule();
+	void setSavegameInfo(const Common::String &description, uint slot, bool newSavegame);
 protected:
 	int _sceneNum;
-	Common::String _savegameName;
 	byte *_savedPaletteData;
 	StringArray *_savegameList;
+	Common::String _savegameDescription;
+	uint _savegameSlot;
+	bool _newSavegame;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -129,7 +132,6 @@ public:
 	void clear();
 	void setString(const byte *string, int stringLen);
 	TextSurface *getTextSurface() const { return _textSurface; }
-	void setTY(int16 ty);
 protected:
 	BaseSurface *_drawSurface;
 	int16 _tx, _ty;
@@ -141,8 +143,8 @@ protected:
 class TextEditWidget : public Widget {
 public:
 	TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority,
-		const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect);
+		int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface,
+		uint32 fileHash, const NRect &rect);
 	~TextEditWidget();
 	virtual void onClick();
 	virtual void addSprite();
@@ -151,11 +153,12 @@ public:
 	void setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight);
 	void drawCursor();
 	void updateString();
-	void getString(Common::String &string);
+	Common::String& getString();
 	void setString(const Common::String &string);
 	void handleAsciiKey(char ch);
 	void handleKeyDown(Common::KeyCode keyCode);
 	void refresh();
+	bool isModified() const { return _modified; }
 protected:
 	NRect _rect;
 	uint32 _fileHash;
@@ -169,6 +172,7 @@ protected:
 	BaseSurface *_cursorSurface;
 	uint32 _cursorFileHash;
 	int16 _cursorWidth, _cursorHeight;
+	bool _modified;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -211,7 +215,7 @@ protected:
 	TextSurface *_textSurface;
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;
-	Common::String _savegameName;
+	Common::String _savegameDescription;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: 685ce4e3122dfd48ce136f6bc6baaacf142e8850
    https://github.com/scummvm/scummvm/commit/685ce4e3122dfd48ce136f6bc6baaacf142e8850
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: Add initCodeSymbolsPuzzle

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module1600.cpp
    engines/neverhood/module3000.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index ce72a22..c7ce53f 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -262,6 +262,23 @@ void GameModule::initCannonSymbolsPuzzle() {
 	}
 }
 
+void GameModule::initCodeSymbolsPuzzle() {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x0CD09B50)) {
+		for (int i = 0; i < 12; ++i)
+			setSubVar(VA_CODE_SYMBOLS, i, i);
+		for (int i = 0; i < 12; ++i) {
+			uint32 index1 = _vm->_rnd->getRandomNumber(12 - 1);
+			uint32 index2 = _vm->_rnd->getRandomNumber(12 - 1);
+			uint32 temp = getSubVar(VA_CODE_SYMBOLS, index1);
+			setSubVar(VA_CODE_SYMBOLS, index1, getSubVar(VA_CODE_SYMBOLS, index2));
+			setSubVar(VA_CODE_SYMBOLS, index2, temp);
+		}
+		setGlobalVar(V_NOISY_SYMBOL_INDEX, _vm->_rnd->getRandomNumber(11 - 1) + 1);
+		setSubVar(VA_IS_PUZZLE_INIT, 0x0CD09B50, 1);
+	}
+
+}
+
 uint32 GameModule::getCurrRadioMusicFileHash() {
 	uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
 	return (musicIndex % 5 != 0) ? 0 : kRadioMusicFileHashes[CLIP<uint>(musicIndex / 5, 0, 17)];
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 81ebfb8..e1461d2 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -46,8 +46,9 @@ public:
 	void initWaterPipesPuzzle();
 	void initRadioPuzzle();
 	void initTestTubes1Puzzle();
-	void initTestTubes2Puzzle();
+	void initTestTubes2Puzzle();	
 	void initCannonSymbolsPuzzle();
+	void initCodeSymbolsPuzzle();
 	uint32 getCurrRadioMusicFileHash();
 protected:
 	Entity *_prevChildObject;
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index db8eeab..ca4d2e5 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -1317,7 +1317,7 @@ void Scene1608::updateKlaymanCliprect() {
 Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule)
 	: Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
 
-	// TODO _vm->gameModule()->initScene3011Vars();
+	_vm->gameModule()->initCodeSymbolsPuzzle();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
 	
 	SetMessageHandler(&Scene1609::handleMessage);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 9c2d896..1fc1f53 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -1450,7 +1450,7 @@ void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) {
 Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) {
 
-	// TODO _vm->gameModule()->initScene3011Vars();
+	_vm->gameModule()->initCodeSymbolsPuzzle();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
 
 	SetMessageHandler(&Scene3011::handleMessage);


Commit: 1904e944c561a21dbe6271f64393f2bfc5f584f9
    https://github.com/scummvm/scummvm/commit/1904e944c561a21dbe6271f64393f2bfc5f584f9
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:37-07:00

Commit Message:
NEVERHOOD: Add initCubeSymbolsPuzzle

- Add microtiles to the screen update to eliminate overdraw
  (microtiles code taken from the Toltecs engine)
- Fix sprite dimensions in AsScene1402PuzzleBox which caused a crash
- Fix screen shaking in Scene1402
  (the puzzle box and bridge parts now shake along :)
- Use addSoundItem/addMusicItem in the SoundMan instead of
  directly using push_back on the resp. arrays
- Remove old code and comments

Changed paths:
  A engines/neverhood/microtiles.cpp
  A engines/neverhood/microtiles.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module.mk
    engines/neverhood/module1400.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h
    engines/neverhood/sound.cpp
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c7ce53f..be4f5d3 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -276,7 +276,15 @@ void GameModule::initCodeSymbolsPuzzle() {
 		setGlobalVar(V_NOISY_SYMBOL_INDEX, _vm->_rnd->getRandomNumber(11 - 1) + 1);
 		setSubVar(VA_IS_PUZZLE_INIT, 0x0CD09B50, 1);
 	}
+}
 
+void GameModule::initCubeSymbolsPuzzle() {
+	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x60400854)) {
+		NonRepeatingRandomNumbers cubeSymbols(_vm->_rnd, 9);
+		for (uint32 cubePosition = 0; cubePosition < 9; ++cubePosition)
+			setSubVar(VA_CUBE_POSITIONS, cubePosition, (uint32)(cubeSymbols.getNumber() - 1));
+		setSubVar(VA_IS_PUZZLE_INIT, 0x60400854, 1);
+	}
 }
 
 uint32 GameModule::getCurrRadioMusicFileHash() {
@@ -352,7 +360,7 @@ void GameModule::startup() {
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4);
 	// <<<DEBUG
 
-#if 1
+#if 0
 	/*
 	//DEBUG>>>
 	createScene(_vm->gameState().sceneNum, _vm->gameState().which);
@@ -364,9 +372,9 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 28;
 	createModule(2700, -1);
 #endif
-#if 0
+#if 1
 	_vm->gameState().sceneNum = 0;
-	createModule(1800, -1);
+	createModule(1400, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index e1461d2..53adb85 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -49,6 +49,7 @@ public:
 	void initTestTubes2Puzzle();	
 	void initCannonSymbolsPuzzle();
 	void initCodeSymbolsPuzzle();
+	void initCubeSymbolsPuzzle();
 	uint32 getCurrRadioMusicFileHash();
 protected:
 	Entity *_prevChildObject;
diff --git a/engines/neverhood/microtiles.cpp b/engines/neverhood/microtiles.cpp
new file mode 100644
index 0000000..ee64fda
--- /dev/null
+++ b/engines/neverhood/microtiles.cpp
@@ -0,0 +1,164 @@
+/* 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/microtiles.h"
+
+namespace Neverhood {
+
+MicroTileArray::MicroTileArray(int16 width, int16 height) {
+	_tilesW = (width / TileSize) + ((width % TileSize) > 0 ? 1 : 0);
+	_tilesH = (height / TileSize) + ((height % TileSize) > 0 ? 1 : 0);
+	_tiles = new BoundingBox[_tilesW * _tilesH];
+	clear();
+}
+
+MicroTileArray::~MicroTileArray() {
+	delete[] _tiles;
+}
+
+void MicroTileArray::addRect(Common::Rect r) {
+
+	int ux0, uy0, ux1, uy1;
+	int tx0, ty0, tx1, ty1;
+	int ix0, iy0, ix1, iy1;
+
+	r.clip(Common::Rect(0, 0, 639, 479));
+
+	ux0 = r.left / TileSize;
+	uy0 = r.top / TileSize;
+	ux1 = r.right / TileSize;
+	uy1 = r.bottom / TileSize;
+
+	tx0 = r.left % TileSize;
+	ty0 = r.top % TileSize;
+	tx1 = r.right % TileSize;
+	ty1 = r.bottom % TileSize;
+
+	for (int yc = uy0; yc <= uy1; yc++) {
+		for (int xc = ux0; xc <= ux1; xc++) {
+			ix0 = (xc == ux0) ? tx0 : 0;
+			ix1 = (xc == ux1) ? tx1 : TileSize - 1;
+			iy0 = (yc == uy0) ? ty0 : 0;
+			iy1 = (yc == uy1) ? ty1 : TileSize - 1;
+			updateBoundingBox(_tiles[xc + yc * _tilesW], ix0, iy0, ix1, iy1);
+		}
+	}
+
+}
+
+void MicroTileArray::clear() {
+	memset(_tiles, 0, _tilesW * _tilesH * sizeof(BoundingBox));
+}
+
+byte MicroTileArray::TileX0(const BoundingBox &boundingBox) {
+	return (boundingBox >> 24) & 0xFF;
+}
+
+byte MicroTileArray::TileY0(const BoundingBox &boundingBox) {
+	return (boundingBox >> 16) & 0xFF;
+}
+
+byte MicroTileArray::TileX1(const BoundingBox &boundingBox) {
+	return (boundingBox >> 8) & 0xFF;
+}
+
+byte MicroTileArray::TileY1(const BoundingBox &boundingBox) {
+	return boundingBox & 0xFF;
+}
+
+bool MicroTileArray::isBoundingBoxEmpty(const BoundingBox &boundingBox) {
+	return boundingBox == EmptyBoundingBox;
+}
+
+bool MicroTileArray::isBoundingBoxFull(const BoundingBox &boundingBox) {
+	return boundingBox == FullBoundingBox;
+}
+
+void MicroTileArray::setBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1) {
+	boundingBox = (x0 << 24) | (y0 << 16) | (x1 << 8) | y1;
+}
+
+void MicroTileArray::updateBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1) {
+	if (!isBoundingBoxEmpty(boundingBox)) {
+		x0 = MIN(TileX0(boundingBox), x0);
+		y0 = MIN(TileY0(boundingBox), y0);
+		x1 = MAX(TileX1(boundingBox), x1);
+		y1 = MAX(TileY1(boundingBox), y1);
+	}
+	setBoundingBox(boundingBox, x0, y0, x1, y1);
+}
+
+RectArray *MicroTileArray::getRectangles() {
+
+	RectArray *rects = new RectArray();
+
+	int x, y;
+	int x0, y0, x1, y1;
+	int i = 0;
+
+	for (y = 0; y < _tilesH; ++y) {
+		for (x = 0; x < _tilesW; ++x) {
+
+			int start;
+			int finish = 0;
+			BoundingBox boundingBox = _tiles[i];
+
+			if (isBoundingBoxEmpty(boundingBox)) {
+				++i;
+				continue;
+			}
+
+			x0 = (x * TileSize) + TileX0(boundingBox);
+			y0 = (y * TileSize) + TileY0(boundingBox);
+			y1 = (y * TileSize) + TileY1(boundingBox);
+
+			start = i;
+
+			if (TileX1(boundingBox) == TileSize - 1 && x != _tilesW - 1) {	// check if the tile continues
+				while (!finish) {
+					++x;
+					++i;
+					if (x == _tilesW || i >= _tilesW * _tilesH ||
+						TileY0(_tiles[i]) != TileY0(boundingBox) ||
+						TileY1(_tiles[i]) != TileY1(boundingBox) ||
+						TileX0(_tiles[i]) != 0)
+					{
+						--x;
+						--i;
+						finish = 1;
+					}
+				}
+			}
+
+			x1 = (x * TileSize) + TileX1(_tiles[i]);
+
+			rects->push_back(Common::Rect(x0, y0, x1 + 1, y1 + 1));
+
+			++i;
+		}
+	}
+
+	return rects;
+}
+
+} // End of namespace Neverhood
diff --git a/engines/neverhood/microtiles.h b/engines/neverhood/microtiles.h
new file mode 100644
index 0000000..2ad6796
--- /dev/null
+++ b/engines/neverhood/microtiles.h
@@ -0,0 +1,64 @@
+/* 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_MICROTILES_H
+#define NEVERHOOD_MICROTILES_H
+
+#include "common/scummsys.h"
+#include "common/array.h"
+#include "common/util.h"
+#include "common/rect.h"
+
+namespace Neverhood {
+
+typedef uint32 BoundingBox;
+
+const BoundingBox FullBoundingBox  = 0x00001F1F;
+const BoundingBox EmptyBoundingBox = 0x00000000;
+const int TileSize = 32;
+
+typedef Common::Array<Common::Rect> RectArray;
+
+class MicroTileArray {
+public:
+	MicroTileArray(int16 width, int16 height);
+	~MicroTileArray();
+	void addRect(Common::Rect r);
+	void clear();
+	RectArray *getRectangles();
+protected:
+	BoundingBox *_tiles;
+	int16 _tilesW, _tilesH;
+	byte TileX0(const BoundingBox &boundingBox);
+	byte TileY0(const BoundingBox &boundingBox);
+	byte TileX1(const BoundingBox &boundingBox);
+	byte TileY1(const BoundingBox &boundingBox);
+	bool isBoundingBoxEmpty(const BoundingBox &boundingBox);
+	bool isBoundingBoxFull(const BoundingBox &boundingBox);
+	void setBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1);
+	void updateBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1);
+};
+
+} // namespace Neverhood
+
+#endif // NEVERHOOD_MICROTILES_H
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 224dfb5..9069203 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -12,6 +12,7 @@ MODULE_OBJS = \
 	graphics.o \
 	klayman.o \
 	menumodule.o \
+	microtiles.o \
 	module.o \
 	module1000.o \
 	module1100.o \
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 2494941..db3acb6 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -780,7 +780,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas
 AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status)
 	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
 
-	createSurface(900, 152, 147);
+	createSurface(900, 347, 230);
 
 	SetFilterY(&Sprite::defFilterY);
 	SetUpdateHandler(&AnimatedSprite::update);
@@ -844,9 +844,10 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene1402::handleMessage);
 
+	_vm->_screen->setYOffset(0);
+
 	setBackground(0x231482F0);
 	setBackgroundY(-10);
-	// TODO g_screen->field_26 = 0;
 	setPalette(0x231482F0);
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
 	insertMouse433(0x482F4239);
@@ -891,7 +892,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 			startShaking();
 		}
 	}
-
+	
 	if (_asPuzzleBox)
 		_asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2());
 
@@ -919,10 +920,10 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 void Scene1402::upShaking() {
 	if (_isShaking) {
 		setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10);
-		// TODO g_screen->field_26 = -10 - _background->getDrawRect().y;
+		_vm->_screen->setYOffset(-10 - getBackgroundY());
 	} else {
 		setBackgroundY(-10);
-		// TODO g_screen->field_26 = 0;
+		_vm->_screen->setYOffset(0);
 		SetUpdateHandler(&Scene::update);
 	}
 	Scene::update();
@@ -973,6 +974,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 			} else
 				setMessageList2(0x004B0B68);
 		}
+		break;
 	}
 	return 0;
 }
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 8616592..8a7e346 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -539,9 +539,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
-	if (!getSubVar(VA_IS_PUZZLE_INIT, 0x60400854)) {
-		// TODO _vm->gameModule()->initScene2201Vars();
-	}
+	_vm->gameModule()->initCubeSymbolsPuzzle();
 
 	SetMessageHandler(&Scene2201::handleMessage);
 	SetUpdateHandler(&Scene2201::update);
@@ -875,7 +873,8 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isCubeMoving(false),
 	_ssMovingCube(NULL), _ssDoneMovingCube(NULL) {
 
-	// TODO initScene2201Vars();
+	_vm->gameModule()->initCubeSymbolsPuzzle();
+
 	SetMessageHandler(&Scene2202::handleMessage);
 	SetUpdateHandler(&Scene2202::update);
 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index aa4efac..6141ee4 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -29,7 +29,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) {
 	
 	_isKlaymanBusy = false;
-	_systemCallbackFlag = false;
+	_doConvertMessages = false;
 	_messageList = NULL;
 	_rectType = 0;
 	_mouseClickPos.x = 0;
@@ -46,7 +46,6 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	}
 	_vm->_screen->setFps(24);
 	_vm->_screen->setSmackerDecoder(NULL);
-	// TODO g_screen->resetDirtyRects();	
 	_canAcceptInput = true;
 	_messageList2 = NULL;
 	_smackerPlayer = NULL;
@@ -229,7 +228,6 @@ void Scene::update() {
 
 	if (_mouseClicked) {
 		if (_klayman) {
-			// TODO: Merge later
 			if (_canAcceptInput &&
 				_klayman->hasMessageHandler() && 
 				sendMessage(_klayman, 0x1008, 0) != 0 &&
@@ -262,27 +260,11 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 	case 0: // mouse moved
 		if (_mouseCursor && _mouseCursor->hasMessageHandler())
 			sendMessage(_mouseCursor, 0x4002, param);
-		// TODO Seems unused: queryPositionSomeRects(param.asPoint().x, param.asPoint().y);			
 		break;
 	case 1: // mouse clicked
 		_mouseClicked = true;
 		_mouseClickPos = param.asPoint();
 		break;
-	/* ORIGINAL DEBUG		
-	case 3:
-		drawSurfaceRects();		
-		break;
-	*/		
-	/* ORIGINAL DEBUG		
-	case 4:
-		drawRectListRects();		
-		break;
-	*/		
-	/* ORIGINAL DEBUG		
-	case 5:
-		broadcastObjectMessage5();		
-		break;
-	*/		
 	case 6:
 		sendMessage(_parentModule, 0x1009, param);		
 		break;
@@ -331,34 +313,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 	return 0;
 }
 
-void Scene::smackerUpdate() {
-	//**ALL TODO
-#if 0	
-	_smackerPlayer->handleUpdate();
-	if (_smackerDone) {
-		delete _smackerPlayer;
-		_smackerPlayer = NULL;
-		_updateHandlerCb = _savedUpdateHandlerCb;
-		_messageHandlerCb = _savedMessageHandlerCb;
-		if (_palette)
-			_palette->usePalette();
-		// TODO _background->restore();
-		// TODO g_screen->smackerPlayer = NULL;		
-	}
-#endif	
-}
-
-uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x3002:
-		_smackerDone = true;
-		break;
-	}
-	return 0;
-}
-
 bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
-	//debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY);
 	for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) {
 		Sprite *sprite = _vm->_collisionMan->getSprite(i);
 		if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && 
@@ -380,7 +335,6 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 				for (uint j = 0; j < rectList[i].subRects.size(); j++) {
 					debug(2, "  (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2);
 					if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) {
-						//debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId);
 						return setMessageList2(rectList[i].subRects[j].messageListId);
 					}
 				}
@@ -394,53 +348,33 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) {
 	return true;
 }
 
-void Scene::setMessageList(uint32 id, bool canAcceptInput, bool systemCallbackFlag) {
-	setMessageList(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag);
+void Scene::setMessageList(uint32 id, bool canAcceptInput, bool doConvertMessages) {
+	setMessageList(_vm->_staticData->getMessageList(id), canAcceptInput, doConvertMessages);
 }
 
-void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) {
-	//debug("Scene::setMessageList(%p)", (void*)messageList);
+void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool doConvertMessages) {
 	_messageList = messageList;
 	_messageListCount = _messageList ? _messageList->size() : 0;
 	_messageListIndex = 0;
 	_isKlaymanBusy = false;
 	_canAcceptInput = canAcceptInput;
-	_systemCallbackFlag = systemCallbackFlag;
+	_doConvertMessages = doConvertMessages;
 	_messageListStatus = 1;
 	sendMessage(_klayman, 0x101C, 0);
-	
-#if 0
-	// DEBUG: Show message list
-	for (uint i = 0; i < messageList->size(); i++) {
-		debug("A: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
-	}
-	debug("A: ================================================================");
-#endif	
-	
 }
 
-bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool systemCallbackFlag) {
-	return setMessageList2(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag);
+bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool doConvertMessages) {
+	return setMessageList2(_vm->_staticData->getMessageList(id), canAcceptInput, doConvertMessages);
 }
 
-bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) {
-	//debug("Scene::setMessageList2(%p)", (void*)messageList);
-
-#if 0
-	// DEBUG: Show message list
-	for (uint i = 0; i < messageList->size(); i++) {
-		debug("B: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue);
-	}
-	debug("B: ================================================================");
-#endif
-
+bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool doConvertMessages) {
 	if (_messageListStatus == 0 ||
 		(_messageListStatus == 1 && messageList != _messageList2) ||
 		(_messageListStatus == 2 && messageList == _messageList2)) {
 		// NOTE Skipped unneeded resource preloading code
 		_messageValue = -1;
 		_messageList2 = messageList;
-		setMessageList(messageList, canAcceptInput, systemCallbackFlag);
+		setMessageList(messageList, canAcceptInput, doConvertMessages);
 		return true;
 	}
 	return false;
@@ -465,45 +399,39 @@ void Scene::processMessageList() {
 			uint32 messageNum = (*_messageList)[_messageListIndex].messageNum;
 			uint32 messageParam = (*_messageList)[_messageListIndex].messageValue;
 			
-			//debug("Scene::processMessageList() %04X, %08X", messageNum, messageParam);
-			
-			_messageListIndex++;
-			if (_messageListIndex == _messageListCount) {
+			++_messageListIndex;
+			if (_messageListIndex == _messageListCount)
 				sendMessage(_klayman, 0x1021, 0);
-			}
-			if (_systemCallbackFlag) {
+			if (_doConvertMessages)
 				messageNum = convertMessageNum(messageNum);
-			}
-			if (messageNum != 0x4003) {
-				if (messageNum == 0x1009 || messageNum == 0x1024) {
-					sendMessage(_parentModule, messageNum, messageParam);
-				} else if (messageNum == 0x100A) {
-					_messageValue = messageParam;
-					sendMessage(_parentModule, messageNum, messageParam);
-				} else if (messageNum == 0x4001) {
-					_isKlaymanBusy = true;
-					sendPointMessage(_klayman, 0x4001, _mouseClickPos);
-				} else if (messageNum == 0x100D) {
-					if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0)
-						continue;
-				} else if (messageNum == 0x101A) {
-					_messageListStatus = 0;
-				} else if (messageNum == 0x101B) {
-					_messageListStatus = 2;
-				} else if (messageNum == 0x1020) {
-					_canAcceptInput = false;
-				} else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) {
-					if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) {
-						_isMessageListBusy = false;
-						return;
-					}
-				} else {
-					_isKlaymanBusy = true;
-					if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) {
-						_isKlaymanBusy = false;
-					}
-				} 
-			}
+			if (messageNum == 0x1009 || messageNum == 0x1024) {
+				sendMessage(_parentModule, messageNum, messageParam);
+			} else if (messageNum == 0x100A) {
+				_messageValue = messageParam;
+				sendMessage(_parentModule, messageNum, messageParam);
+			} else if (messageNum == 0x4001) {
+				_isKlaymanBusy = true;
+				sendPointMessage(_klayman, 0x4001, _mouseClickPos);
+			} else if (messageNum == 0x100D) {
+				if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0)
+					continue;
+			} else if (messageNum == 0x101A) {
+				_messageListStatus = 0;
+			} else if (messageNum == 0x101B) {
+				_messageListStatus = 2;
+			} else if (messageNum == 0x1020) {
+				_canAcceptInput = false;
+			} else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) {
+				if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) {
+					_isMessageListBusy = false;
+					return;
+				}
+			} else if (messageNum != 0x4003) {
+				_isKlaymanBusy = true;
+				if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) {
+					_isKlaymanBusy = false;
+				}
+			} 
 			if (_messageListIndex == _messageListCount) {
 				_canAcceptInput = true;
 				_messageList = NULL;
@@ -538,7 +466,6 @@ void Scene::clearRectList() {
 
 void Scene::loadHitRectList() {
 	HitRectList *hitRectList = _dataResource.getHitRectList();
-	//debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList);
 	if (hitRectList) {
 		_hitRectList = *hitRectList;
 		_vm->_collisionMan->setHitRects(&_hitRectList);
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index 21f054e..b531796 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -170,7 +170,7 @@ protected:
 	int _messageListStatus;
 	uint _messageListCount;
 	uint _messageListIndex;
-	bool _systemCallbackFlag;
+	bool _doConvertMessages;
 
 	bool _canAcceptInput;
 	bool _isKlaymanBusy;
@@ -189,17 +189,14 @@ protected:
 
 	void (Entity::*_savedUpdateHandlerCb)();
 	uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
-	bool _smackerDone;
 	int _messageValue;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void smackerUpdate();
-	uint32 smackerHandleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	bool queryPositionSprite(int16 mouseX, int16 mouseY);
 	bool queryPositionRectList(int16 mouseX, int16 mouseY);
-	void setMessageList(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false);
-	void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false);
-	bool setMessageList2(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false);
-	bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false);
+	void setMessageList(uint32 id, bool canAcceptInput = true, bool doConvertMessages = false);
+	void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false);
+	bool setMessageList2(uint32 id, bool canAcceptInput = true, bool doConvertMessages = false);
+	bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false);
 	void processMessageList();
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 7321ddb..352e59e 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -26,7 +26,8 @@
 namespace Neverhood {
 
 Screen::Screen(NeverhoodEngine *vm)
-	: _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL) {
+	: _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL),
+	_yOffset(0) {
 	
 	_ticks = _vm->_system->getMillis();
 	
@@ -35,10 +36,12 @@ Screen::Screen(NeverhoodEngine *vm)
 	
 	_renderQueue = new RenderQueue();
 	_prevRenderQueue = new RenderQueue();
+	_microTiles = new MicroTileArray(640, 480);
 	
 }
 
 Screen::~Screen() {
+	delete _microTiles;
 	delete _renderQueue;
 	delete _prevRenderQueue;
 	_backScreen->free();
@@ -56,16 +59,8 @@ void Screen::update() {
 		return;
 	}
 
-	// NOTE This is more or less experimental code for a smart "render queue".
-	// It works well so far but needs some optimizing, e.g. reducing overdraw.
-	// Maybe I'll use my microtiles code from the Toltecs engine.
-	// Also better move this to a separate method or even class.
-	
-	Common::Array<Common::Rect> updateRects;
+	_microTiles->clear();
 
-	for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt)
-		(*jt)._refresh = true;
-	
 	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
 		RenderItem &renderItem = (*it);
 		renderItem._refresh = true;
@@ -81,27 +76,34 @@ void Screen::update() {
 	for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) {
 		RenderItem &prevRenderItem = (*jt);
 		if (prevRenderItem._refresh)
-			updateRects.push_back(Common::Rect(prevRenderItem._destX, prevRenderItem._destY, prevRenderItem._destX + prevRenderItem._width, prevRenderItem._destY + prevRenderItem._height));
+			_microTiles->addRect(Common::Rect(prevRenderItem._destX, prevRenderItem._destY, prevRenderItem._destX + prevRenderItem._width, prevRenderItem._destY + prevRenderItem._height));
 	}
 	
 	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
 		RenderItem &renderItem = (*it);
 		if (renderItem._refresh)
-			updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height));
+			_microTiles->addRect(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height));
+		renderItem._refresh = true;
 	}
 
+	RectArray *updateRects = _microTiles->getRectangles();
+
 	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
 		RenderItem &renderItem = (*it);
-		for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
+		for (RectArray::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri)
 			blitRenderItem(renderItem, *ri);
 	}
 	
 	SWAP(_renderQueue, _prevRenderQueue);
 	_renderQueue->clear();
 
-	for (Common::Array<Common::Rect>::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri)
-		_vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr((*ri).left, (*ri).top), _backScreen->pitch, (*ri).left, (*ri).top, (*ri).width(), (*ri).height());
-		
+	for (Common::Array<Common::Rect>::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) {
+		Common::Rect &r = *ri;
+		_vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr(r.left, r.top), _backScreen->pitch, r.left, r.top, r.width(), r.height());
+	}
+
+	delete updateRects;
+
 }
 
 uint32 Screen::getNextFrameTime() {
@@ -120,6 +122,14 @@ int Screen::getFps() {
 	return 1000 / _frameDelay;
 }
 
+void Screen::setYOffset(int16 yOffset) {
+	_yOffset = yOffset;
+}
+
+int16 Screen::getYOffset() {
+	return _yOffset;
+}
+
 void Screen::setPaletteData(byte *paletteData) {
 	_paletteChanged = true;
 	_paletteData = paletteData;
@@ -194,15 +204,8 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect,
 		ddRect.y1 = 0;
 	}
 	
-	//debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2);
-
 	queueBlit(surface, destX, destY, ddRect, transparent, version, shadowSurface);
 
-	// Useful for debugging	
-	//_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); 
-	//_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); 
-	//_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255);
-
 }
 
 void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version) {
@@ -240,45 +243,6 @@ void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, ND
 
 }
 
-void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent,
-	const Graphics::Surface *shadowSurface) {
-
-	const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1);
-	byte *dest = (byte*)_backScreen->getBasePtr(destX, destY);
-	int width = ddRect.x2 - ddRect.x1;
-	int height = ddRect.y2 - ddRect.y1;
-
-	if (width <= 0 || height <= 0)
-		return;
-	
-	if (shadowSurface) {
-		const byte *shadowSource = (const byte*)shadowSurface->getBasePtr(destX, destY);
-		while (height--) {
-			for (int xc = 0; xc < width; xc++)
-				if (source[xc] != 0)
-					dest[xc] = shadowSource[xc];
-			source += surface->pitch;
-			shadowSource += shadowSurface->pitch;
-			dest += _backScreen->pitch;
-		}
-	} else if (!transparent) {
-		while (height--) {
-			memcpy(dest, source, width);
-			source += surface->pitch;
-			dest += _backScreen->pitch;
-		}
-	} else {
-		while (height--) {
-			for (int xc = 0; xc < width; xc++)
-				if (source[xc] != 0)
-					dest[xc] = source[xc];
-			source += surface->pitch;
-			dest += _backScreen->pitch;
-		}
-	}
-
-}
-
 void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) {
 
 	const byte *source = (const byte*)surface->getBasePtr(0, 0);
@@ -377,8 +341,8 @@ void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &d
 void Screen::queueBlit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, byte version,
 	const Graphics::Surface *shadowSurface) {
 	
-	int width = ddRect.x2 - ddRect.x1;
-	int height = ddRect.y2 - ddRect.y1;
+	const int width = ddRect.x2 - ddRect.x1;
+	const int height = ddRect.y2 - ddRect.y1;
 
 	if (width <= 0 || height <= 0)
 		return;
@@ -406,7 +370,7 @@ void Screen::blitRenderItem(const RenderItem &renderItem, const Common::Rect &cl
 	const int16 y0 = MAX<int16>(clipRect.top, renderItem._destY);
 	const int16 x1 = MIN<int16>(clipRect.right, renderItem._destX + renderItem._width);
 	const int16 y1 = MIN<int16>(clipRect.bottom, renderItem._destY + renderItem._height);
-	int16 width = x1 - x0;
+	const int16 width = x1 - x0;
 	int16 height = y1 - y0;
 
 	if (width < 0 || height < 0)
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 4e7618b..33de141 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -27,6 +27,7 @@
 #include "graphics/surface.h"
 #include "video/smk_decoder.h"
 #include "neverhood/neverhood.h"
+#include "neverhood/microtiles.h"
 #include "neverhood/graphics.h"
 
 namespace Neverhood {
@@ -64,6 +65,8 @@ public:
 	uint32 getNextFrameTime();
 	void setFps(int fps);
 	int getFps();
+	void setYOffset(int16 yOffset);
+	int16 getYOffset();
 	void setPaletteData(byte *paletteData);
 	void unsetPaletteData(byte *paletteData);
 	byte *getPaletteData() { return _paletteData; }
@@ -75,8 +78,6 @@ public:
 		const Graphics::Surface *shadowSurface = NULL);
 	void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version);
 	void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect);
-	void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent,
-		const Graphics::Surface *shadowSurface = NULL);
 	void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect);
 	void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version);
 	void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version);
@@ -86,13 +87,14 @@ public:
 	void blitRenderItem(const RenderItem &renderItem, const Common::Rect &clipRect);
 protected:
 	NeverhoodEngine *_vm;
+	MicroTileArray *_microTiles;
 	Graphics::Surface *_backScreen;
 	Video::SmackerDecoder *_smackerDecoder;
 	int32 _ticks;
 	int32 _frameDelay;
 	byte *_paletteData;
 	bool _paletteChanged;
-	//
+	int16 _yOffset;
 	bool _fullRefresh;
 	RenderQueue *_renderQueue, *_prevRenderQueue;
 };
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index d7a244b..04959b4 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -44,7 +44,6 @@ void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) {
 	_drawRect.y = 0;
 	_drawRect.width = smackerFrame->w;
 	_drawRect.height = smackerFrame->h;
-	// TODO: Check if _sysRect is needed at all in the reimplementation...
 	_sysRect.x = 0;
 	_sysRect.y = 0;
 	_sysRect.width = (smackerFrame->w + 3) & 0xFFFC; // align by 4 bytes
@@ -66,7 +65,7 @@ void SmackerDoubleSurface::draw() {
 // SmackerPlayer
 
 SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused)
-	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false), _paused(paused),
+	: Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _videoDone(false), _paused(paused),
 	_palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true),
 	_drawX(-1), _drawY(-1) {
 
@@ -96,8 +95,6 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 
 	_stream = _vm->_res->createStream(fileHash);
 
-	// TODO: _keepLastFrame stuff
-
 	_smackerDecoder = new Video::SmackerDecoder();
 	_smackerDecoder->loadStream(_stream);
 	
@@ -164,11 +161,6 @@ void SmackerPlayer::update() {
 	if (!_smackerDecoder)
 		return;
 
-	if (_dirtyFlag) {
-		// TODO _vm->_screen->resetDirtyRects();
-		_dirtyFlag = false;
-	}
-
 	if (_paused) {
 		if (_smackerFirst)
 			updateFrame();
@@ -208,13 +200,6 @@ void SmackerPlayer::updateFrame() {
 		_smackerFirst = false;
 	}
 	
-	if (_doubleSurface) {
-		// TODO
-	}
-
-	// TODO _vm->_screen->_skipUpdate = true;
-	_dirtyFlag = true;
-	
 	if (_smackerDecoder->hasDirtyPalette())
 		updatePalette();
 		
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index 63c9ebb..b4d8ddb 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -73,7 +73,6 @@ protected:
 	Common::SeekableReadStream *_stream;
 	bool _keepLastFrame;
 	bool _videoDone;
-	bool _dirtyFlag;
 	bool _paused;
 	int _drawX, _drawY;
 	void update();
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 18f40dc..52783cc 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -166,7 +166,7 @@ void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) {
 	musicItem->_countdown = 24;
 	musicItem->_musicResource = new MusicResource(_vm);
 	musicItem->_musicResource->load(musicFileHash);
-	_musicItems.push_back(musicItem);
+	addMusicItem(musicItem);
 }
 
 void SoundMan::deleteMusic(uint32 musicFileHash) {
@@ -203,7 +203,7 @@ void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolume
 
 void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) {
 	SoundItem *soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 50, 600, false, 0, false, 0);
-	_soundItems.push_back(soundItem);
+	addSoundItem(soundItem);
 }
 
 void SoundMan::addSoundList(uint32 nameHash, const uint32 *soundFileHashList) {
@@ -337,8 +337,6 @@ void SoundMan::deleteMusicGroup(uint32 nameHash) {
 
 void SoundMan::deleteSoundGroup(uint32 nameHash) {
 
-	SoundItem *soundItem;
-
 	if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) {
 		deleteSoundByIndex(_soundIndex1);
 		_soundIndex1 = -1;
@@ -349,13 +347,9 @@ void SoundMan::deleteSoundGroup(uint32 nameHash) {
 		_soundIndex2 = -1;
 	}
 
-	for (uint index = 0; index < _soundItems.size(); ++index) {
-		soundItem = _soundItems[index];
-		if (soundItem && soundItem->_nameHash == nameHash) {
-			delete soundItem;
-			_soundItems[index] = NULL;
-		}
-	}
+	for (uint index = 0; index < _soundItems.size(); ++index)
+		if (_soundItems[index] && _soundItems[index]->_nameHash == nameHash)
+			deleteSoundByIndex(index);
 
 }
 
@@ -384,16 +378,14 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun
 		soundItem = new SoundItem(_vm, nameHash, soundFileHash1, false, 0, 0,
 			_playOnceAfterCountdown, _initialCountdown, false, currCountdown1);
 		soundItem->_soundResource->setVolume(80);
-		_soundIndex1 = _soundItems.size();
-		_soundItems.push_back(soundItem);
+		_soundIndex1 = addSoundItem(soundItem);
 	}
 
 	if (soundFileHash2 != 0) {
 		soundItem = new SoundItem(_vm, nameHash, soundFileHash2, false, 0, 0,
 			_playOnceAfterCountdown, _initialCountdown, false, currCountdown2);
 		soundItem->_soundResource->setVolume(80);
-		_soundIndex2 = _soundItems.size();
-		_soundItems.push_back(soundItem);
+		_soundIndex2 = addSoundItem(soundItem);
 	}
 
 }
@@ -410,8 +402,7 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) {
 	if (soundFileHash != 0) {
 		soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 0, 0,
 			false, _initialCountdown3, false, 0);
-		_soundIndex3 = _soundItems.size();
-		_soundItems.push_back(soundItem);
+		_soundIndex3 = addSoundItem(soundItem);
 	}
 	
 }
@@ -445,15 +436,26 @@ SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
 }
 
 int16 SoundMan::addMusicItem(MusicItem *musicItem) {
-	return 0; // TODO
+#if 0
+	for (uint i = 0; i < _musicItems.size(); ++i)
+		if (!_musicItems[i]) {
+			_musicItems[i] = musicItem;
+			return i;
+		}
+#endif		
+	int16 musicIndex = _musicItems.size();
+	_musicItems.push_back(musicItem);
+	return musicIndex;
 }
 
 int16 SoundMan::addSoundItem(SoundItem *soundItem) {
+#if 0
 	for (uint i = 0; i < _soundItems.size(); ++i)
 		if (!_soundItems[i]) {
 			_soundItems[i] = soundItem;
 			return i;
 		}
+#endif
 	int16 soundIndex = _soundItems.size();
 	_soundItems.push_back(soundItem);
 	return soundIndex;
@@ -541,6 +543,8 @@ int16 AudioResourceMan::addSound(uint32 fileHash) {
 
 void AudioResourceMan::removeSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
+		_vm->_mixer->stopHandle(soundItem->_soundHandle);
 	if (soundItem->_data) {
 		_vm->_res->unloadResource(soundItem->_resourceHandle);
 		soundItem->_data = NULL;
@@ -549,8 +553,6 @@ void AudioResourceMan::removeSound(int16 soundIndex) {
 		_vm->_res->unuseResource(soundItem->_resourceHandle);
 		soundItem->_resourceHandle = -1;
 	}
-	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
-		_vm->_mixer->stopHandle(soundItem->_soundHandle);
 	delete soundItem;
 	_soundItems[soundIndex] = NULL;
 }
@@ -565,6 +567,8 @@ void AudioResourceMan::loadSound(int16 soundIndex) {
 
 void AudioResourceMan::unloadSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
+	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
+		_vm->_mixer->stopHandle(soundItem->_soundHandle);
 	if (soundItem->_data) {
 		_vm->_res->unloadResource(soundItem->_resourceHandle);
 		soundItem->_data = NULL;
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index d034783..1e73078 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/sprite.h"
+#include "neverhood/screen.h"
 
 namespace Neverhood {
 
@@ -74,13 +75,6 @@ bool Sprite::checkCollision(NRect &rect) {
 }
 
 uint32 Sprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x0005:
-		// TODO: Draw debug marker (?)
-		// TODO g_Screen->drawLine(_x - 5, _y, _x + 6, _y);
-		// TODO g_Screen->drawLine(_x, _y - 5, _x, _y + 6);
-		break;
-	}
 	return 0;
 }
 
@@ -93,8 +87,7 @@ void Sprite::createSurface(int surfacePriority, int16 width, int16 height) {
 }
 
 int16 Sprite::defFilterY(int16 y) {
-	// TODO return y - g_screen->field_26;
-	return y;
+	return y - _vm->_screen->getYOffset();
 }
 
 void Sprite::setClipRect(int16 x1, int16 y1, int16 x2, int16 y2) {


Commit: 325c85fc41dd6a0dbf8050ef3e39fe8c91d8966a
    https://github.com/scummvm/scummvm/commit/325c85fc41dd6a0dbf8050ef3e39fe8c91d8966a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Fix Klaymen in Scene1403 (*facepalm*)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1400.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index be4f5d3..1d01cdd 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -373,7 +373,7 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 0;
+	_vm->gameState().sceneNum = 2;
 	createModule(1400, -1);
 #endif
 #if 0
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index db3acb6..e0cf2c5 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -1300,11 +1300,11 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (which < 0) {
 		// Restoring game
-		insertKlayman<KmScene1402>(380, 463);
+		insertKlayman<KmScene1403>(380, 463);
 		setMessageList(0x004B1F18);
 	} else {
 		// Klaymen entering from the right
-		insertKlayman<KmScene1402>(640, 463);
+		insertKlayman<KmScene1403>(640, 463);
 		setMessageList(0x004B1F20);
 	}
 	_klayman->setRepl(64, 0);


Commit: 370f00e808a907f940169ce28e4c391e45b4c2f0
    https://github.com/scummvm/scummvm/commit/370f00e808a907f940169ce28e4c391e45b4c2f0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: New _sceneNum in Module2800

- Very slightly improved the speed in SmackerPlayer::gotoFrame()

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h
    engines/neverhood/smackerplayer.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 1d01cdd..bd671ee 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -373,8 +373,8 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 2;
-	createModule(1400, -1);
+	_vm->gameState().sceneNum = 1;
+	createModule(2800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index c42e033..6500ae0 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -59,13 +59,15 @@ Module2800::~Module2800() {
 
 void Module2800::createScene(int sceneNum, int which) {
 	debug("Module2800::createScene(%d, %d)", sceneNum, which);
-	_vm->gameState().sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	_sceneNum = sceneNum;
+	switch (_sceneNum) {
 	case 0:
+		_vm->gameState().sceneNum = 0;
 		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
 		_childObject = new Scene2801(_vm, this, which);
 		break;
 	case 1:
+		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0);
 		if (getGlobalVar(V_RADIO_ENABLED))
 			_childObject = new Scene2802(_vm, this, which);
@@ -73,101 +75,124 @@ void Module2800::createScene(int sceneNum, int which) {
 			createStaticScene(0x000C6444, 0xC6440008);
 		break;
 	case 2:
+		_vm->gameState().sceneNum = 2;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
-		//setGlobalVar(V_KLAYMAN_SMALL,1);//DEBUG
 		if (getGlobalVar(V_KLAYMAN_SMALL))
 			_childObject = new Scene2803Small(_vm, this, which);
 		else
 			_childObject = new Scene2803(_vm, this, which);
 		break;
 	case 3:
+		_vm->gameState().sceneNum = 3;
 		_childObject = new Scene2804(_vm, this, which);
 		break;
 	case 4:
+		_vm->gameState().sceneNum = 4;
 		_vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2805(_vm, this, which);
 		break;
 	case 5:
+		_vm->gameState().sceneNum = 5;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2806(_vm, this, which);
 		break;
 	case 6:
+		_vm->gameState().sceneNum = 6;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2807(_vm, this, which);
 		break;
 	case 7:
+		_vm->gameState().sceneNum = 7;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2808(_vm, this, 0);
 		break;
 	case 8:
+		_vm->gameState().sceneNum = 8;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2809(_vm, this, which);
 		break;
 	case 9:
+		_vm->gameState().sceneNum = 9;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2810(_vm, this, which);
 		break;
 	case 10:
+		_vm->gameState().sceneNum = 10;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2808(_vm, this, 1);
 		break;
 	case 11:
+		_vm->gameState().sceneNum = 11;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2812(_vm, this, which);
 		break;
 	case 12:
+		_vm->gameState().sceneNum = 12;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x0000A245, 0x0A241008);
 		break;
 	case 13:
+		_vm->gameState().sceneNum = 13;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x81C60635, 0x60631814);
 		break;
 	case 14:
+		_vm->gameState().sceneNum = 14;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0xCA811204, 0x11200CA0);
 		break;
 	case 15:
+		_vm->gameState().sceneNum = 15;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x2D438A00, 0x38A042DC);
 		break;
 	case 16:
+		_vm->gameState().sceneNum = 16;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x0A806204, 0x062000A0);
 		break;
 	case 17:
+		_vm->gameState().sceneNum = 17;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x010F9284, 0xF9280018);
 		break;
 	case 18:
+		_vm->gameState().sceneNum = 18;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x0100022B, 0x0022F018);
 		break;
 	case 19:
+		_vm->gameState().sceneNum = 19;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x10866205, 0x66201100);
 		break;
 	case 20:
+		_vm->gameState().sceneNum = 20;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x01C58000, 0x58004014);
 		break;
 	case 21:
+		_vm->gameState().sceneNum = 21;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new Scene2822(_vm, this, which);
 		break;
 	case 22:
+		_vm->gameState().sceneNum = 22;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x9408121E, 0x8121A948);
 		break;
 	case 23:
+		_vm->gameState().sceneNum = 23;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x048C0600, 0xC0604040);
 		break;
 	case 24:
+		_vm->gameState().sceneNum = 24;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		createStaticScene(0x04270A94, 0x70A9004A);
 		break;
 	case 25:
+		_vm->gameState().sceneNum = 25;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		if (getGlobalVar(V_SHRINK_LIGHTS_ON))
 			createStaticScene(0x01600204, 0x0020001E);
@@ -175,6 +200,7 @@ void Module2800::createScene(int sceneNum, int which) {
 			createStaticScene(0x08611204, 0x1120008E);
 		break;
 	case 26:
+		_vm->gameState().sceneNum = 26;
 		_vm->_soundMan->startMusic(0xD2FA4D14, 0, 2);
 		_childObject = new DiskplayerScene(_vm, this, 4);
 		break;
@@ -189,7 +215,7 @@ void Module2800::createScene(int sceneNum, int which) {
 
 void Module2800::updateScene() {
 	if (!updateChild()) {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			if (_moduleResult != 2) {
 				if (_musicResource) {
@@ -359,7 +385,7 @@ void Module2800::updateScene() {
 			break;
 		}
 	} else {
-		switch (_vm->gameState().sceneNum) {
+		switch (_sceneNum) {
 		case 0:
 			updateMusic(true);
 			break;
@@ -402,6 +428,9 @@ void Module2800::updateMusic(bool halfVolume) {
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true) {
 
+	Sprite *_sprite1;
+	Sprite *_sprite2;
+
 	_vm->gameModule()->initRadioPuzzle();
 
 	SetMessageHandler(&Scene2801::handleMessage);
@@ -586,7 +615,7 @@ void Scene2802::update() {
 		changeTuneStatus(prevTuneStatus, _currTuneStatus);
 		
 	//DEBUG>>>
-	debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX));
+	//debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX));
 	//DEBUG<<<
 
 	if (getGlobalVar(V_RADIO_MOVE_DISH_VIDEO) && prevTuneStatus != _currTuneStatus && _currRadioMusicIndex != 0) {
@@ -1990,8 +2019,6 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[1].x1 = _sprite4->getDrawRect().x;
 	_clipRects[1].y1 = _sprite4->getDrawRect().y;
 	
-	_fieldEC = true;
-
 	tempSprite = insertStaticSprite(0xD2012C02, 1100);
 	_clipRects[2].x1 = tempSprite->getDrawRect().x;
 	_clipRects[2].y2 = tempSprite->getDrawRect().y2();
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index bdcb1ee..1dd7bca 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -36,7 +36,7 @@ public:
 	Module2800(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Module2800();
 protected:
-	bool _flag;
+	int _sceneNum;
 	uint32 _currentMusicFileHash;
 	MusicResource *_musicResource;
 	void createScene(int sceneNum, int which);
@@ -49,8 +49,6 @@ public:
 	Scene2801(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~Scene2801();
 protected:
-	Sprite *_sprite1;
-	Sprite *_sprite2;
 	Sprite *_asTape;
 	uint32 _paletteHash;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
@@ -301,7 +299,6 @@ protected:
 	NPointArray *_pointList;
 	int _pointIndex;
 	NRect _clipRects[4];
-	bool _fieldEC;
 	Sprite *_sprite1;
 	Sprite *_sprite2;
 	Sprite *_sprite3;
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 04959b4..85319dc 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -111,7 +111,7 @@ void SmackerPlayer::close() {
 		_smackerDecoder->stop();
 	delete _smackerDecoder;
 	delete _palette;
-	// NOTE: The SmackerDecoder deletes the _stream
+	// NOTE The SmackerDecoder deletes the _stream
 	delete _smackerSurface;
 	_smackerDecoder = NULL;
 	_palette = NULL;
@@ -125,7 +125,7 @@ void SmackerPlayer::gotoFrame(int frameNumber) {
 		if (frameNumber < _smackerDecoder->getCurFrame())
 			rewind();
 		while (_smackerDecoder->getCurFrame() != frameNumber)
-			updateFrame();
+			_smackerDecoder->decodeNextFrame();
 	}
 }
 
@@ -199,7 +199,7 @@ void SmackerPlayer::updateFrame() {
 		_smackerSurface->getDrawRect().y = _drawY;
 		_smackerFirst = false;
 	}
-	
+
 	if (_smackerDecoder->hasDirtyPalette())
 		updatePalette();
 		


Commit: 1b9807b312172b0cb31b2eb83b8afc5fd23f97f5
    https://github.com/scummvm/scummvm/commit/1b9807b312172b0cb31b2eb83b8afc5fd23f97f5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Remove more old comments

- Add the remaining idle stuff to Klayman

Changed paths:
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module1800.cpp



diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 572074b..d6d4de1 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -25,8 +25,6 @@
 
 namespace Neverhood {
 
-// TODO: Maybe move hash tables into neverhood.dat
-
 static const uint32 kDiskplayerPaletteFileHashes[] = {
 	0x03B78240,
 	0x34B32B08,
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index bd671ee..956d969 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -373,8 +373,9 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 1;
-	createModule(2800, -1);
+	_vm->gameState().sceneNum = 4;
+	_vm->gameState().which = 1;
+	createModule(1800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 81cec9f..2a8f543 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -34,7 +34,6 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h
 	_drawRect.y = 0;
 	_drawRect.width = width;
 	_drawRect.height = height;
-	// TODO: Check if _sysRect is needed at all in the reimplementation...
 	_sysRect.x = 0;
 	_sysRect.y = 0;
 	_sysRect.width = (width + 3) & 0xFFFC; // align by 4 bytes
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 782c376..9673adc 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -53,6 +53,11 @@ static const KlaymanIdleTableItem klaymanTable4[] = {
 	{1, &Klayman::stDoIdleHeadOff},
 };
 
+static const KlaymanIdleTableItem klaymanIdleTable1002[] = {
+	{1, &Klayman::stDoIdlePickEar},
+	{2, &Klayman::stIdleWonderAbout}
+}; 
+
 // Klayman
 
 Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
@@ -268,6 +273,16 @@ uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
+void Klayman::stIdleWonderAbout() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
+	SetUpdateHandler(&Klayman::update);
+	SetMessageHandler(&Klayman::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klayman::stStandAround);
+}
+
 void Klayman::stSitIdleTeleporter() {
 	_status2 = 0;
 	_acceptInput = true;
@@ -3421,7 +3436,7 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 void KmScene1002::xUpdate() {
 	if (_x >= 250 && _x <= 435 && _y >= 420) {
 		if (_idleTableNum == 0) {
-			// TODO setKlaymanIdleTable(stru_4B44C8);
+			setKlaymanIdleTable(klaymanIdleTable1002, ARRAYSIZE(klaymanIdleTable1002));
 			_idleTableNum = 1;
 		}
 	} else if (_idleTableNum == 1) {
@@ -3670,7 +3685,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
-	// TODO setKlaymanIdleTable(dword_4AEF10, 3);
+	setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
 	_flagF6 = true;
 	
 }
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index ab2c523..443bb97 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -77,6 +77,8 @@ public:
 	void stIdleHeadOff();
 	uint32 hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender);
 
+	void stIdleWonderAbout();
+
 	void stDoIdleTeleporterHands();
 	void stIdleTeleporterHands();
 	
diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp
index 30bffb9..dc5f942 100644
--- a/engines/neverhood/module1800.cpp
+++ b/engines/neverhood/module1800.cpp
@@ -163,7 +163,6 @@ void Module1800::updateScene() {
 		case 8:
 			// NOTE: After Klayman jumped into the hole and died...
 			leaveModule(1);
-			// TODO GameState stuff // Restarts the game?
 			break;
 		case 1009:
 			leaveModule(0);


Commit: cc015e3d24d15dc0c3532063927fd40e2329f43e
    https://github.com/scummvm/scummvm/commit/cc015e3d24d15dc0c3532063927fd40e2329f43e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Simplify resource loading

- Renamne and clean up

Changed paths:
    engines/neverhood/blbarchive.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/resourceman.cpp
    engines/neverhood/resourceman.h
    engines/neverhood/smackerscene.cpp
    engines/neverhood/sound.cpp
    engines/neverhood/sound.h
    engines/neverhood/sprite.cpp
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 5551ff0..02fad55 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -73,7 +73,7 @@ void BlbArchive::open(const Common::String &filename) {
 	if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size())
 		error("BlbArchive::open() %s seems to be corrupt", filename.c_str());
 
-	debug(2, "%s: fileCount = %d", filename.c_str(), header.fileCount);
+	debug(4, "%s: fileCount = %d", filename.c_str(), header.fileCount);
 
 	_entries.reserve(header.fileCount);
 
@@ -98,7 +98,7 @@ void BlbArchive::open(const Common::String &filename) {
 		entry.offset = _fd.readUint32LE();
 		entry.diskSize = _fd.readUint32LE();
 		entry.size = _fd.readUint32LE();
-		debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
+		debug(4, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X",
 			entry.fileHash, entry.type, entry.comprType, extDataOffsets[i], entry.timeStamp,
 			entry.offset, entry.diskSize, entry.size);
 	}
@@ -131,11 +131,8 @@ void BlbArchive::load(BlbArchiveEntry *entry, byte *buffer, uint32 size) {
 		_fd.read(buffer, size);
 		break;
 	case 3: // DCL-compressed
-		if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size)) {
-			debug("decompressDCL(diskSize: %d; size: %d)", entry->diskSize, entry->size);
-			debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry->fileHash, entry->type, entry->offset, entry->offset + entry->diskSize);
-			debug("-> fd.pos() = %08X", _fd.pos());
-		}
+		if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size))
+			error("BlbArchive::load() Error during decompression of %=8X", entry->fileHash);
 		break;
 	default:
 		error("BlbArchive::load() Unknown compression type %d", entry->comprType);
@@ -148,7 +145,6 @@ byte *BlbArchive::getEntryExtData(uint index) {
 }
 
 byte *BlbArchive::getEntryExtData(BlbArchiveEntry *entry) {
-	//return (_extData && entry->extDataOfs != 0) ? &_extData[entry->extDataOfs - 1] : NULL;
 	return entry->extData;
 }
 
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 956d969..e6f38f0 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -375,7 +375,7 @@ void GameModule::startup() {
 #if 1
 	_vm->gameState().sceneNum = 4;
 	_vm->gameState().which = 1;
-	createModule(1800, -1);
+	createModule(1000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 2a8f543..3b456a5 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -150,7 +150,7 @@ void ShadowSurface::draw() {
 
 // FontSurface
 
-FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
+FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
 	: BaseSurface(vm, 0, charWidth * 16, charHeight * numRows), _tracking(tracking), _numRows(numRows), _firstChar(firstChar),
 	_charWidth(charWidth), _charHeight(charHeight) {
 }
@@ -168,7 +168,7 @@ void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr)
 void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string) {
 	for (; *string != 0; string++) {
 		drawChar(destSurface, x, y, *string);
-		x += (*_tracking)[*string - _firstChar].x;
+		x += _tracking[*string - _firstChar].x;
 	}	
 }
 
@@ -216,7 +216,7 @@ enum BitmapFlags {
 	BF_HAS_IMAGE		= 16
 };
 
-void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) {
+void parseBitmapResource(const byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, const byte **palette, const byte **pixels) {
 
 	uint16 flags;
 	
@@ -263,7 +263,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin
 
 }
 
-void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor, byte newColor) {
+void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor, byte newColor) {
 
 	const bool replaceColors = oldColor != newColor;
 
@@ -313,7 +313,7 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi
 
 }
 
-void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
+void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
 
 	// TODO: Flip Y
 
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index b528690..65d25c0 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -131,11 +131,11 @@ protected:
 
 class FontSurface : public BaseSurface {
 public:
-	FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
+	FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
 	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
 	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string);
 protected:
-	NPointArray *_tracking;
+	NPointArray _tracking;
 	uint16 _numRows;
 	byte _firstChar;
 	uint16 _charWidth;
@@ -162,9 +162,9 @@ protected:
 
 // Misc
 
-void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels);
-void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor = 0, byte newColor = 0);
-void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
+void parseBitmapResource(const byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, const byte **palette, const byte **pixels);
+void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor = 0, byte newColor = 0);
+void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY);
 int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2);
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index c7c3fb2..caa4466 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1597,7 +1597,7 @@ FontSurface *Scene1005::createFontSurface() {
 	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
 	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
 	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
-	fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight);	
+	fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight);	
 	if (getGlobalVar(V_ENTRANCE_OPEN)) {
 		fontSprite.load2(0x283CE401);
 	} else {
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 8a7e346..8061e97 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2242,7 +2242,7 @@ void Scene2208::createFontSurface() {
 	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
 	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
 	spriteResource.load2(0x0800090C);
-	_fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight);
+	_fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight);
 	_fontSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 }
 
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 9a8a2f9..50b4b24 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -185,7 +185,7 @@ void Module2700::createScene(int sceneNum, int which) {
 	case 10:
 		_vm->gameState().sceneNum = 10;
 		_vm->gameState().which = which;
-		// TODO _vm->gameModule()->initScene2808Vars2();
+		_vm->gameModule()->initTestTubes2Puzzle();
 		_scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)];
 		_scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)];
 		_scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0)];
@@ -631,8 +631,8 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x1E086325, 1200);
 	clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2());
 
-	if (sceneInfo->class437Filename) {
-		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
+	if (sceneInfo->bgShadowFilename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
 		addEntity(_ssTrackShadowBackground);
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -898,8 +898,8 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	
 	_palStatus = 2;
 	
-	if (sceneInfo->class437Filename) {
-		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
+	if (sceneInfo->bgShadowFilename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
 		addEntity(_ssTrackShadowBackground);
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -1017,8 +1017,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 
 	insertMouse433(sceneInfo->mouseCursorFilename);
 	
-	if (sceneInfo->class437Filename) {
-		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->class437Filename);
+	if (sceneInfo->bgShadowFilename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
 		addEntity(_ssTrackShadowBackground);
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index 8e167dd..ffaa802 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -157,7 +157,6 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) {
 	uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos);
 	
 	switch (direction) {
-	// TODO: Merge cases 0 and 1?
 	case 0:
 		if (navigationItem.leftSmackerFileHash != 0) {
 			_smackerFileHash = navigationItem.leftSmackerFileHash;
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 208a157..c29cc7b 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -214,7 +214,7 @@ void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, in
 }
 
 void NeverhoodEngine::dumpAllResources() {
-
+#if 0
 	PaletteResource paletteResource(this);
 	byte *vgaPalette = new byte[768];
 	//paletteResource.load(0x4086520E);
@@ -258,7 +258,7 @@ void NeverhoodEngine::dumpAllResources() {
 	}
 	
 	delete[] vgaPalette;
-
+#endif
 }
 	
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 1246472..64f1061 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -20,6 +20,7 @@
  *
  */
 
+#include "common/algorithm.h"
 #include "common/memstream.h"
 #include "neverhood/resource.h"
 #include "neverhood/resourceman.h"
@@ -33,7 +34,7 @@ namespace Neverhood {
 // SpriteResource
 
 SpriteResource::SpriteResource(NeverhoodEngine *vm)
-	 : _vm(vm), _resourceHandle(-1), _pixels(NULL) {
+	 : _vm(vm), _pixels(NULL) {
 }
 
 SpriteResource::~SpriteResource() {
@@ -53,43 +54,30 @@ bool SpriteResource::load(uint32 fileHash) {
 	debug(2, "SpriteResource::load(%08X)", fileHash);
 	// TODO: Later merge with load2 and make the mode a parameter
 	unload();
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	debug(2, "SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle);
-	if (_resourceHandle != -1) {
-		if (_vm->_res->getResourceType(_resourceHandle) == 2) {
-			byte *spriteData = _vm->_res->loadResource(_resourceHandle, true);
-			parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels);
-		} else {
-			_vm->_res->unuseResource(_resourceHandle);
-			_resourceHandle = -1;
-		}
+	_vm->_res->queryResource(fileHash, _resourceHandle);
+	if (_resourceHandle.isValid() && _resourceHandle.type() == 2) {
+		_vm->_res->loadResource(_resourceHandle);
+		const byte *spriteData = _resourceHandle.data();
+		parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels);
 	} 
 	return _pixels != NULL;
 }
 
 bool SpriteResource::load2(uint32 fileHash) {
+	debug(2, "SpriteResource::load2(%08X)", fileHash);
 	unload();
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	if (_resourceHandle != -1) {
-		if (_vm->_res->getResourceType(_resourceHandle) == 2) {
-			byte *spriteData = _vm->_res->loadResource(_resourceHandle, true);
-			parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels);
-		} else {
-			_vm->_res->unuseResource(_resourceHandle);
-			_resourceHandle = -1;
-		}
+	_vm->_res->queryResource(fileHash, _resourceHandle);
+	if (_resourceHandle.isValid() && _resourceHandle.type() == 2) {
+		_vm->_res->loadResource(_resourceHandle);
+		const byte *spriteData = _resourceHandle.data();
+		parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels);
 	} 
 	return _pixels != NULL;
 }
 
 void SpriteResource::unload() {
-	if (_resourceHandle != -1) {
-		_vm->_res->unloadResource(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-	} else {
-		delete[] _pixels;
-	}
+	_vm->_res->unloadResource(_resourceHandle);
+	delete[] _pixels;
 	_pixels = NULL;
 	_rle = false;
 }
@@ -97,7 +85,7 @@ void SpriteResource::unload() {
 // PaletteResource
 
 PaletteResource::PaletteResource(NeverhoodEngine *vm)
-	: _vm(vm), _resourceHandle(-1), _palette(NULL) {
+	: _vm(vm), _palette(NULL) {
 }
 
 PaletteResource::~PaletteResource() {
@@ -107,33 +95,22 @@ PaletteResource::~PaletteResource() {
 bool PaletteResource::load(uint32 fileHash) {
 	debug(2, "PaletteResource::load(%08X)", fileHash);
 	unload();
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	if (_resourceHandle != -1) {
-		_palette = _vm->_res->loadResource(_resourceHandle, true);
-		switch (_vm->_res->getResourceType(_resourceHandle)) {
-		case 2:
-			// Palette is stored in a bitmap
+	_vm->_res->queryResource(fileHash, _resourceHandle);
+	if (_resourceHandle.isValid() &&
+		(_resourceHandle.type() == 2 || _resourceHandle.type() == 3)) {
+		_vm->_res->loadResource(_resourceHandle);
+		_palette = _resourceHandle.data();
+		// Check if the palette is stored in a bitmap
+		if (_resourceHandle.type() == 2)
 			parseBitmapResource(_palette, NULL, NULL, NULL, &_palette, NULL);
-			break;
-		case 3:
-			// _palette already points to the correct data
-			break;
-		default:
-			_vm->_res->unuseResource(_resourceHandle);
-			_resourceHandle = -1;
-			break;
-		}
-	} 
+
+	}
 	return _palette != NULL;
 }
 
 void PaletteResource::unload() {
-	if (_resourceHandle != -1) {
-		_vm->_res->unloadResource(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-		_palette = NULL;
-	}
+	_vm->_res->unloadResource(_resourceHandle);
+	_palette = NULL;
 }
 
 void PaletteResource::copyPalette(byte *destPalette) {
@@ -147,14 +124,12 @@ void PaletteResource::copyPalette(byte *destPalette) {
 // AnimResource
 
 AnimResource::AnimResource(NeverhoodEngine *vm)
-	: _vm(vm), _width(0), _height(0), _currSpriteData(NULL) {
-	
-	clear();
-	clear2();
+	: _vm(vm), _width(0), _height(0), _currSpriteData(NULL), _fileHash(0), _paletteData(NULL),
+	_spriteData(NULL), _replEnabled(false), _replOldColor(0), _replNewColor(0) {
 }
 
 AnimResource::~AnimResource() {
-	unloadInternal();
+	unload();
 }
 
 void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) {
@@ -175,27 +150,18 @@ bool AnimResource::load(uint32 fileHash) {
 		return true;
 
 	unload();
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	if (_resourceHandle == -1)
+	
+	_vm->_res->queryResource(fileHash, _resourceHandle);
+	if (!_resourceHandle.isValid() || _resourceHandle.type() != 4)
 		return false;
 	
-	byte *resourceData, *animList, *frameList;
+	const byte *resourceData, *animList, *frameList;
 	uint16 animInfoStartOfs, animListIndex, animListCount;
 	uint16 frameListStartOfs, frameCount;
 	uint32 spriteDataOfs, paletteDataOfs;
 
-	if (_vm->_res->getResourceType(_resourceHandle) != 4) {
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-		return false;
-	}
-	
-	resourceData = _vm->_res->loadResource(_resourceHandle);
-	if (!resourceData) {
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-		return false;
-	}
+	_vm->_res->loadResource(_resourceHandle);
+	resourceData = _resourceHandle.data();
 
 	animListCount = READ_LE_UINT16(resourceData);
 	animInfoStartOfs = READ_LE_UINT16(resourceData + 2);
@@ -212,8 +178,6 @@ bool AnimResource::load(uint32 fileHash) {
 	
 	if (animListIndex >= animListCount) {
 		_vm->_res->unloadResource(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
 		return false;
 	}
 
@@ -257,44 +221,22 @@ bool AnimResource::load(uint32 fileHash) {
 	}
 	
 	_fileHash = fileHash;
-	
+
 	return true;
 	
 }
 
 void AnimResource::unload() {
-	if (_resourceHandle != -1) {
-		_vm->_res->unloadResource(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		clear();
-	}
-}
-
-void AnimResource::clear() {
-	_resourceHandle = -1;
+	_vm->_res->unloadResource(_resourceHandle);
 	_currSpriteData = NULL;
 	_fileHash = 0;
 	_paletteData = NULL;
 	_spriteData = NULL;
-}
-
-void AnimResource::clear2() {
-	clear();
 	_replEnabled = true;
 	_replOldColor = 0;
 	_replNewColor = 0;
 }
 
-bool AnimResource::loadInternal(uint32 fileHash) {
-	unloadInternal();
-	return load(fileHash);
-}
-
-void AnimResource::unloadInternal() {
-	unload();
-	clear2();
-}
-
 int16 AnimResource::getFrameIndex(uint32 frameHash) {
 	int16 frameIndex = -1;
 	for (uint i = 0; i < _frames.size(); i++)
@@ -312,8 +254,10 @@ void AnimResource::setRepl(byte oldColor, byte newColor) {
 }
 
 NDimensions AnimResource::loadSpriteDimensions(uint32 fileHash) {
+	ResourceHandle resourceHandle;
 	NDimensions dimensions;
-	byte *resDimensions = _vm->_res->getResourceExtDataByHash(fileHash);
+	_vm->_res->queryResource(fileHash, resourceHandle);
+	const byte *resDimensions = resourceHandle.extData();
 	if (resDimensions) {
 		dimensions.width = READ_LE_UINT16(resDimensions + 0);
 		dimensions.height = READ_LE_UINT16(resDimensions + 2);
@@ -368,7 +312,7 @@ NDrawRect& MouseCursorResource::getRect() {
 void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) {
 	if (_cursorSprite.getPixels()) {
 		int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment
-		byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32;
+		const byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32;
 		for (int16 yc = 0; yc < 32; yc++) {
 			memcpy(dest, source, 32);
 			source += sourcePitch;
@@ -380,7 +324,7 @@ void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) {
 // TextResource
 
 TextResource::TextResource(NeverhoodEngine *vm)
-	: _vm(vm), _resourceHandle(-1), _textData(NULL), _count(0) {
+	: _vm(vm), _textData(NULL), _count(0) {
 	
 }
 
@@ -389,38 +333,20 @@ TextResource::~TextResource() {
 }
 
 void TextResource::load(uint32 fileHash) {
+	debug(2, "TextResource::load(%08X)", fileHash);
 	unload();
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	if (_resourceHandle != -1) {
-		if (_vm->_res->getResourceType(_resourceHandle) == 6) {
-			_textData = _vm->_res->loadResource(_resourceHandle, true);
-			_count = READ_LE_UINT32(_textData);
-			
-			debug("TEXT RESOURCE %08X, count = %d:", fileHash, _count);
-			for (uint i = 0; i < _count-1; i++) {
-				const char *textEnd, *text = getString(i, textEnd);
-				while (text < textEnd) {
-					debug("[%04d] [%s]", i, text);
-					text += strlen(text) + 1;
-				}
-				debug("------------------");
-			}
-			
-		} else {
-			_vm->_res->unuseResource(_resourceHandle);
-			_resourceHandle = -1;
-		}
+	_vm->_res->queryResource(fileHash, _resourceHandle);
+	if (_resourceHandle.isValid() && _resourceHandle.type() == 6) {
+		_vm->_res->loadResource(_resourceHandle);
+		_textData = _resourceHandle.data();
+		_count = READ_LE_UINT32(_textData);
 	}
 }
 
 void TextResource::unload() {
-	if (_resourceHandle != -1) {
-		_vm->_res->unloadResource(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-		_textData = NULL;
-		_count = 0;
-	}
+	_vm->_res->unloadResource(_resourceHandle);
+	_textData = NULL;
+	_count = 0;
 }
 
 const char *TextResource::getString(uint index, const char *&textEnd) {
@@ -432,7 +358,7 @@ const char *TextResource::getString(uint index, const char *&textEnd) {
 // DataResource
 
 DataResource::DataResource(NeverhoodEngine *vm)
-	: _vm(vm), _resourceHandle(-1) {
+	: _vm(vm) {
 }
 
 DataResource::~DataResource() {
@@ -441,18 +367,14 @@ DataResource::~DataResource() {
 
 void DataResource::load(uint32 fileHash) {
 	debug(2, "DataResource::load(%08X)", fileHash);
-	byte *data = NULL;
+	const byte *data = NULL;
 	uint32 dataSize = 0;
 	unload();
-	_resourceHandle = _vm->_res->useResource(fileHash);
-	if (_resourceHandle != -1) {
-		if (_vm->_res->getResourceType(_resourceHandle) == 5) {
-			data = _vm->_res->loadResource(_resourceHandle, true);
-			dataSize = _vm->_res->getResourceSize(_resourceHandle);
-		} else {
-			_vm->_res->unuseResource(_resourceHandle);
-			_resourceHandle = -1;
-		}
+	_vm->_res->queryResource(fileHash, _resourceHandle);
+	if (_resourceHandle.isValid() && _resourceHandle.type() == 5) {
+		_vm->_res->loadResource(_resourceHandle);
+		data = _resourceHandle.data();
+		dataSize = _resourceHandle.size();
 	}
 	if (data && dataSize) {
 		Common::MemoryReadStream dataS(data, dataSize);
@@ -588,40 +510,45 @@ void DataResource::load(uint32 fileHash) {
 }
 
 void DataResource::unload() {
-	if (_resourceHandle != -1) {
-		_vm->_res->unloadResource(_resourceHandle);
-		_vm->_res->unuseResource(_resourceHandle);
-		_resourceHandle = -1;
-		// TODO: Clear arrays
-	}
+	_vm->_res->unloadResource(_resourceHandle);
+	_directory.clear();
+	_points.clear();
+	for (Common::Array<NPointArray*>::iterator it = _pointArrays.begin(); it != _pointArrays.end(); ++it)
+		delete (*it);
+	_pointArrays.clear();
+	for (Common::Array<NRectArray*>::iterator it = _rectArrays.begin(); it != _rectArrays.end(); ++it)
+		delete (*it);
+	_rectArrays.clear();
+	for (Common::Array<HitRectList*>::iterator it = _hitRectLists.begin(); it != _hitRectLists.end(); ++it)
+		delete (*it);
+	_hitRectLists.clear();
+	for (Common::Array<MessageList*>::iterator it = _messageLists.begin(); it != _messageLists.end(); ++it)
+		delete (*it);
+	_messageLists.clear();
+	_drRects.clear();
+	for (Common::Array<DRSubRectList*>::iterator it = _drSubRectLists.begin(); it != _drSubRectLists.end(); ++it)
+		delete (*it);
+	_drSubRectLists.clear();
 }
 
 NPoint DataResource::getPoint(uint32 nameHash) {
 	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 1);
-	if (drDirectoryItem)
-		return _points[drDirectoryItem->offset];
-	return NPoint();
+	return drDirectoryItem ? _points[drDirectoryItem->offset] : NPoint();
 }
 
 NPointArray *DataResource::getPointArray(uint32 nameHash) {
 	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 2);
-	if (drDirectoryItem)
-		return _pointArrays[drDirectoryItem->offset];
-	return NULL;
+	return drDirectoryItem ? _pointArrays[drDirectoryItem->offset] : NULL;
 }
 
 NRectArray *DataResource::getRectArray(uint32 nameHash) {
 	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 3);
-	if (drDirectoryItem)
-		return _rectArrays[drDirectoryItem->offset];
-	return NULL;
+	return drDirectoryItem ? _rectArrays[drDirectoryItem->offset] : NULL;
 }
 
 HitRectList *DataResource::getHitRectList() {
 	DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(calcHash("HitArray"), 3);
-	if (drDirectoryItem)
-		return _hitRectLists[drDirectoryItem->offset];
-	return NULL;
+	return drDirectoryItem ? _hitRectLists[drDirectoryItem->offset] : NULL;
 }
 
 MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) {
@@ -642,10 +569,9 @@ MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, i
 }
 
 DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash, uint16 type) {
-	for (Common::Array<DRDirectoryItem>::iterator it = _directory.begin(); it != _directory.end(); it++) {
+	for (Common::Array<DRDirectoryItem>::iterator it = _directory.begin(); it != _directory.end(); it++)
 		if ((*it).nameHash == nameHash && (*it).type == type)
 			return &(*it);
-	}
 	return NULL;
 }
 
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 50a49e3..996579b 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -27,6 +27,7 @@
 #include "neverhood/neverhood.h"
 #include "neverhood/graphics.h"
 #include "neverhood/staticdata.h"
+#include "neverhood/resourceman.h"
 
 namespace Neverhood {
 
@@ -41,13 +42,13 @@ public:
 	const NDimensions& getDimensions() { return _dimensions; }
 	NPoint& getPosition() { return _position; }
 	bool isRle() const { return _rle; }
-	byte *getPixels() const { return _pixels; }
+	const byte *getPixels() const { return _pixels; }
 protected:
 	NeverhoodEngine *_vm;
-	int _resourceHandle;
+	ResourceHandle _resourceHandle;
 	NDimensions _dimensions;
 	NPoint _position;
-	byte *_pixels;
+	const byte *_pixels;
 	bool _rle;
 };
 
@@ -58,11 +59,11 @@ public:
 	bool load(uint32 fileHash);
 	void unload();
 	void copyPalette(byte *destPalette);
-	byte *palette() { return _palette; }
+	const byte *palette() { return _palette; }
 protected:
 	NeverhoodEngine *_vm;
-	int _resourceHandle;
-	byte *_palette;
+	ResourceHandle _resourceHandle;
+	const byte *_palette;
 };
 
 struct AnimFrameInfo {
@@ -82,9 +83,6 @@ public:
 	bool load(uint32 fileHash);
 	void unload();
 	void clear();
-	void clear2();
-	bool loadInternal(uint32 fileHash);
-	void unloadInternal();
 	uint getFrameCount() const { return _frames.size(); }
 	const AnimFrameInfo& getFrameInfo(int16 index) const { return _frames[index]; }
 	int16 getFrameIndex(uint32 frameHash);
@@ -93,12 +91,12 @@ public:
 	NDimensions loadSpriteDimensions(uint32 fileHash);
 protected:
 	NeverhoodEngine *_vm;
-	int _resourceHandle;
+	ResourceHandle _resourceHandle;
 	int16 _width, _height;
-	byte *_currSpriteData;
+	const byte *_currSpriteData;
 	uint32 _fileHash;
-	byte *_paletteData;
-	byte *_spriteData;
+	const byte *_paletteData;
+	const byte *_spriteData;
 	bool _replEnabled;
 	byte _replOldColor;
 	byte _replNewColor;
@@ -131,8 +129,8 @@ public:
 	uint getCount() const { return _count;}
 protected:
 	NeverhoodEngine *_vm;
-	int _resourceHandle;
-	byte *_textData;
+	ResourceHandle _resourceHandle;
+	const byte *_textData;
 	uint _count;
 };
 
@@ -178,7 +176,7 @@ protected:
 	typedef Common::Array<DRSubRect> DRSubRectList;
 
 	NeverhoodEngine *_vm;
-	int _resourceHandle;
+	ResourceHandle _resourceHandle;
 	Common::Array<DRDirectoryItem> _directory;
 	Common::Array<NPoint> _points;
 	Common::Array<NPointArray*> _pointArrays;
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index eb6aa01..3b67b26 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -24,6 +24,13 @@
 
 namespace Neverhood {
 
+ResourceHandle::ResourceHandle()
+	: _resourceFileEntry(NULL), _data(NULL) {
+}
+
+ResourceHandle::~ResourceHandle() {
+}
+
 ResourceMan::ResourceMan() {
 }
 
@@ -66,92 +73,43 @@ ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) {
 	return entry;
 }
 
-int ResourceMan::useResource(uint32 fileHash) {
-	ResourceFileEntry *entry = findEntry(fileHash);
-	if (!entry)
-		return -1;
-	if (entry->resourceHandle != -1) {
-		_resources[entry->resourceHandle]->useRefCount++;
-	} else {
-		Resource *resource = new Resource();
-		resource->entry = entry;
-		resource->useRefCount = 1;
-		entry->resourceHandle = (int)_resources.size();
-		_resources.push_back(resource);
-	}
-	return entry->resourceHandle;
-}
-
-void ResourceMan::unuseResource(int resourceHandle) {
-	if (resourceHandle < 0)
-		return;
-	Resource *resource = _resources[resourceHandle];
-	if (resource->useRefCount > 0)
-		resource->useRefCount--;
-}
-
-uint32 ResourceMan::getResourceSize(int resourceHandle) const {
-	if (resourceHandle < 0)
-		return 0;
-	Resource *resource = _resources[resourceHandle];
-	return resource->entry->archiveEntry->size;
-}
-
-byte ResourceMan::getResourceType(int resourceHandle) {
-	if (resourceHandle < 0)
-		return 0;
-	Resource *resource = _resources[resourceHandle];
-	return resource->entry->archiveEntry->type;
-}
-
-byte ResourceMan::getResourceTypeByHash(uint32 fileHash) {
+Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntry(fileHash);
-	return entry->archiveEntry->type;
-}
-
-byte *ResourceMan::getResourceExtData(int resourceHandle) {
-	if (resourceHandle < 0)
-		return NULL;
-	Resource *resource = _resources[resourceHandle];
-	return resource->entry->archive->getEntryExtData(resource->entry->archiveEntry);
+	return entry->archive->createStream(entry->archiveEntry);
 }
 
-byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) {
-	ResourceFileEntry *entry = findEntrySimple(fileHash);
-	return entry ? entry->archive->getEntryExtData(entry->archiveEntry) : NULL;
+void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) {
+	resourceHandle._resourceFileEntry = findEntry(fileHash);
 }
 
-byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) {
-	if (resourceHandle < 0)
-		return NULL;
-	Resource *resource = _resources[resourceHandle];
-	ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash];
-	if (!resourceData) {
-		resourceData = new ResourceData();
-		_data[resource->entry->archiveEntry->fileHash] = resourceData;
-	}
-	if (resourceData->data != NULL) {
-		resourceData->dataRefCount++;
-	} else {
-		resourceData->data = new byte[resource->entry->archiveEntry->size];
-		resource->entry->archive->load(resource->entry->archiveEntry, resourceData->data, 0);
-		resourceData->dataRefCount = 1;
+void ResourceMan::loadResource(ResourceHandle &resourceHandle) {
+	resourceHandle._data = NULL;
+	if (resourceHandle.isValid()) {
+		const uint32 fileHash = resourceHandle.fileHash();
+		ResourceData *resourceData = _data[fileHash];
+		if (!resourceData) {
+			resourceData = new ResourceData();
+			_data[fileHash] = resourceData;
+		}
+		if (resourceData->data != NULL) {
+			resourceData->dataRefCount++;
+		} else {
+			resourceData->data = new byte[resourceHandle._resourceFileEntry->archiveEntry->size];
+			resourceHandle._resourceFileEntry->archive->load(resourceHandle._resourceFileEntry->archiveEntry, resourceData->data, 0);
+			resourceData->dataRefCount = 1;
+		}
+		resourceHandle._data = resourceData->data;
 	}
-	return resourceData->data;
-}
-
-void ResourceMan::unloadResource(int resourceHandle) {
-	if (resourceHandle < 0)
-		return;
-	Resource *resource = _resources[resourceHandle];
-	ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash];
-	if (resourceData && resourceData->dataRefCount > 0)
-		resourceData->dataRefCount--;
 }
 
-Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) {
-	ResourceFileEntry *entry = findEntry(fileHash);
-	return entry->archive->createStream(entry->archiveEntry);
+void ResourceMan::unloadResource(ResourceHandle &resourceHandle) {
+	if (resourceHandle.isValid()) {
+		ResourceData *resourceData = _data[resourceHandle.fileHash()];
+		if (resourceData && resourceData->dataRefCount > 0)
+			--resourceData->dataRefCount;
+		resourceHandle._resourceFileEntry = NULL;
+		resourceHandle._data = NULL;
+	}
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index 5ca8fa2..515849e 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -48,20 +48,23 @@ struct ResourceData {
 	ResourceData() : data(NULL), dataRefCount() {}
 };
 
-#if 0
 class ResourceMan;
 
 struct ResourceHandle {
+friend class ResourceMan;
 public:
 	ResourceHandle();
 	~ResourceHandle();
-	const byte *data();
-	uint32 size() const { return _archiveEntry ? _archiveEntry->size : 0 };
+	bool isValid() const { return _resourceFileEntry != NULL && _resourceFileEntry->archiveEntry != NULL; }
+	byte type() const { return isValid() ? _resourceFileEntry->archiveEntry->type : 0; };
+	const byte *data() const { return _data; }
+	uint32 size() const { return isValid() ? _resourceFileEntry->archiveEntry->size : 0; };
+	const byte *extData() const { return isValid() ? _resourceFileEntry->archiveEntry->extData : NULL; };
+	uint32 fileHash() const { return isValid() ? _resourceFileEntry->archiveEntry->fileHash : 0; };
 protected:
-	ResourceMan *_res;
 	ResourceFileEntry *_resourceFileEntry;
+	const byte *_data;
 };
-#endif
 
 class ResourceMan {
 public:
@@ -70,21 +73,12 @@ public:
 	void addArchive(const Common::String &filename);
 	ResourceFileEntry *findEntrySimple(uint32 fileHash);
 	ResourceFileEntry *findEntry(uint32 fileHash);
-	int useResource(uint32 fileHash);
-	void unuseResource(int resourceHandle);
-	uint32 getResourceSize(int resourceHandle) const;
-	byte getResourceType(int resourceHandle);
-	byte getResourceTypeByHash(uint32 fileHash);
-	byte *getResourceExtData(int resourceHandle);
-	byte *getResourceExtDataByHash(uint32 fileHash);
-	byte *loadResource(int resourceHandle, bool moveToFront = false);
-	void unloadResource(int resourceHandle);
 	Common::SeekableReadStream *createStream(uint32 fileHash);
 	const ResourceFileEntry& getEntry(uint index) { return _entries[index]; }
 	uint getEntryCount() { return _entries.size(); }
-#if 0	
-	ResourceHandle getResource(uint32 fileHash);
-#endif
+	void queryResource(uint32 fileHash, ResourceHandle &resourceHandle);
+	void loadResource(ResourceHandle &resourceHandle);
+	void unloadResource(ResourceHandle &resourceHandle);
 protected:
 	typedef Common::HashMap<uint32, ResourceFileEntry> EntriesMap;
 	Common::Array<BlbArchive*> _archives;
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 0ed6890..a08aad4 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -70,7 +70,9 @@ void SmackerScene::nextVideo() {
 	
 	if (_fileHashList && _fileHashList[_fileHashListIndex] != 0) {
 		uint32 smackerFileHash = _fileHashList[_fileHashListIndex];
-		if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) {
+		ResourceHandle resourceHandle;
+		_vm->_res->queryResource(smackerFileHash, resourceHandle);
+		if (resourceHandle.type() != 10) {
 			// Not a Smacker file
 			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, 0);
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 52783cc..f0961f4 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -524,7 +524,7 @@ AudioResourceMan::~AudioResourceMan() {
 
 int16 AudioResourceMan::addSound(uint32 fileHash) {
 	AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem();
-	soundItem->_resourceHandle = _vm->_res->useResource(fileHash);
+	_vm->_res->queryResource(fileHash, soundItem->_resourceHandle);
 	soundItem->_fileHash = fileHash;
 	soundItem->_data = NULL;
 	soundItem->_isLoaded = false;
@@ -543,16 +543,7 @@ int16 AudioResourceMan::addSound(uint32 fileHash) {
 
 void AudioResourceMan::removeSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
-		_vm->_mixer->stopHandle(soundItem->_soundHandle);
-	if (soundItem->_data) {
-		_vm->_res->unloadResource(soundItem->_resourceHandle);
-		soundItem->_data = NULL;
-	}
-	if (soundItem->_resourceHandle != 1) {
-		_vm->_res->unuseResource(soundItem->_resourceHandle);
-		soundItem->_resourceHandle = -1;
-	}
+	unloadSound(soundIndex);
 	delete soundItem;
 	_soundItems[soundIndex] = NULL;
 }
@@ -561,7 +552,8 @@ void AudioResourceMan::loadSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
 	if (!soundItem->_data) {
 		// TODO Check if it's a sound resource
-		soundItem->_data = _vm->_res->loadResource(soundItem->_resourceHandle);
+		_vm->_res->loadResource(soundItem->_resourceHandle);
+		soundItem->_data = soundItem->_resourceHandle.data();
 	}
 }
 
@@ -569,10 +561,8 @@ void AudioResourceMan::unloadSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
 	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
 		_vm->_mixer->stopHandle(soundItem->_soundHandle);
-	if (soundItem->_data) {
-		_vm->_res->unloadResource(soundItem->_resourceHandle);
-		soundItem->_data = NULL;
-	}
+	_vm->_res->unloadResource(soundItem->_resourceHandle);
+	soundItem->_data = NULL;
 }
 
 void AudioResourceMan::setSoundVolume(int16 soundIndex, int16 volume) {
@@ -597,9 +587,8 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
 	if (!soundItem->_data)
 		return;
 		
-	uint32 soundSize = _vm->_res->getResourceSize(soundItem->_resourceHandle);
-	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundSize, DisposeAfterUse::NO);
-	byte *shiftValue = _vm->_res->getResourceExtData(soundItem->_resourceHandle);
+	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO);
+	const byte *shiftValue = soundItem->_resourceHandle.extData();
 	NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream);
 
 	_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle,
@@ -719,8 +708,10 @@ void AudioResourceMan::updateMusicItem(int16 musicIndex) {
 	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
 
 	if (musicItem->_start && !_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
+		ResourceHandle resourceHandle;
+		_vm->_res->queryResource(musicItem->_fileHash, resourceHandle);
 		Common::SeekableReadStream *stream = _vm->_res->createStream(musicItem->_fileHash);
-		byte *shiftValue = _vm->_res->getResourceExtDataByHash(musicItem->_fileHash);
+		const byte *shiftValue = resourceHandle.extData();
 		NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream);
 		_vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &musicItem->_soundHandle,
 			audioStream, -1, VOLUME(musicItem->_isFadingIn ? musicItem->_fadeVolume : musicItem->_volume),
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index 1f0940c..8bfd5af 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -184,8 +184,8 @@ private:
 
 struct AudioResourceManSoundItem {
 	uint32 _fileHash;
-	int _resourceHandle;
-	byte *_data;
+	ResourceHandle _resourceHandle;
+	const byte *_data;
 	bool _isLoaded;
 	bool _isPlaying;
 	int16 _volume;
@@ -195,8 +195,6 @@ struct AudioResourceManSoundItem {
 
 struct AudioResourceManMusicItem {
 	uint32 _fileHash;
-	// streamIndex dw
-	// needCreate db
 	bool _isPlaying;
 	bool _remove;
 	int16 _volume;
@@ -207,8 +205,6 @@ struct AudioResourceManMusicItem {
 	int16 _fadeVolume;
 	int16 _fadeVolumeStep;
 	Audio::SoundHandle _soundHandle;
-	// status dw
-	// updateCounter dd
 };
 
 class AudioResourceMan {
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 1e73078..c7676ce 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -263,10 +263,10 @@ void AnimatedSprite::updateAnim() {
 			if (_currFrameTicks != 0 && (--_currFrameTicks == 0) && _animResource.getFrameCount() != 0) {
 				
 				if (_nextAnimFileHash != 0) {
-					if (_animResource.loadInternal(_nextAnimFileHash)) {
+					if (_animResource.load(_nextAnimFileHash)) {
 						_currAnimFileHash = _nextAnimFileHash;
 					} else {
-						_animResource.loadInternal(calcHash("sqDefault"));
+						_animResource.load(calcHash("sqDefault"));
 						_currAnimFileHash = 0;
 					}
 					if (_replOldColor != _replNewColor) {
@@ -294,10 +294,10 @@ void AnimatedSprite::updateAnim() {
 			_currStickFrameIndex = _currFrameIndex;
 		} else {
 			if (_animStatus == 1) {
-				if (_animResource.loadInternal(_newAnimFileHash)) {
+				if (_animResource.load(_newAnimFileHash)) {
 					_currAnimFileHash = _newAnimFileHash;
 				} else {
-					_animResource.loadInternal(calcHash("sqDefault"));
+					_animResource.load(calcHash("sqDefault"));
 					_currAnimFileHash = 0;
 				}
 				if (_replOldColor != _replNewColor) {
@@ -307,10 +307,10 @@ void AnimatedSprite::updateAnim() {
 				_currFrameIndex = _plFirstFrameHash != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_plFirstFrameHash)) : 0;
 				_lastFrameIndex = _plLastFrameHash != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_plLastFrameHash)) : _animResource.getFrameCount() - 1;
 			} else {
-				if (_animResource.loadInternal(_newAnimFileHash)) {
+				if (_animResource.load(_newAnimFileHash)) {
 					_currAnimFileHash = _newAnimFileHash;
 				} else {
-					_animResource.loadInternal(calcHash("sqDefault"));
+					_animResource.load(calcHash("sqDefault"));
 					_currAnimFileHash = 0;
 				}
 				if (_replOldColor != _replNewColor) {
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 1a633e2..31f9f5e 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -147,7 +147,7 @@ void StaticData::load(const char *filename) {
 		SceneInfo2700 *sceneInfo2700 = new SceneInfo2700();
 		uint32 id = fd.readUint32LE();
 		sceneInfo2700->bgFilename = fd.readUint32LE();
-		sceneInfo2700->class437Filename = fd.readUint32LE();
+		sceneInfo2700->bgShadowFilename = fd.readUint32LE();
 		sceneInfo2700->dataResourceFilename = fd.readUint32LE();
 		sceneInfo2700->pointListName = fd.readUint32LE();
 		sceneInfo2700->rectListName = fd.readUint32LE();
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index 69a407b..f9a8b71 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -80,7 +80,7 @@ struct HallOfRecordsInfo {
 struct SceneInfo2700 {
 	uint32 id;
 	uint32 bgFilename;
-	uint32 class437Filename;
+	uint32 bgShadowFilename;
 	uint32 dataResourceFilename;
 	uint32 pointListName;
 	uint32 rectListName;


Commit: b2934eb166ba5b442a93969ad8b4dfbbc6ef3314
    https://github.com/scummvm/scummvm/commit/b2934eb166ba5b442a93969ad8b4dfbbc6ef3314
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Fix Klaymen "grow" animation after drinking the potion

- Remove static sprite 0x50C027A8 Scene2803/Scene2803Small because the resource doesn't exist!
- Remove some old comments
- Fix resource extData handling which fixes some crashes
- Enable reusing deleted sound/music slots in SoundMan (was disabled for debugging)

Changed paths:
    engines/neverhood/blbarchive.cpp
    engines/neverhood/entity.cpp
    engines/neverhood/entity.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/module2800.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resourceman.cpp
    engines/neverhood/resourceman.h
    engines/neverhood/sound.cpp
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 02fad55..748d04c 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -91,7 +91,6 @@ void BlbArchive::open(const Common::String &filename) {
 		BlbArchiveEntry &entry = _entries[i];
 		entry.type = _fd.readByte();
 		entry.comprType = _fd.readByte();
-		//entry.extDataOfs = _fd.readUint16LE();
 		entry.extData = NULL;
 		extDataOffsets[i] = _fd.readUint16LE(); 
 		entry.timeStamp = _fd.readUint32LE();
@@ -132,7 +131,7 @@ void BlbArchive::load(BlbArchiveEntry *entry, byte *buffer, uint32 size) {
 		break;
 	case 3: // DCL-compressed
 		if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size))
-			error("BlbArchive::load() Error during decompression of %=8X", entry->fileHash);
+			error("BlbArchive::load() Error during decompression of %08X", entry->fileHash);
 		break;
 	default:
 		error("BlbArchive::load() Unknown compression type %d", entry->comprType);
diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index 29524f8..c7f1659 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -46,11 +46,6 @@ Entity *MessageParam::asEntity() const {
 	return _entity; 
 }
 
-// TODO: Disable heavy debug stuff in release mode
-
-#define SetUpdateHandler(handler) _updateHandlerCb = static_cast <void (Entity::*)(void)> (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler
-#define SetMessageHandler(handler) _messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler
-
 Entity::Entity(NeverhoodEngine *vm, int priority)
 	: _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL) {
 }
@@ -63,13 +58,13 @@ void Entity::draw() {
 }
 
 void Entity::handleUpdate() {
-	debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str());
+	debug(5, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str());
 	if (_updateHandlerCb)
 		(this->*_updateHandlerCb)();
 }
 
 uint32 Entity::receiveMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
+	debug(5, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str());
 	return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0;
 }
 
diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h
index 89a1a42..fb8941a 100644
--- a/engines/neverhood/entity.h
+++ b/engines/neverhood/entity.h
@@ -61,12 +61,12 @@ protected:
 
 #define SetUpdateHandler(handler)												\
 	_updateHandlerCb = static_cast <void (Entity::*)(void)> (handler);			\
-	debug(2, "SetUpdateHandler(" #handler ")");									\
+	debug(5, "SetUpdateHandler(" #handler ")");									\
 	_updateHandlerCbName = #handler
 
 #define SetMessageHandler(handler)												\
 	_messageHandlerCb = static_cast <uint32 (Entity::*)(int messageNum, const MessageParam &param, Entity *sender)> (handler);	\
-	debug(2, "SetMessageHandler(" #handler ")");								\
+	debug(5, "SetMessageHandler(" #handler ")");								\
 	_messageHandlerCbName = #handler
 
 const uint kMaxSoundResources = 16;
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index e6f38f0..5cb9198 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -358,6 +358,8 @@ void GameModule::startup() {
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 2, 2);
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 3, 0);
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4);
+	setGlobalVar(V_KLAYMAN_SMALL, 1);
+	setGlobalVar(V_SHRINK_LIGHTS_ON, 0);
 	// <<<DEBUG
 
 #if 0
@@ -369,13 +371,13 @@ void GameModule::startup() {
 	*/
 
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 28;
-	createModule(2700, -1);
+	_vm->gameState().sceneNum = 2;
+	createModule(2800, -1);
 #endif
 #if 1
-	_vm->gameState().sceneNum = 4;
-	_vm->gameState().which = 1;
-	createModule(1000, -1);
+	_vm->gameState().sceneNum = 5;
+	_vm->gameState().which = 0;
+	createModule(2800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 0;
@@ -416,7 +418,6 @@ void GameModule::startup() {
 	createModule(2700, -1);
 #endif
 #if 0
-	setGlobalVar(V_KLAYMAN_SMALL, 1); // DEBUG Make Klayman small
 	_vm->gameState().sceneNum = 2;
 	createModule(2800, -1);
 #endif
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 9673adc..39d38c3 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -2212,16 +2212,16 @@ uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *
 	return messageResult;
 }
 
-void Klayman::sub421230() {//stGrow
+void Klayman::stFinishGrow() {
 	_status2 = 2;
 	_acceptInput = false;
-	startAnimationByHash(0x38445000, 0, -1);
+	startAnimation(0x38445000, 0, -1);
 	SetUpdateHandler(&Klayman::update);
 	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::handleMessage41F1D0);
+	SetMessageHandler(&Klayman::hmFinishGrow);
 }
 
-uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender) {
+uint32 Klayman::hmFinishGrow(int messageNum, const MessageParam &param, Entity *sender) {
 	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x100D:
@@ -5728,7 +5728,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4804:
 		if (param.asInteger() == 3)
-			GotoState(&Klayman::sub421230);
+			GotoState(&Klayman::stFinishGrow);
 		break;
 	case 0x480D:
 		GotoState(&Klayman::stPullCord);
@@ -5882,11 +5882,11 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-
-	_surface->setClipRects(clipRects, clipRectsCount);
 
 	if (flag) {
+		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
+		delete _surface;
+		createSurface(1000, dimensions.width, dimensions.height);
 		loadSound(3, 0x58E0C341);
 		loadSound(4, 0x40A00342);
 		loadSound(5, 0xD0A1C348);
@@ -5895,6 +5895,7 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	}
 	
 	_dataResource.load(0x98182003);
+	_surface->setClipRects(clipRects, clipRectsCount);
 
 }
 
@@ -5943,9 +5944,10 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	bool flag, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
-	_surface->setClipRects(clipRects, clipRectsCount);
-
 	if (flag) {
+		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
+		delete _surface;
+		createSurface(1000, dimensions.width, dimensions.height);
 		loadSound(3, 0x58E0C341);
 		loadSound(4, 0x40A00342);
 		loadSound(5, 0xD0A1C348);
@@ -5954,6 +5956,7 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1
 	}
 
 	_dataResource.load(0x1830009A);
+	_surface->setClipRects(clipRects, clipRectsCount);
 	
 }
 
@@ -6070,7 +6073,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x4804:
 		if (param.asInteger() == 3)
-			GotoState(&Klayman::sub421230);
+			GotoState(&Klayman::stFinishGrow);
 		break;
 	case NM_KLAYMAN_PICKUP:
 		GotoState(&Klayman::stPickUpGeneric);
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 443bb97..3b08108 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -319,8 +319,8 @@ public:
 	void stTurnToBackSmall();
 	uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender);
 
-	void sub421230();//stGrow??
-	uint32 handleMessage41F1D0(int messageNum, const MessageParam &param, Entity *sender);
+	void stFinishGrow();
+	uint32 hmFinishGrow(int messageNum, const MessageParam &param, Entity *sender);
 	
 	void stJumpToRingVenusFlyTrap();
 	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 6500ae0..fb437fd 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -661,9 +661,6 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam &param, Entit
 		if (prevTuneStatus != _currTuneStatus)
 			changeTuneStatus(prevTuneStatus, _currTuneStatus);
 		break;
-	case 0x000D:
-		// DEBUG message
-		break;
 	}
 	return 0;
 }
@@ -1035,7 +1032,6 @@ void Scene2803::toggleBackground() {
 }
 
 void Scene2803::changeBackground() {
-	// TODO? g_screen->resetDirtyRects();
 	if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 		_asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D);
 		_background->load(0x412A423E);
@@ -1050,16 +1046,14 @@ void Scene2803::changeBackground() {
 		_mouseCursor->updateCursor();
 		_sprite8->loadSprite(0x3C42022F);
 		_sprite9->loadSprite(0x341A0237);
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0)
 			_asTestTubeOne->loadSprite(0x66121222);
-		} else
+		else
 			sendMessage(_asTestTubeOne, 0x2000, 0);
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 			_asTestTubeTwo->loadSprite(0x64330236);
-		}
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 			_asTestTubeThree->loadSprite(0x2E4A22A2);
-		}
 		_sprite10->setVisible(true);
 	} else {
 		_asLightCord->setFileHashes(0xAFAD591A, 0x276E321D);
@@ -1075,16 +1069,12 @@ void Scene2803::changeBackground() {
 		_mouseCursor->updateCursor();
 		_sprite8->loadSprite(0x108012C1);
 		_sprite9->loadSprite(0x708072E0);
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
-			_asTestTubeOne->loadSprite(0x50C027A8);
-		} else
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0)
 			sendMessage(_asTestTubeOne, 0x2000, 1);
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 			_asTestTubeTwo->loadSprite(0xD48077A0);
-		}
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 			_asTestTubeThree->loadSprite(0x30022689);
-		}
 		_sprite10->setVisible(false);
 	}
 	updatePaletteArea();
@@ -1144,18 +1134,14 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 		_sprite5 = insertStaticSprite(0x34422912, 1100);
 		_sprite6 = insertStaticSprite(0x3C42022F, 1100);
 		_sprite7 = insertStaticSprite(0x341A0237, 1100);
-
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0)
 			insertStaticSprite(0x66121222, 100);
 		else
 			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326);
-
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 			insertStaticSprite(0x64330236, 100);
-
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 			insertStaticSprite(0x2E4A22A2, 100);
-
 	} else {
 		setBackground(0x29800A01);
 		setPalette(0x29800A01);
@@ -1169,19 +1155,12 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 		_sprite6 = insertStaticSprite(0x108012C1, 1100);
 		_sprite7 = insertStaticSprite(0x708072E0, 1100);
 		insertStaticSprite(0x90582EA4, 100);
-
-		setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0, 1);//DEBUG, FIXME crashes when not done?!
-		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0)
-			insertStaticSprite(0x50C027A8, 100);
-		else
+		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0)
 			insertSprite<AnimatedSprite>(kScene2803SmallFileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326);
-
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3)
 			insertStaticSprite(0xD48077A0, 100);
-
 		if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3)
 			insertStaticSprite(0x30022689, 100);
-
 	}
 	
 	_sprite6->setVisible(false);
@@ -1992,6 +1971,8 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	Sprite *tempSprite;
 
+	which = 3;
+
 	SetMessageHandler(&Scene2806::handleMessage);
 	SetUpdateHandler(&Scene2806::update);
 	
@@ -2023,7 +2004,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[2].x1 = tempSprite->getDrawRect().x;
 	_clipRects[2].y2 = tempSprite->getDrawRect().y2();
 	_clipRects[3].y1 = tempSprite->getDrawRect().y2();
-	_clipRects[1].x2 = tempSprite->getDrawRect().x2();
+	_clipRects[1].x2 = tempSprite->getDrawRect().x;
 
 	tempSprite = insertStaticSprite(0x72875F42, 1100);
 	_clipRects[3].x1 = tempSprite->getDrawRect().x;
@@ -2038,6 +2019,9 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[2].x2 = 640;
 	_clipRects[3].x2 = 640;
 
+	for (uint i = 0; i < 4; i++)
+		debug("clipRect[%d] (%d, %d, %d, %d)", i, _clipRects[i].x1, _clipRects[i].y1, _clipRects[i].x2, _clipRects[i].y2);
+
 	if (which < 0) {
 		insertKlayman<KmScene2806>(441, 423, false, _clipRects, 4);
 		setMessageList(0x004AF098);
@@ -2288,25 +2272,21 @@ uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam &pa
 }
 
 void AsScene2808TestTube::fill() {
-
-
-	if ((int)_fillLevel < _testTubeSetNum * 3 + 3)
-		return;
-		
-	if (_testTubeSetNum == 0) {
-		playSound(_fillLevel);
-		setVisible(true);
-		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]);
-		_newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1];
-	} else {
-		playSound(3 + _fillLevel);
-		setVisible(true);
-		startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]);
-		_newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1];
+	if ((int)_fillLevel < _testTubeSetNum * 3 + 3) {
+		if (_testTubeSetNum == 0) {
+			playSound(_fillLevel);
+			setVisible(true);
+			startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]);
+			_newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1];
+		} else {
+			playSound(3 + _fillLevel);
+			setVisible(true);
+			startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]);
+			_newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1];
+		}
+		_ssDispenser->startCountdown(_fillLevel);
+		_fillLevel++;
 	}
-	_ssDispenser->startCountdown(_fillLevel);
-	_fillLevel++;
-
 }
 
 void AsScene2808TestTube::flush() {
@@ -2446,13 +2426,12 @@ void AsScene2808LightEffect::update() {
 Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule, true), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) {
 
-	Sprite *tempSprite;
+	Sprite *asHandle;
 
-	if (which == 0) {
+	if (which == 0)
 		_vm->gameModule()->initTestTubes1Puzzle();
-	} else {
+	else
 		_vm->gameModule()->initTestTubes2Puzzle();
-	}
 	
 	SetMessageHandler(&Scene2808::handleMessage);
 	SetUpdateHandler(&Scene2808::update);
@@ -2460,8 +2439,8 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(kScene2808FileHashes1[which]);
 	setPalette(kScene2808FileHashes1[which]);
 
-	tempSprite = insertSprite<AsScene2808Handle>(this, which);
-	_vm->_collisionMan->addSprite(tempSprite);
+	asHandle = insertSprite<AsScene2808Handle>(this, which);
+	_vm->_collisionMan->addSprite(asHandle);
 
 	_asFlow = insertSprite<AsScene2808Flow>(this, which);
 	insertSprite<AsScene2808LightEffect>(which);
@@ -2513,9 +2492,14 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam &param, Entit
 void Scene2808::update() {
 
 	// DEBUG>>> Show correct values
+	#if 1
 	debug("---------------");
-	debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2));
+	if (_testTubeSetNum == 0)
+		debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2));
+	else
+		debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2));
 	debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel());
+	#endif
 	// DEBUG<<<
 	
 	Scene::update();
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 64f1061..7f897a4 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -162,7 +162,7 @@ bool AnimResource::load(uint32 fileHash) {
 
 	_vm->_res->loadResource(_resourceHandle);
 	resourceData = _resourceHandle.data();
-
+	
 	animListCount = READ_LE_UINT16(resourceData);
 	animInfoStartOfs = READ_LE_UINT16(resourceData + 2);
 	spriteDataOfs = READ_LE_UINT32(resourceData + 4);
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 3b67b26..c30e272 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -66,8 +66,10 @@ ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) {
 	return p != _entries.end() ? &(*p)._value : NULL;
 }
 
-ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) {
+ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash, ResourceFileEntry **firstEntry) {
 	ResourceFileEntry *entry = findEntrySimple(fileHash);
+	if (firstEntry)
+		*firstEntry = entry;
 	for (; entry && entry->archiveEntry->comprType == 0x65; fileHash = entry->archiveEntry->diskSize)
 		entry = findEntrySimple(fileHash);
 	return entry;
@@ -79,7 +81,9 @@ Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) {
 }
 
 void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) {
-	resourceHandle._resourceFileEntry = findEntry(fileHash);
+	ResourceFileEntry *firstEntry;
+	resourceHandle._resourceFileEntry = findEntry(fileHash, &firstEntry);
+	resourceHandle._extData = firstEntry ? firstEntry->archiveEntry->extData : NULL;
 }
 
 void ResourceMan::loadResource(ResourceHandle &resourceHandle) {
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index 515849e..e83de24 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -59,10 +59,11 @@ public:
 	byte type() const { return isValid() ? _resourceFileEntry->archiveEntry->type : 0; };
 	const byte *data() const { return _data; }
 	uint32 size() const { return isValid() ? _resourceFileEntry->archiveEntry->size : 0; };
-	const byte *extData() const { return isValid() ? _resourceFileEntry->archiveEntry->extData : NULL; };
+	const byte *extData() const { return _extData; };
 	uint32 fileHash() const { return isValid() ? _resourceFileEntry->archiveEntry->fileHash : 0; };
 protected:
 	ResourceFileEntry *_resourceFileEntry;
+	const byte *_extData;
 	const byte *_data;
 };
 
@@ -72,7 +73,7 @@ public:
 	~ResourceMan();
 	void addArchive(const Common::String &filename);
 	ResourceFileEntry *findEntrySimple(uint32 fileHash);
-	ResourceFileEntry *findEntry(uint32 fileHash);
+	ResourceFileEntry *findEntry(uint32 fileHash, ResourceFileEntry **firstEntry = NULL);
 	Common::SeekableReadStream *createStream(uint32 fileHash);
 	const ResourceFileEntry& getEntry(uint index) { return _entries[index]; }
 	uint getEntryCount() { return _entries.size(); }
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index f0961f4..3cbcf96 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -436,26 +436,22 @@ SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
 }
 
 int16 SoundMan::addMusicItem(MusicItem *musicItem) {
-#if 0
 	for (uint i = 0; i < _musicItems.size(); ++i)
 		if (!_musicItems[i]) {
 			_musicItems[i] = musicItem;
 			return i;
 		}
-#endif		
 	int16 musicIndex = _musicItems.size();
 	_musicItems.push_back(musicItem);
 	return musicIndex;
 }
 
 int16 SoundMan::addSoundItem(SoundItem *soundItem) {
-#if 0
 	for (uint i = 0; i < _soundItems.size(); ++i)
 		if (!_soundItems[i]) {
 			_soundItems[i] = soundItem;
 			return i;
 		}
-#endif
 	int16 soundIndex = _soundItems.size();
 	_soundItems.push_back(soundItem);
 	return soundIndex;
@@ -550,7 +546,7 @@ void AudioResourceMan::removeSound(int16 soundIndex) {
 
 void AudioResourceMan::loadSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (!soundItem->_data) {
+	if (!soundItem->_data && soundItem->_resourceHandle.isValid()) {
 		// TODO Check if it's a sound resource
 		_vm->_res->loadResource(soundItem->_resourceHandle);
 		soundItem->_data = soundItem->_resourceHandle.data();
@@ -580,6 +576,7 @@ void AudioResourceMan::setSoundPan(int16 soundIndex, int16 pan) {
 }
 
 void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
+
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
 	if (!soundItem->_data)
 		loadSound(soundIndex);
@@ -587,8 +584,9 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
 	if (!soundItem->_data)
 		return;
 		
-	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO);
 	const byte *shiftValue = soundItem->_resourceHandle.extData();
+	
+	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO);
 	NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream);
 
 	_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle,
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index c7676ce..2419122 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -477,7 +477,6 @@ void AnimatedSprite::gotoNextState() {
 	if (_nextStateCb) {
 		_currStateCb = _nextStateCb;
 		_nextStateCb = NULL;
-		//debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str());
 		(this->*_currStateCb)();
 	} else {
 		_currStateCb = NULL;


Commit: 9a1d9883ad8a8f56b6c7397efe07a17625a03970
    https://github.com/scummvm/scummvm/commit/9a1d9883ad8a8f56b6c7397efe07a17625a03970
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Fix AsCommonCar turning

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2800.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 5cb9198..dacac98 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -362,7 +362,7 @@ void GameModule::startup() {
 	setGlobalVar(V_SHRINK_LIGHTS_ON, 0);
 	// <<<DEBUG
 
-#if 0
+#if 1
 	/*
 	//DEBUG>>>
 	createScene(_vm->gameState().sceneNum, _vm->gameState().which);
@@ -371,10 +371,10 @@ void GameModule::startup() {
 	*/
 
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 2;
-	createModule(2800, -1);
+	_vm->gameState().sceneNum = 14;
+	createModule(2700, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 5;
 	_vm->gameState().which = 0;
 	createModule(2800, -1);
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index ca4d2e5..41fc415 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -210,6 +210,7 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	_newDeltaXType = -1;
 	_soundCounter = 0;
 	_pathPoints = NULL;
+	_currMoveDirection = 0;
 	
 	startAnimation(0xD4220027, 0, -1);
 	setDoDeltaX(getGlobalVar(V_CAR_DELTA_X));
@@ -496,21 +497,6 @@ void AsCommonCar::stIdleBlink() {
 	NextState(&AsCommonCar::stLeanForwardIdle);
 }
 
-void AsCommonCar::stHandleRect() {
-	_isBusy = true;
-	gotoNextState();
-	startAnimation(0x9C220DA4, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	FinalizeState(&AsCommonCar::evHandleRectDone);
-}
-
-void AsCommonCar::evHandleRectDone() {
-	_isBusy = false;
-	_newMoveDirection = 0;
-	stUpdateMoveDirection();
-}
-
 void AsCommonCar::stUpdateMoveDirection() {
 	_isMoving = true;
 	if (_currMoveDirection == 1)
@@ -532,12 +518,13 @@ void AsCommonCar::moveToNextPoint() {
 	} else {
 		NPoint nextPt = pathPoint(_currPointIndex + 1);
 		NPoint currPt = pathPoint(_currPointIndex);
-		if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && nextPt.x >= currPt.x &&
-			(_currMoveDirection == 4 || _currMoveDirection == 2)) {
-			if (_currMoveDirection == 4) 
-				_currMoveDirection = 2;
-			else if (_currMoveDirection == 2)
+		if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) &&
+			((_currMoveDirection == 2 && nextPt.x < currPt.x) ||
+			(_currMoveDirection == 4 && nextPt.x >= currPt.x))) {
+			if (_currMoveDirection == 2) 
 				_currMoveDirection = 4;
+			else if (_currMoveDirection == 4)
+				_currMoveDirection = 2;
 			if (_isIdle)
 				stTurnCarMoveToNextPoint();
 			else
@@ -619,8 +606,9 @@ void AsCommonCar::moveToPrevPoint() {
 			prevPt = pathPoint(_currPointIndex);
 			currPt = pathPoint(_currPointIndex + 1);
 		}
-		if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && currPt.x >= prevPt.x &&
-			(_currMoveDirection == 2 || _currMoveDirection == 4)) {
+		if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) &&
+			((_currMoveDirection == 2 && prevPt.x < currPt.x) ||
+			(_currMoveDirection == 4 && prevPt.x >= currPt.x))) {
 			if (_currMoveDirection == 2) 
 				_currMoveDirection = 4;
 			else if (_currMoveDirection == 4)
@@ -657,8 +645,8 @@ void AsCommonCar::stBrakeMoveToPrevPoint() {
 
 void AsCommonCar::evTurnCarDone() {
 	_isBusy = false;
-	_newMoveDirection = 0;
 	setDoDeltaX(2);
+	_newMoveDirection = 0;
 	stUpdateMoveDirection();
 }
 
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 2a7d547..0c567e6 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -89,8 +89,6 @@ protected:
 	void stLeanForwardIdle();
 	void evIdleDone();
 	void stIdleBlink();
-	void stHandleRect();
-	void evHandleRectDone();
 	void stUpdateMoveDirection();
 	void stTurnCar();
 	void moveToNextPoint();
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index fb437fd..f97d071 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -1736,8 +1736,6 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2804::handleMessage);
 	SetUpdateHandler(&Scene2804::update);
 
-	//setGlobalVar(V_SHRINK_LIGHTS_ON, 1); // DEBUG Set lights on
-
 	if (getGlobalVar(V_SHRINK_LIGHTS_ON)) {
 		setBackground(0xA1D03005);
 		setPalette(0xA1D03005);
@@ -2019,9 +2017,6 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	_clipRects[2].x2 = 640;
 	_clipRects[3].x2 = 640;
 
-	for (uint i = 0; i < 4; i++)
-		debug("clipRect[%d] (%d, %d, %d, %d)", i, _clipRects[i].x1, _clipRects[i].y1, _clipRects[i].x2, _clipRects[i].y2);
-
 	if (which < 0) {
 		insertKlayman<KmScene2806>(441, 423, false, _clipRects, 4);
 		setMessageList(0x004AF098);


Commit: c182688e44a385549ca0734196a8a920a13ed8b6
    https://github.com/scummvm/scummvm/commit/c182688e44a385549ca0734196a8a920a13ed8b6
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Add saveload skeleton (doesn't actually do anything yet)

Changed paths:
  A engines/neverhood/saveload.cpp
    engines/neverhood/module.mk
    engines/neverhood/neverhood.h



diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 9069203..b3deb6f 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -41,6 +41,7 @@ MODULE_OBJS = \
 	palette.o \
 	resource.o \
 	resourceman.o \
+	saveload.o \
 	scene.o \
 	screen.o \
 	smackerscene.o \
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index ba6b9f7..a66bdb3 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -105,6 +105,9 @@ public:
 		uint32 version;
 		byte gameID;
 		uint32 flags;
+		uint32 saveDate;
+		uint32 saveTime;
+		uint32 playTime;
 		Graphics::Surface *thumbnail;
 	};
 
@@ -113,7 +116,6 @@ public:
 	bool canLoadGameStateCurrently() { return _isSaveAllowed; }
 	bool canSaveGameStateCurrently() { return _isSaveAllowed; }
 	
-#if 0 // Not used yet but let's keep it for later when it is	
 	Common::Error loadGameState(int slot);
 	Common::Error saveGameState(int slot, const Common::String &description);
 	void savegame(const char *filename, const char *description);
@@ -121,7 +123,6 @@ public:
 	const char *getSavegameFilename(int num);
 	static Common::String getSavegameFilename(const Common::String &target, int num);
 	static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header);
-#endif
 
 	GameState& gameState() { return _gameState; }
 	GameModule *gameModule() { return _gameModule; }
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
new file mode 100644
index 0000000..96d7fdd
--- /dev/null
+++ b/engines/neverhood/saveload.cpp
@@ -0,0 +1,147 @@
+/* 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 "common/savefile.h"
+
+#include "graphics/thumbnail.h"
+
+#include "neverhood/neverhood.h"
+
+namespace Neverhood {
+
+#define NEVERHOOD_SAVEGAME_VERSION 0
+
+NeverhoodEngine::kReadSaveHeaderError NeverhoodEngine::readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header) {
+
+	header.version = in->readUint32LE();
+	if (header.version > NEVERHOOD_SAVEGAME_VERSION)
+		return kRSHEInvalidVersion;
+
+	byte descriptionLen = in->readByte();
+	header.description = "";
+	while (descriptionLen--)
+		header.description += (char)in->readByte();
+
+	if (loadThumbnail) {
+		header.thumbnail = Graphics::loadThumbnail(*in);
+	} else {
+		Graphics::skipThumbnail(*in);
+	}
+
+	// Not used yet, reserved for future usage
+	header.gameID = in->readByte();
+	header.flags = in->readUint32LE();
+
+	header.saveDate = in->readUint32LE();
+	header.saveTime = in->readUint32LE();
+	header.playTime = in->readUint32LE();
+
+	return ((in->eos() || in->err()) ? kRSHEIoError : kRSHENoError);
+}
+
+void NeverhoodEngine::savegame(const char *filename, const char *description) {
+
+	Common::OutSaveFile *out;
+	if (!(out = g_system->getSavefileManager()->openForSaving(filename))) {
+		warning("Can't create file '%s', game not saved", filename);
+		return;
+	}
+
+	TimeDate curTime;
+	g_system->getTimeAndDate(curTime);
+
+	// Header start
+	out->writeUint32LE(NEVERHOOD_SAVEGAME_VERSION);
+
+	byte descriptionLen = strlen(description);
+	out->writeByte(descriptionLen);
+	out->write(description, descriptionLen);
+	
+	Graphics::saveThumbnail(*out);
+
+	// Not used yet, reserved for future usage
+	out->writeByte(0);
+	out->writeUint32LE(0);
+	uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF);
+	uint32 saveTime = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF);
+	uint32 playTime = g_engine->getTotalPlayTime() / 1000;
+	out->writeUint32LE(saveDate);
+	out->writeUint32LE(saveTime);
+	out->writeUint32LE(playTime);
+	// Header end
+
+	// TODO
+	
+	out->finalize();
+	delete out;
+}
+
+void NeverhoodEngine::loadgame(const char *filename) {
+	Common::InSaveFile *in;
+	if (!(in = g_system->getSavefileManager()->openForLoading(filename))) {
+		warning("Can't open file '%s', game not loaded", filename);
+		return;
+	}
+
+	SaveHeader header;
+
+	kReadSaveHeaderError errorCode = readSaveHeader(in, false, header);
+	
+	if (errorCode != kRSHENoError) {
+		warning("Error loading savegame '%s'", filename);
+		delete in;
+		return;
+	}
+	
+	g_engine->setTotalPlayTime(header.playTime * 1000);
+
+	// TODO
+	
+	delete in;
+
+}
+
+Common::Error NeverhoodEngine::loadGameState(int slot) {
+	const char *fileName = getSavegameFilename(slot);
+	loadgame(fileName);
+	return Common::kNoError;
+}
+
+Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &description) {
+	const char *fileName = getSavegameFilename(slot);
+	savegame(fileName, description.c_str());
+	return Common::kNoError;
+}
+
+const char *NeverhoodEngine::getSavegameFilename(int num) {
+	static Common::String filename;
+	filename = getSavegameFilename(_targetName, num);
+	return filename.c_str();
+}
+
+Common::String NeverhoodEngine::getSavegameFilename(const Common::String &target, int num) {
+	assert(num >= 0 && num <= 999);
+	return Common::String::format("%s.%03d", target.c_str(), num);
+}
+
+} // End of namespace Neverhood


Commit: 99e15e400537d85ff9f68cc10973b6d2c36c1776
    https://github.com/scummvm/scummvm/commit/99e15e400537d85ff9f68cc10973b6d2c36c1776
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: More work on saveload, saving works, loading not yet (from the GMM, in-game isn't finished yet)

Changed paths:
    engines/neverhood/detection.cpp
    engines/neverhood/gamevars.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/saveload.cpp



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index df9eca3..ed7053a 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -126,12 +126,10 @@ public:
 	virtual bool hasFeature(MetaEngineFeature f) const;
 	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
 
-#if 0 // Not used yet but let's keep it for later when it is	
 	SaveStateList listSaves(const char *target) const;
 	virtual int getMaximumSaveSlot() const;
 	void removeSaveState(const char *target, int slot) const;
 	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
-#endif
 
 	const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const;
 
@@ -139,20 +137,20 @@ public:
 
 bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return
-		false; // Nothing yet :(
-//		(f == kSupportsListSaves) ||
-//		(f == kSupportsLoadingDuringStartup) ||
+		(f == kSupportsListSaves) ||
+		(f == kSupportsLoadingDuringStartup) ||
 //		(f == kSupportsDeleteSave) ||
-//	   	(f == kSavesSupportMetaInfo) ||
-//		(f == kSavesSupportThumbnail);
+	   	(f == kSavesSupportMetaInfo) ||
+		(f == kSavesSupportThumbnail) ||
+		(f == kSavesSupportCreationDate) ||
+		(f == kSavesSupportPlayTime);
 }
 
 bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const {
 	return
-		false; // Nothing yet :(
 //		(f == kSupportsRTL) || // TODO: Not yet...
-//		(f == kSupportsLoadingDuringRuntime) ||
-//		(f == kSupportsSavingDuringRuntime);
+		(f == kSupportsLoadingDuringRuntime) ||
+		(f == kSupportsSavingDuringRuntime);
 }
 
 bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
@@ -177,8 +175,6 @@ const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSLis
 	return NULL;
 }
 
-#if 0 // Not used yet but let's keep it for later when it is	
-
 SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const {
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 	Neverhood::NeverhoodEngine::SaveHeader header;
@@ -213,9 +209,6 @@ int NeverhoodMetaEngine::getMaximumSaveSlot() const {
 }
 
 void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const {
-	// Slot 0 can't be deleted, it's for restarting the game(s)
-	if (slot == 0)
-		return;
 
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot);
@@ -235,11 +228,6 @@ void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const {
 		// Rename every slot greater than the deleted slot,
 		// Also do not rename quicksaves.
 		if (slotNum > slot && slotNum < 990) {
-			// FIXME: Our savefile renaming done here is inconsitent with what we do in
-			// GUI_v2::deleteMenu. While here we rename every slot with a greater equal
-			// number of the deleted slot to deleted slot, deleted slot + 1 etc.,
-			// we only rename the following slots in GUI_v2::deleteMenu until a slot
-			// is missing.
 			saveFileMan->renameSavefile(file->c_str(), filename.c_str());
 
 			filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot);
@@ -265,7 +253,14 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target,
 			desc.setDeletableFlag(false);
 			desc.setWriteProtectedFlag(false);
 			desc.setThumbnail(header.thumbnail);
-
+			int day = (header.saveDate >> 24) & 0xFF;
+			int month = (header.saveDate >> 16) & 0xFF;
+			int year = header.saveDate & 0xFFFF;
+			desc.setSaveDate(year, month, day);
+			int hour = (header.saveTime >> 16) & 0xFF;
+			int minutes = (header.saveTime >> 8) & 0xFF;
+			desc.setSaveTime(hour, minutes);
+			desc.setPlayTime(header.playTime * 1000);
 			return desc;
 		}
 	}
@@ -273,8 +268,6 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target,
 	return SaveStateDescriptor();
 }
 
-#endif
-
 #if PLUGIN_ENABLED_DYNAMIC(NEVERHOOD)
 	REGISTER_PLUGIN_DYNAMIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
 #else
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index e56ec1e..558543f 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -31,6 +31,30 @@ GameVars::GameVars() {
 GameVars::~GameVars() {
 }
 
+void GameVars::loadState(Common::InSaveFile *in) {
+	uint varCount;
+	_vars.clear();
+	varCount = in->readUint32LE();
+	for (uint i = 0; i < varCount; ++i) {
+		GameVar var;
+		var.nameHash = in->readUint32LE();
+		var.value = in->readUint32LE();
+		var.firstIndex = in->readUint16LE();
+		var.nextIndex = in->readUint16LE();
+	}
+}
+
+void GameVars::saveState(Common::OutSaveFile *out) {
+	out->writeUint32LE(_vars.size());
+	for (uint i = 0; i < _vars.size(); ++i) {
+		GameVar &var = _vars[i];
+		out->writeUint32LE(var.nameHash);
+		out->writeUint32LE(var.value);
+		out->writeUint16LE(var.firstIndex);
+		out->writeUint16LE(var.nextIndex);
+	}
+}
+
 uint32 GameVars::getGlobalVar(uint32 nameHash) {
 	int16 varIndex = findSubVarIndex(0, nameHash);
 	return varIndex != -1 ? _vars[varIndex].value : 0;
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 623e5b5..36fcebc 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -24,6 +24,7 @@
 #define NEVERHOOD_GAMEVARS_H
 
 #include "common/array.h"
+#include "common/savefile.h"
 #include "neverhood/neverhood.h"
 
 namespace Neverhood {
@@ -170,8 +171,8 @@ class GameVars {
 public:
 	GameVars();
 	~GameVars();
-	// TODO void load(???);
-	// TODO void save(???);
+	void loadState(Common::InSaveFile *in);
+	void saveState(Common::OutSaveFile *out);
 	uint32 getGlobalVar(uint32 nameHash);
 	void setGlobalVar(uint32 nameHash, uint32 value);
 	uint32 getSubVar(uint32 nameHash, uint32 subNameHash);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index c29cc7b..fbb8df3 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -86,13 +86,6 @@ Common::Error NeverhoodEngine::run() {
 
 	CursorMan.showMouse(true);
 
-#if 0
-	// TODO: This should probably be implemented as debug command later 
-	dumpAllResources();
-#endif
-
-#if 1
-
 	_soundMan = new SoundMan(this);
 	_audioResourceMan = new AudioResourceMan(this);
 	
@@ -101,6 +94,9 @@ Common::Error NeverhoodEngine::run() {
 	
 	_gameModule->startup();
 	
+	// TODO Check if this can actually be false...
+	_isSaveAllowed = true;
+	
 	uint32 nextFrameTime = 0;
 
 	// Preliminary main loop, needs some more work but works for testing
@@ -145,25 +141,19 @@ Common::Error NeverhoodEngine::run() {
 			_gameModule->draw();
 			_screen->update();
 			nextFrameTime = _screen->getNextFrameTime();
-			//_gameVars->dumpVars();
 		};
 		
 		_soundMan->update();
 		_audioResourceMan->update();
-		//_screen->update();
 		_system->updateScreen();
 		_system->delayMillis(10);
 		
-		debug(0, "---------------------------------------");
-	
 	}
 	
 	delete _gameModule;
 	delete _collisionMan;
 	delete _soundMan;
 	delete _audioResourceMan;
-#endif
-
 
 	delete _res;
 	delete _screen;
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index 96d7fdd..851943d 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -26,6 +26,7 @@
 #include "graphics/thumbnail.h"
 
 #include "neverhood/neverhood.h"
+#include "neverhood/gamevars.h"
 
 namespace Neverhood {
 
@@ -90,7 +91,10 @@ void NeverhoodEngine::savegame(const char *filename, const char *description) {
 	out->writeUint32LE(playTime);
 	// Header end
 
-	// TODO
+	_gameVars->setGlobalVar(0x108A4870, _gameState.sceneNum);
+	_gameVars->setGlobalVar(0x82C80875, _gameState.which);
+
+	_gameVars->saveState(out);
 	
 	out->finalize();
 	delete out;
@@ -115,7 +119,7 @@ void NeverhoodEngine::loadgame(const char *filename) {
 	
 	g_engine->setTotalPlayTime(header.playTime * 1000);
 
-	// TODO
+	_gameVars->loadState(in);
 	
 	delete in;
 


Commit: 060287a4f85189cce3bb3b1b864b85cd81ee5c2f
    https://github.com/scummvm/scummvm/commit/060287a4f85189cce3bb3b1b864b85cd81ee5c2f
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Improve frame-exact seeking for Scene2802

Thanks to clone2727 for his help!

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerplayer.h
    video/smk_decoder.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index dacac98..7d5932b 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -362,7 +362,7 @@ void GameModule::startup() {
 	setGlobalVar(V_SHRINK_LIGHTS_ON, 0);
 	// <<<DEBUG
 
-#if 1
+#if 0
 	/*
 	//DEBUG>>>
 	createScene(_vm->gameState().sceneNum, _vm->gameState().which);
@@ -417,8 +417,8 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 2;
+#if 1
+	_vm->gameState().sceneNum = 1;
 	createModule(2800, -1);
 #endif
 #if 0
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index f97d071..e40890a 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -540,6 +540,9 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertMouse435(0x008810A8, 20, 620);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true));
 	_currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
+	// Need to go to the first frame first to load up the palette
+	_smackerPlayer->gotoFrame(0);
+	// Now we can actually set the current radio frame
 	_smackerPlayer->gotoFrame(_currRadioMusicIndex);
 	_vm->_soundMan->addSound(0x04360A18, 0x422630C2);
 	_vm->_soundMan->addSound(0x04360A18, 0x00632252);
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 85319dc..7c14edf 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -62,6 +62,28 @@ void SmackerDoubleSurface::draw() {
 		_vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect);
 }
 
+void NeverhoodSmackerDecoder::forceSeekToFrame(uint frame) {
+	if (!isVideoLoaded())
+		return;
+	
+	if (frame >= getFrameCount())
+		error("Can't force Smacker seek to invalid frame %d", frame);
+	
+	if (_header.audioInfo[0].hasAudio)
+		error("Can't force Smacker frame seek with audio");
+	if (!rewind())
+		error("Failed to rewind");
+	
+	SmackerVideoTrack *videoTrack = (SmackerVideoTrack *)getTrack(0);
+	uint32 offset = 0;
+	for (uint32 i = 0; i < frame; i++) {
+		videoTrack->increaseCurFrame();
+		offset += _frameSizes[i] & ~3;
+	}
+	
+	_fileStream->seek(offset, SEEK_CUR);
+}
+
 // SmackerPlayer
 
 SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused)
@@ -95,7 +117,7 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
 
 	_stream = _vm->_res->createStream(fileHash);
 
-	_smackerDecoder = new Video::SmackerDecoder();
+	_smackerDecoder = new NeverhoodSmackerDecoder();
 	_smackerDecoder->loadStream(_stream);
 	
 	_palette = new Palette(_vm);
@@ -120,12 +142,9 @@ void SmackerPlayer::close() {
 }
 
 void SmackerPlayer::gotoFrame(int frameNumber) {
-	// NOTE Slow as hell but only used in Scene2802
-	if (frameNumber != _smackerDecoder->getCurFrame()) {
-		if (frameNumber < _smackerDecoder->getCurFrame())
-			rewind();
-		while (_smackerDecoder->getCurFrame() != frameNumber)
-			_smackerDecoder->decodeNextFrame();
+	if (_smackerDecoder) {
+		_smackerDecoder->forceSeekToFrame(frameNumber);
+		_smackerDecoder->decodeNextFrame();
 	}
 }
 
@@ -156,7 +175,6 @@ void SmackerPlayer::rewind() {
 }
 
 void SmackerPlayer::update() {
-	debug(8, "SmackerPlayer::update()");
 
 	if (!_smackerDecoder)
 		return;
diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h
index b4d8ddb..26ebff5 100644
--- a/engines/neverhood/smackerplayer.h
+++ b/engines/neverhood/smackerplayer.h
@@ -47,6 +47,11 @@ public:
 	virtual void draw();
 };
 
+class NeverhoodSmackerDecoder : public Video::SmackerDecoder {
+public:
+	void forceSeekToFrame(uint frame);
+};
+
 class SmackerPlayer : public Entity {
 public:
 	SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused = false);
@@ -61,11 +66,11 @@ public:
 	void setDrawPos(int16 x, int16 y);
 	void rewind();
 	bool isDone() { return getFrameNumber() + 1 == getFrameCount(); }
-	Video::SmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; }
+	NeverhoodSmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; }
 protected:
 	Scene *_scene;
 	Palette *_palette;
-	Video::SmackerDecoder *_smackerDecoder;
+	NeverhoodSmackerDecoder *_smackerDecoder;
 	SmackerSurface *_smackerSurface;
 	uint32 _fileHash;
 	bool _smackerFirst;
diff --git a/video/smk_decoder.h b/video/smk_decoder.h
index 7227238..e4bc9ba 100644
--- a/video/smk_decoder.h
+++ b/video/smk_decoder.h
@@ -122,7 +122,6 @@ protected:
 
 	Common::SeekableReadStream *_fileStream;
 
-private:
 	enum AudioCompression {
 		kCompressionNone,
 		kCompressionDPCM,
@@ -151,6 +150,10 @@ private:
 		uint32 dummy;
 	} _header;
 
+	uint32 *_frameSizes;
+
+private:
+
 	class SmackerAudioTrack : public AudioTrack {
 	public:
 		SmackerAudioTrack(const AudioInfo &audioInfo, Audio::Mixer::SoundType soundType);
@@ -173,7 +176,6 @@ private:
 		AudioInfo _audioInfo;
 	};
 
-	uint32 *_frameSizes;
 	// The FrameTypes section of a Smacker file contains an array of bytes, where
 	// the 8 bits of each byte describe the contents of the corresponding frame.
 	// The highest 7 bits correspond to audio frames (bit 7 is track 6, bit 6 track 5


Commit: 0f1aa64fd0172c374c491bcfba4ac7baa2394d2e
    https://github.com/scummvm/scummvm/commit/0f1aa64fd0172c374c491bcfba4ac7baa2394d2e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:38-07:00

Commit Message:
NEVERHOOD: Add support for the demo version

- Remove debug resource dumping code
- Fix Scene1501 (pictures without sound weren't displayed/too fast)
- Move main loop to mainLoop method

Changed paths:
    engines/neverhood/detection.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/resourceman.cpp



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index ed7053a..c40b9e7 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -55,6 +55,10 @@ uint16 NeverhoodEngine::getVersion() const {
 	return _gameDescription->version;
 }
 
+bool NeverhoodEngine::isDemo() const {
+	return _gameDescription->desc.flags & ADGF_DEMO;
+}
+
 }
 
 static const PlainGameDescriptor neverhoodGames[] = {
@@ -84,6 +88,23 @@ static const NeverhoodGameDescription gameDescriptions[] = {
 		0,
 	},
 
+	{
+		// Neverhood English demo version
+		{
+			"neverhood",
+			"Demo",
+			AD_ENTRY1s("nevdemo.blb", "05b735cfb1086892bec79b54dca5545b", 22564568),
+			Common::EN_ANY,
+			Common::kPlatformWindows,
+			ADGF_DEMO,
+			GUIO1(GUIO_NONE)
+		},
+		0,
+		0,
+		0,
+		0,
+	},
+
 	{ AD_TABLE_END_MARKER, 0, 0, 0, 0 }
 };
 
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 7d5932b..548b358 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -149,7 +149,9 @@ void GameModule::handleKeyDown(Common::KeyCode keyCode) {
 }
 
 void GameModule::handleEscapeKey() {
-	if (!_prevChildObject /* && _canRequestMainMenu TODO?*/)
+	if (_vm->isDemo())
+		_vm->quitGame();
+	else if (!_prevChildObject /* && _canRequestMainMenu TODO?*/)
 		_mainMenuRequested = true;
 	else if (_childObject)
 		sendMessage(_childObject, 0x000C, 0);
@@ -316,8 +318,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 
 void GameModule::startup() {
 	// TODO: Displaying of error text probably not needed in ScummVM
-//	createModule(1500, 0); // Logos and intro video //Real
-
+#if 1
+	createModule(1500, 0); // Logos and intro video //Real
+#else
 	// DEBUG>>>
 	/*
 	setGlobalVar(V_SEEN_MUSIC_BOX, 1);
@@ -417,7 +420,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 1;
 	createModule(2700, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 1;
 	createModule(2800, -1);
 #endif
@@ -426,9 +429,11 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(2500, -1);
 #endif
-#if 0
+#if 1
 	_vm->gameState().sceneNum = 1;
-	createModule(2400, -1);
+	createModule(2300, -1);
+#endif
+
 #endif
 }
 
@@ -528,6 +533,9 @@ void GameModule::createModule(int moduleNum, int which) {
 		setGlobalVar(V_MODULE_NAME, 0x81293110);
 		_childObject = new Module3000(_vm, this, which);
 		break;
+	case 9999:
+		createDemoScene();
+		break;
 	default:
 		error("GameModule::createModule() Could not create module %d", moduleNum);
 	}
@@ -689,17 +697,18 @@ void GameModule::updateModule() {
 			createModule(2300, 1);
 			break;
 		case 2300:
-			if (_moduleResult == 1) {
-				createModule(2200, 0);
-			} else if (_moduleResult == 2) {
+			if (_moduleResult == 2)
 				createModule(1200, 0);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 0)
+				createModule(1000, 1);
+			else if (_vm->isDemo())
+				createModule(9999, -1);
+			else if (_moduleResult == 1)
+				createModule(2200, 0);
+			else if (_moduleResult == 3)
 				createModule(2400, 0);
-			} else if (_moduleResult == 4) {
+			else if (_moduleResult == 4)
 				createModule(3000, 0);
-			} else {
-				createModule(1000, 1);
-			}
 			break;
 		case 2400:
 			createModule(2300, 3);
@@ -708,21 +717,19 @@ void GameModule::updateModule() {
 			createModule(2600, 1);
 			break;
 		case 2600:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createModule(2500, 0);
-			} else {
+			else
 				createModule(1200, 1);
-			}
 			break;
 		case 2700:
 			createModule(1800, 2);
 			break;
 		case 2800:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createModule(2900, 5);
-			} else {
+			else
 				createModule(1800, 0);
-			}
 			break;
 		case 2900:
 			if (_moduleResult != 0xFFFFFFFF) {
@@ -786,6 +793,9 @@ void GameModule::updateModule() {
 				createModule(2300, 4);
 			}
 			break;
+		case 9999:
+			createModuleByHash(getGlobalVar(V_MODULE_NAME));
+			break;
 		}
 	}
 }
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 1cd6c0d..aeeb62f 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -24,6 +24,7 @@
 #include "neverhood/navigationscene.h"
 #include "neverhood/smackerscene.h"
 #include "neverhood/module1000.h"
+#include "neverhood/module1500.h"
 
 namespace Neverhood {
 
@@ -98,6 +99,10 @@ void Module::createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash)
 	_childObject = new StaticScene(_vm, this, backgroundFileHash, cursorFileHash);
 }
 
+void Module::createDemoScene() {
+	_childObject = new Scene1501(_vm, this, 0x0009B624, 0, 288, 0);
+}
+
 bool Module::updateChild() {
 	if (_childObject) {
 		_childObject->handleUpdate();
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index bb01218..576a5a4 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -62,6 +62,7 @@ protected:
 	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
 	void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort);
 	void createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash);
+	void createDemoScene();
 	bool updateChild();
 	void leaveModule(uint32 result);
 };
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index caa4466..1aaa0c2 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -95,9 +95,13 @@ void Module1000::updateScene() {
 		case 1:
 			if (_moduleResult == 1)
 				leaveModule(0);
-			else if (_moduleResult == 2)
-				createScene(3, 0);
-			else
+			else if (_moduleResult == 2) {
+				if (_vm->isDemo())
+					// Demo version returns to the same scene
+					createScene(1, 2);
+				else
+					createScene(3, 0);
+			} else
 				createScene(0, 1);
 			break;
 		case 2:
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 98c55bc..328bda3 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -106,7 +106,7 @@ void Scene1501::update() {
 			_vm->_screen->clear();
 			leaveScene(0);
 		}
-	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !isSoundPlaying(0)) {
+	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0))) {
 		_countdown1 = 12;
 		_palette->startFadeToBlack(11);
 	}
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 2c43afe..937ba9a 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -105,6 +105,9 @@ void Module2300::createScene(int sceneNum, int which) {
 		_vm->_soundMan->setTwoSoundsPlayFlag(true);
 		createSmackerScene(0x20080A0B, true, true, false);
 		break;
+	case 9999:
+		createDemoScene();
+		break;
 	}
 	SetUpdateHandler(&Module2300::updateScene);
 	_childObject->handleUpdate();
@@ -122,6 +125,8 @@ void Module2300::updateScene() {
 		case 1:
 			if (_moduleResult == 1)
 				createScene(0, 0);
+			else if (_vm->isDemo())
+				createScene(9999, 0);
 			else if (_moduleResult == 2)
 				createScene(2, 1);
 			else if (_moduleResult == 3)
@@ -149,6 +154,9 @@ void Module2300::updateScene() {
 			_vm->_soundMan->setTwoSoundsPlayFlag(false);
 			createScene(1, 2);
 			break;
+		case 9999:
+			createScene(1, -1);
+			break;
 		}
 	} else {
 		switch (_sceneNum) {
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 4ddcc38..741f413 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -124,6 +124,9 @@ void Module2600::createScene(int sceneNum, int which) {
 		else
 			createSmackerScene(0x42980941, true, true, false);
 		break;
+	case 9999:
+		createDemoScene();
+		break;
 	}
 	SetUpdateHandler(&Module2600::updateScene);
 	_childObject->handleUpdate();
@@ -151,8 +154,12 @@ void Module2600::updateScene() {
 		case 2:
 			if (_moduleResult == 0)
 				createScene(1, 0);
-			else if (_moduleResult == 1)
-				createScene(1002, -1);
+			else if (_moduleResult == 1) {
+				if (_vm->isDemo())
+					createScene(9999, -1);
+				else
+					createScene(1002, -1);
+			}
 			break;
 		case 3:
 			if (_moduleResult == 0) {
@@ -178,8 +185,12 @@ void Module2600::updateScene() {
 				createScene(3, 1);
 			break;
 		case 6:
-			if (_moduleResult == 0)
-				createScene(1006, -1);
+			if (_moduleResult == 0) {
+				if (_vm->isDemo())
+					createScene(9999, -1);
+				else
+					createScene(1006, -1);
+			}
 			else if (_moduleResult == 1)
 				createScene(1, 2);
 			break;
@@ -201,6 +212,9 @@ void Module2600::updateScene() {
 		case 1008:
 			createScene(6, 0);
 			break;
+		case 9999:
+			createScene(_vm->gameState().sceneNum, -1);
+			break;
 		}
 	}
 }
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index fbb8df3..ae181ff 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -76,13 +76,19 @@ Common::Error NeverhoodEngine::run() {
 	_screen = new Screen(this);
 
 	_res = new ResourceMan();
-	_res->addArchive("a.blb");
-	_res->addArchive("c.blb");
-	_res->addArchive("hd.blb");
-	_res->addArchive("i.blb");
-	_res->addArchive("m.blb");
-	_res->addArchive("s.blb");
-	_res->addArchive("t.blb");
+	
+	if (isDemo()) {
+		_res->addArchive("a.blb");
+		_res->addArchive("nevdemo.blb");
+	} else {
+		_res->addArchive("a.blb");
+		_res->addArchive("c.blb");
+		_res->addArchive("hd.blb");
+		_res->addArchive("i.blb");
+		_res->addArchive("m.blb");
+		_res->addArchive("s.blb");
+		_res->addArchive("t.blb");
+	}
 
 	CursorMan.showMouse(true);
 
@@ -97,13 +103,42 @@ Common::Error NeverhoodEngine::run() {
 	// TODO Check if this can actually be false...
 	_isSaveAllowed = true;
 	
-	uint32 nextFrameTime = 0;
+	if (isDemo()) {
+		// Adjust some navigation lists for the demo version...
+		NavigationList *navigationList = _staticData->getNavigationList(0x004B67E8);
+		(*navigationList)[0].middleSmackerFileHash = 0;
+		(*navigationList)[0].middleFlag = 1;
+		(*navigationList)[2].middleSmackerFileHash = 0;
+		(*navigationList)[2].middleFlag = 1;
+		(*navigationList)[4].middleSmackerFileHash = 0;
+		(*navigationList)[4].middleFlag = 1;
+		(*navigationList)[5].middleSmackerFileHash = 0;
+		(*navigationList)[5].middleFlag = 1;
+	}
+	
+	mainLoop();
+	
+	delete _gameModule;
+	delete _collisionMan;
+	delete _soundMan;
+	delete _audioResourceMan;
+
+	delete _res;
+	delete _screen;
 
-	// Preliminary main loop, needs some more work but works for testing
+	delete _gameVars;
+	delete _staticData;
+	
+	debug("Ok.");
+
+	return Common::kNoError;
+}
+
+void NeverhoodEngine::mainLoop() {
+	uint32 nextFrameTime = 0;
 	while (!shouldQuit()) {
 		Common::Event event;
 		Common::EventManager *eventMan = _system->getEventManager();
-	
 		while (eventMan->pollEvent(event)) {
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
@@ -134,7 +169,6 @@ Common::Error NeverhoodEngine::run() {
 				break;
 			}
 		}
-
 		if (_system->getMillis() >= nextFrameTime) {
 			_gameModule->checkMainMenu();
 			_gameModule->handleUpdate();
@@ -142,28 +176,11 @@ Common::Error NeverhoodEngine::run() {
 			_screen->update();
 			nextFrameTime = _screen->getNextFrameTime();
 		};
-		
 		_soundMan->update();
 		_audioResourceMan->update();
 		_system->updateScreen();
 		_system->delayMillis(10);
-		
 	}
-	
-	delete _gameModule;
-	delete _collisionMan;
-	delete _soundMan;
-	delete _audioResourceMan;
-
-	delete _res;
-	delete _screen;
-
-	delete _gameVars;
-	delete _staticData;
-	
-	debug("Ok.");
-
-	return Common::kNoError;
 }
 
 NPoint NeverhoodEngine::getMousePos() {
@@ -173,82 +190,4 @@ NPoint NeverhoodEngine::getMousePos() {
 	return pt;
 }
 
-void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, int16 height) {
-	byte identsize = 0;
-	byte colourmaptype = 1;
-	byte imagetype = 1;
-	uint16 colourmapstart = 0;
-	uint16 colourmaplength = 256;
-	byte colourmapbits = 24;
-	uint16 xstart = 0;
-	uint16 ystart = 0;
-	byte bits = 8;
-	byte descriptor = 0x20;
-	Common::DumpFile tga;
-	tga.open(filename);
-	tga.writeByte(identsize);
-	tga.writeByte(colourmaptype);
-	tga.writeByte(imagetype);
-	tga.writeUint16LE(colourmapstart);
-	tga.writeUint16LE(colourmaplength);
-	tga.writeByte(colourmapbits);
-	tga.writeUint16LE(xstart);
-	tga.writeUint16LE(ystart);
-	tga.writeUint16LE(width);
-	tga.writeUint16LE(height);
-	tga.writeByte(bits);
-	tga.writeByte(descriptor);
-	tga.write(palette, 768);
-	tga.write(pixels, width * height);
-	tga.close();
-}
-
-void NeverhoodEngine::dumpAllResources() {
-#if 0
-	PaletteResource paletteResource(this);
-	byte *vgaPalette = new byte[768];
-	//paletteResource.load(0x4086520E);
-	paletteResource.load(0x12C23307);
-	byte *srcpalette = paletteResource.palette();
-	for (int i = 0; i < 256; i++) {
-		vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0];
-		vgaPalette[i * 3 + 1] = srcpalette[i * 4 + 1];
-		vgaPalette[i * 3 + 0] = srcpalette[i * 4 + 2];
-	}
-
-#if 0
-	for (int i = 0; i < 768; i++)
-		vgaPalette[i] <<= 2;
-#endif
-
-	uint entriesCount = _res->getEntryCount();
-	debug("%d entries", entriesCount);
-
-	for (uint i = 0; i < entriesCount; i++) {
-		const ResourceFileEntry &entry = _res->getEntry(i);
-		int type = _res->getResourceTypeByHash(entry.archiveEntry->fileHash);
-		debug("hash: %08X; type: %d", entry.archiveEntry->fileHash, type);
-		if (type == 4) {
-			AnimResource anim(this);
-			anim.load(entry.archiveEntry->fileHash);
-			for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) {
-				const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex);
-				int16 width = (frameInfo.drawOffset.width + 3) & 0xFFFC;
-				byte *pixels = new byte[width * frameInfo.drawOffset.height];
-				memset(pixels, 0, width * frameInfo.drawOffset.height);
-				anim.draw(frameIndex, pixels, width, false, false);
-				Common::String filename = 
-					frameInfo.frameHash != 0
-					? Common::String::format("%08X_%03d_%08X.tga", entry.archiveEntry->fileHash, frameIndex, frameInfo.frameHash) 
-					: Common::String::format("%08X_%03d.tga", entry.archiveEntry->fileHash, frameIndex);
-				writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.drawOffset.height);
-				delete[] pixels;
-			}
-		}
-	}
-	
-	delete[] vgaPalette;
-#endif
-}
-	
 } // End of namespace Neverhood
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index a66bdb3..b0f9abb 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -59,6 +59,7 @@ class NeverhoodEngine : public ::Engine {
 protected:
 
 	Common::Error run();
+	void mainLoop();
 
 public:
 	NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc);
@@ -71,6 +72,7 @@ public:
 	uint16 getVersion() const;
 	Common::Platform getPlatform() const;
 	bool hasFeature(EngineFeature f) const;
+	bool isDemo() const;
 
 	Common::RandomSource *_rnd;
 
@@ -130,8 +132,6 @@ public:
 	int16 getMouseY() const { return _mouseY; }
 	NPoint getMousePos();
 
-	void dumpAllResources();
-
 public:
 
 };
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index c30e272..7b7d5cf 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -77,7 +77,7 @@ ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash, ResourceFileEntry **f
 
 Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) {
 	ResourceFileEntry *entry = findEntry(fileHash);
-	return entry->archive->createStream(entry->archiveEntry);
+	return entry ? entry->archive->createStream(entry->archiveEntry) : NULL;
 }
 
 void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) {


Commit: a35cd088e52eced55d5c0f8253773e9d940b8373
    https://github.com/scummvm/scummvm/commit/a35cd088e52eced55d5c0f8253773e9d940b8373
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Remove obsolete _keyState

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



diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index ae181ff..4ee801b 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -70,11 +70,8 @@ Common::Error NeverhoodEngine::run() {
 
 	_staticData = new StaticData();
 	_staticData->load("neverhood.dat");
-
 	_gameVars = new GameVars();
-
 	_screen = new Screen(this);
-
 	_res = new ResourceMan();
 	
 	if (isDemo()) {
@@ -98,13 +95,11 @@ Common::Error NeverhoodEngine::run() {
 	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
 	
-	_gameModule->startup();
-	
 	// TODO Check if this can actually be false...
 	_isSaveAllowed = true;
 	
 	if (isDemo()) {
-		// Adjust some navigation lists for the demo version...
+		// Adjust this navigation list for the demo version
 		NavigationList *navigationList = _staticData->getNavigationList(0x004B67E8);
 		(*navigationList)[0].middleSmackerFileHash = 0;
 		(*navigationList)[0].middleFlag = 1;
@@ -116,6 +111,8 @@ Common::Error NeverhoodEngine::run() {
 		(*navigationList)[5].middleFlag = 1;
 	}
 	
+	_gameModule->startup();
+	
 	mainLoop();
 	
 	delete _gameModule;
@@ -142,12 +139,10 @@ void NeverhoodEngine::mainLoop() {
 		while (eventMan->pollEvent(event)) {
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
-				_keyState = event.kbd.keycode;
 				_gameModule->handleKeyDown(event.kbd.keycode);
 				_gameModule->handleAsciiKey(event.kbd.ascii);
 				break;
 			case Common::EVENT_KEYUP:
-				_keyState = Common::KEYCODE_INVALID;
 				break;
 			case Common::EVENT_MOUSEMOVE:
 				_mouseX = event.mouse.x;
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index b0f9abb..ef0f16c 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -77,7 +77,6 @@ public:
 	Common::RandomSource *_rnd;
 
 	int16 _mouseX, _mouseY;
-	Common::KeyCode _keyState;
 	uint16 _buttonState;
 
 	GameState _gameState;


Commit: 30178e46e522c6d741e82e282f3f3edc1fab4825
    https://github.com/scummvm/scummvm/commit/30178e46e522c6d741e82e282f3f3edc1fab4825
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Implement savegame loading via GMM (in-game saving/loading still TODO)

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/module1200.cpp
    engines/neverhood/saveload.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 548b358..823f89a 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -437,6 +437,15 @@ void GameModule::startup() {
 #endif
 }
 
+void GameModule::restoreGame() {
+	delete _childObject;
+	delete _prevChildObject;
+	_childObject = NULL;
+	_prevChildObject = NULL;
+	_prevModuleNum = 0;
+	createModuleByHash(getGlobalVar(V_MODULE_NAME));
+}
+
 void GameModule::checkMainMenu() {
 	if (_mainMenuRequested)
 		openMainMenu();
@@ -544,6 +553,7 @@ void GameModule::createModule(int moduleNum, int which) {
 }
 
 void GameModule::createModuleByHash(uint32 nameHash) {
+	debug("GameModule::createModuleByHash(%08X)", nameHash);
 	switch (nameHash) {
 	case 0x03294419:
 		createModule(1000, -1);
@@ -833,7 +843,7 @@ void GameModule::updateMenuModule() {
 		_moduleNum = _prevModuleNum;
 		SetUpdateHandler(&GameModule::updateModule);
 	} else if (_gameWasLoaded) {
-		debug("_gameWasLoaded!");
+#if 0 // TODO Handle this in some other way...
 		_gameWasLoaded = false;
 		delete _childObject;
 		delete _prevChildObject;
@@ -842,6 +852,7 @@ void GameModule::updateMenuModule() {
 		_prevModuleNum = 0;
 		// TODO Create module from savegame values...
 		 // TODO createModuleByHash(...);
+#endif
 	}
 }
 
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 53adb85..93373a1 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -33,6 +33,7 @@ public:
 	GameModule(NeverhoodEngine *vm);
 	virtual ~GameModule();
 	void startup();
+	void restoreGame();
 	void checkMainMenu();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index 558543f..7bf9f30 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -41,6 +41,7 @@ void GameVars::loadState(Common::InSaveFile *in) {
 		var.value = in->readUint32LE();
 		var.firstIndex = in->readUint16LE();
 		var.nextIndex = in->readUint16LE();
+		_vars.push_back(var);
 	}
 }
 
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 36fcebc..a62b33c 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -32,6 +32,8 @@ namespace Neverhood {
 enum {
 	// Misc
 	V_MODULE_NAME				= 0x91080831,			// Currently active module name hash
+	V_CURRENT_SCENE				= 0x108A4870,			// Current scene in the current module
+	V_CURRENT_SCENE_WHICH		= 0x82C80875,
 	V_DEBUG						= 0xA4014072,			// Original debug-flag, can probably be removed
 	V_SMACKER_CAN_ABORT			= 0x06C02850,			// Not set anywhere (yet), seems like a debug flag
 	V_KEY3_LOCATION				= 0x13382860,			// Location of the third key
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 98ec012..e86aa00 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -1025,7 +1025,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule)
 
 	playSound(0, 0x40106542);
 	loadSound(1, 0x40005446);
-	loadSound(2, 0x40005446);
+	loadSound(2, 0x40005446); // Same sound as slot 1
 	loadSound(3, 0x68E25540);
 
 }
@@ -1049,6 +1049,7 @@ void Scene1202::update() {
 		playSound(3);
 		_isPuzzleSolved = true;
 	} else if (_clickedIndex >= 0 && _counter == 0) {
+		// Swap TNT positions
 		int destIndex = kScene1202Table[_clickedIndex];
 		sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex));
 		sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex));
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index 851943d..e1ef954 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -26,6 +26,7 @@
 #include "graphics/thumbnail.h"
 
 #include "neverhood/neverhood.h"
+#include "neverhood/gamemodule.h"
 #include "neverhood/gamevars.h"
 
 namespace Neverhood {
@@ -91,8 +92,8 @@ void NeverhoodEngine::savegame(const char *filename, const char *description) {
 	out->writeUint32LE(playTime);
 	// Header end
 
-	_gameVars->setGlobalVar(0x108A4870, _gameState.sceneNum);
-	_gameVars->setGlobalVar(0x82C80875, _gameState.which);
+	_gameVars->setGlobalVar(V_CURRENT_SCENE, _gameState.sceneNum);
+	_gameVars->setGlobalVar(V_CURRENT_SCENE_WHICH, _gameState.which);
 
 	_gameVars->saveState(out);
 	
@@ -121,6 +122,11 @@ void NeverhoodEngine::loadgame(const char *filename) {
 
 	_gameVars->loadState(in);
 	
+	_gameState.sceneNum = _gameVars->getGlobalVar(V_CURRENT_SCENE);
+	_gameState.which = _gameVars->getGlobalVar(V_CURRENT_SCENE_WHICH);
+
+	_gameModule->restoreGame();
+
 	delete in;
 
 }


Commit: fec1d7816a3e9924db7eb617eda1a6f3fd7b8978
    https://github.com/scummvm/scummvm/commit/fec1d7816a3e9924db7eb617eda1a6f3fd7b8978
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Implement resource cache purging and purge it after each scene

Changed paths:
    engines/neverhood/resourceman.cpp
    engines/neverhood/resourceman.h
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 7b7d5cf..9e5f9ae 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -116,4 +116,14 @@ void ResourceMan::unloadResource(ResourceHandle &resourceHandle) {
 	}
 }
 
+void ResourceMan::purgeResources() {
+	for (Common::HashMap<uint32, ResourceData*>::iterator it = _data.begin(); it != _data.end(); ++it) {
+		ResourceData *resourceData = (*it)._value;
+		if (resourceData->dataRefCount == 0) {
+			delete resourceData->data;
+			resourceData->data = NULL;
+		}
+	}
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h
index e83de24..5a3697f 100644
--- a/engines/neverhood/resourceman.h
+++ b/engines/neverhood/resourceman.h
@@ -80,6 +80,7 @@ public:
 	void queryResource(uint32 fileHash, ResourceHandle &resourceHandle);
 	void loadResource(ResourceHandle &resourceHandle);
 	void unloadResource(ResourceHandle &resourceHandle);
+	void purgeResources();
 protected:
 	typedef Common::HashMap<uint32, ResourceFileEntry> EntriesMap;
 	Common::Array<BlbArchive*> _archives;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 6141ee4..c899a59 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -70,6 +70,9 @@ Scene::~Scene() {
 		delete *iter;
 
 	// Don't delete surfaces since they always belong to an entity
+	
+	// Purge the resources after each scene
+	_vm->_res->purgeResources();
 
 }
 


Commit: 4b7ad48ca8857fd0c597ae1cc1ce599a3286bd57
    https://github.com/scummvm/scummvm/commit/4b7ad48ca8857fd0c597ae1cc1ce599a3286bd57
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Rename some CollisionMan methods/fields

- Remove fallback detector (I think it's not needed)
- Rename Scene insertMouse methods

Changed paths:
    engines/neverhood/collisionman.cpp
    engines/neverhood/collisionman.h
    engines/neverhood/detection.cpp
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
index 973c0fe..bafa1e3 100644
--- a/engines/neverhood/collisionman.cpp
+++ b/engines/neverhood/collisionman.cpp
@@ -39,16 +39,6 @@ void CollisionMan::setHitRects(uint32 id) {
 
 void CollisionMan::setHitRects(HitRectList *hitRects) {
 	_hitRects = hitRects;
-
-	// DEBUG
-	if (_hitRects) {
-		debug("CollisionMan::setHitRects() count = %d", _hitRects->size());
-		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) {
-			HitRect *hitRect = &(*it);
-			debug("(%d, %d, %d, %d) -> %04X", hitRect->rect.x1, hitRect->rect.y1, hitRect->rect.x2, hitRect->rect.y2, hitRect->type);
-		}
-	}
-	
 }
 
 void CollisionMan::clearHitRects() {
@@ -63,9 +53,9 @@ HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) {
 	return &defaultHitRect; 
 }
 
-void CollisionMan::addSprite(Sprite *sprite) {
+void CollisionMan::addCollisionSprite(Sprite *sprite) {
 	int index = 0, insertIndex = -1;
-	for (Common::Array<Sprite*>::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) {
+	for (Common::Array<Sprite*>::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) {
 		if ((*iter)->getPriority() > sprite->getPriority()) {
 			insertIndex = index;
 			break;
@@ -73,26 +63,26 @@ void CollisionMan::addSprite(Sprite *sprite) {
 		index++;
 	}
 	if (insertIndex >= 0)
-		_sprites.insert_at(insertIndex, sprite);
+		_collisionSprites.insert_at(insertIndex, sprite);
 	else
-		_sprites.push_back(sprite);		
+		_collisionSprites.push_back(sprite);		
 }
 
-void CollisionMan::removeSprite(Sprite *sprite) {
-	for (uint index = 0; index < _sprites.size(); index++) {
-		if (_sprites[index] == sprite) {
-			_sprites.remove_at(index);
+void CollisionMan::removeCollisionSprite(Sprite *sprite) {
+	for (uint index = 0; index < _collisionSprites.size(); index++) {
+		if (_collisionSprites[index] == sprite) {
+			_collisionSprites.remove_at(index);
 			break;
 		}
 	}
 }
 
-void CollisionMan::clearSprites() {
-	_sprites.clear();
+void CollisionMan::clearCollisionSprites() {
+	_collisionSprites.clear();
 }
 
 void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) {
-	for (Common::Array<Sprite*>::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) {
+	for (Common::Array<Sprite*>::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) {
 		Sprite *collSprite = *iter;
 		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) {
 			sprite->sendMessage(collSprite, messageNum, messageParam);
@@ -100,12 +90,4 @@ void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum,
 	}	
 }
 
-void CollisionMan::save() {
-	// TODO
-}
-
-void CollisionMan::restore() {
-	// TODO
-}
-
 } // End of namespace Neverhood
diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h
index 8635952..36bb2a5 100644
--- a/engines/neverhood/collisionman.h
+++ b/engines/neverhood/collisionman.h
@@ -37,18 +37,16 @@ public:
 	void setHitRects(HitRectList *hitRects);
 	void clearHitRects();
 	HitRect *findHitRectAtPos(int16 x, int16 y);
-	void addSprite(Sprite *sprite);
-	void removeSprite(Sprite *sprite);
-	void clearSprites();
+	void addCollisionSprite(Sprite *sprite);
+	void removeCollisionSprite(Sprite *sprite);
+	void clearCollisionSprites();
 	void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam);
-	void save();
-	void restore();
-	uint getSpriteCount() const { return _sprites.size(); }
-	Sprite *getSprite(uint index) const { return _sprites[index]; }
+	uint getCollisionSpritesCount() const { return _collisionSprites.size(); }
+	Sprite *getCollisionSprite(uint index) const { return _collisionSprites[index]; }
 protected:
 	NeverhoodEngine *_vm;
 	HitRectList *_hitRects;
-	Common::Array<Sprite*> _sprites;
+	Common::Array<Sprite*> _collisionSprites;
 };
 
 
diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index c40b9e7..9dc4582 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -108,26 +108,6 @@ static const NeverhoodGameDescription gameDescriptions[] = {
 	{ AD_TABLE_END_MARKER, 0, 0, 0, 0 }
 };
 
-/**
- * The fallback game descriptor used by the Neverhood engine's fallbackDetector.
- * Contents of this struct are to be overwritten by the fallbackDetector.
- */
-static NeverhoodGameDescription g_fallbackDesc = {
-	{
-		"",
-		"",
-		AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor
-		Common::UNK_LANG,
-		Common::kPlatformPC,
-		ADGF_NO_FLAGS,
-		GUIO_NONE
-	},
-	0,
-	0,
-	0,
-	0,
-};
-
 } // End of namespace Neverhood
 
 class NeverhoodMetaEngine : public AdvancedMetaEngine {
@@ -152,8 +132,6 @@ public:
 	void removeSaveState(const char *target, int slot) const;
 	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
 
-	const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const;
-
 };
 
 bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -182,20 +160,6 @@ bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
 	return gd != 0;
 }
 
-const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSList &fslist) const {
-	// Set the default values for the fallback descriptor's ADGameDescription part.
-	Neverhood::g_fallbackDesc.desc.language = Common::UNK_LANG;
-	Neverhood::g_fallbackDesc.desc.platform = Common::kPlatformPC;
-	Neverhood::g_fallbackDesc.desc.flags = ADGF_NO_FLAGS;
-
-	// Set default values for the fallback descriptor's NeverhoodGameDescription part.
-	Neverhood::g_fallbackDesc.gameID = 0;
-	Neverhood::g_fallbackDesc.features = 0;
-	Neverhood::g_fallbackDesc.version = 3;
-
-	return NULL;
-}
-
 SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const {
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 	Neverhood::NeverhoodEngine::SaveHeader header;
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index d6d4de1..fbef600 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -325,7 +325,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	setPalette(kDiskplayerPaletteFileHashes[paletteIndex]);
 
 	_ssPlayButton = insertSprite<DiskplayerPlayButton>(this);
-	_vm->_collisionMan->addSprite(_ssPlayButton);
+	_vm->_collisionMan->addCollisionSprite(_ssPlayButton);
 
 	_asKey = insertSprite<AsDiskplayerSceneKey>();
 
@@ -351,7 +351,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	_finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0);
 	addEntity(_finalDiskSlot);
 
-	insertMouse435(0x000408A8, 20, 620);
+	insertPuzzleMouse(0x000408A8, 20, 620);
 	showMouse(false);
 
 	_diskSmackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true);
@@ -442,7 +442,6 @@ void DiskplayerScene::update() {
 }
 
 uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
 	Scene::handleMessage(messageNum, param, sender);
 	if (!_inputDisabled) {
 		switch (messageNum) {
@@ -473,7 +472,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 			break;			
 		}
 	}
-	return messageResult;
+	return 0;
 }
 
 void DiskplayerScene::stop() {
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 528d303..521c0e0 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -240,7 +240,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
 	
 	setBackground(0x08C0020C);
 	setPalette(0x08C0020C);
-	insertMouse433(0x00208084);
+	insertScreenMouse(0x00208084);
 	
 	insertStaticSprite(0x41137051, 100);
 	insertStaticSprite(0xC10B2015, 100);
@@ -251,7 +251,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
 	for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) {
 		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
 			kMenuButtonFileHashes[buttonIndex], kMenuButtonCollisionBounds[buttonIndex]);
-		_vm->_collisionMan->addSprite(menuButton);
+		_vm->_collisionMan->addCollisionSprite(menuButton);
 	}
 	
 	SetUpdateHandler(&Scene::update);	
@@ -466,7 +466,7 @@ TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 it
 
 void TextLabelWidget::addSprite() {
 	_parentScene->addSprite(this);
-	_vm->_collisionMan->addSprite(this);
+	_vm->_collisionMan->addCollisionSprite(this);
 }
 
 int16 TextLabelWidget::getWidth() {
@@ -544,7 +544,7 @@ void TextEditWidget::addSprite() {
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
-	_vm->_collisionMan->addSprite(this);
+	_vm->_collisionMan->addCollisionSprite(this);
 	_surface->setVisible(true);
 	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2,
 		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
@@ -708,7 +708,7 @@ void SavegameListBox::addSprite() {
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
-	_vm->_collisionMan->addSprite(this);
+	_vm->_collisionMan->addCollisionSprite(this);
 	_surface->setVisible(true);
 	buildItems();
 	_firstVisibleItem = 0;
@@ -809,7 +809,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 	
 	setBackground(0x30084E25);
 	setPalette(0x30084E25);
-	insertMouse433(0x84E21308, &kMouseRect);
+	insertScreenMouse(0x84E21308, &kMouseRect);
 	insertStaticSprite(0x1340A5C2, 200);
 	insertStaticSprite(0x1301A7EA, 200);
 
@@ -826,7 +826,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
 		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
 			kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]);
-		_vm->_collisionMan->addSprite(menuButton);
+		_vm->_collisionMan->addCollisionSprite(menuButton);
 	}
 
 
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 1aaa0c2..6c5cc28 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -344,7 +344,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
 	setHitRects(0x004B4860);
 	setBackground(0x4086520E);
 	setPalette(0x4086520E);
-	insertMouse433(0x6520A400);
+	insertScreenMouse(0x6520A400);
 	
 	if (which < 0) {
 		// Restoring game
@@ -1226,7 +1226,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 		_vm->_gameState.which = 0;
 	}
 
-	insertMouse433(0x23303124);
+	insertScreenMouse(0x23303124);
 
 	tempSprite = insertStaticSprite(0xB3242310, 825);
 	tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y,
@@ -1243,7 +1243,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
 	_ssPressButton = insertSprite<SsCommonPressButton>(this, 0x00412692, 0x140B60BE, 800, 0);
 	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, false);
-	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
+	_vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap);
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 
@@ -1395,7 +1395,7 @@ StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backg
 	
 	setBackground(backgroundFileHash);
 	setPalette(backgroundFileHash);
-	insertMouse435(cursorFileHash, 20, 620);
+	insertPuzzleMouse(cursorFileHash, 20, 620);
 }
 
 uint32 StaticScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1460,7 +1460,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	addEntity(_palette);
 
-	insertMouse433(0x03001504);
+	insertScreenMouse(0x03001504);
 
 	if (which < 0) {
 		// Restoring game
@@ -1550,13 +1550,13 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x2800E011);
 		setPalette(0x2800E011);
 		insertStaticSprite(0x492D5AD7, 100);
-		insertMouse435(0x0E015288, 20, 620);
+		insertPuzzleMouse(0x0E015288, 20, 620);
 	} else {
 		setBackground(0x8870A546);
 		setPalette(0x8870A546);
 		insertStaticSprite(0x40D1E0A9, 100);
 		insertStaticSprite(0x149C00A6, 100);
-		insertMouse435(0x0A54288F, 20, 620);
+		insertPuzzleMouse(0x0A54288F, 20, 620);
 	}
 
 	drawTextToBackground();
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index cc6284b..4b8a8ba 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -444,8 +444,8 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule)
 	
 	_asTeddyBear = insertSprite<AsScene1105TeddyBear>(this);
 	ssOpenButton = insertSprite<SsScene1105OpenButton>(this);
-	_vm->_collisionMan->addSprite(ssOpenButton);
-	insertMouse435(0x10006208, 20, 620);
+	_vm->_collisionMan->addCollisionSprite(ssOpenButton);
+	insertPuzzleMouse(0x10006208, 20, 620);
 	
 	loadSound(0, 0x48442057);
 	loadSound(1, 0xC025014F);
@@ -555,19 +555,19 @@ void Scene1105::createObjects() {
 	_ssSymbolDice[2] = insertSprite<SsScene1105SymbolDie>(2, 485, 304);
 
 	_ssSymbol1UpButton = insertSprite<SsScene1105Button>(this, 0x08002860, NRect(146, 362, 192, 403));
-	_vm->_collisionMan->addSprite(_ssSymbol1UpButton);
+	_vm->_collisionMan->addCollisionSprite(_ssSymbol1UpButton);
 	_ssSymbol1DownButton = insertSprite<SsScene1105Button>(this, 0x42012460, NRect(147, 404, 191, 442));
-	_vm->_collisionMan->addSprite(_ssSymbol1DownButton);
+	_vm->_collisionMan->addCollisionSprite(_ssSymbol1DownButton);
 	_ssSymbol2UpButton = insertSprite<SsScene1105Button>(this, 0x100030A0, NRect(308, 361, 355, 402));
-	_vm->_collisionMan->addSprite(_ssSymbol2UpButton);
+	_vm->_collisionMan->addCollisionSprite(_ssSymbol2UpButton);
 	_ssSymbol2DownButton = insertSprite<SsScene1105Button>(this, 0x840228A0, NRect(306, 406, 352, 445));
-	_vm->_collisionMan->addSprite(_ssSymbol2DownButton);
+	_vm->_collisionMan->addCollisionSprite(_ssSymbol2DownButton);
 	_ssSymbol3UpButton = insertSprite<SsScene1105Button>(this, 0x20000120, NRect(476, 358, 509, 394));
-	_vm->_collisionMan->addSprite(_ssSymbol3UpButton);
+	_vm->_collisionMan->addCollisionSprite(_ssSymbol3UpButton);
 	_ssSymbol3DownButton = insertSprite<SsScene1105Button>(this, 0x08043121, NRect(463, 401, 508, 438));
-	_vm->_collisionMan->addSprite(_ssSymbol3DownButton);
+	_vm->_collisionMan->addCollisionSprite(_ssSymbol3DownButton);
 	_ssActionButton = insertSprite<SsScene1105Button>(this, 0x8248AD35, NRect(280, 170, 354, 245));
-	_vm->_collisionMan->addSprite(_ssActionButton);
+	_vm->_collisionMan->addCollisionSprite(_ssActionButton);
 	
 	_isPanelOpen = true;
 	
@@ -575,7 +575,7 @@ void Scene1105::createObjects() {
 
 	// TODO: Find a nicer way
 	deleteSprite((Sprite**)&_mouseCursor);
-	insertMouse435(0x18666208, 20, 620);
+	insertPuzzleMouse(0x18666208, 20, 620);
 	
 }
 
@@ -652,7 +652,7 @@ Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0x8449E02F);
 	setPalette(0x8449E02F);
-	insertMouse433(0x9E02B84C);
+	insertScreenMouse(0x9E02B84C);
 	
 	_sprite1 = insertStaticSprite(0x600CEF01, 1100);
 
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index e86aa00..11e29fd 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -671,10 +671,10 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]);
 	}
 
-	insertMouse433(0x9A2C0409);
+	insertScreenMouse(0x9A2C0409);
 	
 	_asTape = insertSprite<AsScene1201Tape>(this, 3, 1100, 243, 340, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 	
 	tempSprite = insertStaticSprite(0x03C82530, 100);
 	topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; 
@@ -752,7 +752,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			_asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1);
 			_asTntMan->setClipRect(x1, 0, x2, 480);
 			_asTntMan->setRepl(64, 0);
-			_vm->_collisionMan->addSprite(_asTntMan);
+			_vm->_collisionMan->addCollisionSprite(_asTntMan);
 			tempSprite = insertSprite<AsScene1201TntManFlame>(_asTntMan);
 			tempSprite->setClipRect(x1, 0, x2, 480);
 		}
@@ -826,7 +826,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_MATCH_STATUS) < 3) {
 		_asMatch = insertSprite<AsScene1201Match>(this);
-		_vm->_collisionMan->addSprite(_asMatch);
+		_vm->_collisionMan->addCollisionSprite(_asMatch);
 	}
 
 	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) {
@@ -1011,11 +1011,11 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule)
 	_paletteResource.load(0x60250EB5);
 	_paletteResource.copyPalette(_paletteData);
 
-	insertMouse435(0x10ED160A, 20, 620);
+	insertPuzzleMouse(0x10ED160A, 20, 620);
 
 	for (int tntIndex = 0; tntIndex < 18; tntIndex++) {
 		_asTntItems[tntIndex] = insertSprite<AsScene1202TntItem>(this, tntIndex);
-		_vm->_collisionMan->addSprite(_asTntItems[tntIndex]);
+		_vm->_collisionMan->addCollisionSprite(_asTntItems[tntIndex]);
 	}
 
 	insertStaticSprite(0x8E8419C1, 1100);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index feebd78..989ada5 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -427,7 +427,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B0A38);
 	setBackground(0x420643C4);
 	setPalette(0x420643C4);
-	insertMouse433(0x643C0428);
+	insertScreenMouse(0x643C0428);
 
 	_class595 = insertStaticSprite(0xB0420130, 1015);
 	_sprite1 = insertStaticSprite(0x942FC224, 300);
@@ -456,7 +456,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480);
 
 	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, true);
-	_vm->_collisionMan->addSprite(_asVenusFlyTrap);
+	_vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap);
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 	
@@ -637,11 +637,11 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule)
 	setRectList(0x004AF9E8);
 	setBackground(0x01581A9C);
 	setPalette(0x01581A9C);
-	insertMouse433(0x81A9801D);
+	insertScreenMouse(0x81A9801D);
 
 	if (!getGlobalVar(V_BALLOON_POPPED)) {
 		_asBalloon = insertSprite<AsScene1303Balloon>(this);
-		_vm->_collisionMan->addSprite(_asBalloon);
+		_vm->_collisionMan->addCollisionSprite(_asBalloon);
 	}
 	
 	_sprite1 = insertStaticSprite(0xA014216B, 1100);
@@ -699,18 +699,18 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B91A8);
 	setBackground(0x062C0214);
 	setPalette(0x062C0214);
-	insertMouse433(0xC021006A);
+	insertScreenMouse(0xC021006A);
 	
 	if (getGlobalVar(V_BALLOON_POPPED)) {
 		_asKey = insertSprite<AsCommonKey>(this, 0, 1100, 278, 347);
-		_vm->_collisionMan->addSprite(_asKey);
+		_vm->_collisionMan->addCollisionSprite(_asKey);
 	} else {
 		_asKey = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
 	}
 
 	if (!getGlobalVar(V_HAS_NEEDLE)) {
 		_asNeedle = insertSprite<AsScene1304Needle>(this, 1100, 278, 347);
-		_vm->_collisionMan->addSprite(_asNeedle);
+		_vm->_collisionMan->addCollisionSprite(_asNeedle);
 	}
 
 	_sprite1 = insertStaticSprite(0x0562E621, 1100);
@@ -763,7 +763,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B6E98);
 	setBackground(0x28801B64);
 	setPalette(0x28801B64);
-	insertMouse433(0x01B60280);
+	insertScreenMouse(0x01B60280);
 
 	if (which < 0) {
 		// Restoring game
@@ -876,11 +876,11 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x05303114);
 	setPalette(0x05303114);
-	insertMouse433(0x0311005B);
+	insertScreenMouse(0x0311005B);
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 4) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 435, 445);
-		_vm->_collisionMan->addSprite(_asKey);
+		_vm->_collisionMan->addCollisionSprite(_asKey);
 	}
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x404A36A0, 100, 0x440C1000);
@@ -897,14 +897,14 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1306>(380, 440);
 		setMessageList(0x004AFAD0);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else if (which == 1) {
 		// Klaymen teleporting in
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFAF0);
 		sendMessage(this, 0x2000, 1);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else if (which == 2) {
 		// Klaymen returning from diskplayer
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
@@ -915,27 +915,27 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 		setMessageList(0x004AFBC8);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else if (which == 3) {
 		// Klaymen returning from window
 		insertKlayman<KmScene1306>(534, 440);
 		setMessageList(0x004AFC30);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else if (which == 4) {
 		// Klaymen teleporting out
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFC38);
 		sendMessage(this, 0x2000, 1);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else if (which == 5) {
 		// Klaymen returning from teleporter
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFB00);
 		sendMessage(this, 0x2000, 1);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else {
 		// Klaymen coming up in elevator
 		insertKlayman<KmScene1306>(286, 408);
@@ -1007,7 +1007,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
 		setSurfacePriority(_sprite1->getSurface(), 80);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 		break;
 	}
 	return 0;
@@ -1033,7 +1033,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
 		setSurfacePriority(_sprite1->getSurface(), 80);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 		break;
 	}
 	return 0;
@@ -1246,7 +1246,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule)
 	setBackground(0xA8006200);
 	setPalette(0xA8006200);
 	addEntity(_palette);
-	insertMouse435(0x06204A88, 20, 620);
+	insertPuzzleMouse(0x06204A88, 20, 620);
 
 	tempSprite = insertStaticSprite(0x00A3621C, 800);
 	_clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480);
@@ -1260,7 +1260,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule)
 	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 		if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) {
 			_asKeys[keyIndex] = insertSprite<AsScene1307Key>(this, keyIndex, _clipRects);
-			_vm->_collisionMan->addSprite(_asKeys[keyIndex]);
+			_vm->_collisionMan->addCollisionSprite(_asKeys[keyIndex]);
 		} else {
 			_asKeys[keyIndex] = NULL;
 		}
@@ -1527,10 +1527,10 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0x41024202);
 	setPalette(0x41024202);
-	insertMouse433(0x24206418);
+	insertScreenMouse(0x24206418);
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 17, 1100, 502, 445, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 
 	if (getGlobalVar(V_MOUSE_SUCKED_IN)) {
 		insertSprite<AsScene1308Mouse>();
@@ -1603,7 +1603,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_asProjector);
+		_vm->_collisionMan->addCollisionSprite(_asProjector);
 		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
 		_asProjector->setRepl(64, 0);
 	}
@@ -1701,7 +1701,7 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule)
 	
 	SetMessageHandler(&Scene1317::handleMessage);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
-	insertMouse433(0x08284011);
+	insertScreenMouse(0x08284011);
 	showMouse(false);
 	_smackerFileHash = 0;
 	_keepLastSmackerFrame = false;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index e0cf2c5..521981e 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -637,7 +637,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B6758);
 	setBackground(0x08221FA5);
 	setPalette(0x08221FA5);
-	insertMouse433(0x21FA108A);
+	insertScreenMouse(0x21FA108A);
 	
 	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x980F3124, 0x12192892, 100, 0);
 	_asPipe = insertSprite<AsScene1401Pipe>();
@@ -678,7 +678,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, _asPipe);
-		_vm->_collisionMan->addSprite(_asProjector);
+		_vm->_collisionMan->addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 6) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
@@ -850,7 +850,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackgroundY(-10);
 	setPalette(0x231482F0);
 	_palette->addPalette(0x91D3A391, 0, 64, 0);
-	insertMouse433(0x482F4239);
+	insertScreenMouse(0x482F4239);
 
 	_ssBridgePart1 = insertSprite<SsScene1402BridgePart>(0x15402D64, 1100);
 	_ssBridgePart2 = insertSprite<SsScene1402BridgePart>(0x10A02120, 1100);
@@ -898,7 +898,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_asProjector);
+		_vm->_collisionMan->addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
@@ -1227,7 +1227,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule)
 
 	setBackground(0x00442225);
 	setPalette(0x00442225);
-	insertMouse435(0x4222100C, 20, 620);
+	insertPuzzleMouse(0x4222100C, 20, 620);
 
 	_asMouse = insertSprite<AsScene1407Mouse>(this);
 	_ssResetButton = insertStaticSprite(0x12006600, 100);
@@ -1285,17 +1285,17 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004B1FF8);
 	setBackground(0x2110A234);
 	setPalette(0x2110A234);
-	insertMouse433(0x0A230219);
+	insertScreenMouse(0x0A230219);
 
 	_sprite1 = insertStaticSprite(0x01102A33, 100);
 	_sprite1->setVisible(false);
 	_sprite2 = insertStaticSprite(0x04442520, 995);
 	_sprite3 = insertStaticSprite(0x08742271, 995);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 12, 1100, 201, 468, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape1);
+	_vm->_collisionMan->addCollisionSprite(_asTape1);
 	_asTape1->setRepl(64, 0);
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 16, 1100, 498, 468, 0x9048A093);
-	_vm->_collisionMan->addSprite(_asTape2);
+	_vm->_collisionMan->addCollisionSprite(_asTape2);
 	_asTape2->setRepl(64, 0);
 
 	if (which < 0) {
@@ -1311,7 +1311,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_asProjector);
+		_vm->_collisionMan->addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
@@ -1393,16 +1393,16 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0xAC0B006F);
 	setPalette(0xAC0B006F);
 	_palette->addPalette(0x00801510, 0, 65, 0);
-	insertMouse433(0xB006BAC8);
+	insertScreenMouse(0xB006BAC8);
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 5) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 267, 411);
-		_vm->_collisionMan->addSprite(_asKey);
+		_vm->_collisionMan->addCollisionSprite(_asKey);
 	}
 
 	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
 	_asTape = insertSprite<AsScene1201Tape>(this, 14, 1100, 281, 411, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 
 	if (which < 0) {
 		// Restoring game
@@ -1429,7 +1429,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addSprite(_asProjector);
+		_vm->_collisionMan->addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
@@ -1561,11 +1561,11 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule)
 
 	setBackground(0x0C0C007D);
 	setPalette(0x0C0C007D);
-	insertMouse435(0xC00790C8, 20, 620);
+	insertPuzzleMouse(0xC00790C8, 20, 620);
 	
 	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
 		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
-		_vm->_collisionMan->addSprite(_tiles[tileIndex]);
+		_vm->_collisionMan->addCollisionSprite(_tiles[tileIndex]);
 		if (getSubVar(VA_IS_TILE_MATCH, tileIndex))
 			_tilesLeft--;
 	}
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index 41fc415..b40d580 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -996,7 +996,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene1608::hmLowerFloor);
 	
 	_asKey = insertSprite<AsCommonKey>(this, 1, 1100, 198, 220);
-	_vm->_collisionMan->addSprite(_asKey);
+	_vm->_collisionMan->addCollisionSprite(_asKey);
 
 	if (which < 0) {
 		// Restoring game
@@ -1014,10 +1014,10 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 			setBackground(0x10080E01);
 			setPalette(0x10080E01);
 			_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-			_vm->_collisionMan->addSprite(_asTape);
+			_vm->_collisionMan->addCollisionSprite(_asTape);
 			_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 			SetUpdateHandler(&Scene1608::upLowerFloor);
-			insertMouse433(0x80E05108);
+			insertScreenMouse(0x80E05108);
 			insertStaticSprite(0x4B18F868, 1200);
 		}
 	} else if (which == 0) {
@@ -1031,8 +1031,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x10080E01);
 		setPalette(0x10080E01);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape);
-		insertMouse433(0x80E05108);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
+		insertScreenMouse(0x80E05108);
 		_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 		SetUpdateHandler(&Scene1608::upLowerFloor);
@@ -1045,7 +1045,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x98001604);
 		setPalette(0x98001604);
 		_palette->addPalette("paPodRed", 65, 31, 65);
-		insertMouse433(0x01600988);
+		insertScreenMouse(0x01600988);
 		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
 		_asCar = createSprite<AsCommonCar>(this, 375, 227); // Create but don't add to the sprite list yet
 		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
@@ -1072,7 +1072,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarLower->setClipRect(_clipRect1);
 		_asIdleCarFull->setClipRect(_clipRect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
 		_klaymanInCar = false;
 		_carClipFlag = false;
@@ -1089,7 +1089,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x98001604);
 		setPalette(0x98001604);
 		_palette->addPalette("paPodRed", 65, 31, 65);
-		insertMouse433(0x01600988);
+		insertScreenMouse(0x01600988);
 		_asCar = insertSprite<AsCommonCar>(this, 375, 227);
 		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
 		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
@@ -1114,7 +1114,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarLower->setClipRect(_clipRect1);
 		_asIdleCarFull->setClipRect(_clipRect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		// ... _vm->_collisionMan->addSprite(_asTape);
+		// ... _vm->_collisionMan->addCollisionSprite(_asTape);
 		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
 		_klaymanInCar = true;
 		_carClipFlag = true;
@@ -1313,13 +1313,13 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule)
 	
 	setBackground(0x92124A14);
 	setPalette(0x92124A14);
-	insertMouse435(0x24A10929, 20, 620);
+	insertPuzzleMouse(0x24A10929, 20, 620);
 	
 	for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++)
 		_asSymbols[symbolPosition] = insertSprite<AsScene3011Symbol>(symbolPosition, false);
 	
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
-	_vm->_collisionMan->addSprite(_ssButton);
+	_vm->_collisionMan->addCollisionSprite(_ssButton);
 	loadSound(0, 0x68E25540);
 
 }
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index aa14529..cf2fe63 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -193,14 +193,14 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addBasePalette(0x91D3A391, 0, 64, 0);
 	_palette->copyBasePalette(0, 256, 0);
 	addEntity(_palette);
-	insertMouse433(0x18222039);
+	insertScreenMouse(0x18222039);
 
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0);
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1);
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2);
 	_sprite = insertStaticSprite(0x31313A22, 1100);
 	_ssTape = insertSprite<SsScene1705Tape>(this, 15, 1100, 238, 439, 0x02363852);
-	_vm->_collisionMan->addSprite(_ssTape);
+	_vm->_collisionMan->addCollisionSprite(_ssTape);
 
 	if (which < 0) {
 		// Restoring game
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 269fd84..2557121 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -95,7 +95,7 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x01303227);
 	setPalette(0x01303227);
-	insertMouse433(0x0322301B);
+	insertScreenMouse(0x0322301B);
 
 	insertStaticSprite(0x42213133, 1100);
 	
@@ -358,8 +358,8 @@ void AsScene1907Symbol::stFallOffHitGround() {
 	playSound(1);
 	sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex);
 	Entity::_priority = 1000 - _newPositionIndex;
-	_vm->_collisionMan->removeSprite(this);
-	_vm->_collisionMan->addSprite(this);
+	_vm->_collisionMan->removeCollisionSprite(this);
+	_vm->_collisionMan->addCollisionSprite(this);
 	SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround);
 	NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent);
 	_newStickFrameIndex = 0;
@@ -527,15 +527,15 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule)
 
 	for (int i = 0; i < 9; i++) {
 		_asSymbols[i] = insertSprite<AsScene1907Symbol>(this, i, getRandomPositionIndex());
-		_vm->_collisionMan->addSprite(_asSymbols[i]);
+		_vm->_collisionMan->addCollisionSprite(_asSymbols[i]);
 	}
 	
 	_ssUpDownButton = insertSprite<SsScene1907UpDownButton>(this, _asSymbols[8]);
-	_vm->_collisionMan->addSprite(_ssUpDownButton);
+	_vm->_collisionMan->addCollisionSprite(_ssUpDownButton);
 
 	_asWaterHint = insertSprite<AsScene1907WaterHint>();
 	
-	insertMouse435(0x28E0120E, 20, 620);
+	insertPuzzleMouse(0x28E0120E, 20, 620);
 
 	SetMessageHandler(&Scene1907::handleMessage);
 	SetUpdateHandler(&Scene1907::update);
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index ce871de..643bec4 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -103,7 +103,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0xA6417244);
 	setPalette(0xA6417244);
-	insertMouse433(0x17240A6C);
+	insertScreenMouse(0x17240A6C);
 
 	tempSprite = insertStaticSprite(0x0D641724, 1100);
 
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 7bbb9e8..12b10b4 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -203,15 +203,15 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0x44242305);
 	setPalette(0x44242305);
-	insertMouse433(0x4230144A);
+	insertScreenMouse(0x4230144A);
 
 	insertStaticSprite(0x00502330, 1100);
 	tempSprite = insertStaticSprite(0x78492010, 1100);
 	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x72427010, 0x32423010, 200, 0);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 18, 1100, 412, 443, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape1);
+	_vm->_collisionMan->addCollisionSprite(_asTape1);
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 11, 1100, 441, 443, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape2);
+	_vm->_collisionMan->addCollisionSprite(_asTape2);
 	
 	if (which < 0) {
 		insertKlayman<KmScene2101>(380, 438);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 8061e97..dc77a5e 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -548,10 +548,10 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	loadHitRectList();
 	setBackground(0x40008208);
 	setPalette(0x40008208);
-	insertMouse433(0x0820C408);
+	insertScreenMouse(0x0820C408);
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 7, 1100, 459, 432, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape); 
+	_vm->_collisionMan->addCollisionSprite(_asTape); 
 	_ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
 	for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++)
@@ -881,13 +881,13 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x08100A0C);
 	setPalette(0x08100A0C);
 	addEntity(_palette);
-	insertMouse435(0x00A08089, 20, 620);
+	insertPuzzleMouse(0x00A08089, 20, 620);
 
 	for (uint32 cubePosition = 0; cubePosition < 9; cubePosition++) {
 		int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition);
 		if (cubeSymbol >= 0) {
 			Sprite *puzzleCubeSprite = insertSprite<SsScene2202PuzzleCube>(this, cubePosition, cubeSymbol);
-			_vm->_collisionMan->addSprite(puzzleCubeSprite);
+			_vm->_collisionMan->addCollisionSprite(puzzleCubeSprite);
 		}
 	}
 
@@ -1094,17 +1094,17 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x82C80334);
 	setPalette(0x82C80334);
-	insertMouse433(0x80330824);
+	insertScreenMouse(0x80330824);
 	setHitRects(0x004B8320);
 	setRectList(0x004B8420);
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 1) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 282, 432);
-		_vm->_collisionMan->addSprite(_asKey);
+		_vm->_collisionMan->addCollisionSprite(_asKey);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 1, 1100, 435, 432, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 	_asLeftDoor = insertSprite<AsScene2203Door>(this, 0);
 	_asRightDoor = insertSprite<AsScene2203Door>(this, 1);
 	_ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100);
@@ -1113,8 +1113,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480);
 	sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor);
 	sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor);
-	_vm->_collisionMan->addSprite(_asLeftDoor);
-	_vm->_collisionMan->addSprite(_asRightDoor);
+	_vm->_collisionMan->addCollisionSprite(_asLeftDoor);
+	_vm->_collisionMan->addCollisionSprite(_asRightDoor);
 
 	if (which < 0) {
 		// Restoring game
@@ -1227,14 +1227,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x0008028D);
 		setPalette(0x0008028D);
 		addEntity(_palette);
-		insertMouse433(0x80289008);
+		insertScreenMouse(0x80289008);
 		_ssLightSwitch = insertSprite<SsCommonPressButton>(this, 0x2D339030, 0x2D309030, 100, 0);
 	} else {
 		_isLightOn = false;
 		setBackground(0xD00A028D);
 		setPalette(0xD00A028D);
 		addEntity(_palette);
-		insertMouse433(0xA0289D08);
+		insertScreenMouse(0xA0289D08);
 		_ssLightSwitch = insertSprite<SsCommonPressButton>(this, 0x2D339030, 0xDAC86E84, 100, 0);
 	}
 	_palette->addBasePalette(0xD00A028D, 0, 256, 0);
@@ -1467,7 +1467,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8AF8);
 		_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x0E038022, 100, 0);
-		insertMouse433(0x83212411);
+		insertScreenMouse(0x83212411);
 		_ssTestTube = insertSprite<SsScene2206TestTube>(this, 1100, /*464, 433, */0x5E00E262);
 		_asPlatform = insertSprite<AsScene2206Platform>(0x085E25E0);
 	} else {
@@ -1479,7 +1479,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480);
 		setRectList(0x004B8B58);
 		_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x16882608, 100, 0);
-		insertMouse433(0x02A41E09);
+		insertScreenMouse(0x02A41E09);
 		_ssTestTube = insertSprite<SsScene2206TestTube>(this, 1100, /*464, 433, */0x52032563);
 		_asPlatform = insertSprite<AsScene2206Platform>(0x317831A0);
 	}
@@ -1491,7 +1491,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addBasePalette(fileHash, 0, 256, 0);
 	if (!getGlobalVar(V_LIGHTS_ON))
 		_palette->addPalette(0x0263D144, 0, 65, 0);
-	_vm->_collisionMan->addSprite(_ssTestTube);
+	_vm->_collisionMan->addCollisionSprite(_ssTestTube);
 	
 	if (which < 0) {
 		// Restoring game
@@ -1944,14 +1944,14 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule)
 	if (getGlobalVar(V_LIGHTS_ON)) {
 		setBackground(0x88C00241);
 		setPalette(0x88C00241);
-		insertMouse433(0x00245884);
+		insertScreenMouse(0x00245884);
 		_ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200);
 		_ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100);
 		_ssMaskPart3 = insertStaticSprite(0x0043B038, 1100);
 		_asTape = insertSprite<AsScene1201Tape>(this, 4, 1100, 277, 428, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape); 
+		_vm->_collisionMan->addCollisionSprite(_asTape); 
 		_asLever = insertSprite<AsScene2207Lever>(this, 527, 333, 0);
-		_vm->_collisionMan->addSprite(_asLever);
+		_vm->_collisionMan->addCollisionSprite(_asLever);
 		_asWallRobotAnimation = insertSprite<AsScene2207WallRobotAnimation>(this);
 		_asWallCannonAnimation = insertSprite<AsScene2207WallCannonAnimation>();
 		_asWallRobotAnimation->setVisible(false);
@@ -1964,7 +1964,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule)
 		setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1);
 		setBackground(0x05C02A55);
 		setPalette(0x05C02A55);
-		insertMouse433(0x02A51054);
+		insertScreenMouse(0x02A51054);
 		_ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200);
 		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0);
 		insertSprite<SsScene2207Symbol>(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1);
@@ -2134,7 +2134,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	addBackground(_background);
 	setPalette(0x08100289);
 	addEntity(_palette);
-	insertMouse435(0x0028D089, 40, 600);
+	insertPuzzleMouse(0x0028D089, 40, 600);
 	
 	createFontSurface();
 	_backgroundSurface = new BaseSurface(_vm, 0, 640, 480);
@@ -2296,7 +2296,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	if (getGlobalVar(V_LIGHTS_ON)) {
 		setBackground(0x11840E24);
 		setPalette(0x11840E24);
-		insertMouse433(0x40E20110);
+		insertScreenMouse(0x40E20110);
 		setRectList(0x004B3DC8);
 	} else {
 		setBackground(0x25848E24);
@@ -2304,12 +2304,12 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 		addEntity(_palette);
 		_palette->copyBasePalette(0, 256, 0);
 		_palette->addPalette(0x68033B1C, 0, 65, 0);
-		insertMouse433(0x48E20250);
+		insertScreenMouse(0x48E20250);
 		setRectList(0x004B3E18);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 10, 1100, 464, 435, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape); 
+	_vm->_collisionMan->addCollisionSprite(_asTape); 
 
 	if (which < 0) {
 		// Restoring game
@@ -2418,12 +2418,12 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule
 		setRectList(0x004B2BF8);
 		setBackground(_hallOfRecordsInfo->bgFilename2);
 		setPalette(_hallOfRecordsInfo->bgFilename2);
-		insertMouse433(0x14320138);
+		insertScreenMouse(0x14320138);
 	} else {
 		setRectList(0x004B2BB8);
 		setBackground(_hallOfRecordsInfo->bgFilename1);
 		setPalette(_hallOfRecordsInfo->bgFilename1);
-		insertMouse433(0x63A40028);
+		insertScreenMouse(0x63A40028);
 	}
 
 	if (which < 0) {
@@ -2507,12 +2507,12 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
 		setRectList(0x004B5588);
 		setBackground(0x40339414);
 		setPalette(0x40339414);
-		insertMouse433(0x3941040B);
+		insertScreenMouse(0x3941040B);
 	} else {
 		setRectList(0x004B55C8);
 		setBackground(0x071963E5);
 		setPalette(0x071963E5);
-		insertMouse433(0x14320138);
+		insertScreenMouse(0x14320138);
 	}
 
 	if (which < 0) {
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index 3acb8b4..ed9e231 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -382,7 +382,7 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
 	addEntity(_palette);
 	_palette->addBasePalette(0x8C030206, 0, 256, 0);
 	_palette->addPalette(0x91D3A391, 0, 65, 0);
-	insertMouse433(0x302028C8);
+	insertScreenMouse(0x302028C8);
 
 	_sprite1 = insertStaticSprite(0x2E068A23, 200);
 	insertStaticSprite(0x401410A6, 200);
@@ -694,9 +694,9 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 	setRectList(0x004AF900);
 	setBackground(0x81660220);
 	setPalette(0x81660220);
-	insertMouse433(0x6022481E);
+	insertScreenMouse(0x6022481E);
 	_asTape = insertSprite<AsScene1201Tape>(this, 9, 1100, 286, 409, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
 	
 	if (which < 0) {
@@ -794,9 +794,9 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x0C05060C);
 	setPalette(0x0C05060C);
 	_palette->addPalette(0x414364B0, 0, 65, 0);
-	insertMouse433(0x506080C8);
+	insertScreenMouse(0x506080C8);
 	_asTape = insertSprite<AsScene1201Tape>(this, 2, 1100, 480, 454, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 	_asLightCord = insertSprite<AsScene2803LightCord>(this, 0xA1095A10, 0x836D3813, 368, 200);
 	_asLightCord->setClipRect(0, 25, 640, 480);
 	
@@ -889,15 +889,15 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene2406::handleMessage);
 	
 	setRectList(0x004B78C8);
-	insertMouse433(0xB03001A8);
+	insertScreenMouse(0xB03001A8);
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 2) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 560, 409);
-		_vm->_collisionMan->addSprite(_asKey);
+		_vm->_collisionMan->addCollisionSprite(_asKey);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011);
-	_vm->_collisionMan->addSprite(_asTape);
+	_vm->_collisionMan->addCollisionSprite(_asTape);
 	tempSprite2 = insertStaticSprite(0x19625293, 1100);
 	_clipRects[0].x1 = 0;
 	_clipRects[0].y1 = 0;
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 3479387..3fc508a 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -232,7 +232,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x1B8E8115);
 	_palette->addPalette(0x00128842, 65, 31, 65);
 	_palette->addPalette("paKlayRed", 0, 64, 0);
-	insertMouse433(0xE81111B0);
+	insertScreenMouse(0xE81111B0);
 
 	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x99BE9015); // Don't add this to the sprite list
 	addEntity(_ssTrackShadowBackground);
@@ -542,8 +542,8 @@ Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x90791B80);
 	setPalette(0x90791B80);
 	ssButton = insertSprite<SsScene2504Button>();
-	_vm->_collisionMan->addSprite(ssButton);
-	insertMouse435(0x91B8490F, 20, 620);
+	_vm->_collisionMan->addCollisionSprite(ssButton);
+	insertPuzzleMouse(0x91B8490F, 20, 620);
 	SetMessageHandler(&Scene2504::handleMessage);
 	SetUpdateHandler(&Scene::update);
 }
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 741f413..91132c0 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -317,8 +317,8 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x51409A16);
 	_asWater = insertSprite<AsScene2609Water>();
 	_ssButton = insertSprite<SsScene2609Button>(this);
-	_vm->_collisionMan->addSprite(_ssButton);
-	insertMouse435(0x09A1251C, 20, 620);
+	_vm->_collisionMan->addCollisionSprite(_ssButton);
+	insertPuzzleMouse(0x09A1251C, 20, 620);
 	insertStaticSprite(0x02138002, 1200);
 	insertStaticSprite(0x825E2827, 1200);
 }
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 50b4b24..b22da94 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -626,7 +626,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(sceneInfo->bgFilename);
 	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
-	insertMouse433(0x08B08180);
+	insertScreenMouse(0x08B08180);
 	
 	tempSprite = insertStaticSprite(0x1E086325, 1200);
 	clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2());
@@ -734,7 +734,7 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
 	addEntity(_palette);
-	insertMouse433(0x08B04180);
+	insertScreenMouse(0x08B04180);
 
 	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x12002035);
 	addEntity(_ssTrackShadowBackground);
@@ -894,7 +894,7 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
 	addEntity(_palette);
-	insertMouse433(sceneInfo->mouseCursorFilename);
+	insertScreenMouse(sceneInfo->mouseCursorFilename);
 	
 	_palStatus = 2;
 	
@@ -1015,7 +1015,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	while (staticSprites && *staticSprites)
 		insertStaticSprite(*staticSprites++, 1100);
 
-	insertMouse433(sceneInfo->mouseCursorFilename);
+	insertScreenMouse(sceneInfo->mouseCursorFilename);
 	
 	if (sceneInfo->bgShadowFilename) {
 		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
@@ -1111,7 +1111,7 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
 	
-	insertMouse433(0x08B8C180);
+	insertScreenMouse(0x08B8C180);
 
 	_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(0x18808B88);
 	addEntity(_ssTrackShadowBackground);
@@ -1224,7 +1224,7 @@ Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule)
 
 	setBackground(0x0220C041);
 	setPalette(0x0220C041);
-	insertMouse433(0x0C04502A);
+	insertScreenMouse(0x0C04502A);
 	setRectList(0x004AE360);
 
 	insertKlayman<KmScene2732>(108, 331);
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index e40890a..25360ac 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -468,9 +468,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_sprite1 = insertStaticSprite(0x100CA0A8, 1100);
 		_sprite2 = insertStaticSprite(0x287C21A4, 1100);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480);
-		insertMouse433(0x0066201C);
+		insertScreenMouse(0x0066201C);
 		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape); 
+		_vm->_collisionMan->addCollisionSprite(_asTape); 
 	} else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) {
 		setRectList(0x004B6CD0);
 		setBackground(0x11E00684);
@@ -479,9 +479,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->addBasePalette(0x11E00684, 0, 256, 0);
 		_sprite2 = insertStaticSprite(0x061601C8, 1100);
 		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480);
-		insertMouse433(0x00680116);
+		insertScreenMouse(0x00680116);
 		_asTape = insertSprite<SsScene1705Tape>(this, 8, 1100, 302, 437, 0x01142428);
-		_vm->_collisionMan->addSprite(_asTape); 
+		_vm->_collisionMan->addCollisionSprite(_asTape); 
 	} else {
 		setRectList(0x004B6CF0);
 		setBackground(0x030006E6);
@@ -490,9 +490,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_palette->addBasePalette(0x030006E6, 0, 256, 0);
 		_sprite2 = insertStaticSprite(0x273801CE, 1100);
 		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480);
-		insertMouse433(0x006E2038);
+		insertScreenMouse(0x006E2038);
 		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape); 
+		_vm->_collisionMan->addCollisionSprite(_asTape); 
 	}
 	
 	addEntity(_palette);
@@ -537,7 +537,7 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	SetMessageHandler(&Scene2802::handleMessage);
 	SetUpdateHandler(&Scene2802::update);
-	insertMouse435(0x008810A8, 20, 620);
+	insertPuzzleMouse(0x008810A8, 20, 620);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true));
 	_currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
 	// Need to go to the first frame first to load up the palette
@@ -871,7 +871,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x412A423E);
 	addEntity(_palette);
 	
-	insertMouse433(0xA423A41A);
+	insertScreenMouse(0xA423A41A);
 	
 	if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
 		_asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100);
@@ -1121,7 +1121,7 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh
 	SetMessageHandler(&Scene2803Small::handleMessage);
 
 	loadDataResource(0x81120132);
-	insertMouse433(0x00A05290);
+	insertScreenMouse(0x00A05290);
 
 	insertSprite<AsScene2803LightCord>(this, 0xAFAD591A, 0x276E321D, 578, 200);
 
@@ -1743,7 +1743,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0xA1D03005);
 		setPalette(0xA1D03005);
 		addEntity(_palette);
-		insertMouse435(0x03001A15, 20, 620);
+		insertPuzzleMouse(0x03001A15, 20, 620);
 		_asCoil = insertSprite<SsScene2804LightCoil>();
 		_asTarget = insertSprite<SsScene2804LightTarget>();
 	} else {
@@ -1751,7 +1751,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x01C01414);
 		setPalette(0x01C01414);
 		addEntity(_palette);
-		insertMouse435(0x01410014, 20, 620);
+		insertPuzzleMouse(0x01410014, 20, 620);
 		ssBeamCoilBody = insertSprite<SsScene2804BeamCoilBody>();
 		_asCoil = insertSprite<AsScene2804BeamCoil>(this, ssBeamCoilBody);
 		_asTarget = insertSprite<AsScene2804BeamTarget>();
@@ -1759,7 +1759,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	_ssRedButton = insertSprite<SsScene2804RedButton>(this);
-	_vm->_collisionMan->addSprite(_ssRedButton);
+	_vm->_collisionMan->addCollisionSprite(_ssRedButton);
 
 	for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) {
 		AsScene2804CrystalWaves *asCrystalWaves = NULL;
@@ -1767,7 +1767,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 			asCrystalWaves = insertSprite<AsScene2804CrystalWaves>(crystalIndex);
 		_asCrystals[crystalIndex] = insertSprite<AsScene2804Crystal>(asCrystalWaves, crystalIndex);
 		_ssCrystalButtons[crystalIndex] = insertSprite<SsScene2804CrystalButton>(this, _asCrystals[crystalIndex], crystalIndex);
-		_vm->_collisionMan->addSprite(_ssCrystalButtons[crystalIndex]);
+		_vm->_collisionMan->addCollisionSprite(_ssCrystalButtons[crystalIndex]);
 	}
 
 }
@@ -1889,7 +1889,7 @@ Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
 	setBackground(0x08021E04);
 	setPalette(0x08021E04);
 	_palette->addPalette(0x8A6B1F91, 0, 65, 0);
-	insertMouse433(0x21E00088);
+	insertScreenMouse(0x21E00088);
 
 	_sprite1 = insertStaticSprite(0x008261E7, 1100);
 	_sprite2 = insertStaticSprite(0x020CE421, 1100);
@@ -1982,7 +1982,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	_pointList = _dataResource.getPointArray(0x3606A422);
 
-	insertMouse433(0x22114C13);	
+	insertScreenMouse(0x22114C13);	
 	setBackground(0xC1B22110);
 	setPalette(0xC1B22110);
 	
@@ -2119,7 +2119,7 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0x3E049A95);
 	setPalette(0x3E049A95);
-	insertMouse435(0x49A913E8, 20, 620);
+	insertPuzzleMouse(0x49A913E8, 20, 620);
 
 }
 
@@ -2438,19 +2438,19 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(kScene2808FileHashes1[which]);
 
 	asHandle = insertSprite<AsScene2808Handle>(this, which);
-	_vm->_collisionMan->addSprite(asHandle);
+	_vm->_collisionMan->addCollisionSprite(asHandle);
 
 	_asFlow = insertSprite<AsScene2808Flow>(this, which);
 	insertSprite<AsScene2808LightEffect>(which);
 
 	for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) {
 		SsScene2808Dispenser *ssDispenser = insertSprite<SsScene2808Dispenser>(this, which, testTubeIndex);
-		_vm->_collisionMan->addSprite(ssDispenser);
+		_vm->_collisionMan->addCollisionSprite(ssDispenser);
 		_asTestTubes[testTubeIndex] = insertSprite<AsScene2808TestTube>(which, testTubeIndex, ssDispenser);
-		_vm->_collisionMan->addSprite(_asTestTubes[testTubeIndex]);
+		_vm->_collisionMan->addCollisionSprite(_asTestTubes[testTubeIndex]);
 	}
 	
-	insertMouse433(kScene2808FileHashes2[which]);
+	insertScreenMouse(kScene2808FileHashes2[which]);
 
 }
 
@@ -2570,7 +2570,7 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	setBackground(0xB22116C5);
 	setPalette(0xB22116C5);
-	insertMouse433(0x116C1B2A);
+	insertScreenMouse(0x116C1B2A);
 
 	_sprite1 = insertStaticSprite(0x1FA2EB82, 1100);
 
@@ -2711,7 +2711,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0x26508804);
 	setPalette(0x26508804);
-	insertMouse433(0x0880026D);
+	insertScreenMouse(0x0880026D);
 
 	_sprite6 = insertStaticSprite(0x03615227, 1100);
 	_sprite5 = insertStaticSprite(0xE059A224, 1100);
@@ -2727,10 +2727,10 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KLAYMAN_SMALL)) {
 		_asTape = insertSprite<AsScene1201Tape>(this, 0, 900, 245, 429, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	} else {
 		_asTape = insertSprite<AsScene1201Tape>(this, 0, 1100, 245, 429, 0x9148A011);
-		_vm->_collisionMan->addSprite(_asTape);
+		_vm->_collisionMan->addCollisionSprite(_asTape);
 	}
 
 	_sprite1 = insertStaticSprite(0x430001C4, 1200);
@@ -2752,7 +2752,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AE438);
 			setRectList(0x004AE810);
 			_isRopingDown = false;
-			_vm->_collisionMan->removeSprite(_asTape);
+			_vm->_collisionMan->removeCollisionSprite(_asTape);
 		} else {
 			insertKlayman<KmScene2810>(300, 424, _clipRects, 2);
 			setMessageList(0x004AE438);
@@ -2796,7 +2796,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AE6D8);
 			setRectList(0x004AE810);
 			_isRopingDown = false;
-			_vm->_collisionMan->removeSprite(_asTape);
+			_vm->_collisionMan->removeCollisionSprite(_asTape);
 		} else {
 			insertKlaymanLadder();
 			if (getGlobalVar(V_LADDER_DOWN_ACTION)) {
@@ -2819,7 +2819,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AE428);
 			setRectList(0x004AE810);
 			_isRopingDown = false;
-			_vm->_collisionMan->removeSprite(_asTape);
+			_vm->_collisionMan->removeCollisionSprite(_asTape);
 		} else {
 			insertKlayman<KmScene2810>(450, 424, _clipRects, 2);
 			setMessageList(0x004AE418);
@@ -2838,7 +2838,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AE410);
 		setRectList(0x004AE810);
 		_isRopingDown = false;
-		_vm->_collisionMan->removeSprite(_asTape);
+		_vm->_collisionMan->removeCollisionSprite(_asTape);
 	}
 
 }
@@ -3035,15 +3035,15 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addBasePalette(0x03600606, 0, 256, 0);
 
 	_sprite1 = insertStaticSprite(0x0C06C860, 1100);
-	insertMouse433(0x0060203E);
+	insertScreenMouse(0x0060203E);
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 3) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 474, 437);
-		_vm->_collisionMan->addSprite(_asKey);
+		_vm->_collisionMan->addCollisionSprite(_asKey);
 	}
 
 	_ssTape = insertSprite<SsScene1705Tape>(this, 6, 1100, 513, 437, 0xA1361863);
-	_vm->_collisionMan->addSprite(_ssTape);
+	_vm->_collisionMan->addCollisionSprite(_ssTape);
 	
 	_asWinch = insertSprite<AsScene2812Winch>();
 	_asTrapDoor = insertSprite<AsScene2812TrapDoor>();
@@ -3181,7 +3181,7 @@ Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
 	addBackground(_background);
 	_background->getSurface()->getDrawRect().y = -10;
 	setPalette(0xD542022E);
-	insertMouse435(0x0028D089, 20, 620);
+	insertPuzzleMouse(0x0028D089, 20, 620);
 	_ssButton = insertStaticSprite(0x1A4D4120, 1100);
 	_ssButton->setVisible(false);
 	loadSound(2, 0x19044E72);
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 4b8f28e..551d6cb 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -365,7 +365,7 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (uint i = 0; i < 6; ++i) {
 		if (i != 2 || !_isButton2Broken) {
 			_ssLocationButtons[i] = insertSprite<SsScene2901LocationButton>(this, _currLocationButtonNum, i);
-			_vm->_collisionMan->addSprite(_ssLocationButtons[i]);
+			_vm->_collisionMan->addCollisionSprite(_ssLocationButtons[i]);
 			_ssLocationButtonLights[i] = insertSprite<SsScene2901LocationButtonLight>(_currLocationButtonNum, i);
 		}
 	}
@@ -374,9 +374,9 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertSprite<SsScene2901BrokenButton>(_currLocationButtonNum);
 
 	_ssBigButton = insertSprite<SsScene2901BigButton>(this, _currLocationButtonNum);
-	_vm->_collisionMan->addSprite(_ssBigButton);
+	_vm->_collisionMan->addCollisionSprite(_ssBigButton);
 
-	insertMouse435(kScene2901FileHashes2[_currLocationButtonNum], 20, 620);
+	insertPuzzleMouse(kScene2901FileHashes2[_currLocationButtonNum], 20, 620);
 	
 	SetUpdateHandler(&Scene2901::update);
 	SetMessageHandler(&Scene2901::handleMessage);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 1fc1f53..6767aa5 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -712,9 +712,9 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009Symbol::handleMessage);
 	_ssArrowPrev = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _symbolPosition * 2 + 0);
-	_vm->_collisionMan->addSprite(_ssArrowPrev);
+	_vm->_collisionMan->addCollisionSprite(_ssArrowPrev);
 	_ssArrowNext = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _symbolPosition * 2 + 1);
-	_vm->_collisionMan->addSprite(_ssArrowNext);
+	_vm->_collisionMan->addCollisionSprite(_ssArrowNext);
 }
 
 uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -766,16 +766,16 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	setBackground(0xD000420C);
 	setPalette(0xD000420C);
-	insertMouse435(0x04208D08, 20, 620);
+	insertPuzzleMouse(0x04208D08, 20, 620);
 
 	_ssFireCannonButton = insertSprite<SsScene3009FireCannonButton>(this);
-	_vm->_collisionMan->addSprite(_ssFireCannonButton);
+	_vm->_collisionMan->addCollisionSprite(_ssFireCannonButton);
 
 	_asVerticalIndicator = insertSprite<AsScene3009VerticalIndicator>(this, _cannonTargetStatus);
-	_vm->_collisionMan->addSprite(_asVerticalIndicator);
+	_vm->_collisionMan->addCollisionSprite(_asVerticalIndicator);
 
 	_asHorizontalIndicator = insertSprite<AsScene3009HorizontalIndicator>(this, _cannonTargetStatus);
-	_vm->_collisionMan->addSprite(_asHorizontalIndicator);
+	_vm->_collisionMan->addCollisionSprite(_asHorizontalIndicator);
 
 	if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) {
 		_keepVideo = true;
@@ -1235,7 +1235,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (int i = 0; i < 3; i++) {
 		_asDeadBolts[i] = insertSprite<AsScene3010DeadBolt>(this, i, which == 1);//CHECKME
 		_ssDeadBoltButtons[i] = insertSprite<SsScene3010DeadBoltButton>(this, i, initCountdown, which == 1);//CHECKME
-		_vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]);
+		_vm->_collisionMan->addCollisionSprite(_ssDeadBoltButtons[i]);
 		if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i]))
 			initCountdown++;
 		_boltUnlocking[i] = false;
@@ -1243,7 +1243,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (which == 0) {
-		insertMouse435(0x02622800, 20, 620);
+		insertPuzzleMouse(0x02622800, 20, 620);
 	}
 
 	loadSound(0, 0x68E25540);
@@ -1460,13 +1460,13 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0xA4070114);
 	addEntity(_palette);
 
-	insertMouse435(0x24A00929, 20, 620);
+	insertPuzzleMouse(0x24A00929, 20, 620);
 
 	for (int symbolIndex = 0; symbolIndex < 12; symbolIndex++)
 		_asSymbols[symbolIndex] = insertSprite<AsScene3011Symbol>(symbolIndex, true);
 
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
-	_vm->_collisionMan->addSprite(_ssButton);
+	_vm->_collisionMan->addCollisionSprite(_ssButton);
 	
 }
 
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index c899a59..3f0c92f 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -42,7 +42,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_background = NULL;
 	if (clearHitRects) {
 		_vm->_collisionMan->clearHitRects();
-		_vm->_collisionMan->clearSprites();
+		_vm->_collisionMan->clearCollisionSprites();
 	}
 	_vm->_screen->setFps(24);
 	_vm->_screen->setSmackerDecoder(NULL);
@@ -160,7 +160,7 @@ void Scene::setSpriteSurfacePriority(Sprite *sprite, int priority) {
 }
 
 void Scene::deleteSprite(Sprite **sprite) {
-	_vm->_collisionMan->removeSprite(*sprite);
+	_vm->_collisionMan->removeCollisionSprite(*sprite);
 	removeSurface((*sprite)->getSurface());
 	removeEntity(*sprite);
 	delete *sprite;
@@ -194,7 +194,7 @@ Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
 	return addSprite(new StaticSprite(_vm, fileHash, surfacePriority));
 }
 
-void Scene::insertMouse433(uint32 fileHash, const NRect *mouseRect) {
+void Scene::insertScreenMouse(uint32 fileHash, const NRect *mouseRect) {
 	NRect rect(-1, -1, -1, -1);
 	if (mouseRect)
 		rect = *mouseRect;
@@ -202,7 +202,7 @@ void Scene::insertMouse433(uint32 fileHash, const NRect *mouseRect) {
 	addEntity(_mouseCursor);
 }
 
-void Scene::insertMouse435(uint32 fileHash, int16 x1, int16 x2) {
+void Scene::insertPuzzleMouse(uint32 fileHash, int16 x1, int16 x2) {
 	_mouseCursor = new Mouse(_vm, fileHash, x1, x2);
 	addEntity(_mouseCursor);
 }
@@ -317,8 +317,8 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 }
 
 bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
-	for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) {
-		Sprite *sprite = _vm->_collisionMan->getSprite(i);
+	for (uint i = 0; i < _vm->_collisionMan->getCollisionSpritesCount(); i++) {
+		Sprite *sprite = _vm->_collisionMan->getCollisionSprite(i);
 		if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && 
 			sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) {
 			return true;
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index b531796..a9e1674 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -59,8 +59,8 @@ public:
 	void setPalette(uint32 fileHash = 0);
 	void setHitRects(uint32 id);
 	Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority);
-	void insertMouse433(uint32 fileHash, const NRect *mouseRect = NULL);
-	void insertMouse435(uint32 fileHash, int16 x1, int16 x2);
+	void insertScreenMouse(uint32 fileHash, const NRect *mouseRect = NULL);
+	void insertPuzzleMouse(uint32 fileHash, int16 x1, int16 x2);
 	void insertNavigationMouse(uint32 fileHash, int type);
 	void showMouse(bool visible);
 	void changeMouseCursor(uint32 fileHash);


Commit: 9963ce41ea5f2c733873f16fd47be9b060dd2d16
    https://github.com/scummvm/scummvm/commit/9963ce41ea5f2c733873f16fd47be9b060dd2d16
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Merge CollisionMan into Scene class

Changed paths:
  R engines/neverhood/collisionman.cpp
  R engines/neverhood/collisionman.h
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/klayman.cpp
    engines/neverhood/klayman.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/module.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module1500.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1700.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2400.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2600.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/navigationscene.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/smackerscene.cpp



diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp
deleted file mode 100644
index bafa1e3..0000000
--- a/engines/neverhood/collisionman.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* 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/collisionman.h"
-
-namespace Neverhood {
-
-static HitRect defaultHitRect = {NRect(), 0x5000};
-
-CollisionMan::CollisionMan(NeverhoodEngine *vm)
-	: _vm(vm), _hitRects(NULL) {
-}
-
-CollisionMan::~CollisionMan() {
-}
-
-void CollisionMan::setHitRects(uint32 id) {
-	setHitRects(_vm->_staticData->getHitRectList(id));
-}
-
-void CollisionMan::setHitRects(HitRectList *hitRects) {
-	_hitRects = hitRects;
-}
-
-void CollisionMan::clearHitRects() {
-	_hitRects = NULL;
-}
-
-HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) {
-	if (_hitRects)
-		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++)
-			if ((*it).rect.contains(x, y))
-				return &(*it);
-	return &defaultHitRect; 
-}
-
-void CollisionMan::addCollisionSprite(Sprite *sprite) {
-	int index = 0, insertIndex = -1;
-	for (Common::Array<Sprite*>::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) {
-		if ((*iter)->getPriority() > sprite->getPriority()) {
-			insertIndex = index;
-			break;
-		}
-		index++;
-	}
-	if (insertIndex >= 0)
-		_collisionSprites.insert_at(insertIndex, sprite);
-	else
-		_collisionSprites.push_back(sprite);		
-}
-
-void CollisionMan::removeCollisionSprite(Sprite *sprite) {
-	for (uint index = 0; index < _collisionSprites.size(); index++) {
-		if (_collisionSprites[index] == sprite) {
-			_collisionSprites.remove_at(index);
-			break;
-		}
-	}
-}
-
-void CollisionMan::clearCollisionSprites() {
-	_collisionSprites.clear();
-}
-
-void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) {
-	for (Common::Array<Sprite*>::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) {
-		Sprite *collSprite = *iter;
-		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) {
-			sprite->sendMessage(collSprite, messageNum, messageParam);
-		}
-	}	
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h
deleted file mode 100644
index 36bb2a5..0000000
--- a/engines/neverhood/collisionman.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* 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_COLLISIONMAN_H
-#define NEVERHOOD_COLLISIONMAN_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/sprite.h"
-#include "neverhood/staticdata.h"
-
-namespace Neverhood {
-
-class CollisionMan {
-public:
-	CollisionMan(NeverhoodEngine *vm);
-	~CollisionMan();
-	void setHitRects(uint32 id);
-	void setHitRects(HitRectList *hitRects);
-	void clearHitRects();
-	HitRect *findHitRectAtPos(int16 x, int16 y);
-	void addCollisionSprite(Sprite *sprite);
-	void removeCollisionSprite(Sprite *sprite);
-	void clearCollisionSprites();
-	void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam);
-	uint getCollisionSpritesCount() const { return _collisionSprites.size(); }
-	Sprite *getCollisionSprite(uint index) const { return _collisionSprites[index]; }
-protected:
-	NeverhoodEngine *_vm;
-	HitRectList *_hitRects;
-	Common::Array<Sprite*> _collisionSprites;
-};
-
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_COLLISIONMAN_H */
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index fbef600..907e027 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -316,7 +316,7 @@ void DiskplayerSlot::stop() {
 }
 
 DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int paletteIndex)
-	: Scene(vm, parentModule, true), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0),
+	: Scene(vm, parentModule), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0),
 	_hasAllDisks(false), _dropKey(false), _inputDisabled(true), _updateStatus(kUSStopped) { 
 
 	int availableDisksCount = 0;
@@ -325,7 +325,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	setPalette(kDiskplayerPaletteFileHashes[paletteIndex]);
 
 	_ssPlayButton = insertSprite<DiskplayerPlayButton>(this);
-	_vm->_collisionMan->addCollisionSprite(_ssPlayButton);
+	addCollisionSprite(_ssPlayButton);
 
 	_asKey = insertSprite<AsDiskplayerSceneKey>();
 
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
index 39d38c3..0dfd29b 100644
--- a/engines/neverhood/klayman.cpp
+++ b/engines/neverhood/klayman.cpp
@@ -21,8 +21,8 @@
  */
 
 #include "neverhood/klayman.h"
-#include "neverhood/collisionman.h"
 #include "neverhood/resourceman.h"
+#include "neverhood/scene.h"
 #include "neverhood/staticdata.h"
 
 namespace Neverhood {
@@ -60,7 +60,7 @@ static const KlaymanIdleTableItem klaymanIdleTable1002[] = {
 
 // Klayman
 
-Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
+Klayman::Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
 	: AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
 	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
 	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
@@ -744,12 +744,12 @@ void Klayman::suSneaking() {
 	_deltaX = 0;				
 
 	if (_destX != _x) {
-		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
 		_x += xdiff;
 		if (_pathPoints) {
 			walkAlongPathPoints();
 		} else {
-			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
 				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
 			} else if (hitRectNext->type == 0x5003) {
@@ -925,12 +925,12 @@ void Klayman::suWalkingTestExit() {
 		(_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
 		sendMessage(this, 0x1019, 0);
 	} else {
-		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
 		_x += xdelta;
 		if (_pathPoints) {
 			walkAlongPathPoints();
 		} else {
-			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
 				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
 			} else if (hitRectNext->type == 0x5003) {
@@ -1408,12 +1408,12 @@ void Klayman::suLargeStep() {
 	_deltaX = 0;
 	
 	if (_x != _destX) {
-		HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
 		_x += xdiff;
 		if (_pathPoints) {
 			walkAlongPathPoints();
 		} else {
-			HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y);
+			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
 			if (hitRectNext->type == 0x5002) {
 				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
 			} else if (hitRectNext->type == 0x5003) {
@@ -2868,13 +2868,13 @@ uint32 Klayman::hmJumpAndFall(int messageNum, const MessageParam &param, Entity
 
 void Klayman::suFallDown() {
 	AnimatedSprite::updateDeltaXY();
-	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
+	HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
 		updateBounds();
 		sendMessage(this, 0x1019, 0);
 	}
-	_vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0);
+	_parentScene->checkCollision(this, 0xFFFF, 0x4810, 0);
 }
 
 void Klayman::stJumpToRingVenusFlyTrap() {
@@ -3028,7 +3028,7 @@ void Klayman::evMoveVenusFlyTrapDone() {
 
 void Klayman::suFallSkipJump() {
 	updateDeltaXY();
-	HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10);
+	HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
 	if (hitRect->type == 0x5001) {
 		_y = hitRect->rect.y1;
 		updateBounds();
@@ -3348,7 +3348,7 @@ void Klayman::stPeekInsideBlink() {
 
 // KmScene1001
 
-KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 }
 
@@ -3426,7 +3426,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1002
 
-KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	setKlaymanIdleTable1();
@@ -3548,7 +3548,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1004
 
-KmScene1004::KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	_dataResource.load(0x01900A04);	
@@ -3614,7 +3614,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty
@@ -3682,7 +3682,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1201
 
-KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
@@ -3753,7 +3753,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty
@@ -3774,7 +3774,7 @@ uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty	
@@ -3828,7 +3828,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene1305::KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
@@ -3854,7 +3854,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 }
@@ -3980,7 +3980,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
@@ -4056,7 +4056,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1401
 
-KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty	
@@ -4131,7 +4131,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1402
 
-KmScene1402::KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	SetFilterY(&Sprite::defFilterY);	
@@ -4176,7 +4176,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1403
 
-KmScene1403::KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
@@ -4236,7 +4236,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1404
 
-KmScene1404::KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty	
@@ -4314,7 +4314,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 }
 
@@ -4405,7 +4405,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 
 // KmScene1705
 
-KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
@@ -4498,7 +4498,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
@@ -4537,7 +4537,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	// Empty	
@@ -4603,7 +4603,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	// Empty
@@ -4689,7 +4689,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;	
 }
 
-KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
+KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	_surface->setClipRects(clipRects, clipRectsCount);
@@ -4763,7 +4763,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;	
 }
 
-KmScene2203::KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -4835,7 +4835,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -4883,7 +4883,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	_walkResumeFrameIncr = 1;
@@ -4989,7 +4989,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5053,7 +5053,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5123,7 +5123,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5177,7 +5177,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 	return 0;
 }
 
-KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5231,7 +5231,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
   
-KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5314,7 +5314,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene2402::KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5386,7 +5386,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5472,7 +5472,7 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 	
-KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
+KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	_surface->setClipRects(clipRects, clipRectsCount);
@@ -5565,7 +5565,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 	
-KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5616,7 +5616,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene2732::KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5633,7 +5633,7 @@ uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5705,7 +5705,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2803::KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
+KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	_surface->setClipRects(clipRects, clipRectsCount);
@@ -5769,7 +5769,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	
 	_dataResource.load(0x81120132);
@@ -5822,7 +5822,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &para
 	return 0;
 }
 
-KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -5879,7 +5879,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 	return messageResult;
 }
 
-KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -5940,7 +5940,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
@@ -6001,7 +6001,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) 
+KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) 
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
@@ -6051,7 +6051,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
 	return 0;
 }
 
-KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount)
+KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 
 	_surface->setClipRects(clipRects, clipRectsCount);
@@ -6146,7 +6146,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 	return 0;
 }
 
-KmScene2812::KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y)
+KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klayman(vm, parentScene, x, y, 1000, 1000) {
 	// Empty
 }
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
index 3b08108..99fcceb 100644
--- a/engines/neverhood/klayman.h
+++ b/engines/neverhood/klayman.h
@@ -34,6 +34,7 @@ namespace Neverhood {
 // TODO Also the methods should probably rearranged and be grouped together more consistently
 
 class Klayman;
+class Scene;
 
 const uint32 kKlaymanSpeedUpHash = 0x004A2148;
 
@@ -48,7 +49,7 @@ struct KlaymanIdleTableItem {
 
 class Klayman : public AnimatedSprite {
 public:
-	Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);
+	Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);
 
 	void update();
 
@@ -385,7 +386,7 @@ public:
 	void stWaitLeverDown();
 
 protected:
-	Entity *_parentScene;
+	Scene *_parentScene;
 	Sprite *_attachedSprite;
 	int _ladderStatus;
 	bool _isWalking;
@@ -456,14 +457,14 @@ protected:
 
 class KmScene1001 : public Klayman {
 public:
-	KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1002 : public Klayman {
 public:
-	KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	void xUpdate();	
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -471,140 +472,140 @@ protected:
 
 class KmScene1004 : public Klayman {
 public:
-	KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1109 : public Klayman {
 public:
-	KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1201 : public Klayman {
 public:
-	KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1303 : public Klayman {
 public:
-	KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1304 : public Klayman {
 public:
-	KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1305 : public Klayman {
 public:
-	KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1306 : public Klayman {
 public:
-	KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1308 : public Klayman {
 public:
-	KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1401 : public Klayman {
 public:
-	KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1402 : public Klayman {
 public:
-	KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1403 : public Klayman {
 public:
-	KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1404 : public Klayman {
 public:
-	KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1608 : public Klayman {
 public:
-	KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1705 : public Klayman {
 public:
-	KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene1901 : public Klayman {
 public:
-	KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2001 : public Klayman {
 public:
-	KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2101 : public Klayman {
 public:
-	KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2201 : public Klayman {
 public:
-	KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
+	KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2203 : public Klayman {
 public:
-	KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2205 : public Klayman {
 public:
-	KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -612,7 +613,7 @@ protected:
 
 class KmScene2206 : public Klayman {
 public:
-	KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 	~KmScene2206();
 protected:
 	void xUpdate();
@@ -621,14 +622,14 @@ protected:
 
 class KmScene2207 : public Klayman {
 public:
-	KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2242 : public Klayman {
 public:
-	KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -636,7 +637,7 @@ protected:
 
 class KmHallOfRecords : public Klayman {
 public:
-	KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -644,7 +645,7 @@ protected:
 
 class KmScene2247 : public Klayman {
 public:
-	KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	void xUpdate();
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -652,77 +653,77 @@ protected:
 
 class KmScene2401 : public Klayman {
 public:
-	KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2402 : public Klayman {
 public:
-	KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2403 : public Klayman {
 public:
-	KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2406 : public Klayman {
 public:
-	KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
+	KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2501 : public Klayman {
 public:
-	KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2732 : public Klayman {
 public:
-	KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2801 : public Klayman {
 public:
-	KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2803 : public Klayman {
 public:
-	KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
+	KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2803Small : public Klayman {
 public:
-	KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2805 : public Klayman {
 public:
-	KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2806 : public Klayman {
 public:
-	KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+	KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 		bool flag, NRect *clipRects, uint clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -730,7 +731,7 @@ protected:
 
 class KmScene2809 : public Klayman {
 public:
-	KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+	KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 		bool flag, NRect *clipRects, uint clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -738,14 +739,14 @@ protected:
 
 class KmScene2810Small : public Klayman {
 public:
-	KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
 
 class KmScene2810 : public Klayman {
 public:
-	KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y,
+	KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 		NRect *clipRects, uint clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
@@ -753,7 +754,7 @@ protected:
 
 class KmScene2812 : public Klayman {
 public:
-	KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y);
+	KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 521c0e0..a1489fc 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -212,7 +212,7 @@ uint32 MenuButton::handleMessage(int messageNum, const MessageParam &param, Enti
 }
 
 MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	static const uint32 kMenuButtonFileHashes[] = {
 		0x36C62120,
@@ -251,7 +251,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule)
 	for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) {
 		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
 			kMenuButtonFileHashes[buttonIndex], kMenuButtonCollisionBounds[buttonIndex]);
-		_vm->_collisionMan->addCollisionSprite(menuButton);
+		addCollisionSprite(menuButton);
 	}
 	
 	SetUpdateHandler(&Scene::update);	
@@ -298,7 +298,7 @@ static const uint32 kCreditsSceneFileHashes[] = {
 };
 
 CreditsScene::CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAbort)
-	: Scene(vm, parentModule, true), _canAbort(canAbort), _screenIndex(0), _ticksDuration(0),
+	: Scene(vm, parentModule), _canAbort(canAbort), _screenIndex(0), _ticksDuration(0),
 	_countdown(216) {
 
 	SetUpdateHandler(&CreditsScene::update);	
@@ -368,7 +368,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, En
 }
 
 WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _currWidget(NULL) {
+	: Scene(vm, parentModule), _currWidget(NULL) {
 }
 
 NPoint WidgetScene::getMousePos() {
@@ -466,7 +466,7 @@ TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 it
 
 void TextLabelWidget::addSprite() {
 	_parentScene->addSprite(this);
-	_vm->_collisionMan->addCollisionSprite(this);
+	_parentScene->addCollisionSprite(this);
 }
 
 int16 TextLabelWidget::getWidth() {
@@ -544,7 +544,7 @@ void TextEditWidget::addSprite() {
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
-	_vm->_collisionMan->addCollisionSprite(this);
+	_parentScene->addCollisionSprite(this);
 	_surface->setVisible(true);
 	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2,
 		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
@@ -708,7 +708,7 @@ void SavegameListBox::addSprite() {
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
-	_vm->_collisionMan->addCollisionSprite(this);
+	_parentScene->addCollisionSprite(this);
 	_surface->setVisible(true);
 	buildItems();
 	_firstVisibleItem = 0;
@@ -826,7 +826,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
 		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
 			kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]);
-		_vm->_collisionMan->addCollisionSprite(menuButton);
+		addCollisionSprite(menuButton);
 	}
 
 
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index 576a5a4..b91b9de 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -27,7 +27,6 @@
 
 #include "neverhood/neverhood.h"
 #include "neverhood/background.h"
-#include "neverhood/collisionman.h"
 #include "neverhood/entity.h"
 #include "neverhood/graphics.h"
 #include "neverhood/mouse.h"
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index b3deb6f..d9486d9 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -3,7 +3,6 @@ MODULE := engines/neverhood
 MODULE_OBJS = \
 	background.o \
 	blbarchive.o \
-	collisionman.o \
 	detection.o \
 	diskplayerscene.o \
 	entity.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 6c5cc28..7033caf 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -335,7 +335,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p
 }
 		
 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asDoor(NULL), _asWindow(NULL) {
+	: Scene(vm, parentModule), _asDoor(NULL), _asWindow(NULL) {
 
 	Sprite *tempSprite;
 
@@ -1156,7 +1156,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa
 }
 
 Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isKlaymanFloor(false), _isClimbingLadder(false) {
+	: Scene(vm, parentModule), _isKlaymanFloor(false), _isClimbingLadder(false) {
 
 	NRect tempClipRect;
 	Sprite *tempSprite;
@@ -1243,7 +1243,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
 	_ssPressButton = insertSprite<SsCommonPressButton>(this, 0x00412692, 0x140B60BE, 800, 0);
 	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, false);
-	_vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap);
+	addCollisionSprite(_asVenusFlyTrap);
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 
@@ -1389,7 +1389,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 // StaticScene
 
 StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SetMessageHandler(&StaticScene::handleMessage);
 	
@@ -1442,7 +1442,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa
 }
 
 Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _paletteAreaStatus(-1) {
+	: Scene(vm, parentModule), _paletteAreaStatus(-1) {
 
 	Sprite *tempSprite;
 	
@@ -1542,7 +1542,7 @@ void Scene1004::updatePaletteArea() {
 // Scene1005
 
 Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SetMessageHandler(&Scene1005::handleMessage);
 
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index 4b8a8ba..c39845e 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -429,7 +429,7 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &
 }
 
 Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false),
+	: Scene(vm, parentModule), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false),
 	_isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) {
 	
 	Sprite *ssOpenButton;
@@ -444,7 +444,7 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule)
 	
 	_asTeddyBear = insertSprite<AsScene1105TeddyBear>(this);
 	ssOpenButton = insertSprite<SsScene1105OpenButton>(this);
-	_vm->_collisionMan->addCollisionSprite(ssOpenButton);
+	addCollisionSprite(ssOpenButton);
 	insertPuzzleMouse(0x10006208, 20, 620);
 	
 	loadSound(0, 0x48442057);
@@ -555,19 +555,19 @@ void Scene1105::createObjects() {
 	_ssSymbolDice[2] = insertSprite<SsScene1105SymbolDie>(2, 485, 304);
 
 	_ssSymbol1UpButton = insertSprite<SsScene1105Button>(this, 0x08002860, NRect(146, 362, 192, 403));
-	_vm->_collisionMan->addCollisionSprite(_ssSymbol1UpButton);
+	addCollisionSprite(_ssSymbol1UpButton);
 	_ssSymbol1DownButton = insertSprite<SsScene1105Button>(this, 0x42012460, NRect(147, 404, 191, 442));
-	_vm->_collisionMan->addCollisionSprite(_ssSymbol1DownButton);
+	addCollisionSprite(_ssSymbol1DownButton);
 	_ssSymbol2UpButton = insertSprite<SsScene1105Button>(this, 0x100030A0, NRect(308, 361, 355, 402));
-	_vm->_collisionMan->addCollisionSprite(_ssSymbol2UpButton);
+	addCollisionSprite(_ssSymbol2UpButton);
 	_ssSymbol2DownButton = insertSprite<SsScene1105Button>(this, 0x840228A0, NRect(306, 406, 352, 445));
-	_vm->_collisionMan->addCollisionSprite(_ssSymbol2DownButton);
+	addCollisionSprite(_ssSymbol2DownButton);
 	_ssSymbol3UpButton = insertSprite<SsScene1105Button>(this, 0x20000120, NRect(476, 358, 509, 394));
-	_vm->_collisionMan->addCollisionSprite(_ssSymbol3UpButton);
+	addCollisionSprite(_ssSymbol3UpButton);
 	_ssSymbol3DownButton = insertSprite<SsScene1105Button>(this, 0x08043121, NRect(463, 401, 508, 438));
-	_vm->_collisionMan->addCollisionSprite(_ssSymbol3DownButton);
+	addCollisionSprite(_ssSymbol3DownButton);
 	_ssActionButton = insertSprite<SsScene1105Button>(this, 0x8248AD35, NRect(280, 170, 354, 245));
-	_vm->_collisionMan->addCollisionSprite(_ssActionButton);
+	addCollisionSprite(_ssActionButton);
 	
 	_isPanelOpen = true;
 	
@@ -646,7 +646,7 @@ void Scene1105::update() {
 }
 
 Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, which) {
+	: Scene(vm, parentModule) {
 	
 	SetMessageHandler(&Scene1109::handleMessage);
 	
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 11e29fd..844d07f 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -653,7 +653,7 @@ void AsScene1201LeftDoor::stCloseDoor() {
 }
 
 Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL),
+	: Scene(vm, parentModule), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL),
 	_asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) {
 
 	int16 topY1, topY2, topY3, topY4;
@@ -674,7 +674,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertScreenMouse(0x9A2C0409);
 	
 	_asTape = insertSprite<AsScene1201Tape>(this, 3, 1100, 243, 340, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 	
 	tempSprite = insertStaticSprite(0x03C82530, 100);
 	topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; 
@@ -752,7 +752,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 			_asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1);
 			_asTntMan->setClipRect(x1, 0, x2, 480);
 			_asTntMan->setRepl(64, 0);
-			_vm->_collisionMan->addCollisionSprite(_asTntMan);
+			addCollisionSprite(_asTntMan);
 			tempSprite = insertSprite<AsScene1201TntManFlame>(_asTntMan);
 			tempSprite->setClipRect(x1, 0, x2, 480);
 		}
@@ -826,7 +826,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_MATCH_STATUS) < 3) {
 		_asMatch = insertSprite<AsScene1201Match>(this);
-		_vm->_collisionMan->addCollisionSprite(_asMatch);
+		addCollisionSprite(_asMatch);
 	}
 
 	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) {
@@ -998,7 +998,7 @@ void AsScene1202TntItem::stChangePositionDone() {
 }
 
 Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _paletteResource(vm),  
+	: Scene(vm, parentModule), _paletteResource(vm),  
 	_soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) {
 
 	SetMessageHandler(&Scene1202::handleMessage);
@@ -1015,7 +1015,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule)
 
 	for (int tntIndex = 0; tntIndex < 18; tntIndex++) {
 		_asTntItems[tntIndex] = insertSprite<AsScene1202TntItem>(this, tntIndex);
-		_vm->_collisionMan->addCollisionSprite(_asTntItems[tntIndex]);
+		addCollisionSprite(_asTntItems[tntIndex]);
 	}
 
 	insertStaticSprite(0x8E8419C1, 1100);
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 989ada5..a0a1167 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -419,7 +419,7 @@ void SsScene1302Fence::suMoveUp() {
 }
 
 Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SetMessageHandler(&Scene1302::handleMessage);
 
@@ -456,7 +456,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which)
 	_klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480);
 
 	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, true);
-	_vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap);
+	addCollisionSprite(_asVenusFlyTrap);
 
 	sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
 	
@@ -630,7 +630,7 @@ void AsScene1303Balloon::stPopBalloon() {
 }
 
 Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SetMessageHandler(&Scene1303::handleMessage);
 
@@ -641,7 +641,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule)
 
 	if (!getGlobalVar(V_BALLOON_POPPED)) {
 		_asBalloon = insertSprite<AsScene1303Balloon>(this);
-		_vm->_collisionMan->addCollisionSprite(_asBalloon);
+		addCollisionSprite(_asBalloon);
 	}
 	
 	_sprite1 = insertStaticSprite(0xA014216B, 1100);
@@ -692,7 +692,7 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam &para
 }
 
 Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asNeedle(NULL) {
+	: Scene(vm, parentModule), _asNeedle(NULL) {
 	
 	SetMessageHandler(&Scene1304::handleMessage);
 
@@ -703,14 +703,14 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	if (getGlobalVar(V_BALLOON_POPPED)) {
 		_asKey = insertSprite<AsCommonKey>(this, 0, 1100, 278, 347);
-		_vm->_collisionMan->addCollisionSprite(_asKey);
+		addCollisionSprite(_asKey);
 	} else {
 		_asKey = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
 	}
 
 	if (!getGlobalVar(V_HAS_NEEDLE)) {
 		_asNeedle = insertSprite<AsScene1304Needle>(this, 1100, 278, 347);
-		_vm->_collisionMan->addCollisionSprite(_asNeedle);
+		addCollisionSprite(_asNeedle);
 	}
 
 	_sprite1 = insertStaticSprite(0x0562E621, 1100);
@@ -756,7 +756,7 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SetMessageHandler(&Scene1305::handleMessage);
 
@@ -867,7 +867,7 @@ void AsScene1306Elevator::cbGoingDownEvent() {
 }
 
 Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 4);
@@ -880,7 +880,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 4) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 435, 445);
-		_vm->_collisionMan->addCollisionSprite(_asKey);
+		addCollisionSprite(_asKey);
 	}
 
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x404A36A0, 100, 0x440C1000);
@@ -897,14 +897,14 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertKlayman<KmScene1306>(380, 440);
 		setMessageList(0x004AFAD0);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else if (which == 1) {
 		// Klaymen teleporting in
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFAF0);
 		sendMessage(this, 0x2000, 1);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else if (which == 2) {
 		// Klaymen returning from diskplayer
 		if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) {
@@ -915,27 +915,27 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which)
 		}
 		setMessageList(0x004AFBC8);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else if (which == 3) {
 		// Klaymen returning from window
 		insertKlayman<KmScene1306>(534, 440);
 		setMessageList(0x004AFC30);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else if (which == 4) {
 		// Klaymen teleporting out
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFC38);
 		sendMessage(this, 0x2000, 1);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else if (which == 5) {
 		// Klaymen returning from teleporter
 		insertKlayman<KmScene1306>(136, 440);
 		sendMessage(_klayman, 0x2000, 1);
 		setMessageList(0x004AFB00);
 		sendMessage(this, 0x2000, 1);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else {
 		// Klaymen coming up in elevator
 		insertKlayman<KmScene1306>(286, 408);
@@ -1007,7 +1007,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entit
 		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
 		setSurfacePriority(_sprite1->getSurface(), 80);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 		break;
 	}
 	return 0;
@@ -1033,7 +1033,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param,
 		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
 		setSurfacePriority(_sprite1->getSurface(), 80);
 		sendMessage(this, 0x2000, 0);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 		break;
 	}
 	return 0;
@@ -1222,7 +1222,7 @@ void AsScene1307Key::stInsert() {
 }
 
 Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL),
+	: Scene(vm, parentModule), _countdown(0), _asCurrKey(NULL),
 	_isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) {
 
 	Sprite *tempSprite;
@@ -1260,7 +1260,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule)
 	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
 		if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) {
 			_asKeys[keyIndex] = insertSprite<AsScene1307Key>(this, keyIndex, _clipRects);
-			_vm->_collisionMan->addCollisionSprite(_asKeys[keyIndex]);
+			addCollisionSprite(_asKeys[keyIndex]);
 		} else {
 			_asKeys[keyIndex] = NULL;
 		}
@@ -1519,7 +1519,7 @@ uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam &param
 }
 
 Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isProjecting(false), _asProjector(NULL) {
+	: Scene(vm, parentModule), _isProjecting(false), _asProjector(NULL) {
 	
 	_vm->gameModule()->initKeySlotsPuzzle();
 
@@ -1530,7 +1530,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertScreenMouse(0x24206418);
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 17, 1100, 502, 445, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 
 	if (getGlobalVar(V_MOUSE_SUCKED_IN)) {
 		insertSprite<AsScene1308Mouse>();
@@ -1603,7 +1603,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addCollisionSprite(_asProjector);
+		addCollisionSprite(_asProjector);
 		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
 		_asProjector->setRepl(64, 0);
 	}
@@ -1697,7 +1697,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	SetMessageHandler(&Scene1317::handleMessage);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index 521981e..5febe8f 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -627,7 +627,7 @@ void AsCommonProjector::stStartSuckedIn() {
 }
 
 Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), 
+	: Scene(vm, parentModule), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), 
 	_asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), 
 	_sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) {
 
@@ -678,7 +678,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, _asPipe);
-		_vm->_collisionMan->addCollisionSprite(_asProjector);
+		addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 6) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
@@ -840,7 +840,7 @@ void AsScene1402PuzzleBox::stMoveDownSolvedDone() {
 }
 
 Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) {
+	: Scene(vm, parentModule), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) {
 
 	SetMessageHandler(&Scene1402::handleMessage);
 
@@ -898,7 +898,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addCollisionSprite(_asProjector);
+		addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
@@ -1220,7 +1220,7 @@ void AsScene1407Mouse::stArriveAtHole() {
 }
 
 Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _puzzleSolvedCountdown(0),	_resetButtonCountdown(0) {
+	: Scene(vm, parentModule), _puzzleSolvedCountdown(0),	_resetButtonCountdown(0) {
 
 	SetMessageHandler(&Scene1407::handleMessage);
 	SetUpdateHandler(&Scene1407::update);
@@ -1278,7 +1278,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entit
 // Scene1403
 
 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asProjector(NULL), _isProjecting(false) {
+	: Scene(vm, parentModule), _asProjector(NULL), _isProjecting(false) {
 	
 	SetMessageHandler(&Scene1403::handleMessage);
 	
@@ -1292,10 +1292,10 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_sprite2 = insertStaticSprite(0x04442520, 995);
 	_sprite3 = insertStaticSprite(0x08742271, 995);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 12, 1100, 201, 468, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape1);
+	addCollisionSprite(_asTape1);
 	_asTape1->setRepl(64, 0);
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 16, 1100, 498, 468, 0x9048A093);
-	_vm->_collisionMan->addCollisionSprite(_asTape2);
+	addCollisionSprite(_asTape2);
 	_asTape2->setRepl(64, 0);
 
 	if (which < 0) {
@@ -1311,7 +1311,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addCollisionSprite(_asProjector);
+		addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() + 100);
@@ -1382,7 +1382,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entit
 // Scene1404
 
 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) {
+	: Scene(vm, parentModule), _asProjector(NULL), _asKey(NULL) {
 	
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 5);
@@ -1397,12 +1397,12 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 5) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 267, 411);
-		_vm->_collisionMan->addCollisionSprite(_asKey);
+		addCollisionSprite(_asKey);
 	}
 
 	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
 	_asTape = insertSprite<AsScene1201Tape>(this, 14, 1100, 281, 411, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 
 	if (which < 0) {
 		// Restoring game
@@ -1429,7 +1429,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klayman, (Sprite*)NULL);
-		_vm->_collisionMan->addCollisionSprite(_asProjector);
+		addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
 			sendEntityMessage(_klayman, 0x1014, _asProjector);
 			_klayman->setX(_asProjector->getX() - 100);
@@ -1552,7 +1552,7 @@ void AsScene1405Tile::hide() {
 }
 
 Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
+	: Scene(vm, parentModule), _selectFirstTile(true), _tilesLeft(48), _countdown(0) {
 
 	_vm->gameModule()->initMemoryPuzzle();
 	
@@ -1565,7 +1565,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule)
 	
 	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
 		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
-		_vm->_collisionMan->addCollisionSprite(_tiles[tileIndex]);
+		addCollisionSprite(_tiles[tileIndex]);
 		if (getSubVar(VA_IS_TILE_MATCH, tileIndex))
 			_tilesLeft--;
 	}
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
index 328bda3..c49e968 100644
--- a/engines/neverhood/module1500.cpp
+++ b/engines/neverhood/module1500.cpp
@@ -82,7 +82,7 @@ void Module1500::updateScene() {
 // Scene1501
 
 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3)
-	: Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) {
+	: Scene(vm, parentModule), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) {
 
 	SetUpdateHandler(&Scene1501::update);
 	SetMessageHandler(&Scene1501::handleMessage);
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index b40d580..a2f06e1 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -989,14 +989,14 @@ void AsCommonCarConnector::update() {
 }
 
 Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _asCar(NULL), _countdown1(0) {
+	: Scene(vm, parentModule), _asCar(NULL), _countdown1(0) {
 
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	
 	SetMessageHandler(&Scene1608::hmLowerFloor);
 	
 	_asKey = insertSprite<AsCommonKey>(this, 1, 1100, 198, 220);
-	_vm->_collisionMan->addCollisionSprite(_asKey);
+	addCollisionSprite(_asKey);
 
 	if (which < 0) {
 		// Restoring game
@@ -1014,7 +1014,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 			setBackground(0x10080E01);
 			setPalette(0x10080E01);
 			_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-			_vm->_collisionMan->addCollisionSprite(_asTape);
+			addCollisionSprite(_asTape);
 			_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
 			SetUpdateHandler(&Scene1608::upLowerFloor);
 			insertScreenMouse(0x80E05108);
@@ -1031,7 +1031,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		setBackground(0x10080E01);
 		setPalette(0x10080E01);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 		insertScreenMouse(0x80E05108);
 		_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
@@ -1072,7 +1072,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarLower->setClipRect(_clipRect1);
 		_asIdleCarFull->setClipRect(_clipRect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
 		_klaymanInCar = false;
 		_carClipFlag = false;
@@ -1114,7 +1114,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asIdleCarLower->setClipRect(_clipRect1);
 		_asIdleCarFull->setClipRect(_clipRect1);
 		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		// ... _vm->_collisionMan->addCollisionSprite(_asTape);
+		// ... addCollisionSprite(_asTape);
 		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
 		_klaymanInCar = true;
 		_carClipFlag = true;
@@ -1303,7 +1303,7 @@ void Scene1608::updateKlaymanCliprect() {
 }
 
 Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
+	: Scene(vm, parentModule), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
 
 	_vm->gameModule()->initCodeSymbolsPuzzle();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
@@ -1319,7 +1319,7 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule)
 		_asSymbols[symbolPosition] = insertSprite<AsScene3011Symbol>(symbolPosition, false);
 	
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
-	_vm->_collisionMan->addCollisionSprite(_ssButton);
+	addCollisionSprite(_ssButton);
 	loadSound(0, 0x68E25540);
 
 }
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index cf2fe63..39bc49b 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -177,7 +177,7 @@ uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam &param,
 }
 
 Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _paletteArea(1) {
+	: Scene(vm, parentModule), _paletteArea(1) {
 
 	Sprite *tempSprite;
 	
@@ -200,7 +200,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertSprite<SsScene1705WallSymbol>(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2);
 	_sprite = insertStaticSprite(0x31313A22, 1100);
 	_ssTape = insertSprite<SsScene1705Tape>(this, 15, 1100, 238, 439, 0x02363852);
-	_vm->_collisionMan->addCollisionSprite(_ssTape);
+	addCollisionSprite(_ssTape);
 
 	if (which < 0) {
 		// Restoring game
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 2557121..629cfd9 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -87,7 +87,7 @@ void Module1900::updateScene() {
 // Scene1901
 
 Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	Sprite *tempSprite;
 
@@ -358,8 +358,8 @@ void AsScene1907Symbol::stFallOffHitGround() {
 	playSound(1);
 	sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex);
 	Entity::_priority = 1000 - _newPositionIndex;
-	_vm->_collisionMan->removeCollisionSprite(this);
-	_vm->_collisionMan->addCollisionSprite(this);
+	_parentScene->removeCollisionSprite(this);
+	_parentScene->addCollisionSprite(this);
 	SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround);
 	NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent);
 	_newStickFrameIndex = 0;
@@ -516,7 +516,7 @@ void AsScene1907WaterHint::hide() {
 }
 
 Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule)	
-	: Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), 
+	: Scene(vm, parentModule), _currMovingSymbolIndex(0), _pluggedInCount(0), 
 	_moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) {
 	
 	setBackground(0x20628E05);
@@ -527,11 +527,11 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule)
 
 	for (int i = 0; i < 9; i++) {
 		_asSymbols[i] = insertSprite<AsScene1907Symbol>(this, i, getRandomPositionIndex());
-		_vm->_collisionMan->addCollisionSprite(_asSymbols[i]);
+		addCollisionSprite(_asSymbols[i]);
 	}
 	
 	_ssUpDownButton = insertSprite<SsScene1907UpDownButton>(this, _asSymbols[8]);
-	_vm->_collisionMan->addCollisionSprite(_ssUpDownButton);
+	addCollisionSprite(_ssUpDownButton);
 
 	_asWaterHint = insertSprite<AsScene1907WaterHint>();
 	
diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp
index 643bec4..f08b620 100644
--- a/engines/neverhood/module2000.cpp
+++ b/engines/neverhood/module2000.cpp
@@ -95,7 +95,7 @@ void Module2000::updateScene() {
 // Scene2001
 
 Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	Sprite *tempSprite;
 
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 12b10b4..423f93c 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -194,7 +194,7 @@ uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &pa
 }
 
 Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	Sprite *tempSprite;
 	
@@ -209,9 +209,9 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x78492010, 1100);
 	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x72427010, 0x32423010, 200, 0);
 	_asTape1 = insertSprite<AsScene1201Tape>(this, 18, 1100, 412, 443, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape1);
+	addCollisionSprite(_asTape1);
 	_asTape2 = insertSprite<AsScene1201Tape>(this, 11, 1100, 441, 443, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape2);
+	addCollisionSprite(_asTape2);
 	
 	if (which < 0) {
 		insertKlayman<KmScene2101>(380, 438);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index dc77a5e..889af37 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -535,7 +535,7 @@ SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positio
 }
 
 Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isSoundPlaying(false) {
+	: Scene(vm, parentModule), _isSoundPlaying(false) {
 
 	Sprite *tempSprite;
 
@@ -551,7 +551,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertScreenMouse(0x0820C408);
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 7, 1100, 459, 432, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape); 
+	addCollisionSprite(_asTape); 
 	_ssDoorButton = insertSprite<SsCommonPressButton>(this, 0xE4A43E29, 0xE4A43E29, 100, 0);
 	
 	for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++)
@@ -870,7 +870,7 @@ void SsScene2202PuzzleCube::stopMoving() {
 }
 
 Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isCubeMoving(false),
+	: Scene(vm, parentModule), _isSolved(false), _leaveScene(false), _isCubeMoving(false),
 	_ssMovingCube(NULL), _ssDoneMovingCube(NULL) {
 
 	_vm->gameModule()->initCubeSymbolsPuzzle();
@@ -887,7 +887,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which)
 		int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition);
 		if (cubeSymbol >= 0) {
 			Sprite *puzzleCubeSprite = insertSprite<SsScene2202PuzzleCube>(this, cubePosition, cubeSymbol);
-			_vm->_collisionMan->addCollisionSprite(puzzleCubeSprite);
+			addCollisionSprite(puzzleCubeSprite);
 		}
 	}
 
@@ -1085,7 +1085,7 @@ void AsScene2203Door::closeDoor() {
 }
 
 Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 1);
@@ -1100,11 +1100,11 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 1) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 282, 432);
-		_vm->_collisionMan->addCollisionSprite(_asKey);
+		addCollisionSprite(_asKey);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 1, 1100, 435, 432, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 	_asLeftDoor = insertSprite<AsScene2203Door>(this, 0);
 	_asRightDoor = insertSprite<AsScene2203Door>(this, 1);
 	_ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100);
@@ -1113,8 +1113,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which)
 	_rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480);
 	sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor);
 	sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor);
-	_vm->_collisionMan->addCollisionSprite(_asLeftDoor);
-	_vm->_collisionMan->addCollisionSprite(_asRightDoor);
+	addCollisionSprite(_asLeftDoor);
+	addCollisionSprite(_asRightDoor);
 
 	if (which < 0) {
 		// Restoring game
@@ -1215,7 +1215,7 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p
 }
 
 Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SetMessageHandler(&Scene2205::handleMessage);
 	SetUpdateHandler(&Scene2205::update);
@@ -1451,7 +1451,7 @@ uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &pa
 }
 
 Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	uint32 fileHash;
 	
@@ -1491,7 +1491,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addBasePalette(fileHash, 0, 256, 0);
 	if (!getGlobalVar(V_LIGHTS_ON))
 		_palette->addPalette(0x0263D144, 0, 65, 0);
-	_vm->_collisionMan->addCollisionSprite(_ssTestTube);
+	addCollisionSprite(_ssTestTube);
 	
 	if (which < 0) {
 		// Restoring game
@@ -1926,7 +1926,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
 }
 
 Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
+	: Scene(vm, parentModule), _klaymanAtElevator(true), _elevatorSurfacePriority(0) {
 
 	_vm->gameModule()->initCannonSymbolsPuzzle();
 
@@ -1949,9 +1949,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule)
 		_ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100);
 		_ssMaskPart3 = insertStaticSprite(0x0043B038, 1100);
 		_asTape = insertSprite<AsScene1201Tape>(this, 4, 1100, 277, 428, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape); 
+		addCollisionSprite(_asTape); 
 		_asLever = insertSprite<AsScene2207Lever>(this, 527, 333, 0);
-		_vm->_collisionMan->addCollisionSprite(_asLever);
+		addCollisionSprite(_asLever);
 		_asWallRobotAnimation = insertSprite<AsScene2207WallRobotAnimation>(this);
 		_asWallCannonAnimation = insertSprite<AsScene2207WallCannonAnimation>();
 		_asWallRobotAnimation->setVisible(false);
@@ -2110,7 +2110,7 @@ static const uint32 kScene2208FileHashes2[] = {
 };
 
 Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _textResource(vm) {
+	: Scene(vm, parentModule), _textResource(vm) {
 
 	SpriteResource spriteResource(_vm);
 	const char *textStart, *textEnd;
@@ -2288,7 +2288,7 @@ static const uint32 kScene2242MessageListIds1[] = {
 };
 
 Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isKlaymanInLight(false) {
+	: Scene(vm, parentModule), _isKlaymanInLight(false) {
 
 	SetMessageHandler(&Scene2242::handleMessage);
 	SetUpdateHandler(&Scene2242::update);
@@ -2309,7 +2309,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 10, 1100, 464, 435, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape); 
+	addCollisionSprite(_asTape); 
 
 	if (which < 0) {
 		// Restoring game
@@ -2407,7 +2407,7 @@ static const uint32 kHallOfRecordsSceneMessageListIds1[] = {
 };
 
 HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	_hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId);
 
@@ -2498,7 +2498,7 @@ static const uint32 kScene2247MessageListIds1[] = {
 };
 
 Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	SetMessageHandler(&Scene2247::handleMessage);
 	SetUpdateHandler(&Scene::update);
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index ed9e231..6c007c4 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -368,7 +368,7 @@ void AsScene2401Door::stDoorOpenFinished() {
 }
 
 Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _unkFlag(false),
+	: Scene(vm, parentModule), _countdown1(0), _countdown2(0), _unkFlag(false),
 	_soundToggle(false), _asWaterSpitIndex(0) {
 
 	_vm->gameModule()->initWaterPipesPuzzle();
@@ -684,7 +684,7 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam &param, Entity *
 }
 
 Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _soundToggle(false) {
+	: Scene(vm, parentModule), _countdown(0), _soundToggle(false) {
 
 	Sprite *tempSprite;
 
@@ -696,7 +696,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x81660220);
 	insertScreenMouse(0x6022481E);
 	_asTape = insertSprite<AsScene1201Tape>(this, 9, 1100, 286, 409, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
 	
 	if (which < 0) {
@@ -786,7 +786,7 @@ void Scene2402::playPipeSound(uint32 fileHash) {
 }
 
 Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	Sprite *tempSprite1, *tempSprite2, *tempSprite3;
 
@@ -796,7 +796,7 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which)
 	_palette->addPalette(0x414364B0, 0, 65, 0);
 	insertScreenMouse(0x506080C8);
 	_asTape = insertSprite<AsScene1201Tape>(this, 2, 1100, 480, 454, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 	_asLightCord = insertSprite<AsScene2803LightCord>(this, 0xA1095A10, 0x836D3813, 368, 200);
 	_asLightCord->setClipRect(0, 25, 640, 480);
 	
@@ -879,7 +879,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	Sprite *tempSprite1, *tempSprite2;
 
@@ -893,11 +893,11 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 2) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 560, 409);
-		_vm->_collisionMan->addCollisionSprite(_asKey);
+		addCollisionSprite(_asKey);
 	}
 
 	_asTape = insertSprite<AsScene1201Tape>(this, 5, 1100, 456, 409, 0x9148A011);
-	_vm->_collisionMan->addCollisionSprite(_asTape);
+	addCollisionSprite(_asTape);
 	tempSprite2 = insertStaticSprite(0x19625293, 1100);
 	_clipRects[0].x1 = 0;
 	_clipRects[0].y1 = 0;
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 3fc508a..4aefbfb 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -220,7 +220,7 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 }
 
 Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	_sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628);
 	_sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C);
@@ -535,14 +535,14 @@ uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam &para
 }
 
 Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	Sprite *ssButton;
 	
 	setBackground(0x90791B80);
 	setPalette(0x90791B80);
 	ssButton = insertSprite<SsScene2504Button>();
-	_vm->_collisionMan->addCollisionSprite(ssButton);
+	addCollisionSprite(ssButton);
 	insertPuzzleMouse(0x91B8490F, 20, 620);
 	SetMessageHandler(&Scene2504::handleMessage);
 	SetUpdateHandler(&Scene::update);
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 91132c0..04a9147 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -308,7 +308,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam &param
 }
 
 Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isBusy(false) {
+	: Scene(vm, parentModule), _isBusy(false) {
 	
 	SetUpdateHandler(&Scene::update);
 	SetMessageHandler(&Scene2609::handleMessage);
@@ -317,7 +317,7 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x51409A16);
 	_asWater = insertSprite<AsScene2609Water>();
 	_ssButton = insertSprite<SsScene2609Button>(this);
-	_vm->_collisionMan->addCollisionSprite(_ssButton);
+	addCollisionSprite(_ssButton);
 	insertPuzzleMouse(0x09A1251C, 20, 620);
 	insertStaticSprite(0x02138002, 1200);
 	insertStaticSprite(0x825E2827, 1200);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index b22da94..d4f46ea 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -614,7 +614,7 @@ void AsCommonCarTrackShadow::update() {
 }
 
 Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	Sprite *tempSprite;
 	
@@ -720,7 +720,7 @@ static const uint32 kScene2702Infos[2][3] = {
 
 
 Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _isInLight(true), _newTrackIndex(-1), _count(3) {
+	: Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1), _count(3) {
 	
 	for (int i = 0; i < 2; i++)
 		for (int j = 0; j < 3; j++)
@@ -882,7 +882,7 @@ void Scene2702::changeTrack() {
 }
 
 Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
 	
@@ -996,7 +996,7 @@ uint32 Scene2703::handleMessage(int messageNum, const MessageParam &param, Entit
 		
 Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
 	const uint32 *staticSprites, const NRect *clipRect)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
 	
@@ -1101,7 +1101,7 @@ static const struct { const char *pointListName; int which1, which2; } kSceneInf
 };
 
 Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _newTrackIndex(-1) {
+	: Scene(vm, parentModule), _newTrackIndex(-1) {
 	
 	SetMessageHandler(&Scene2706::handleMessage);
 	
@@ -1218,7 +1218,7 @@ void Scene2706::changeTrack() {
 }
 
 Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	Sprite *tempSprite;
 
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 25360ac..7c7c097 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -426,7 +426,7 @@ void Module2800::updateMusic(bool halfVolume) {
 }
 
 Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	Sprite *_sprite1;
 	Sprite *_sprite2;
@@ -470,7 +470,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480);
 		insertScreenMouse(0x0066201C);
 		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape); 
+		addCollisionSprite(_asTape); 
 	} else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) {
 		setRectList(0x004B6CD0);
 		setBackground(0x11E00684);
@@ -481,7 +481,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480);
 		insertScreenMouse(0x00680116);
 		_asTape = insertSprite<SsScene1705Tape>(this, 8, 1100, 302, 437, 0x01142428);
-		_vm->_collisionMan->addCollisionSprite(_asTape); 
+		addCollisionSprite(_asTape); 
 	} else {
 		setRectList(0x004B6CF0);
 		setBackground(0x030006E6);
@@ -492,7 +492,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
 		_klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480);
 		insertScreenMouse(0x006E2038);
 		_asTape = insertSprite<AsScene1201Tape>(this, 8, 1100, 302, 437, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape); 
+		addCollisionSprite(_asTape); 
 	}
 	
 	addEntity(_palette);
@@ -533,7 +533,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam &param, Entit
 }
 
 Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _currTuneStatus(0), _countdown1(0), _countdown2(0) {
+	: Scene(vm, parentModule), _currTuneStatus(0), _countdown1(0), _countdown2(0) {
 
 	SetMessageHandler(&Scene2802::handleMessage);
 	SetUpdateHandler(&Scene2802::update);
@@ -841,7 +841,7 @@ void AsScene2803Rope::stHide() {
 }
 
 Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _paletteArea(0) {
+	: Scene(vm, parentModule), _paletteArea(0) {
 	
 	static const uint32 kScene2803FileHashes1[] = {
 		0,
@@ -1108,7 +1108,7 @@ void Scene2803::updatePaletteArea() {
 }
 
 Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _paletteArea(0) {
+	: Scene(vm, parentModule), _paletteArea(0) {
 
 	static const uint32 kScene2803SmallFileHashes1[] = {
 		0, 0x081000F1, 0x08100171, 0x08100271
@@ -1731,7 +1731,7 @@ uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam &
 }
 
 Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _countdown3(0),
+	: Scene(vm, parentModule), _countdown1(0), _countdown2(0), _countdown3(0),
 	_beamStatus(0), _isSolved(false), _isWorking(false) {
 
 	initCrystalColors();
@@ -1759,7 +1759,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	
 	_ssRedButton = insertSprite<SsScene2804RedButton>(this);
-	_vm->_collisionMan->addCollisionSprite(_ssRedButton);
+	addCollisionSprite(_ssRedButton);
 
 	for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) {
 		AsScene2804CrystalWaves *asCrystalWaves = NULL;
@@ -1767,7 +1767,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 			asCrystalWaves = insertSprite<AsScene2804CrystalWaves>(crystalIndex);
 		_asCrystals[crystalIndex] = insertSprite<AsScene2804Crystal>(asCrystalWaves, crystalIndex);
 		_ssCrystalButtons[crystalIndex] = insertSprite<SsScene2804CrystalButton>(this, _asCrystals[crystalIndex], crystalIndex);
-		_vm->_collisionMan->addCollisionSprite(_ssCrystalButtons[crystalIndex]);
+		addCollisionSprite(_ssCrystalButtons[crystalIndex]);
 	}
 
 }
@@ -1882,7 +1882,7 @@ void Scene2804::initCrystalColors() {
 }
 
 Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	SetMessageHandler(&Scene2805::handleMessage);
 
@@ -1968,7 +1968,7 @@ uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam &param,
 }
 	
 Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	Sprite *tempSprite;
 
@@ -2089,7 +2089,7 @@ void Scene2806::findClosestPoint() {
 }
 
 Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 	
 	SetMessageHandler(&Scene2807::handleMessage);
 
@@ -2422,7 +2422,7 @@ void AsScene2808LightEffect::update() {
 }
 
 Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) {
+	: Scene(vm, parentModule), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) {
 
 	Sprite *asHandle;
 
@@ -2438,16 +2438,16 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(kScene2808FileHashes1[which]);
 
 	asHandle = insertSprite<AsScene2808Handle>(this, which);
-	_vm->_collisionMan->addCollisionSprite(asHandle);
+	addCollisionSprite(asHandle);
 
 	_asFlow = insertSprite<AsScene2808Flow>(this, which);
 	insertSprite<AsScene2808LightEffect>(which);
 
 	for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) {
 		SsScene2808Dispenser *ssDispenser = insertSprite<SsScene2808Dispenser>(this, which, testTubeIndex);
-		_vm->_collisionMan->addCollisionSprite(ssDispenser);
+		addCollisionSprite(ssDispenser);
 		_asTestTubes[testTubeIndex] = insertSprite<AsScene2808TestTube>(which, testTubeIndex, ssDispenser);
-		_vm->_collisionMan->addCollisionSprite(_asTestTubes[testTubeIndex]);
+		addCollisionSprite(_asTestTubes[testTubeIndex]);
 	}
 	
 	insertScreenMouse(kScene2808FileHashes2[which]);
@@ -2556,7 +2556,7 @@ uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam &param,
 }
 
 Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	Sprite *tempSprite;
 		
@@ -2703,7 +2703,7 @@ uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam &param,
 }
 
 Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true) {
+	: Scene(vm, parentModule) {
 
 	Sprite *tempSprite;
 
@@ -2727,10 +2727,10 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KLAYMAN_SMALL)) {
 		_asTape = insertSprite<AsScene1201Tape>(this, 0, 900, 245, 429, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	} else {
 		_asTape = insertSprite<AsScene1201Tape>(this, 0, 1100, 245, 429, 0x9148A011);
-		_vm->_collisionMan->addCollisionSprite(_asTape);
+		addCollisionSprite(_asTape);
 	}
 
 	_sprite1 = insertStaticSprite(0x430001C4, 1200);
@@ -2752,7 +2752,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AE438);
 			setRectList(0x004AE810);
 			_isRopingDown = false;
-			_vm->_collisionMan->removeCollisionSprite(_asTape);
+			removeCollisionSprite(_asTape);
 		} else {
 			insertKlayman<KmScene2810>(300, 424, _clipRects, 2);
 			setMessageList(0x004AE438);
@@ -2796,7 +2796,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AE6D8);
 			setRectList(0x004AE810);
 			_isRopingDown = false;
-			_vm->_collisionMan->removeCollisionSprite(_asTape);
+			removeCollisionSprite(_asTape);
 		} else {
 			insertKlaymanLadder();
 			if (getGlobalVar(V_LADDER_DOWN_ACTION)) {
@@ -2819,7 +2819,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 			setMessageList(0x004AE428);
 			setRectList(0x004AE810);
 			_isRopingDown = false;
-			_vm->_collisionMan->removeCollisionSprite(_asTape);
+			removeCollisionSprite(_asTape);
 		} else {
 			insertKlayman<KmScene2810>(450, 424, _clipRects, 2);
 			setMessageList(0x004AE418);
@@ -2838,7 +2838,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which)
 		setMessageList(0x004AE410);
 		setRectList(0x004AE810);
 		_isRopingDown = false;
-		_vm->_collisionMan->removeCollisionSprite(_asTape);
+		removeCollisionSprite(_asTape);
 	}
 
 }
@@ -3019,7 +3019,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa
 }
 
 Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _paletteArea(0) {
+	: Scene(vm, parentModule), _paletteArea(0) {
 	
 	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
 		setGlobalVar(V_KEY3_LOCATION, 3);
@@ -3039,11 +3039,11 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	if (getGlobalVar(V_KEY3_LOCATION) == 3) {
 		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 474, 437);
-		_vm->_collisionMan->addCollisionSprite(_asKey);
+		addCollisionSprite(_asKey);
 	}
 
 	_ssTape = insertSprite<SsScene1705Tape>(this, 6, 1100, 513, 437, 0xA1361863);
-	_vm->_collisionMan->addCollisionSprite(_ssTape);
+	addCollisionSprite(_ssTape);
 	
 	_asWinch = insertSprite<AsScene2812Winch>();
 	_asTrapDoor = insertSprite<AsScene2812TrapDoor>();
@@ -3173,7 +3173,7 @@ void Scene2812::updatePaletteArea(bool instantly) {
 }
 
 Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0) {
+	: Scene(vm, parentModule), _countdown(0), _scrollIndex(0) {
 
 	SetMessageHandler(&Scene2822::handleMessage);
 	SetUpdateHandler(&Scene2822::update);
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index 551d6cb..b5a6ab2 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -347,7 +347,7 @@ uint32 SsScene2901BigButton::handleMessage(int messageNum, const MessageParam &p
 }
 
 Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _currLocationButtonNum(which), _selectedButtonNum(which),
+	: Scene(vm, parentModule), _currLocationButtonNum(which), _selectedButtonNum(which),
 	_currWhirlButtonNum(0), _prevWhirlButtonNum(0), _countdown1(1), _skipCountdown(0), _blinkOn(0) {
 
 	_isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0;
@@ -365,7 +365,7 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (uint i = 0; i < 6; ++i) {
 		if (i != 2 || !_isButton2Broken) {
 			_ssLocationButtons[i] = insertSprite<SsScene2901LocationButton>(this, _currLocationButtonNum, i);
-			_vm->_collisionMan->addCollisionSprite(_ssLocationButtons[i]);
+			addCollisionSprite(_ssLocationButtons[i]);
 			_ssLocationButtonLights[i] = insertSprite<SsScene2901LocationButtonLight>(_currLocationButtonNum, i);
 		}
 	}
@@ -374,7 +374,7 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which)
 		insertSprite<SsScene2901BrokenButton>(_currLocationButtonNum);
 
 	_ssBigButton = insertSprite<SsScene2901BigButton>(this, _currLocationButtonNum);
-	_vm->_collisionMan->addCollisionSprite(_ssBigButton);
+	addCollisionSprite(_ssBigButton);
 
 	insertPuzzleMouse(kScene2901FileHashes2[_currLocationButtonNum], 20, 620);
 	
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 6767aa5..6bf95e3 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -712,9 +712,9 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene
 	SetUpdateHandler(&AnimatedSprite::update);
 	SetMessageHandler(&AsScene3009Symbol::handleMessage);
 	_ssArrowPrev = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _symbolPosition * 2 + 0);
-	_vm->_collisionMan->addCollisionSprite(_ssArrowPrev);
+	_parentScene->addCollisionSprite(_ssArrowPrev);
 	_ssArrowNext = _parentScene->insertSprite<SsScene3009SymbolArrow>(this, _symbolPosition * 2 + 1);
-	_vm->_collisionMan->addCollisionSprite(_ssArrowNext);
+	_parentScene->addCollisionSprite(_ssArrowNext);
 }
 
 uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -752,7 +752,7 @@ void AsScene3009Symbol::hide() {
 }
 
 Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _keepVideo(false), _moveCannonLeftFirst(false), 
+	: Scene(vm, parentModule), _keepVideo(false), _moveCannonLeftFirst(false), 
 	_isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
 
 	_cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS);
@@ -769,13 +769,13 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	insertPuzzleMouse(0x04208D08, 20, 620);
 
 	_ssFireCannonButton = insertSprite<SsScene3009FireCannonButton>(this);
-	_vm->_collisionMan->addCollisionSprite(_ssFireCannonButton);
+	addCollisionSprite(_ssFireCannonButton);
 
 	_asVerticalIndicator = insertSprite<AsScene3009VerticalIndicator>(this, _cannonTargetStatus);
-	_vm->_collisionMan->addCollisionSprite(_asVerticalIndicator);
+	addCollisionSprite(_asVerticalIndicator);
 
 	_asHorizontalIndicator = insertSprite<AsScene3009HorizontalIndicator>(this, _cannonTargetStatus);
-	_vm->_collisionMan->addCollisionSprite(_asHorizontalIndicator);
+	addCollisionSprite(_asHorizontalIndicator);
 
 	if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) {
 		_keepVideo = true;
@@ -1220,7 +1220,7 @@ void AsScene3010DeadBolt::stDisabledMessage() {
 }
 
 Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) {
+	: Scene(vm, parentModule), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) {
 	
 	int initCountdown = 0;
 
@@ -1235,7 +1235,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	for (int i = 0; i < 3; i++) {
 		_asDeadBolts[i] = insertSprite<AsScene3010DeadBolt>(this, i, which == 1);//CHECKME
 		_ssDeadBoltButtons[i] = insertSprite<SsScene3010DeadBoltButton>(this, i, initCountdown, which == 1);//CHECKME
-		_vm->_collisionMan->addCollisionSprite(_ssDeadBoltButtons[i]);
+		addCollisionSprite(_ssDeadBoltButtons[i]);
 		if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i]))
 			initCountdown++;
 		_boltUnlocking[i] = false;
@@ -1448,7 +1448,7 @@ void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) {
 }
 
 Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) {
+	: Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) {
 
 	_vm->gameModule()->initCodeSymbolsPuzzle();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
@@ -1466,7 +1466,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
 		_asSymbols[symbolIndex] = insertSprite<AsScene3011Symbol>(symbolIndex, true);
 
 	_ssButton = insertSprite<SsScene3011Button>(this, true);
-	_vm->_collisionMan->addCollisionSprite(_ssButton);
+	addCollisionSprite(_ssButton);
 	
 }
 
diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp
index ffaa802..d802322 100644
--- a/engines/neverhood/navigationscene.cpp
+++ b/engines/neverhood/navigationscene.cpp
@@ -26,7 +26,7 @@
 namespace Neverhood {
 
 NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes)
-	: Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false),
+	: Scene(vm, parentModule), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false),
 	_isWalkingForward(false), _isTurning(false), _smackerFileHash(0), _interactive(true), _leaveSceneAfter(false) {
 
 	_navigationList = _vm->_staticData->getNavigationList(navigationListId);
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 4ee801b..c0c6185 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -28,7 +28,6 @@
 #include "engines/util.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/blbarchive.h"
-#include "neverhood/collisionman.h"
 #include "neverhood/gamemodule.h"
 #include "neverhood/gamevars.h"
 #include "neverhood/graphics.h"
@@ -92,7 +91,6 @@ Common::Error NeverhoodEngine::run() {
 	_soundMan = new SoundMan(this);
 	_audioResourceMan = new AudioResourceMan(this);
 	
-	_collisionMan = new CollisionMan(this);
 	_gameModule = new GameModule(this);
 	
 	// TODO Check if this can actually be false...
@@ -116,7 +114,6 @@ Common::Error NeverhoodEngine::run() {
 	mainLoop();
 	
 	delete _gameModule;
-	delete _collisionMan;
 	delete _soundMan;
 	delete _audioResourceMan;
 
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index ef0f16c..3653127 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -40,7 +40,6 @@ enum NeverhoodGameFeatures {
 
 struct NeverhoodGameDescription;
 
-class CollisionMan;
 class GameModule;
 class GameVars;
 class ResourceMan;
@@ -85,7 +84,6 @@ public:
 	ResourceMan *_res;
 	GameModule *_gameModule;
 	StaticData *_staticData;
-	CollisionMan *_collisionMan;
 	
 	SoundMan *_soundMan;
 	AudioResourceMan *_audioResourceMan;
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 3f0c92f..e34f933 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -21,12 +21,11 @@
  */
 
 #include "neverhood/scene.h"
-#include "neverhood/collisionman.h"
 
 namespace Neverhood {
 
-Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
-	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) {
+Scene::Scene(NeverhoodEngine *vm, Module *parentModule)
+	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL) {
 	
 	_isKlaymanBusy = false;
 	_doConvertMessages = false;
@@ -40,10 +39,8 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects)
 	_mouseCursor = NULL;
 	_palette = NULL;
 	_background = NULL;
-	if (clearHitRects) {
-		_vm->_collisionMan->clearHitRects();
-		_vm->_collisionMan->clearCollisionSprites();
-	}
+	clearHitRects();
+	clearCollisionSprites();
 	_vm->_screen->setFps(24);
 	_vm->_screen->setSmackerDecoder(NULL);
 	_canAcceptInput = true;
@@ -160,7 +157,7 @@ void Scene::setSpriteSurfacePriority(Sprite *sprite, int priority) {
 }
 
 void Scene::deleteSprite(Sprite **sprite) {
-	_vm->_collisionMan->removeCollisionSprite(*sprite);
+	removeCollisionSprite(*sprite);
 	removeSurface((*sprite)->getSurface());
 	removeEntity(*sprite);
 	delete *sprite;
@@ -187,7 +184,11 @@ void Scene::setPalette(uint32 fileHash) {
 }
 
 void Scene::setHitRects(uint32 id) {
-	_vm->_collisionMan->setHitRects(id);
+	setHitRects(_vm->_staticData->getHitRectList(id));
+}
+
+void Scene::setHitRects(HitRectList *hitRects) {
+	_hitRects = hitRects;
 }
 
 Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) {
@@ -317,8 +318,8 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 }
 
 bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) {
-	for (uint i = 0; i < _vm->_collisionMan->getCollisionSpritesCount(); i++) {
-		Sprite *sprite = _vm->_collisionMan->getCollisionSprite(i);
+	for (uint i = 0; i < _collisionSprites.size(); i++) {
+		Sprite *sprite = _collisionSprites[i];
 		if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && 
 			sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) {
 			return true;
@@ -471,7 +472,7 @@ void Scene::loadHitRectList() {
 	HitRectList *hitRectList = _dataResource.getHitRectList();
 	if (hitRectList) {
 		_hitRectList = *hitRectList;
-		_vm->_collisionMan->setHitRects(&_hitRectList);
+		setHitRects(&_hitRectList);
 	}
 }
 
@@ -510,4 +511,54 @@ uint16 Scene::convertMessageNum(uint32 messageNum) {
 	return 0x1000;
 }
 
+void Scene::clearHitRects() {
+	_hitRects = NULL;
+}
+
+HitRect *Scene::findHitRectAtPos(int16 x, int16 y) {
+	static HitRect kDefaultHitRect = {NRect(), 0x5000};
+	if (_hitRects)
+		for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++)
+			if ((*it).rect.contains(x, y))
+				return &(*it);
+	return &kDefaultHitRect; 
+}
+
+void Scene::addCollisionSprite(Sprite *sprite) {
+	int index = 0, insertIndex = -1;
+	for (Common::Array<Sprite*>::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) {
+		if ((*iter)->getPriority() > sprite->getPriority()) {
+			insertIndex = index;
+			break;
+		}
+		index++;
+	}
+	if (insertIndex >= 0)
+		_collisionSprites.insert_at(insertIndex, sprite);
+	else
+		_collisionSprites.push_back(sprite);		
+}
+
+void Scene::removeCollisionSprite(Sprite *sprite) {
+	for (uint index = 0; index < _collisionSprites.size(); index++) {
+		if (_collisionSprites[index] == sprite) {
+			_collisionSprites.remove_at(index);
+			break;
+		}
+	}
+}
+
+void Scene::clearCollisionSprites() {
+	_collisionSprites.clear();
+}
+
+void Scene::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) {
+	for (Common::Array<Sprite*>::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) {
+		Sprite *collSprite = *iter;
+		if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) {
+			sprite->sendMessage(collSprite, messageNum, messageParam);
+		}
+	}	
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index a9e1674..cb34567 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -39,7 +39,7 @@ namespace Neverhood {
 
 class Scene : public Entity {
 public:
-	Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects);
+	Scene(NeverhoodEngine *vm, Module *parentModule);
 	virtual ~Scene();
 	virtual void draw();
 	void addEntity(Entity *entity);
@@ -67,6 +67,10 @@ public:
 	SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer);
 	void update();
 	void leaveScene(uint32 result);
+	HitRect *findHitRectAtPos(int16 x, int16 y);
+	void addCollisionSprite(Sprite *sprite);
+	void removeCollisionSprite(Sprite *sprite);
+	void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam);
 	// Some crazy templated functions to make the logic code smaller/simpler (imo!)
 	// insertKlayman
 	template<class T> 
@@ -187,6 +191,9 @@ protected:
 
 	HitRectList _hitRectList;
 
+	HitRectList *_hitRects;
+	Common::Array<Sprite*> _collisionSprites;
+
 	void (Entity::*_savedUpdateHandlerCb)();
 	uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam &param, Entity *sender);
 	int _messageValue;
@@ -205,6 +212,11 @@ protected:
 	void cancelMessageList();
 	void loadDataResource(uint32 fileHash);
 	uint16 convertMessageNum(uint32 messageNum);
+
+    void setHitRects(HitRectList *hitRects);
+	void clearHitRects();
+	void clearCollisionSprites();
+
 };
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index a08aad4..7470acb 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -25,7 +25,7 @@
 namespace Neverhood {
 
 SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort)
-	: Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false),
+	: Scene(vm, parentModule), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false),
 	_fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) {
 
 	debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort);


Commit: b875696fc7037d949200a714d1403d922714ed91
    https://github.com/scummvm/scummvm/commit/b875696fc7037d949200a714d1403d922714ed91
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Update todo.txt

Changed paths:
    engines/neverhood/todo.txt



diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt
index 5561ead..c13d3f1 100644
--- a/engines/neverhood/todo.txt
+++ b/engines/neverhood/todo.txt
@@ -6,10 +6,6 @@ else the game disasm and reimplemtation code become even more different
 
 TODOs which can be done any time:
 -----------------------------------
-- Give placeholder stuff (e.g. sub?????, _flag??? etc.) better fitting names
-- Use CursorMan for the mouse cursor (instead of using it like a normal sprite)
-	- This whould make it neccessary to call _system->updateScreen more often else 
-		the mouse movement would be choppy
 - Cleanup
 - Clean up staticdata structs to look more like the ones in create_neverhood
 	(e.g. by using template classes etc.)
@@ -17,15 +13,10 @@ TODOs which can be done any time:
 
 TODOs which should be done only after the game logic is finished:
 -------------------------------------------------------------------
-- Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary
-- Rework the resource system
-	- The current system can be simplified a lot
-	- Also resource purging needs to be implemented
 - Implement game menus
 - Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes)
 	- This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included
 	- The move special scenes (SmackerScene) into the scenes file
-- Maybe merge CollisionMan with Scene (since it's so far never used independently)
 
 DONE:
 -------
@@ -34,7 +25,15 @@ DONE:
 	- Play routine should fill the handle so it can be stopped/queried later
 	- Basically like ScummVM own sound handles
 - RE and implement yet unknown music/sound stuff
-
+- Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary
+- Rework the resource system
+	- The current system can be simplified a lot
+	- Also resource purging needs to be implemented
+- Maybe merge CollisionMan with Scene (since it's so far never used independently)
+- Give placeholder stuff (e.g. sub?????, _flag??? etc.) better fitting names
+- Use CursorMan for the mouse cursor (instead of using it like a normal sprite)
+	- This whould make it neccessary to call _system->updateScreen more often else 
+		the mouse movement would be choppy
 
 TODOs which are experimental:
 -------------------------------


Commit: fa205be8924fe5b053d16fe27ffee9a5aaf39d36
    https://github.com/scummvm/scummvm/commit/fa205be8924fe5b053d16fe27ffee9a5aaf39d36
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Remove some obsolete TODOs

Changed paths:
    engines/neverhood/gamemodule.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 823f89a..be56c73 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -78,7 +78,6 @@ GameModule::GameModule(NeverhoodEngine *vm)
 	_mainMenuRequested(false), _gameWasLoaded(false) {
 	
 	// Other initializations moved to actual engine class
-	// TODO
 	_vm->_soundMan->playSoundThree(0x002D0031, 0x8861079);
 	SetMessageHandler(&GameModule::handleMessage);
 }
@@ -88,9 +87,6 @@ GameModule::~GameModule() {
 	_vm->_soundMan->deleteSoundGroup(0x002D0031);
 	delete _childObject;
 	_childObject = NULL;
-	// TODO: Set palette to black but probably not neccessary
-	// TODO SoundMan_deinit();
-	// TODO Set debug vars (maybe)
 }
 
 void GameModule::handleMouseMove(int16 x, int16 y) {
@@ -176,7 +172,7 @@ void GameModule::initMemoryPuzzle() {
 		for (uint32 i = 0; i < 3; i++)
 			setSubVar(VA_CURR_DICE_NUMBERS, i, 1);
 		// Set special symbols
-		// Symbol 5 is always one the three special symbols
+		// Symbol 5 is always one of the three special symbols
 		setSubVar(VA_DICE_MEMORY_SYMBOLS, diceIndices.getNumber(), 5);
 		tileSymbols.removeNumber(5);
 		for (int i = 0; i < 2; i++)


Commit: 6ddedc955a5d04efda9b462154ccac2df4f8966a
    https://github.com/scummvm/scummvm/commit/6ddedc955a5d04efda9b462154ccac2df4f8966a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Merge TextSurface into FontSurface

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 3b456a5..1c3769d 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -150,62 +150,70 @@ void ShadowSurface::draw() {
 
 // FontSurface
 
-FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
-	: BaseSurface(vm, 0, charWidth * 16, charHeight * numRows), _tracking(tracking), _numRows(numRows), _firstChar(firstChar),
-	_charWidth(charWidth), _charHeight(charHeight) {
-}
+FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
+	: BaseSurface(vm, 0, charWidth * charsPerRow, charHeight * numRows), _charsPerRow(charsPerRow), _numRows(numRows),
+	_firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _tracking(NULL) {
+	
+	_tracking = new NPointArray();
+	*_tracking = *tracking;
 
-void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) {
-	NDrawRect sourceRect;
-	chr -= _firstChar;
-	sourceRect.x = (chr % 16) * _charWidth;
-	sourceRect.y = (chr / 16) * _charHeight;
-	sourceRect.width = _charWidth;
-	sourceRect.height = _charHeight;
-	destSurface->copyFrom(_surface, x, y, sourceRect, true);
 }
 
-void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string) {
-	for (; *string != 0; string++) {
-		drawChar(destSurface, x, y, *string);
-		x += _tracking[*string - _firstChar].x;
-	}	
+FontSurface::FontSurface(NeverhoodEngine *vm, uint32 fileHash, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight)
+	: BaseSurface(vm, 0, charWidth * charsPerRow, charHeight * numRows), _charsPerRow(charsPerRow), _numRows(numRows),
+	_firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _tracking(NULL) {
+	
+	SpriteResource fontSpriteResource(_vm);
+	fontSpriteResource.load2(fileHash);
+	drawSpriteResourceEx(fontSpriteResource, false, false, 0, 0);
 }
 
-// TextSurface
-
-TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount,
-		byte firstChar, uint16 charWidth, uint16 charHeight)
-		: BaseSurface(vm, 0, charWidth * charCount, charHeight * numRows),
-		_numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight),
-		_fileHash(fileHash), _charCount(charCount) {
-
-		SpriteResource spriteResource(_vm);
-		spriteResource.load2(_fileHash);
-		drawSpriteResourceEx(spriteResource, false, false, 0, 0);
+FontSurface::~FontSurface() {
+	delete _tracking;
 }
 
-void TextSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) {
+void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) {
 	NDrawRect sourceRect;
 	chr -= _firstChar;
-	sourceRect.x = (chr % _charCount) * _charWidth;
-	sourceRect.y = (chr / _charCount) * _charHeight;
+	sourceRect.x = (chr % _charsPerRow) * _charWidth;
+	sourceRect.y = (chr / _charsPerRow) * _charHeight;
 	sourceRect.width = _charWidth;
 	sourceRect.height = _charHeight;
 	destSurface->copyFrom(_surface, x, y, sourceRect, true);
 }
 
-void TextSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) {
-	for (; stringLen > 0; stringLen--, string++) {
+void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) {
+
+	if (stringLen < 0)
+		stringLen = strlen((const char*)string);
+
+	for (; stringLen > 0; --stringLen, ++string) {
 		drawChar(destSurface, x, y, *string);
-		x += _charWidth;
+		x += _tracking ? (*_tracking)[*string - _firstChar].x : _charWidth;
 	}	
+
 }
 
-int16 TextSurface::getStringWidth(const byte *string, int stringLen) {
+int16 FontSurface::getStringWidth(const byte *string, int stringLen) {
 	return string ? stringLen * _charWidth : 0;
 }
 
+FontSurface *FontSurface::createFontSurface(NeverhoodEngine *vm, uint32 fileHash) {
+	FontSurface *fontSurface;
+	DataResource fontData(vm);
+	SpriteResource fontSprite(vm);
+	fontData.load(calcHash("asRecFont"));
+	uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x;
+	uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x;
+	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
+	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
+	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
+	fontSprite.load2(fileHash);
+	fontSurface = new FontSurface(vm, tracking, 16, numRows, firstChar, charWidth, charHeight);	
+	fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0);
+	return fontSurface;
+}
+
 // Misc
 
 enum BitmapFlags {
@@ -338,8 +346,8 @@ void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, i
 }
 
 int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) {
-	int16 deltaX = ABS(x1 - x2);
-	int16 deltaY = ABS(y1 - y2);
+	const int16 deltaX = ABS(x1 - x2);
+	const int16 deltaY = ABS(y1 - y2);
 	return sqrt((double)(deltaX * deltaX + deltaY * deltaY));
 }
 
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index 65d25c0..a900cea 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -81,8 +81,6 @@ class AnimResource;
 class SpriteResource;
 class MouseCursorResource;
 
-// NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific
-
 class BaseSurface {
 public:
 	BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height);
@@ -131,33 +129,22 @@ protected:
 
 class FontSurface : public BaseSurface {
 public:
-	FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
-	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
-	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string);
-protected:
-	NPointArray _tracking;
-	uint16 _numRows;
-	byte _firstChar;
-	uint16 _charWidth;
-	uint16 _charHeight;
-};
-
-class TextSurface : public BaseSurface {
-public:
-	TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount,
-		byte firstChar, uint16 charWidth, uint16 charHeight);
+	FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
+	FontSurface(NeverhoodEngine *vm, uint32 fileHash, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight);
+	virtual ~FontSurface();
 	void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr);
-	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen);
+	void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen = -1);
 	int16 getStringWidth(const byte *string, int stringLen);
 	uint16 getCharWidth() const { return _charWidth; }
 	uint16 getCharHeight() const { return _charHeight; }
+	static FontSurface *createFontSurface(NeverhoodEngine *vm, uint32 fileHash);
 protected:
+	uint _charsPerRow;
 	uint16 _numRows;
 	byte _firstChar;
 	uint16 _charWidth;
 	uint16 _charHeight;
-	uint32 _fileHash;
-	uint _charCount;
+	NPointArray *_tracking;
 };
 
 // Misc
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index a1489fc..726ab91 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -458,9 +458,9 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam &param, Entity *
 
 TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 	int baseObjectPriority, int baseSurfacePriority,
-	const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface)
+	const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface)
 	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
-	_string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _textSurface(textSurface) {
+	_string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _fontSurface(fontSurface) {
 	
 }
 
@@ -470,15 +470,15 @@ void TextLabelWidget::addSprite() {
 }
 
 int16 TextLabelWidget::getWidth() {
-	return _textSurface->getStringWidth(_string, _stringLen);
+	return _fontSurface->getStringWidth(_string, _stringLen);
 }
 
 int16 TextLabelWidget::getHeight() {
-	return _textSurface->getCharHeight();
+	return _fontSurface->getCharHeight();
 }
 
 void TextLabelWidget::drawString(int maxStringLength) {
-	_textSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength));
+	_fontSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength));
 	_collisionBoundsOffset.set(_tx, _ty, getWidth(), getHeight());
 	updateBounds();
 }
@@ -499,14 +499,14 @@ void TextLabelWidget::setString(const byte *string, int stringLen) {
 }
 
 TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface,
+	int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface,
 	uint32 fileHash, const NRect &rect)
 	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
-	_maxStringLength(maxStringLength), _textSurface(textSurface), _fileHash(fileHash), _rect(rect),
+	_maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect),
 	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0),
 	_modified(false) {
 
-	_maxVisibleChars = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth();
+	_maxVisibleChars = (_rect.x2 - _rect.x1) / _fontSurface->getCharWidth();
 	_cursorPos = 0;
 	
 	SetUpdateHandler(&TextEditWidget::update);
@@ -526,8 +526,8 @@ void TextEditWidget::onClick() {
 		if (_entryString.size() == 1)
 			_cursorPos = 0;
 		else {
-			int newCursorPos = mousePos.x / _textSurface->getCharWidth();
-			if (mousePos.x % _textSurface->getCharWidth() > _textSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//###
+			int newCursorPos = mousePos.x / _fontSurface->getCharWidth();
+			if (mousePos.x % _fontSurface->getCharWidth() > _fontSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//###
 				++newCursorPos;
 			_cursorPos = MIN((int)_entryString.size(), newCursorPos);
 		}
@@ -546,9 +546,9 @@ void TextEditWidget::addSprite() {
 	_parentScene->addSprite(this);
 	_parentScene->addCollisionSprite(this);
 	_surface->setVisible(true);
-	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2,
+	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _fontSurface->getCharHeight()) / 2,
 		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
-		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _textSurface);
+		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface);
 	_textLabelWidget->addSprite();
 	cursorSpriteResource.load2(_cursorFileHash);
 	_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
@@ -576,7 +576,7 @@ void TextEditWidget::setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 c
 void TextEditWidget::drawCursor() {
 	if (_cursorSurface->getVisible() && _cursorPos >= 0 && _cursorPos <= _maxVisibleChars) {
 		NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight);
-		_surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _textSurface->getCharWidth(),
+		_surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _fontSurface->getCharWidth(),
 			_rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect, true);
 	} else
 		_cursorSurface->setVisible(false);
@@ -677,13 +677,13 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam &param,
 
 SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 	int baseObjectPriority, int baseSurfacePriority,
-	StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect)
+	StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect)
 	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
-	_savegameList(savegameList), _textSurface(textSurface), _bgFileHash(bgFileHash), _rect(rect),
+	_savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect),
 	_maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) {
 
-	_maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface->getCharHeight();
-	_maxStringLength = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth();
+	_maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _fontSurface->getCharHeight();
+	_maxStringLength = (_rect.x2 - _rect.x1) / _fontSurface->getCharWidth();
 }
 
 void SavegameListBox::onClick() {
@@ -692,7 +692,7 @@ void SavegameListBox::onClick() {
 	mousePos.y -= _y + _rect.y1;
 	if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 &&
 		mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) {
-		int newIndex = _firstVisibleItem + mousePos.y / _textSurface->getCharHeight();
+		int newIndex = _firstVisibleItem + mousePos.y / _fontSurface->getCharHeight();
 		if (newIndex <= _lastVisibleItem) {
 			_currIndex = newIndex;
 			refresh();
@@ -723,7 +723,7 @@ void SavegameListBox::buildItems() {
 		const byte *string = (const byte*)savegameList[i].c_str();
 		int stringLen = (int)savegameList[i].size();
 		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
-			_baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface);
+			_baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface);
 		label->addSprite();
 		_textLabelItems.push_back(label);
 	}
@@ -733,7 +733,7 @@ void SavegameListBox::drawItems() {
 	for (int i = 0; i < (int)_textLabelItems.size(); ++i) {
 		TextLabelWidget *label = _textLabelItems[i];		
 		if (i >= _firstVisibleItem && i < _lastVisibleItem) {
-			label->setY(_rect.y1 + (i - _firstVisibleItem) * _textSurface->getCharHeight());
+			label->setY(_rect.y1 + (i - _firstVisibleItem) * _fontSurface->getCharHeight());
 			label->updateBounds();
 			label->drawString(_maxStringLength);
 		} else
@@ -805,7 +805,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 	static const NRect kTextEditRect(0, 0, 377, 17);
 	static const NRect kMouseRect(50, 47, 427, 64);
 
-	_textSurface = new TextSurface(_vm, 0x2328121A, 7, 32, 32, 11, 17);
+	_fontSurface = new FontSurface(_vm, 0x2328121A, 32, 7, 32, 11, 17);
 	
 	setBackground(0x30084E25);
 	setPalette(0x30084E25);
@@ -814,11 +814,11 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 	insertStaticSprite(0x1301A7EA, 200);
 
 	_listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, 1000, 1000,
-		_savegameList, _textSurface, 0x1115A223, kListBoxRect);
+		_savegameList, _fontSurface, 0x1115A223, kListBoxRect);
 	_listBox->addSprite();
 
 	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, 29,
-		_textSurface, 0x3510A868, kTextEditRect);
+		_fontSurface, 0x3510A868, kTextEditRect);
 	_textEditWidget->setCursor(0x8290AC20, 2, 13);
 	_textEditWidget->addSprite();
 	setCurrWidget(_textEditWidget);
@@ -835,7 +835,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 }
 
 SaveGameMenu::~SaveGameMenu() {
-	delete _textSurface;
+	delete _fontSurface;
 }
 
 void SaveGameMenu::handleEvent(int16 itemID, int eventType) {
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 0f45795..51c32aa 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -123,7 +123,7 @@ class TextLabelWidget : public Widget {
 public:
 	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 		int baseObjectPriority, int baseSurfacePriority, 
-		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface);	
+		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface);	
 	virtual void onClick();
 	virtual void addSprite();
 	virtual int16 getWidth();
@@ -131,11 +131,11 @@ public:
 	void drawString(int maxStringLength);
 	void clear();
 	void setString(const byte *string, int stringLen);
-	TextSurface *getTextSurface() const { return _textSurface; }
+	FontSurface *getFontSurface() const { return _fontSurface; }
 protected:
 	BaseSurface *_drawSurface;
 	int16 _tx, _ty;
-	TextSurface *_textSurface;
+	FontSurface *_fontSurface;
 	const byte *_string;
 	int _stringLen;
 };
@@ -143,7 +143,7 @@ protected:
 class TextEditWidget : public Widget {
 public:
 	TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface,
+		int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface,
 		uint32 fileHash, const NRect &rect);
 	~TextEditWidget();
 	virtual void onClick();
@@ -167,7 +167,7 @@ protected:
 	int _cursorPos;
 	int _cursorTicks;
 	Common::String _entryString;
-	TextSurface *_textSurface;
+	FontSurface *_fontSurface;
 	TextLabelWidget *_textLabelWidget;
 	BaseSurface *_cursorSurface;
 	uint32 _cursorFileHash;
@@ -181,7 +181,7 @@ class SavegameListBox : public Widget {
 public:
 	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 		int baseObjectPriority, int baseSurfacePriority,
-		StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect);
+		StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
 	virtual void onClick();
 	virtual void addSprite();
 	void buildItems();
@@ -200,7 +200,7 @@ protected:
 	int _firstVisibleItem;
 	int _lastVisibleItem;
 	StringArray *_savegameList;
-	TextSurface *_textSurface;
+	FontSurface *_fontSurface;
 	uint _currIndex;
 	int _maxVisibleItemsCount;
 };
@@ -212,7 +212,7 @@ public:
 	virtual void handleEvent(int16 itemID, int eventType);
 protected:
 	StringArray *_savegameList;
-	TextSurface *_textSurface;
+	FontSurface *_fontSurface;
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;
 	Common::String _savegameDescription;
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 7033caf..44bb778 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1580,7 +1580,7 @@ void Scene1005::drawTextToBackground() {
 	const char *textStart, *textEnd;
 	int16 y = 36;
 	uint32 textIndex = getTextIndex();
-	FontSurface *fontSurface = createFontSurface();
+	FontSurface *fontSurface = FontSurface::createFontSurface(_vm, getGlobalVar(V_ENTRANCE_OPEN) ? 0x283CE401 : 0xC6604282);
 	textResource.load(0x80283101);
 	textStart = textResource.getString(textIndex, textEnd);
 	while (textStart < textEnd) {
@@ -1591,26 +1591,6 @@ void Scene1005::drawTextToBackground() {
 	delete fontSurface;
 }
 
-FontSurface *Scene1005::createFontSurface() {
-	FontSurface *fontSurface;
-	DataResource fontData(_vm);
-	SpriteResource fontSprite(_vm);
-	fontData.load(calcHash("asRecFont"));
-	uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x;
-	uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x;
-	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
-	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
-	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
-	fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight);	
-	if (getGlobalVar(V_ENTRANCE_OPEN)) {
-		fontSprite.load2(0x283CE401);
-	} else {
-		fontSprite.load2(0xC6604282);
-	}
-	fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0);
-	return fontSurface;
-}
-
 uint32 Scene1005::getTextIndex() {
 	uint32 textIndex;
 	textIndex = getTextIndex1();
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 6f73326..32228a2 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -289,7 +289,6 @@ public:
 protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void drawTextToBackground();
-	FontSurface *createFontSurface();
 	uint32 getTextIndex();
 	uint32 getTextIndex1();
 	uint32 getTextIndex2();
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 889af37..6448955 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2135,8 +2135,9 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	setPalette(0x08100289);
 	addEntity(_palette);
 	insertPuzzleMouse(0x0028D089, 40, 600);
-	
-	createFontSurface();
+
+	_fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C);
+
 	_backgroundSurface = new BaseSurface(_vm, 0, 640, 480);
 	spriteResource.load2(0x08100289);
 	_backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
@@ -2232,20 +2233,6 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam &param, Entit
 	return messageResult;
 }
 
-void Scene2208::createFontSurface() {
-	DataResource fontData(_vm);
-	SpriteResource spriteResource(_vm);
-	fontData.load(calcHash("asRecFont"));
-	uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x;
-	uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x;
-	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
-	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
-	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
-	spriteResource.load2(0x0800090C);
-	_fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight);
-	_fontSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
-}
-
 void Scene2208::drawRow(int16 rowIndex) {
 	NDrawRect sourceRect;	
 	int16 y = (rowIndex * 48) % 528;
diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h
index 34be267..30cc681 100644
--- a/engines/neverhood/module2200.h
+++ b/engines/neverhood/module2200.h
@@ -336,7 +336,6 @@ protected:
 	Common::Array<const char*> _strings;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createFontSurface();
 	void drawRow(int16 rowIndex);
 };
 


Commit: a98d9aa58afb4dd944616e7f194c09ff28456e1b
    https://github.com/scummvm/scummvm/commit/a98d9aa58afb4dd944616e7f194c09ff28456e1b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:39-07:00

Commit Message:
NEVERHOOD: Clean up DiskplayerScene

- Enable return to launcher
- Remove obsolete comments
- Remove braces in single-line statements
- Remove unused non-transparent drawing code in BaseSurface::copyFrom
- Clean up mouse cursor insertion code in Scene class

Changed paths:
    engines/neverhood/detection.cpp
    engines/neverhood/diskplayerscene.cpp
    engines/neverhood/diskplayerscene.h
    engines/neverhood/entity.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamevars.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/graphics.cpp
    engines/neverhood/graphics.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module1000.cpp
    engines/neverhood/module1100.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2900.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index 9dc4582..043cf02 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -72,7 +72,6 @@ static const NeverhoodGameDescription gameDescriptions[] = {
 
 	{
 		// Neverhood English version
-		// TODO: Maybe additional files are needed to properly detect different versions
 		{
 			"neverhood",
 			0,
@@ -147,7 +146,7 @@ bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
 
 bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const {
 	return
-//		(f == kSupportsRTL) || // TODO: Not yet...
+		(f == kSupportsRTL) ||
 		(f == kSupportsLoadingDuringRuntime) ||
 		(f == kSupportsSavingDuringRuntime);
 }
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 907e027..d972943 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -240,40 +240,40 @@ void DiskplayerPlayButton::release() {
 	}
 }
 
-DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value)
-	: Entity(vm, 0), _diskplayerScene(diskplayerScene), _elementIndex(elementIndex), _value(value),
-	_isLocked(false), _isBlinking(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
-
-	if (value != 0 && elementIndex < 20) {
-		_inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100));
-		_appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[_elementIndex], 1000));
-		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[_elementIndex], 1100));
+DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int slotIndex, bool isAvailable)
+	: Entity(vm, 0), _diskplayerScene(diskplayerScene), _isLocked(false), _isBlinking(false),
+	_blinkCountdown(0), _initialBlinkCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) {
+
+	if (isAvailable && slotIndex < 20) {
+		_inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[slotIndex], 1100));
+		_appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[slotIndex], 1000));
+		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[slotIndex], 1100));
 		_inactiveSlot->setVisible(false);
 		_appearSlot->setVisible(false);
 		_activeSlot->setVisible(false);
 		loadSound(0, 0x46210074);
-		setSoundPan(0, elementIndex * 100 / 19);
-	} else if (elementIndex != 20) {
-		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100));
+		setSoundPan(0, slotIndex * 100 / 19);
+	} else if (slotIndex != 20) {
+		_activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[slotIndex], 1100));
 		_activeSlot->setVisible(false);
 	}
 	SetUpdateHandler(&DiskplayerSlot::update);
 }
 
 void DiskplayerSlot::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
+	if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) {
 		if (_isBlinking) {
 			if (_inactiveSlot)
 				_inactiveSlot->setVisible(true);
 			if (_activeSlot)
 				_activeSlot->setVisible(false);
-			_countdown = _initialCountdown / 2;
+			_blinkCountdown = _initialBlinkCountdown / 2;
 		} else {
 			if (_inactiveSlot)
 				_inactiveSlot->setVisible(false);
 			if (_activeSlot)
 				_activeSlot->setVisible(true);
-			_countdown = _initialCountdown;
+			_blinkCountdown = _initialBlinkCountdown;
 		}
 		_isBlinking = !_isBlinking;
 	}
@@ -295,13 +295,13 @@ void DiskplayerSlot::play() {
 		if (_activeSlot)
 			_activeSlot->setVisible(true);
 		_isBlinking = true;
-		_countdown = 0;
+		_blinkCountdown = 0;
 	}
 }
 
 void DiskplayerSlot::activate() {
 	if (!_isLocked)
-		_countdown = _initialCountdown;
+		_blinkCountdown = _initialBlinkCountdown;
 }
 
 void DiskplayerSlot::stop() {
@@ -311,7 +311,7 @@ void DiskplayerSlot::stop() {
 		if (_activeSlot)
 			_activeSlot->setVisible(false);
 		_isBlinking = false;
-		_countdown = 0;
+		_blinkCountdown = 0;
 	}
 }
 
@@ -330,17 +330,17 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	_asKey = insertSprite<AsDiskplayerSceneKey>();
 
 	for (int i = 0; i < 20; i++) {
-		_diskAvailable[i] = 0;
+		_diskAvailable[i] = false;
 		if (getSubVar(VA_IS_TAPE_INSERTED, i))
 			availableDisksCount++;
 	}
 
 	for (int i = 0; i < availableDisksCount; i++)
-		_diskAvailable[kDiskplayerInitArray[i] - 1] = 1;
+		_diskAvailable[kDiskplayerInitArray[i] - 1] = true;
 
-	for (int i = 0; i < 20; i++) {
-		_diskSlots[i] = new DiskplayerSlot(_vm, this, i, _diskAvailable[i]);
-		addEntity(_diskSlots[i]);
+	for (int slotIndex = 0; slotIndex < 20; slotIndex++) {
+		_diskSlots[slotIndex] = new DiskplayerSlot(_vm, this, slotIndex, _diskAvailable[slotIndex]);
+		addEntity(_diskSlots[slotIndex]);
 	}
 
 	_hasAllDisks = availableDisksCount == 20;
@@ -348,7 +348,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int
 	if (_hasAllDisks && !getGlobalVar(V_HAS_FINAL_KEY))
 		_dropKey = true;
 
-	_finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0);
+	_finalDiskSlot = new DiskplayerSlot(_vm, this, 20, false);
 	addEntity(_finalDiskSlot);
 
 	insertPuzzleMouse(0x000408A8, 20, 620);
@@ -372,11 +372,10 @@ void DiskplayerScene::update() {
 	Scene::update();
 
 	if (_updateStatus == kUSTuningIn && _diskSmackerPlayer->isDone()) {
-		if (_diskAvailable[_diskIndex]) {
+		if (_diskAvailable[_diskIndex])
 			playDisk();
-		} else {
+		else
 			playStatic();
-		}
 	} else if (_updateStatus == kUSPlaying && _diskSmackerPlayer->isDone()) {
 		_diskSlots[_diskIndex]->stop();
 		_diskIndex++;
@@ -456,11 +455,10 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam &param,
 				_diskIndex = (param.asPoint().x - 38) / 28;
 				_diskSlots[_diskIndex]->activate();
 				if (_updateStatus == kUSPlaying) {
-					if (_diskAvailable[_diskIndex]) {
+					if (_diskAvailable[_diskIndex])
 						playDisk();
-					} else {
+					else
 						playStatic();
-					}
 				}
 			}
 			break;
diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h
index 7225ff6..f3fd9ea 100644
--- a/engines/neverhood/diskplayerscene.h
+++ b/engines/neverhood/diskplayerscene.h
@@ -54,7 +54,7 @@ protected:
 
 class DiskplayerSlot : public Entity {
 public:
-	DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value);
+	DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int slotIndex, bool isAvailable);
 	void activate();
 	void stop();
 	void appear();
@@ -65,11 +65,9 @@ protected:
 	Sprite *_inactiveSlot;
 	Sprite *_appearSlot;
 	Sprite *_activeSlot;
-	int _elementIndex;
-	int _initialCountdown;
-	int _countdown;
+	int _initialBlinkCountdown;
+	int _blinkCountdown;
 	bool _isLocked;
-	int _value;
 	bool _isBlinking;
 	void update();	
 };
@@ -92,7 +90,7 @@ protected:
 	DiskplayerSlot *_diskSlots[20];
 	DiskplayerSlot *_finalDiskSlot;
 	int _updateStatus;
-	byte _diskAvailable[20];
+	bool _diskAvailable[20];
 	int _diskIndex;
 	int _appearCountdown;
 	int _tuneInCountdown;
diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp
index c7f1659..8b12989 100644
--- a/engines/neverhood/entity.cpp
+++ b/engines/neverhood/entity.cpp
@@ -55,6 +55,7 @@ Entity::~Entity() {
 }
 
 void Entity::draw() {
+	// Empty
 }
 
 void Entity::handleUpdate() {
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index be56c73..c931057 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -195,8 +195,7 @@ void GameModule::initMemoryPuzzle() {
 		}
 		setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1);
 
-		// DEBUG>>>
-		// TODO: Some debug code: Leave two matching tiles open
+		// DEBUG>>> Some debug code: Leave two matching tiles open
 		for (int i = 0; i < 48; i++)
 			setSubVar(VA_IS_TILE_MATCH, i, 1);
 		int debugIndex = 0;
@@ -313,9 +312,8 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 }
 
 void GameModule::startup() {
-	// TODO: Displaying of error text probably not needed in ScummVM
-#if 1
-	createModule(1500, 0); // Logos and intro video //Real
+#if 0
+	createModule(1500, 0); // Logos and intro video // Real game start
 #else
 	// DEBUG>>>
 	/*
@@ -362,13 +360,6 @@ void GameModule::startup() {
 	// <<<DEBUG
 
 #if 0
-	/*
-	//DEBUG>>>
-	createScene(_vm->gameState().sceneNum, _vm->gameState().which);
-	return;
-	//DEBUG<<<
-	*/
-
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 14;
 	createModule(2700, -1);
@@ -386,9 +377,9 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
-#if 0
-	_vm->gameState().sceneNum = 1;
-	createModule(1000, -1);
+#if 1
+	_vm->gameState().sceneNum = 7;
+	createModule(2200, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 1;
@@ -425,7 +416,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 0;
 	createModule(2500, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 1;
 	createModule(2300, -1);
 #endif
@@ -626,65 +617,60 @@ void GameModule::updateModule() {
 			createModule(2300, 0);
 			break;
 		case 1200:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createModule(2600, 0);
-			} else {
+			else
 				createModule(2300, 2);
-			}
 			break;
 		case 1100:
-			if (_moduleResult == 0) {
+			if (_moduleResult == 0)
 				createModule(2900, 2);
-			} else {
+			else {
 				setGlobalVar(V_ENTRANCE_OPEN, 1);
 				createModule(1300, 0);
 			}
 			break;
 		case 1300:
 			if (_moduleResult == 1) {
+				// The game was successfully finished
+				// TODO Restart the game/show main menu
 				// TODO _gameState.clear();
 				// TODO GameModule_handleKeyEscape
-			} else {
+			} else
 				createModule(2900, 0);
-			}
 			break;
 		case 1400:
-			if (_moduleResult == 1) {
-				error("WEIRD!");
-			} else {
-				createModule(1600, 1);
-			}
+			createModule(1600, 1);
 			break;
 		case 1500:
 			createModule(1000, 0);
 			break;
 		case 1600:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createModule(1400, 0);
-			} else if (_moduleResult == 2) {
+			else if (_moduleResult == 2)
 				createModule(1700, 0);
-			} else {
+			else
 				createModule(2100, 0);
-			}
 			break;
 		case 1700:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createModule(2900, 3);
-			} else {
+			else
 				createModule(1600, 2);
-			}
 			break;
 		case 1800:
 			if (_moduleResult == 1) {
-				// TODO GameState_clear();
-				// TODO GameModule_handleKeyEscape();
-			} else if (_moduleResult == 2) {
+				// Game over, Klaymen jumped into the hole
+				// TODO Restart the game/show main menu
+				// TODO _gameState.clear();
+				// TODO GameModule_handleKeyEscape
+			} else if (_moduleResult == 2)
 				createModule(2700, 0);
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createModule(3000, 3);
-			} else {
+			else
 				createModule(2800, 0);
-			}
 			break;
 		case 1900:
 			createModule(3000, 1);
@@ -693,11 +679,10 @@ void GameModule::updateModule() {
 			createModule(2900, 4);
 			break;
 		case 2100:
-			if (_moduleResult == 1) {
+			if (_moduleResult == 1)
 				createModule(2900, 1);
-			} else {
+			else
 				createModule(1600, 0);
-			}
 			break;
 		case 2200:
 			createModule(2300, 1);
@@ -738,7 +723,7 @@ void GameModule::updateModule() {
 				createModule(1800, 0);
 			break;
 		case 2900:
-			if (_moduleResult != 0xFFFFFFFF) {
+			if (_moduleResult != (uint32)-1) {
 				switch (_moduleResult) {
 				case 0:
 					createModule(1300, 5);
@@ -787,17 +772,16 @@ void GameModule::updateModule() {
 			setGlobalVar(V_TELEPORTER_CURR_LOCATION, 0);
 			break;
 		case 3000:
-			if (_moduleResult == 1) {
+			// NOTE _moduleResult 2 never used
+			// TODO Check if _moduleResult 4 is used
+			if (_moduleResult == 1)
 				createModule(1900, 0);
-			} else if (_moduleResult == 2) {
-				// WEIRD: Sets the errorFlag
-			} else if (_moduleResult == 3) {
+			else if (_moduleResult == 3)
 				createModule(1800, 3);
-			} else if (_moduleResult == 4) {
+			else if (_moduleResult == 4)
 				createModule(3000, 0);
-			} else {
+			else
 				createModule(2300, 4);
-			}
 			break;
 		case 9999:
 			createModuleByHash(getGlobalVar(V_MODULE_NAME));
@@ -814,7 +798,7 @@ void GameModule::openMainMenu() {
 		// If there's no module, create one so there's something to return to
 		createModule(1000, 0);
 	}
-	// TODO Save FPS, Smacker handle, screen offsets, collisition sprites
+	// TODO Save FPS, Smacker handle, screen offsets
 	_mainMenuRequested = false;
 	createMenuModule();
 }
@@ -833,7 +817,7 @@ void GameModule::updateMenuModule() {
 	if (!updateChild()) {
 		// TODO Restore FPS?
 		_childObject = _prevChildObject;
-		// TODO Restore Smacker handle, screen offsets, collision sprites
+		// TODO Restore Smacker handle, screen offsets
 		sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed?
 		_prevChildObject = NULL;
 		_moduleNum = _prevModuleNum;
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index 7bf9f30..57d9547 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -28,9 +28,6 @@ GameVars::GameVars() {
 	addVar(0, 0);
 }
 
-GameVars::~GameVars() {
-}
-
 void GameVars::loadState(Common::InSaveFile *in) {
 	uint varCount;
 	_vars.clear();
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index a62b33c..d3fe15f 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -172,7 +172,6 @@ struct GameVar {
 class GameVars {
 public:
 	GameVars();
-	~GameVars();
 	void loadState(Common::InSaveFile *in);
 	void saveState(Common::OutSaveFile *out);
 	uint32 getGlobalVar(uint32 nameHash);
diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 1c3769d..5426821 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -112,25 +112,17 @@ void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResour
 	}
 }
 
-void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent) {
-	// TODO: Clipping
+void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect) {
+	// Copy a rectangle from sourceSurface, no clipping is performed, 0 is the transparent color
 	byte *source = (byte*)sourceSurface->getBasePtr(sourceRect.x, sourceRect.y);
 	byte *dest = (byte*)_surface->getBasePtr(x, y);
 	int height = sourceRect.height;
-	if (!transparent) {
-		while (height--) {
-			memcpy(dest, source, sourceRect.width);
-			source += sourceSurface->pitch;
-			dest += _surface->pitch;
-		}
-	} else {
-		while (height--) {
-			for (int xc = 0; xc < sourceRect.width; xc++)
-				if (source[xc] != 0)
-					dest[xc] = source[xc];
-			source += sourceSurface->pitch;
-			dest += _surface->pitch;
-		}
+	while (height--) {
+		for (int xc = 0; xc < sourceRect.width; xc++)
+			if (source[xc] != 0)
+				dest[xc] = source[xc];
+		source += sourceSurface->pitch;
+		dest += _surface->pitch;
 	}
 	++_version;
 }
@@ -179,7 +171,7 @@ void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr)
 	sourceRect.y = (chr / _charsPerRow) * _charHeight;
 	sourceRect.width = _charWidth;
 	sourceRect.height = _charHeight;
-	destSurface->copyFrom(_surface, x, y, sourceRect, true);
+	destSurface->copyFrom(_surface, x, y, sourceRect);
 }
 
 void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) {
diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h
index a900cea..a0ac1f0 100644
--- a/engines/neverhood/graphics.h
+++ b/engines/neverhood/graphics.h
@@ -91,7 +91,7 @@ public:
 	void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height);
 	void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height);
 	void drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum);
-	void copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent);
+	void copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect);
 	int getPriority() const { return _priority; }
 	void setPriority(int priority) { _priority = priority; }
 	NDrawRect& getDrawRect() { return _drawRect; }
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 726ab91..2b7561c 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -577,7 +577,7 @@ void TextEditWidget::drawCursor() {
 	if (_cursorSurface->getVisible() && _cursorPos >= 0 && _cursorPos <= _maxVisibleChars) {
 		NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight);
 		_surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _fontSurface->getCharWidth(),
-			_rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect, true);
+			_rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect);
 	} else
 		_cursorSurface->setVisible(false);
 }
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index aeeb62f..36607d7 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -48,8 +48,7 @@ void Module::draw() {
 uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
 	case 0x0008:
-		if (_parentModule)
-			sendMessage(_parentModule, 8, 0);
+		sendMessage(_parentModule, 8, 0);
 		return 0;
 	case 0x1009:
 		_moduleResult = param.asInteger();
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 44bb778..12fe408 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -34,13 +34,12 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
 	_vm->_soundMan->addMusic(0x03294419, 0x061880C6);
 	_vm->_soundMan->addMusic(0x03294419, _musicFileHash);
 
-	if (which < 0) {
+	if (which < 0)
 		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 0) {
+	else if (which == 0)
 		createScene(0, 0);
-	} else if (which == 1) {
+	else if (which == 1)
 		createScene(1, 1);
-	}
 
 }
 
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index c39845e..2ee3897 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -573,8 +573,6 @@ void Scene1105::createObjects() {
 	
 	_asTeddyBear->show();
 
-	// TODO: Find a nicer way
-	deleteSprite((Sprite**)&_mouseCursor);
 	insertPuzzleMouse(0x18666208, 20, 620);
 	
 }
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 6448955..a53bd46 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2241,20 +2241,20 @@ void Scene2208::drawRow(int16 rowIndex) {
 		sourceRect.y = y;
 		sourceRect.width = 640;
 		sourceRect.height = 48;
-		_background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true);
+		_background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect);
 	} else if (rowIndex > _maxRowIndex - 5) {
 		sourceRect.x = 0;
 		sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48;
 		sourceRect.width = 640;
 		sourceRect.height = 48;
-		_background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect, true);
+		_background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect);
 	} else {
 		rowIndex -= 4;
 		sourceRect.x = 0;
 		sourceRect.y = (rowIndex * 48) % 480;
 		sourceRect.width = 640;
 		sourceRect.height = 48;
-		_background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true);
+		_background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect);
 		if (rowIndex < (int)_strings.size()) {
 			const char *text = _strings[rowIndex];
 			_fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text);
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index b5a6ab2..1e14d37 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -82,8 +82,8 @@ void Module2900::updateScene() {
 	if (!updateChild()) {
 		switch (_sceneNum) {
 		case 0:
-			if (_moduleResult == 0xFFFFFFFF) {
-				leaveModule(0xFFFFFFFF);
+			if (_moduleResult == (uint32)-1) {
+				leaveModule((uint32)-1);
 			} else {
 				_teleporterModuleResult = _moduleResult;
 				switch (getGlobalVar(V_TELEPORTER_WHICH)) {
@@ -417,14 +417,12 @@ uint32 Scene2901::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			leaveScene(0xFFFFFFFF);
-		}
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
+			leaveScene((uint32)-1);
 		break;
 	case 0x2000:
-		if (_currLocationButtonNum != _selectedButtonNum) {
+		if (_currLocationButtonNum != _selectedButtonNum)
 			leaveScene(_selectedButtonNum);
-		}
 		break;
 	case 0x2001:
 		if (_currLocationButtonNum == _selectedButtonNum)
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index e34f933..c22683a 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -199,18 +199,15 @@ void Scene::insertScreenMouse(uint32 fileHash, const NRect *mouseRect) {
 	NRect rect(-1, -1, -1, -1);
 	if (mouseRect)
 		rect = *mouseRect;
-	_mouseCursor = new Mouse(_vm, fileHash, rect);
-	addEntity(_mouseCursor);
+	insertMouse(new Mouse(_vm, fileHash, rect));
 }
 
 void Scene::insertPuzzleMouse(uint32 fileHash, int16 x1, int16 x2) {
-	_mouseCursor = new Mouse(_vm, fileHash, x1, x2);
-	addEntity(_mouseCursor);
+	insertMouse(new Mouse(_vm, fileHash, x1, x2));
 }
 
 void Scene::insertNavigationMouse(uint32 fileHash, int type) {
-	_mouseCursor = new Mouse(_vm, fileHash, type);
-	addEntity(_mouseCursor);
+	insertMouse(new Mouse(_vm, fileHash, type));
 }
 
 void Scene::showMouse(bool visible) {
@@ -561,4 +558,11 @@ void Scene::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32
 	}	
 }
 
+void Scene::insertMouse(Mouse *mouseCursor) {
+	if (_mouseCursor)
+		deleteSprite((Sprite**)&_mouseCursor);
+	_mouseCursor = mouseCursor;
+	addEntity(_mouseCursor);
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index cb34567..f03275f 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -217,6 +217,7 @@ protected:
 	void clearHitRects();
 	void clearCollisionSprites();
 
+	void insertMouse(Mouse *mouseCursor);
 };
 
 } // End of namespace Neverhood


Commit: 57497817e1f086a62471587e3601d8f0f7d7f13b
    https://github.com/scummvm/scummvm/commit/57497817e1f086a62471587e3601d8f0f7d7f13b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Add enum for the resource types

Changed paths:
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/smackerscene.cpp
    engines/neverhood/sound.cpp



diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 7f897a4..6cbbf12 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -27,10 +27,6 @@
 
 namespace Neverhood {
 
-// TODO: Since the load() methods are similar in most cases some of the code therein
-// can probably be copied into another method (e.g. inside the resource manager)
-// to reduce code. 
-
 // SpriteResource
 
 SpriteResource::SpriteResource(NeverhoodEngine *vm)
@@ -55,7 +51,7 @@ bool SpriteResource::load(uint32 fileHash) {
 	// TODO: Later merge with load2 and make the mode a parameter
 	unload();
 	_vm->_res->queryResource(fileHash, _resourceHandle);
-	if (_resourceHandle.isValid() && _resourceHandle.type() == 2) {
+	if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) {
 		_vm->_res->loadResource(_resourceHandle);
 		const byte *spriteData = _resourceHandle.data();
 		parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels);
@@ -67,7 +63,7 @@ bool SpriteResource::load2(uint32 fileHash) {
 	debug(2, "SpriteResource::load2(%08X)", fileHash);
 	unload();
 	_vm->_res->queryResource(fileHash, _resourceHandle);
-	if (_resourceHandle.isValid() && _resourceHandle.type() == 2) {
+	if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) {
 		_vm->_res->loadResource(_resourceHandle);
 		const byte *spriteData = _resourceHandle.data();
 		parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels);
@@ -97,11 +93,11 @@ bool PaletteResource::load(uint32 fileHash) {
 	unload();
 	_vm->_res->queryResource(fileHash, _resourceHandle);
 	if (_resourceHandle.isValid() &&
-		(_resourceHandle.type() == 2 || _resourceHandle.type() == 3)) {
+		(_resourceHandle.type() == kResTypeBitmap || _resourceHandle.type() == kResTypePalette)) {
 		_vm->_res->loadResource(_resourceHandle);
 		_palette = _resourceHandle.data();
 		// Check if the palette is stored in a bitmap
-		if (_resourceHandle.type() == 2)
+		if (_resourceHandle.type() == kResTypeBitmap)
 			parseBitmapResource(_palette, NULL, NULL, NULL, &_palette, NULL);
 
 	}
@@ -152,7 +148,7 @@ bool AnimResource::load(uint32 fileHash) {
 	unload();
 	
 	_vm->_res->queryResource(fileHash, _resourceHandle);
-	if (!_resourceHandle.isValid() || _resourceHandle.type() != 4)
+	if (!_resourceHandle.isValid() || _resourceHandle.type() != kResTypeAnimation)
 		return false;
 	
 	const byte *resourceData, *animList, *frameList;
@@ -336,7 +332,7 @@ void TextResource::load(uint32 fileHash) {
 	debug(2, "TextResource::load(%08X)", fileHash);
 	unload();
 	_vm->_res->queryResource(fileHash, _resourceHandle);
-	if (_resourceHandle.isValid() && _resourceHandle.type() == 6) {
+	if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeText) {
 		_vm->_res->loadResource(_resourceHandle);
 		_textData = _resourceHandle.data();
 		_count = READ_LE_UINT32(_textData);
@@ -371,7 +367,7 @@ void DataResource::load(uint32 fileHash) {
 	uint32 dataSize = 0;
 	unload();
 	_vm->_res->queryResource(fileHash, _resourceHandle);
-	if (_resourceHandle.isValid() && _resourceHandle.type() == 5) {
+	if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeData) {
 		_vm->_res->loadResource(_resourceHandle);
 		data = _resourceHandle.data();
 		dataSize = _resourceHandle.size();
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index 996579b..c6f63bf 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -31,6 +31,17 @@
 
 namespace Neverhood {
 
+enum {
+	kResTypeBitmap		= 2,
+	kResTypePalette		= 3,
+	kResTypeAnimation	= 4,
+	kResTypeData		= 5,
+	kResTypeText		= 6,
+	kResTypeSound		= 7,
+	kResTypeMusic		= 8,
+	kResTypeVideo		= 10
+};
+
 class SpriteResource {
 public:
 	SpriteResource(NeverhoodEngine *vm);
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 7470acb..290b8fa 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -72,7 +72,7 @@ void SmackerScene::nextVideo() {
 		uint32 smackerFileHash = _fileHashList[_fileHashListIndex];
 		ResourceHandle resourceHandle;
 		_vm->_res->queryResource(smackerFileHash, resourceHandle);
-		if (resourceHandle.type() != 10) {
+		if (resourceHandle.type() != kResTypeVideo) {
 			// Not a Smacker file
 			_vm->_screen->setSmackerDecoder(NULL);
 			sendMessage(_parentModule, 0x1009, 0);
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 3cbcf96..13ac87f 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -128,8 +128,8 @@ MusicItem::~MusicItem() {
 }
 
 SoundItem::SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash,
-		bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
-		bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown)
+	bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
+	bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown)
 	: _soundResource(NULL),	_nameHash(nameHash), _soundFileHash(soundFileHash),
 	_playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0),
 	_playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown),
@@ -546,7 +546,8 @@ void AudioResourceMan::removeSound(int16 soundIndex) {
 
 void AudioResourceMan::loadSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (!soundItem->_data && soundItem->_resourceHandle.isValid()) {
+	if (!soundItem->_data && soundItem->_resourceHandle.isValid() &&
+		(soundItem->_resourceHandle.type() == kResTypeSound || soundItem->_resourceHandle.type() == kResTypeMusic)) {
 		// TODO Check if it's a sound resource
 		_vm->_res->loadResource(soundItem->_resourceHandle);
 		soundItem->_data = soundItem->_resourceHandle.data();


Commit: f945448c7ba3884cded68314a13aa2132603121d
    https://github.com/scummvm/scummvm/commit/f945448c7ba3884cded68314a13aa2132603121d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Change graphic resource draw method to get a Surface instead of separate pixels/pitch

- Merge SpriteResource::load and load2

Changed paths:
    engines/neverhood/graphics.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/sprite.cpp



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 5426821..9139545 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -71,7 +71,7 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) {
 	if (spriteResource.getDimensions().width <= _drawRect.width && 
 		spriteResource.getDimensions().height <= _drawRect.height) {
 		clear();
-		spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false);
+		spriteResource.draw(_surface, false, false);
 		++_version;
 	}
 }
@@ -85,7 +85,7 @@ void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flip
 			_drawRect.height = height;
 		if (_surface) {
 			clear();
-			spriteResource.draw((byte*)_surface->pixels, _surface->pitch, flipX, flipY);
+			spriteResource.draw(_surface, flipX, flipY);
 			++_version;
 		}
 	}
@@ -99,7 +99,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex,
 	if (_surface) {
 		clear();
 		if (frameIndex < animResource.getFrameCount()) {
-			animResource.draw(frameIndex, (byte*)_surface->pixels, _surface->pitch, flipX, flipY);
+			animResource.draw(frameIndex, _surface, flipX, flipY);
 			++_version;
 		}
 	}
@@ -107,7 +107,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex,
 
 void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum) {
 	if (frameNum < 3) {
-		mouseCursorResource.draw(frameNum, (byte*)_surface->pixels, _surface->pitch);
+		mouseCursorResource.draw(frameNum, _surface);
 		++_version;
 	}
 }
@@ -156,7 +156,7 @@ FontSurface::FontSurface(NeverhoodEngine *vm, uint32 fileHash, uint charsPerRow,
 	_firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _tracking(NULL) {
 	
 	SpriteResource fontSpriteResource(_vm);
-	fontSpriteResource.load2(fileHash);
+	fontSpriteResource.load(fileHash, true);
 	drawSpriteResourceEx(fontSpriteResource, false, false, 0, 0);
 }
 
@@ -200,7 +200,7 @@ FontSurface *FontSurface::createFontSurface(NeverhoodEngine *vm, uint32 fileHash
 	uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x;
 	uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x;
 	NPointArray *tracking = fontData.getPointArray(calcHash("meTracking"));
-	fontSprite.load2(fileHash);
+	fontSprite.load(fileHash, true);
 	fontSurface = new FontSurface(vm, tracking, 16, numRows, firstChar, charWidth, charHeight);	
 	fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0);
 	return fontSurface;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 2b7561c..71b216b 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -540,7 +540,7 @@ void TextEditWidget::onClick() {
 void TextEditWidget::addSprite() {
 	SpriteResource cursorSpriteResource(_vm);
 
-	_spriteResource.load2(_fileHash);
+	_spriteResource.load(_fileHash, true);
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
@@ -550,7 +550,7 @@ void TextEditWidget::addSprite() {
 		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
 		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface);
 	_textLabelWidget->addSprite();
-	cursorSpriteResource.load2(_cursorFileHash);
+	cursorSpriteResource.load(_cursorFileHash, true);
 	_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
 	_cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
 	_cursorSurface->setVisible(true);
@@ -704,7 +704,7 @@ void SavegameListBox::onClick() {
 }
 
 void SavegameListBox::addSprite() {
-	_spriteResource.load2(_bgFileHash);
+	_spriteResource.load(_bgFileHash, true);
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
 	_parentScene->addSprite(this);
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index a53bd46..9f5f7fb 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2139,15 +2139,17 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 	_fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C);
 
 	_backgroundSurface = new BaseSurface(_vm, 0, 640, 480);
-	spriteResource.load2(0x08100289);
+	spriteResource.load(0x08100289, true);
 	_backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 
 	_topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192);
-	spriteResource.load2(!getGlobalVar(V_COLUMN_BACK_NAME) ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] : getGlobalVar(V_COLUMN_BACK_NAME));
+	spriteResource.load(!getGlobalVar(V_COLUMN_BACK_NAME)
+		? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6]
+		: getGlobalVar(V_COLUMN_BACK_NAME), true);
 	_topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 
 	_bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192);
-	spriteResource.load2(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6]);
+	spriteResource.load(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6], true);
 	_bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0);
 	
 	SetUpdateHandler(&Scene2208::update);
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 6cbbf12..3350b80 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -37,8 +37,10 @@ SpriteResource::~SpriteResource() {
 	unload();
 }
 
-void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) {
+void SpriteResource::draw(Graphics::Surface *destSurface, bool flipX, bool flipY) {
 	if (_pixels) {
+		byte *dest = (byte*)destSurface->pixels;
+		const int destPitch = destSurface->pitch;
 		if (_rle)
 			unpackSpriteRle(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY);
 		else
@@ -46,27 +48,15 @@ void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) {
 	}
 }
 
-bool SpriteResource::load(uint32 fileHash) {
+bool SpriteResource::load(uint32 fileHash, bool doLoadPosition) {
 	debug(2, "SpriteResource::load(%08X)", fileHash);
-	// TODO: Later merge with load2 and make the mode a parameter
 	unload();
 	_vm->_res->queryResource(fileHash, _resourceHandle);
 	if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) {
 		_vm->_res->loadResource(_resourceHandle);
 		const byte *spriteData = _resourceHandle.data();
-		parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels);
-	} 
-	return _pixels != NULL;
-}
-
-bool SpriteResource::load2(uint32 fileHash) {
-	debug(2, "SpriteResource::load2(%08X)", fileHash);
-	unload();
-	_vm->_res->queryResource(fileHash, _resourceHandle);
-	if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) {
-		_vm->_res->loadResource(_resourceHandle);
-		const byte *spriteData = _resourceHandle.data();
-		parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels);
+		NPoint *position = doLoadPosition ? &_position : NULL;
+		parseBitmapResource(spriteData, &_rle, &_dimensions, position, NULL, &_pixels);
 	} 
 	return _pixels != NULL;
 }
@@ -128,8 +118,10 @@ AnimResource::~AnimResource() {
 	unload();
 }
 
-void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) {
+void AnimResource::draw(uint frameIndex, Graphics::Surface *destSurface, bool flipX, bool flipY) {
 	const AnimFrameInfo frameInfo = _frames[frameIndex];
+	byte *dest = (byte*)destSurface->pixels;
+	const int destPitch = destSurface->pitch;
 	_currSpriteData = _spriteData + frameInfo.spriteDataOffs;
 	_width = frameInfo.drawOffset.width;
 	_height = frameInfo.drawOffset.height;
@@ -305,10 +297,12 @@ NDrawRect& MouseCursorResource::getRect() {
 	return _rect;
 }
 
-void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) {
+void MouseCursorResource::draw(int frameNum, Graphics::Surface *destSurface) {
 	if (_cursorSprite.getPixels()) {
-		int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment
+		const int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment
+		const int destPitch = destSurface->pitch;				
 		const byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32;
+		byte *dest = (byte*)destSurface->pixels;
 		for (int16 yc = 0; yc < 32; yc++) {
 			memcpy(dest, source, 32);
 			source += sourcePitch;
diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h
index c6f63bf..e2609b6 100644
--- a/engines/neverhood/resource.h
+++ b/engines/neverhood/resource.h
@@ -46,9 +46,8 @@ class SpriteResource {
 public:
 	SpriteResource(NeverhoodEngine *vm);
 	~SpriteResource();
-	void draw(byte *dest, int destPitch, bool flipX, bool flipY);
-	bool load(uint32 fileHash);
-	bool load2(uint32 fileHash);
+	void draw(Graphics::Surface *destSurface, bool flipX, bool flipY);
+	bool load(uint32 fileHash, bool doLoadPosition = false);
 	void unload();
 	const NDimensions& getDimensions() { return _dimensions; }
 	NPoint& getPosition() { return _position; }
@@ -90,7 +89,7 @@ class AnimResource {
 public:
 	AnimResource(NeverhoodEngine *vm);
 	~AnimResource();
-	void draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY);
+	void draw(uint frameIndex, Graphics::Surface *destSurface, bool flipX, bool flipY);
 	bool load(uint32 fileHash);
 	void unload();
 	void clear();
@@ -120,7 +119,7 @@ public:
 	void load(uint32 fileHash);
 	void unload();
 	NDrawRect& getRect();
-	void draw(int frameNum, byte *dest, int destPitch);
+	void draw(int frameNum, Graphics::Surface *destSurface);
 	int getCursorNum() const { return _cursorNum; }
 	void setCursorNum(int cursorNum) { _cursorNum = cursorNum; }
 protected:
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 2419122..45d131f 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -116,7 +116,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
 StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y)
 	: Sprite(vm, 0), _spriteResource(vm) {
 
-	_spriteResource.load2(fileHash);
+	_spriteResource.load(fileHash, true);
 	createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
 	_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
@@ -126,7 +126,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePrio
 }
 
 void StaticSprite::loadSprite(uint32 fileHash, uint flags, int surfacePriority, int16 x, int16 y) {
-	_spriteResource.load2(fileHash);
+	_spriteResource.load(fileHash, true);
 	if (!_surface)
 		createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	if (flags & kSLFDefDrawOffset)


Commit: df43b8bd6889ebf39c1642b9648b10d64cc5fcdd
    https://github.com/scummvm/scummvm/commit/df43b8bd6889ebf39c1642b9648b10d64cc5fcdd
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Move Scene2804::initCrystalColors() to GameModule::initCrystalColorsPuzzle()

- Add Scene::isMessageList2, only used in Scene2101

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/module2100.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index c931057..6ba3e98 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -284,6 +284,46 @@ void GameModule::initCubeSymbolsPuzzle() {
 	}
 }
 
+void GameModule::initCrystalColorsPuzzle() {
+	// TODO Maybe move this into the GameModule so all puzzle init code is together
+	if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) {
+		TextResource textResource(_vm);
+		const char *textStart, *textEnd;
+		textResource.load(0x46691611);
+		textStart = textResource.getString(0, textEnd);
+		for (uint index = 0; index < 5; index++) {
+			char colorLetter = (byte)textStart[index];
+			byte correctColorNum = 0, misalignedColorNum;
+			switch (colorLetter) {
+			case 'B':
+				correctColorNum = 4;
+				break;
+			case 'G':
+				correctColorNum = 3;
+				break;
+			case 'O':
+				correctColorNum = 1;
+				break;
+			case 'R':
+				correctColorNum = 0;
+				break;
+			case 'V':
+				correctColorNum = 5;
+				break;
+			case 'Y':
+				correctColorNum = 2;
+				break;
+			}
+			do {
+				misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1);
+			} while (misalignedColorNum == correctColorNum);
+			setSubVar(VA_GOOD_CRYSTAL_COLORS, index, correctColorNum);
+			setSubVar(VA_CURR_CRYSTAL_COLORS, index, misalignedColorNum);
+		}
+		setGlobalVar(V_CRYSTAL_COLORS_INIT, 1);
+	}
+}
+
 uint32 GameModule::getCurrRadioMusicFileHash() {
 	uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX);
 	return (musicIndex % 5 != 0) ? 0 : kRadioMusicFileHashes[CLIP<uint>(musicIndex / 5, 0, 17)];
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 93373a1..ee6b000 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -51,6 +51,7 @@ public:
 	void initCannonSymbolsPuzzle();
 	void initCodeSymbolsPuzzle();
 	void initCubeSymbolsPuzzle();
+	void initCrystalColorsPuzzle();
 	uint32 getCurrRadioMusicFileHash();
 protected:
 	Entity *_prevChildObject;
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 423f93c..5b5f5af 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -285,7 +285,7 @@ void Scene2101::update() {
 				}
 			}
 		}
-	} else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/)
+	} else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 && !isMessageList2(0x004B8F48))
 		setMessageList2(0x004B8F50);
 	Scene::update();
 }
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 7c7c097..214e65e 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -1734,7 +1734,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _countdown1(0), _countdown2(0), _countdown3(0),
 	_beamStatus(0), _isSolved(false), _isWorking(false) {
 
-	initCrystalColors();
+	_vm->gameModule()->initCrystalColorsPuzzle();
 
 	SetMessageHandler(&Scene2804::handleMessage);
 	SetUpdateHandler(&Scene2804::update);
@@ -1841,46 +1841,6 @@ void Scene2804::update() {
 
 }
 
-void Scene2804::initCrystalColors() {
-	// TODO Maybe move this into the GameModule so all puzzle init code is together
-	if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) {
-		TextResource textResource(_vm);
-		const char *textStart, *textEnd;
-		textResource.load(0x46691611);
-		textStart = textResource.getString(0, textEnd);
-		for (uint index = 0; index < 5; index++) {
-			char colorLetter = (byte)textStart[index];
-			byte correctColorNum = 0, misalignedColorNum;
-			switch (colorLetter) {
-			case 'B':
-				correctColorNum = 4;
-				break;
-			case 'G':
-				correctColorNum = 3;
-				break;
-			case 'O':
-				correctColorNum = 1;
-				break;
-			case 'R':
-				correctColorNum = 0;
-				break;
-			case 'V':
-				correctColorNum = 5;
-				break;
-			case 'Y':
-				correctColorNum = 2;
-				break;
-			}
-			do {
-				misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1);
-			} while (misalignedColorNum == correctColorNum);
-			setSubVar(VA_GOOD_CRYSTAL_COLORS, index, correctColorNum);
-			setSubVar(VA_CURR_CRYSTAL_COLORS, index, misalignedColorNum);
-		}
-		setGlobalVar(V_CRYSTAL_COLORS_INIT, 1);
-	}
-}
-
 Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule) {
 	
diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h
index 1dd7bca..a341c23 100644
--- a/engines/neverhood/module2800.h
+++ b/engines/neverhood/module2800.h
@@ -273,7 +273,6 @@ protected:
 	Sprite *_ssCrystalButtons[5];
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void initCrystalColors();
 };
 
 class Scene2805 : public Scene {
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index c22683a..1f2f479 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -381,6 +381,10 @@ bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool
 	return false;
 }
 
+bool Scene::isMessageList2(uint32 id) {
+	return _messageList2 == _vm->_staticData->getMessageList(id);
+}
+
 void Scene::processMessageList() {
 	debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymanBusy = %d", _isMessageListBusy, _isKlaymanBusy);
 
diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h
index f03275f..39455c7 100644
--- a/engines/neverhood/scene.h
+++ b/engines/neverhood/scene.h
@@ -204,6 +204,7 @@ protected:
 	void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false);
 	bool setMessageList2(uint32 id, bool canAcceptInput = true, bool doConvertMessages = false);
 	bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false);
+	bool isMessageList2(uint32 id);
 	void processMessageList();
 	void setRectList(uint32 id);
 	void setRectList(RectList *rectList);


Commit: e43184f4f248b38a19d67f1b1b427e19fcd56de5
    https://github.com/scummvm/scummvm/commit/e43184f4f248b38a19d67f1b1b427e19fcd56de5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Remove obsolete TODOs

Changed paths:
    engines/neverhood/module2200.cpp
    engines/neverhood/module2500.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/sound.cpp



diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 9f5f7fb..ebe0f81 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -2170,9 +2170,6 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_background->getSurface()->getSysRect().y = _backgroundScrollY;
 
-	// TODO Screen.yOffset = _backgroundScrollY;
-	// TODO Scene2208_sub409080 (creates background Sprites via the text, doesn't seem to be used?)
-
 }
 
 Scene2208::~Scene2208() {
@@ -2219,7 +2216,6 @@ void Scene2208::update() {
 		_background->getSurface()->getSysRect().y = _backgroundScrollY;
 	}
 
-	// TODO Screen.yOffset = _backgroundScrollY;
 	Scene::update();
 
 }
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 4aefbfb..ba5b140 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -25,8 +25,6 @@
 
 namespace Neverhood {
 
-// TODO Maybe move these to the DAT
-
 static const uint32 kScene2505StaticSprites[] = {
 	0x4000A226, 0
 };
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 214e65e..dd02d59 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -1667,7 +1667,6 @@ uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &pa
 	
 void AsScene2804BeamCoil::show() {
 	_ssBeamCoilBody->setVisible(true);
-	// TODO _ssBeamCoilBody->updatePosition(); -> show()
 	setVisible(true);
 	startAnimation(0x00494891, 0, -1);
 	playSound(0);
@@ -1680,7 +1679,6 @@ void AsScene2804BeamCoil::hide() {
 	SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
 	setVisible(false);
 	_ssBeamCoilBody->setVisible(false);
-	// TODO _ssBeamCoilBody->updatePosition(); -> hide()
 	_vm->_soundMan->stopSound(0xEF56B094);
 }
 
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 3350b80..869bebb 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -100,11 +100,8 @@ void PaletteResource::unload() {
 }
 
 void PaletteResource::copyPalette(byte *destPalette) {
-	if (_palette) {
+	if (_palette)
 		memcpy(destPalette, _palette, 1024);
-	} else {
-		// TODO?: buildDefaultPalette(palette);
-	}
 }
 
 // AnimResource
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 13ac87f..d055107 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -276,7 +276,6 @@ void SoundMan::setSoundVolume(uint32 soundFileHash, int volume) {
 }
 
 void SoundMan::update() {
-	// TODO Check if active
 	
 	for (uint i = 0; i < _soundItems.size(); ++i) {
 		SoundItem *soundItem = _soundItems[i];
@@ -548,7 +547,6 @@ void AudioResourceMan::loadSound(int16 soundIndex) {
 	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
 	if (!soundItem->_data && soundItem->_resourceHandle.isValid() &&
 		(soundItem->_resourceHandle.type() == kResTypeSound || soundItem->_resourceHandle.type() == kResTypeMusic)) {
-		// TODO Check if it's a sound resource
 		_vm->_res->loadResource(soundItem->_resourceHandle);
 		soundItem->_data = soundItem->_resourceHandle.data();
 	}


Commit: 9ea07e0925d679e8f3e33aa34c0403c3f58d5f1c
    https://github.com/scummvm/scummvm/commit/9ea07e0925d679e8f3e33aa34c0403c3f58d5f1c
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Add tables for Scene2706

Changed paths:
    devtools/create_neverhood/tables.h
    dists/engine-data/neverhood.dat



diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h
index 1218526..ea39aa8 100644
--- a/devtools/create_neverhood/tables.h
+++ b/devtools/create_neverhood/tables.h
@@ -710,5 +710,9 @@ static const uint32 sceneInfo2700Offsets[] = {
 	0x004B02A0,
 	// Scene2508
 	0x004B02C8,
+	// Scene2706
+	0x004B22A0,
+	0x004B22C4,
+	0x004B22E8,
 	0
 };
diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat
index e384ee1..dc95c00 100644
Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ


Commit: 18ce1acc12fe0bd58b6b93b8accb840cd7244356
    https://github.com/scummvm/scummvm/commit/18ce1acc12fe0bd58b6b93b8accb840cd7244356
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Rework the car track scenes in Module2500 and Module2700

- Move findClosestTrack code from several scenes to new Tracks::findTrackPoint
- Remove const kScene2706 arrays and use it from the dat instead

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2700.h
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 6ba3e98..d037cf5 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -399,10 +399,10 @@ void GameModule::startup() {
 	setGlobalVar(V_SHRINK_LIGHTS_ON, 0);
 	// <<<DEBUG
 
-#if 0
+#if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 14;
-	createModule(2700, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(2500, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 5;
@@ -417,7 +417,7 @@ void GameModule::startup() {
 	_vm->gameState().sceneNum = 5;
 	createModule(2200, -1);
 #endif
-#if 1
+#if 0
 	_vm->gameState().sceneNum = 7;
 	createModule(2200, -1);
 #endif
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index a2f06e1..54f715a 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -988,6 +988,24 @@ void AsCommonCarConnector::update() {
 	AnimatedSprite::update();
 }
 
+void Tracks::findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance,
+	DataResource &dataResource) {
+	const uint trackCount = size();
+	minMatchTrackIndex = -1;
+	minMatchDistance = 640;
+	for (uint trackIndex = 0; trackIndex < trackCount; trackIndex++) {
+		NPointArray *pointList = dataResource.getPointArray((*this)[trackIndex]->trackPointsName);
+		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
+			NPoint testPt = (*pointList)[pointIndex];
+			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
+			if (distance < minMatchDistance) {
+				minMatchTrackIndex = trackIndex;
+				minMatchDistance = distance;
+			}
+		}
+	}
+}
+
 Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _asCar(NULL), _countdown1(0) {
 
@@ -1082,7 +1100,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	// NOTE: Not in the else because 'which' is set to 1 in the true branch	
 	if (which == 1) {
-		// Klaymen entering riding the car
+		// Klaymen riding the car
 		_vm->gameState().which = 1;
 		_dataResource.load(0x003C0492);
 		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index 0c567e6..eaf8986 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -121,6 +121,12 @@ protected:
 	void update();
 };
 
+class Tracks : public Common::Array<SceneInfo2700*> {
+public:
+	void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance,
+		DataResource &dataResource);
+};
+
 class Scene1608 : public Scene {
 public:
 	Scene1608(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index ba5b140..851ee61 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -220,9 +220,9 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule) {
 	
-	_sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628);
-	_sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C);
-	_sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670);
+	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2628));
+	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B264C));
+	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2670));
 
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	SetUpdateHandler(&Scene2501::update);
@@ -283,14 +283,13 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	_asCarConnectorShadow = insertSprite<AsCommonCarConnectorShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
 	insertSprite<AsCommonCarConnector>(_asCar);
 	
-	_pointListsCount = 3;
 	_newTrackIndex = -1;
 	_dataResource.load(calcHash("Ashooded"));
 
-	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
+	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 
-	if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) {
+	if (which >= 0 && _tracks[_currTrackIndex]->which2 == which) {
 		NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1];
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480)
@@ -331,7 +330,7 @@ void Scene2501::update() {
 		_klayman = NULL;
 		_carStatus = 0;
 	}
-	updateKlaymanCliprect();
+	updateKlaymanClipRect();
 }
 
 void Scene2501::upCarAtHome() {
@@ -341,13 +340,13 @@ void Scene2501::upCarAtHome() {
 			sendMessage(_asCar, 0x200A, 0);
 			SetUpdateHandler(&Scene2501::upGettingOutOfCar);
 		} else {
-			findClosestTrack(_mouseClickPos);
+			moveCarToPoint(_mouseClickPos);
 			SetMessageHandler(&Scene2501::hmRidingCar);
 			SetUpdateHandler(&Scene2501::upRidingCar);
 		}
 		_mouseClicked = false;
 	}
-	updateKlaymanCliprect();
+	updateKlaymanClipRect();
 }
 
 void Scene2501::upGettingOutOfCar() {
@@ -368,13 +367,13 @@ void Scene2501::upGettingOutOfCar() {
 		_klayman->handleUpdate();
 		_carStatus = 0;
 	}
-	updateKlaymanCliprect();
+	updateKlaymanClipRect();
 }
 
 void Scene2501::upRidingCar() {
 	Scene::update();
 	if (_mouseClicked) {
-		findClosestTrack(_mouseClickPos);
+		moveCarToPoint(_mouseClickPos);
 		_mouseClicked = false;
 	}
 }
@@ -397,24 +396,24 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam &param, Entity
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x2005:
-		if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0)
+		if (_tracks[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0)
 			changeTrack();
-		else if (_sceneInfos[_currTrackIndex]->which1 == 0) {
+		else if (_tracks[_currTrackIndex]->which1 == 0) {
 			SetMessageHandler(&Scene2501::hmCarAtHome);
 			SetUpdateHandler(&Scene2501::upCarAtHome);
 			sendMessage(_asCar, 0x200F, 1);
-		} else if (_sceneInfos[_currTrackIndex]->which1 > 0)
-			leaveScene(_sceneInfos[_currTrackIndex]->which1);
+		} else if (_tracks[_currTrackIndex]->which1 > 0)
+			leaveScene(_tracks[_currTrackIndex]->which1);
 		break;
 	case 0x2006:
-		if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0)
+		if (_tracks[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0)
 			changeTrack();
-		else if (_sceneInfos[_currTrackIndex]->which2 == 0) {
+		else if (_tracks[_currTrackIndex]->which2 == 0) {
 			SetMessageHandler(&Scene2501::hmCarAtHome);
 			SetUpdateHandler(&Scene2501::upCarAtHome);
 			sendMessage(_asCar, 0x200F, 1);
-		} else if (_sceneInfos[_currTrackIndex]->which2 > 0)
-			leaveScene(_sceneInfos[_currTrackIndex]->which2);
+		} else if (_tracks[_currTrackIndex]->which2 > 0)
+			leaveScene(_tracks[_currTrackIndex]->which2);
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -436,34 +435,9 @@ uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 	
-void Scene2501::changeTrack() {
-	_currTrackIndex = _newTrackIndex;
-	_trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName);
-	_asCar->setPathPoints(_trackPoints);
-	if (_currTrackIndex == 0)
-		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
-	else
-		sendMessage(_asCar, 0x2002, 0);
-	sendPointMessage(_asCar, 0x2004, _clickPoint);
-	_newTrackIndex = -1;
-}
-
-void Scene2501::findClosestTrack(NPoint &pt) {
-	// TODO NOTE This is uses with minor variations in other scenes, maybe merge them? 
-	int minMatchDistance = 640;
-	int minMatchTrackIndex = -1;
-	// Find the track which contains a point closest to pt
-	for (int infoIndex = 0; infoIndex < _pointListsCount; infoIndex++) {
-		NPointArray *pointList = _dataResource.getPointArray(_sceneInfos[infoIndex]->pointListName);
-		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
-			NPoint testPt = (*pointList)[pointIndex];
-			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
-			if (distance < minMatchDistance) {
-				minMatchTrackIndex = infoIndex;
-				minMatchDistance = distance;
-			}
-		}
-	}
+void Scene2501::moveCarToPoint(NPoint &pt) {
+	int minMatchTrackIndex, minMatchDistance;
+	_tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource);
 	if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
 		_newTrackIndex = minMatchTrackIndex;
 		_clickPoint = pt;
@@ -477,7 +451,19 @@ void Scene2501::findClosestTrack(NPoint &pt) {
 	}
 }
 
-void Scene2501::updateKlaymanCliprect() {
+void Scene2501::changeTrack() {
+	_currTrackIndex = _newTrackIndex;
+	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
+	_asCar->setPathPoints(_trackPoints);
+	if (_currTrackIndex == 0)
+		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
+	else
+		sendMessage(_asCar, 0x2002, 0);
+	sendPointMessage(_asCar, 0x2004, _clickPoint);
+	_newTrackIndex = -1;
+}
+
+void Scene2501::updateKlaymanClipRect() {
 	if (_kmScene2501->getX() <= 211)
 		_kmScene2501->setClipRect(0, 0, 640, 480);
 	else
diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h
index 38a1a43..9a7e944 100644
--- a/engines/neverhood/module2500.h
+++ b/engines/neverhood/module2500.h
@@ -60,11 +60,10 @@ protected:
 	Sprite *_asIdleCarLower;
 	Sprite *_asIdleCarFull;
 	Klayman *_kmScene2501;
+	Tracks _tracks;
 	NPointArray *_trackPoints;
-	SceneInfo2700 *_sceneInfos[3];
 	int _currTrackIndex;
 	NPoint _clickPoint;
-	int _pointListsCount;
 	int _newTrackIndex;
 	int _carStatus;
 	bool _klaymanInCar;
@@ -75,9 +74,9 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmRidingCar(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender);
-	void findClosestTrack(NPoint &pt);
+	void moveCarToPoint(NPoint &pt);
 	void changeTrack();
-	void updateKlaymanCliprect();
+	void updateKlaymanClipRect();
 };
 
 class SsScene2504Button : public StaticSprite {
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index d4f46ea..07273f9 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -528,12 +528,12 @@ uint32 Module2700::handleMessage(int messageNum, const MessageParam &param, Enti
 	return messageResult;
 }
 			
-void Module2700::createScene2703(int which, uint32 sceneInfoId) {
-	_childObject = new Scene2703(_vm, this, which, sceneInfoId);
+void Module2700::createScene2703(int which, uint32 trackInfoId) {
+	_childObject = new Scene2703(_vm, this, which, trackInfoId);
 }
 
-void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
-	_childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect);
+void Module2700::createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) {
+	_childObject = new Scene2704(_vm, this, which, trackInfoId, value, staticSprites, clipRect);
 }
 
 static const NPoint kCarShadowOffsets[] = {
@@ -619,11 +619,11 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	Sprite *tempSprite;
 	
 	NRect clipRect;
-	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240);
+	SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(0x004B2240);
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	
-	setBackground(sceneInfo->bgFilename);
-	setPalette(sceneInfo->bgFilename);
+	setBackground(tracks->bgFilename);
+	setPalette(tracks->bgFilename);
 	_palette->addPalette(calcHash("paPodFloor"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0);
 	insertScreenMouse(0x08B08180);
@@ -631,8 +631,8 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempSprite = insertStaticSprite(0x1E086325, 1200);
 	clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2());
 
-	if (sceneInfo->bgShadowFilename) {
-		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
+	if (tracks->bgShadowFilename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(tracks->bgShadowFilename);
 		addEntity(_ssTrackShadowBackground);
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -644,10 +644,10 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-	_which1 = sceneInfo->which1;
-	_which2 = sceneInfo->which2;
-	_dataResource.load(sceneInfo->dataResourceFilename);
-	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
+	_which1 = tracks->which1;
+	_which2 = tracks->which2;
+	_dataResource.load(tracks->dataResourceFilename);
+	_trackPoints = _dataResource.getPointArray(tracks->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 
 	if (which == _which2) {
@@ -713,18 +713,8 @@ uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam &param, Entity
 	return 0;
 }
 
-static const uint32 kScene2702Infos[2][3] = {
-	{0x004B5F68, 0x004B5F8C, 0x004B5FB0},
-	{0x004B5FD8, 0x004B5FFC, 0x004B6020}
-};
-
-
 Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1), _count(3) {
-	
-	for (int i = 0; i < 2; i++)
-		for (int j = 0; j < 3; j++)
-			_sceneInfos[i][j] = _vm->_staticData->getSceneInfo2700(kScene2702Infos[i][j]);
+	: Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1) {
 	
 	SetMessageHandler(&Scene2702::handleMessage);
 	SetUpdateHandler(&Scene2702::update);
@@ -746,38 +736,48 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	_dataResource.load(0x04310014);
 	
 	if (which == 1) {
-		_currSceneInfos = _sceneInfos[1];
+		_isUpperTrack = false;
 		_currTrackIndex = 1;
 	} else if (which == 2) {
-		_currSceneInfos = _sceneInfos[1];
+		_isUpperTrack = false;
 		_currTrackIndex = 2;
 		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
 		_isInLight = false;
 	} else if (which == 3) {
-		_currSceneInfos = _sceneInfos[0];
+		_isUpperTrack = true;
 		_currTrackIndex = 0;
 	} else if (which == 4) {
-		_currSceneInfos = _sceneInfos[0];
+		_isUpperTrack = true;
 		_currTrackIndex = 2;
 		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
 		_isInLight = false;
 	} else if (which == 5) {
-		_currSceneInfos = _sceneInfos[0];
+		_isUpperTrack = true;
 		_currTrackIndex = 1;
 		_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 		_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
 		_isInLight = false;
 	} else {
-		_currSceneInfos = _sceneInfos[1];
+		_isUpperTrack = false;
 		_currTrackIndex = 0;
 	}
 
-	_trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName);
+	if (_isUpperTrack) {
+		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F68));	
+		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F8C));
+		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FB0));
+	} else {
+		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FD8));	
+		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FFC));
+		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B6020));
+	}
+
+	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 
-	if (which == _currSceneInfos[_currTrackIndex]->which2) {
+	if (which == _tracks[_currTrackIndex]->which2) {
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		sendMessage(_asCar, 0x2007, 150);
 	} else {
@@ -808,21 +808,21 @@ uint32 Scene2702::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		findClosestTrack(param.asPoint());
+		moveCarToPoint(param.asPoint());
 		break;
 	case 0x2005:
 		if (_newTrackIndex >= 0) {
-			if (_currSceneInfos[_currTrackIndex]->which1 < 0)
+			if (_tracks[_currTrackIndex]->which1 < 0)
 				changeTrack();
-		} else if (_currSceneInfos[_currTrackIndex]->which1 >= 0)
-			leaveScene(_currSceneInfos[_currTrackIndex]->which1);
+		} else if (_tracks[_currTrackIndex]->which1 >= 0)
+			leaveScene(_tracks[_currTrackIndex]->which1);
 		break;
 	case 0x2006:
 		if (_newTrackIndex >= 0) {
-			if (_currSceneInfos[_currTrackIndex]->which2 < 0)
+			if (_tracks[_currTrackIndex]->which2 < 0)
 				changeTrack();
-		} else if (_currSceneInfos[_currTrackIndex]->which2 >= 0)
-			leaveScene(_currSceneInfos[_currTrackIndex]->which2);
+		} else if (_tracks[_currTrackIndex]->which2 >= 0)
+			leaveScene(_tracks[_currTrackIndex]->which2);
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -831,25 +831,13 @@ uint32 Scene2702::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-void Scene2702::findClosestTrack(NPoint pt) {
-	int minMatchTrackIndex = -1;
-	int minMatchDistance = 640;
-	// Find the track which contains a point closest to pt
-	for (int infoIndex = 0; infoIndex < _count; infoIndex++) {
-		NPointArray *pointList = _dataResource.getPointArray(_currSceneInfos[infoIndex]->pointListName);
-		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
-			NPoint testPt = (*pointList)[pointIndex];
-			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
-			if (distance < minMatchDistance) {
-				minMatchTrackIndex = infoIndex;
-				minMatchDistance = distance;
-			}
-		}
-	}
+void Scene2702::moveCarToPoint(NPoint pt) {
+	int minMatchTrackIndex, minMatchDistance;
+	_tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource);
 	if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
 		_newTrackIndex = minMatchTrackIndex;
 		_newTrackDestX = pt.x;
-		if (_currSceneInfos == _sceneInfos[0]) {
+		if (_isUpperTrack) {
 			if (_currTrackIndex == 0)
 				sendMessage(_asCar, 0x2003, _trackPoints->size() - 1);
 			else
@@ -866,9 +854,9 @@ void Scene2702::findClosestTrack(NPoint pt) {
 
 void Scene2702::changeTrack() {
 	_currTrackIndex = _newTrackIndex;
-	_trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName);
+	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
-	if (_currSceneInfos == _sceneInfos[0]) {
+	if (_isUpperTrack) {
 		if (_currTrackIndex == 0)
 			sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		else
@@ -881,25 +869,25 @@ void Scene2702::changeTrack() {
 	_newTrackIndex = -1;
 }
 
-Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId)
+Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId)
 	: Scene(vm, parentModule) {
 
-	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
+	SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId);
 	
 	SetMessageHandler(&Scene2703::handleMessage);
 	SetUpdateHandler(&Scene2703::update);
 	
-	setBackground(sceneInfo->bgFilename);
-	setPalette(sceneInfo->bgFilename);
+	setBackground(tracks->bgFilename);
+	setPalette(tracks->bgFilename);
 	_palette->addPalette(calcHash("paPodShade"), 65, 31, 65);
 	_palette->addPalette(calcHash("paKlayShade"), 0, 65, 0);
 	addEntity(_palette);
-	insertScreenMouse(sceneInfo->mouseCursorFilename);
+	insertScreenMouse(tracks->mouseCursorFilename);
 	
 	_palStatus = 2;
 	
-	if (sceneInfo->bgShadowFilename) {
-		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
+	if (tracks->bgShadowFilename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(tracks->bgShadowFilename);
 		addEntity(_ssTrackShadowBackground);
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -912,10 +900,10 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	}
 
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-	_which1 = sceneInfo->which1;
-	_which2 = sceneInfo->which2;
-	_dataResource.load(sceneInfo->dataResourceFilename);
-	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
+	_which1 = tracks->which1;
+	_which2 = tracks->which2;
+	_dataResource.load(tracks->dataResourceFilename);
+	_trackPoints = _dataResource.getPointArray(tracks->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 	
 	if (which == _which2) {
@@ -994,31 +982,31 @@ uint32 Scene2703::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 		
-Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
+Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value,
 	const uint32 *staticSprites, const NRect *clipRect)
 	: Scene(vm, parentModule) {
 
-	SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId);
+	SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId);
 	
 	SetMessageHandler(&Scene2704::handleMessage);
 	SetUpdateHandler(&Scene2704::update);
 	
-	setBackground(sceneInfo->bgFilename);
-	setPalette(sceneInfo->bgFilename);
+	setBackground(tracks->bgFilename);
+	setPalette(tracks->bgFilename);
 
-	if (sceneInfo->exPaletteFilename1)
-		_palette->addPalette(sceneInfo->exPaletteFilename1, 0, 65, 0);
+	if (tracks->exPaletteFilename1)
+		_palette->addPalette(tracks->exPaletteFilename1, 0, 65, 0);
 
-	if (sceneInfo->exPaletteFilename2)
-		_palette->addPalette(sceneInfo->exPaletteFilename2, 65, 31, 65);
+	if (tracks->exPaletteFilename2)
+		_palette->addPalette(tracks->exPaletteFilename2, 65, 31, 65);
 	
 	while (staticSprites && *staticSprites)
 		insertStaticSprite(*staticSprites++, 1100);
 
-	insertScreenMouse(sceneInfo->mouseCursorFilename);
+	insertScreenMouse(tracks->mouseCursorFilename);
 	
-	if (sceneInfo->bgShadowFilename) {
-		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(sceneInfo->bgShadowFilename);
+	if (tracks->bgShadowFilename) {
+		_ssTrackShadowBackground = createSprite<SsCommonTrackShadowBackground>(tracks->bgShadowFilename);
 		addEntity(_ssTrackShadowBackground);
 		_asCar = insertSprite<AsCommonCar>(this, 320, 240);
 		_asCarShadow = insertSprite<AsCommonCarShadow>(_asCar, _ssTrackShadowBackground->getSurface(), 4);
@@ -1031,10 +1019,10 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	}
 
 	_asCarConnector = insertSprite<AsCommonCarConnector>(_asCar);
-	_which1 = sceneInfo->which1;
-	_which2 = sceneInfo->which2;
-	_dataResource.load(sceneInfo->dataResourceFilename);
-	_trackPoints = _dataResource.getPointArray(sceneInfo->pointListName);
+	_which1 = tracks->which1;
+	_which2 = tracks->which2;
+	_dataResource.load(tracks->dataResourceFilename);
+	_trackPoints = _dataResource.getPointArray(tracks->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 	
 	if (which == _which2) {
@@ -1093,17 +1081,14 @@ uint32 Scene2704::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-static const int kSceneInfo2706Count = 3;
-static const struct { const char *pointListName; int which1, which2; } kSceneInfo2706[] = {
-	{"me06slotSlotPath2", 4, -1},
-	{"me06slotSlotPath3", -1, 6},
-	{"me06slotSlotPath4", -1, 5}
-};
-
 Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule), _newTrackIndex(-1) {
 	
 	SetMessageHandler(&Scene2706::handleMessage);
+
+	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22A0));	
+	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22C4));
+	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22E8));
 	
 	setBackground(0x18808B88);
 	setPalette(0x18808B88);
@@ -1131,10 +1116,10 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	else
 		_currTrackIndex = 0;
 
-	_trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName));
+	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 
-	if (which == kSceneInfo2706[_currTrackIndex].which2) {
+	if (which == _tracks[_currTrackIndex]->which2) {
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
 		if (which == 5)
 			sendMessage(_asCar, 0x2007, 50);
@@ -1154,21 +1139,21 @@ uint32 Scene2706::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		findClosestTrack(param.asPoint());
+		moveCarToPoint(param.asPoint());
 		break;
 	case 0x2005:
 		if (_newTrackIndex >= 0) {
-			if (kSceneInfo2706[_currTrackIndex].which1 < 0)
+			if (_tracks[_currTrackIndex]->which1 < 0)
 				changeTrack();
-		} else if (kSceneInfo2706[_currTrackIndex].which1 >= 0)
-			leaveScene(kSceneInfo2706[_currTrackIndex].which1);
+		} else if (_tracks[_currTrackIndex]->which1 >= 0)
+			leaveScene(_tracks[_currTrackIndex]->which1);
 		break;
 	case 0x2006:
 		if (_newTrackIndex >= 0) {
-			if (kSceneInfo2706[_currTrackIndex].which2 < 0)
+			if (_tracks[_currTrackIndex]->which2 < 0)
 				changeTrack();
-		} else if (kSceneInfo2706[_currTrackIndex].which2 >= 0)
-			leaveScene(kSceneInfo2706[_currTrackIndex].which2);
+		} else if (_tracks[_currTrackIndex]->which2 >= 0)
+			leaveScene(_tracks[_currTrackIndex]->which2);
 		break;
 	case 0x200D:
 		sendMessage(_parentModule, 0x200D, 0);
@@ -1177,21 +1162,9 @@ uint32 Scene2706::handleMessage(int messageNum, const MessageParam &param, Entit
 	return 0;
 }
 
-void Scene2706::findClosestTrack(NPoint pt) {
-	int minMatchTrackIndex = -1;
-	int minMatchDistance = 640;
-	// Find the track which contains a point closest to pt
-	for (int infoIndex = 0; infoIndex < kSceneInfo2706Count; infoIndex++) {
-		NPointArray *pointList = _dataResource.getPointArray(calcHash(kSceneInfo2706[infoIndex].pointListName));
-		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
-			NPoint testPt = (*pointList)[pointIndex];
-			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
-			if (distance < minMatchDistance) {
-				minMatchTrackIndex = infoIndex;
-				minMatchDistance = distance;
-			}
-		}
-	}
+void Scene2706::moveCarToPoint(NPoint pt) {
+	int minMatchTrackIndex, minMatchDistance;
+	_tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource);
 	if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) {
 		_newTrackIndex = minMatchTrackIndex;
 		_newTrackDestX = pt.x;
@@ -1207,7 +1180,7 @@ void Scene2706::findClosestTrack(NPoint pt) {
 
 void Scene2706::changeTrack() {
 	_currTrackIndex = _newTrackIndex;
-	_trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName));
+	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
 	_asCar->setPathPoints(_trackPoints);
 	if (_currTrackIndex == 0)
 		sendMessage(_asCar, 0x2002, _trackPoints->size() - 1);
diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h
index 68c471c..5861c2e 100644
--- a/engines/neverhood/module2700.h
+++ b/engines/neverhood/module2700.h
@@ -45,8 +45,8 @@ protected:
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createScene2703(int which, uint32 sceneInfoId);
-	void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
+	void createScene2703(int which, uint32 trackInfoId);
+	void createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 };
 
 class SsCommonTrackShadowBackground : public StaticSprite {
@@ -108,21 +108,20 @@ protected:
 	Sprite *_asCarTrackShadow;
 	Sprite *_asCarConnectorShadow;
 	int16 _newTrackDestX;
-	int _currTrackIndex, _newTrackIndex;
-	int _count;
 	bool _isInLight;
-	SceneInfo2700 *_sceneInfos[2][3];
-	SceneInfo2700 **_currSceneInfos;
+	int _currTrackIndex, _newTrackIndex;
+	bool _isUpperTrack;
+	Tracks _tracks;
 	NPointArray *_trackPoints;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void findClosestTrack(NPoint pt);
+	void moveCarToPoint(NPoint pt);
 	void changeTrack();
 };
 
 class Scene2703 : public Scene {
 public:
-	Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId);
+	Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId);
 protected:
 	AsCommonCar *_asCar;
 	Sprite *_ssTrackShadowBackground;
@@ -139,7 +138,7 @@ protected:
 
 class Scene2704 : public Scene {
 public:
-	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value,
+	Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value,
 		const uint32 *staticSprites = NULL, const NRect *clipRect = NULL);
 protected:
 	AsCommonCar *_asCar;
@@ -166,9 +165,10 @@ protected:
 	Sprite *_asCarConnectorShadow;
 	int16 _newTrackDestX;
 	int _currTrackIndex, _newTrackIndex;
+	Tracks _tracks;
 	NPointArray *_trackPoints;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void findClosestTrack(NPoint pt);
+	void moveCarToPoint(NPoint pt);
 	void changeTrack();
 };
 
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 31f9f5e..cf272e5 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -149,7 +149,7 @@ void StaticData::load(const char *filename) {
 		sceneInfo2700->bgFilename = fd.readUint32LE();
 		sceneInfo2700->bgShadowFilename = fd.readUint32LE();
 		sceneInfo2700->dataResourceFilename = fd.readUint32LE();
-		sceneInfo2700->pointListName = fd.readUint32LE();
+		sceneInfo2700->trackPointsName = fd.readUint32LE();
 		sceneInfo2700->rectListName = fd.readUint32LE();
 		sceneInfo2700->exPaletteFilename2 = fd.readUint32LE();
 		sceneInfo2700->exPaletteFilename1 = fd.readUint32LE();
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index f9a8b71..874a8a5 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -82,7 +82,7 @@ struct SceneInfo2700 {
 	uint32 bgFilename;
 	uint32 bgShadowFilename;
 	uint32 dataResourceFilename;
-	uint32 pointListName;
+	uint32 trackPointsName;
 	uint32 rectListName;
 	uint32 exPaletteFilename2;
 	uint32 exPaletteFilename1;


Commit: 5bf8fb3e96506a758b59d67f68fa6c255e77456a
    https://github.com/scummvm/scummvm/commit/5bf8fb3e96506a758b59d67f68fa6c255e77456a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Remove more old TODOs

Changed paths:
    engines/neverhood/module2700.cpp
    engines/neverhood/neverhood.cpp
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index 07273f9..f1cb571 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -505,7 +505,7 @@ void Module2700::updateScene() {
 				_vm->gameModule()->initRadioPuzzle();
 				_musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME);
 				_vm->_soundMan->addMusic(0x42212411, _musicFileHash);
-				_vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */);
+				_vm->_soundMan->startMusic(_musicFileHash, 0, 2);
 				_vm->_soundMan->addSound(0x42212411, 0x44014282);
 				_vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0);
 				_raidoMusicInitialized = true;
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index c0c6185..fcaf756 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -93,7 +93,6 @@ Common::Error NeverhoodEngine::run() {
 	
 	_gameModule = new GameModule(this);
 	
-	// TODO Check if this can actually be false...
 	_isSaveAllowed = true;
 	
 	if (isDemo()) {
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 1f2f479..30b93bd 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -302,8 +302,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *s
 	case 0x101E:
 		// Show the mouse cursor
 		if (_mouseCursorWasVisible && _mouseCursor) {
-			_mouseCursor->getSurface()->setVisible(true);//CHECKME?!?
-			// TODO sendMessage(_mouseCursor, 0x4002, g_Screen->_mousePos);
+			_mouseCursor->getSurface()->setVisible(true);
 		}
 		break;
 	case 0x1022:


Commit: 51979c4f3f522c6d98290b93de7ecad141980b42
    https://github.com/scummvm/scummvm/commit/51979c4f3f522c6d98290b93de7ecad141980b42
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Rename SceneInfo2700 to TrackInfo

Changed paths:
    engines/neverhood/module1600.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2700.cpp
    engines/neverhood/staticdata.cpp
    engines/neverhood/staticdata.h



diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h
index eaf8986..6bffb2d 100644
--- a/engines/neverhood/module1600.h
+++ b/engines/neverhood/module1600.h
@@ -121,7 +121,7 @@ protected:
 	void update();
 };
 
-class Tracks : public Common::Array<SceneInfo2700*> {
+class Tracks : public Common::Array<TrackInfo*> {
 public:
 	void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance,
 		DataResource &dataResource);
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 851ee61..f5894e9 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -220,9 +220,9 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con
 Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which)
 	: Scene(vm, parentModule) {
 	
-	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2628));
-	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B264C));
-	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2670));
+	_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2628));
+	_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B264C));
+	_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2670));
 
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	SetUpdateHandler(&Scene2501::update);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index f1cb571..b5db911 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -619,7 +619,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which)
 	Sprite *tempSprite;
 	
 	NRect clipRect;
-	SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(0x004B2240);
+	TrackInfo *tracks = _vm->_staticData->getTrackInfo(0x004B2240);
 	setGlobalVar(V_CAR_DELTA_X, 1);
 	
 	setBackground(tracks->bgFilename);
@@ -765,13 +765,13 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 
 	if (_isUpperTrack) {
-		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F68));	
-		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F8C));
-		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FB0));
+		_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F68));	
+		_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F8C));
+		_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FB0));
 	} else {
-		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FD8));	
-		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FFC));
-		_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B6020));
+		_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FD8));	
+		_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FFC));
+		_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B6020));
 	}
 
 	_trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName);
@@ -872,7 +872,7 @@ void Scene2702::changeTrack() {
 Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId)
 	: Scene(vm, parentModule) {
 
-	SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId);
+	TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId);
 	
 	SetMessageHandler(&Scene2703::handleMessage);
 	SetUpdateHandler(&Scene2703::update);
@@ -986,7 +986,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3
 	const uint32 *staticSprites, const NRect *clipRect)
 	: Scene(vm, parentModule) {
 
-	SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId);
+	TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId);
 	
 	SetMessageHandler(&Scene2704::handleMessage);
 	SetUpdateHandler(&Scene2704::update);
@@ -1086,9 +1086,9 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	SetMessageHandler(&Scene2706::handleMessage);
 
-	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22A0));	
-	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22C4));
-	_tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22E8));
+	_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22A0));	
+	_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22C4));
+	_tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22E8));
 	
 	setBackground(0x18808B88);
 	setPalette(0x18808B88);
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index cf272e5..4593594 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -140,23 +140,23 @@ void StaticData::load(const char *filename) {
 		_hallOfRecordsInfoItems[id] = hallOfRecordsInfo;
 	}
 
-	// Load SceneInfo2700 items
-	uint32 sceneInfo2700ItemsCount = fd.readUint32LE();
-	debug("sceneInfo2700ItemsCount: %d", sceneInfo2700ItemsCount);
-	for (uint32 i = 0; i < sceneInfo2700ItemsCount; i++) {
-		SceneInfo2700 *sceneInfo2700 = new SceneInfo2700();
+	// Load TrackInfo items
+	uint32 trackInfoItemsCount = fd.readUint32LE();
+	debug("trackInfoItemsCount: %d", trackInfoItemsCount);
+	for (uint32 i = 0; i < trackInfoItemsCount; i++) {
+		TrackInfo *trackInfo = new TrackInfo();
 		uint32 id = fd.readUint32LE();
-		sceneInfo2700->bgFilename = fd.readUint32LE();
-		sceneInfo2700->bgShadowFilename = fd.readUint32LE();
-		sceneInfo2700->dataResourceFilename = fd.readUint32LE();
-		sceneInfo2700->trackPointsName = fd.readUint32LE();
-		sceneInfo2700->rectListName = fd.readUint32LE();
-		sceneInfo2700->exPaletteFilename2 = fd.readUint32LE();
-		sceneInfo2700->exPaletteFilename1 = fd.readUint32LE();
-		sceneInfo2700->mouseCursorFilename = fd.readUint32LE();
-		sceneInfo2700->which1 = fd.readUint16LE();
-		sceneInfo2700->which2 = fd.readUint16LE();
-		_sceneInfo2700Items[id] = sceneInfo2700;
+		trackInfo->bgFilename = fd.readUint32LE();
+		trackInfo->bgShadowFilename = fd.readUint32LE();
+		trackInfo->dataResourceFilename = fd.readUint32LE();
+		trackInfo->trackPointsName = fd.readUint32LE();
+		trackInfo->rectListName = fd.readUint32LE();
+		trackInfo->exPaletteFilename2 = fd.readUint32LE();
+		trackInfo->exPaletteFilename1 = fd.readUint32LE();
+		trackInfo->mouseCursorFilename = fd.readUint32LE();
+		trackInfo->which1 = fd.readUint16LE();
+		trackInfo->which2 = fd.readUint16LE();
+		_trackInfoItems[id] = trackInfo;
 	}
 
 }
@@ -191,10 +191,10 @@ HallOfRecordsInfo *StaticData::getHallOfRecordsInfoItem(uint32 id) {
 	return _hallOfRecordsInfoItems[id];
 }
 
-SceneInfo2700 *StaticData::getSceneInfo2700(uint32 id) {
-	if (!_sceneInfo2700Items[id])
-		error("StaticData::getSceneInfo2700() SceneInfo2700 with id %08X not found", id);
-	return _sceneInfo2700Items[id];
+TrackInfo *StaticData::getTrackInfo(uint32 id) {
+	if (!_trackInfoItems[id])
+		error("StaticData::getTrackInfo() TrackInfo with id %08X not found", id);
+	return _trackInfoItems[id];
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index 874a8a5..b1cab3b 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -77,7 +77,7 @@ struct HallOfRecordsInfo {
 	byte count;
 };
 
-struct SceneInfo2700 {
+struct TrackInfo {
 	uint32 id;
 	uint32 bgFilename;
 	uint32 bgShadowFilename;
@@ -101,14 +101,14 @@ public:
 	MessageList *getMessageList(uint32 id);
 	NavigationList *getNavigationList(uint32 id);
 	HallOfRecordsInfo *getHallOfRecordsInfoItem(uint32 id);
-	SceneInfo2700 *getSceneInfo2700(uint32 id);
+	TrackInfo *getTrackInfo(uint32 id);
 protected:
 	Common::HashMap<uint32, HitRectList*> _hitRectLists;
 	Common::HashMap<uint32, RectList*> _rectLists;
 	Common::HashMap<uint32, MessageList*> _messageLists;
 	Common::HashMap<uint32, NavigationList*> _navigationLists;
 	Common::HashMap<uint32, HallOfRecordsInfo*> _hallOfRecordsInfoItems;
-	Common::HashMap<uint32, SceneInfo2700*> _sceneInfo2700Items;
+	Common::HashMap<uint32, TrackInfo*> _trackInfoItems;
 };
 
 } // End of namespace Neverhood


Commit: eea9dbe2da9c6195431f234e89671fffd1e1ac29
    https://github.com/scummvm/scummvm/commit/eea9dbe2da9c6195431f234e89671fffd1e1ac29
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Minor renaming and cleanup

Changed paths:
    engines/neverhood/module.cpp
    engines/neverhood/module.h
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/smackerscene.cpp
    engines/neverhood/smackerscene.h



diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 36607d7..93b4134 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -67,7 +67,6 @@ uint32 Module::handleMessage(int messageNum, const MessageParam &param, Entity *
 }
 
 NavigationScene *Module::navigationScene() {
-	// Not so nice
 	return (NavigationScene*)_childObject;
 }
 
@@ -76,19 +75,17 @@ void Module::createNavigationScene(uint32 navigationListId, int navigationIndex,
 	_childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes);
 }
 
-void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort) {
-	SmackerScene *smackerScene;
+void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool canSkip, bool canAbort) {
 	_sceneType = kSceneTypeSmacker;
-	smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort);
+	SmackerScene *smackerScene = new SmackerScene(_vm, this, doubleSurface, canSkip, canAbort);
 	smackerScene->setFileHash(fileHash);
 	smackerScene->nextVideo();
 	_childObject = smackerScene;
 }
 
-void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort) {
-	SmackerScene *smackerScene;
+void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool canSkip, bool canAbort) {
 	_sceneType = kSceneTypeSmacker;
-	smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort);
+	SmackerScene *smackerScene = new SmackerScene(_vm, this, doubleSurface, canSkip, canAbort);
 	smackerScene->setFileHashList(fileHashList);
 	smackerScene->nextVideo();
 	_childObject = smackerScene;
diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h
index b91b9de..e98012c 100644
--- a/engines/neverhood/module.h
+++ b/engines/neverhood/module.h
@@ -58,8 +58,8 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	NavigationScene *navigationScene();
 	void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL);
-	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort);
-	void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort);
+	void createSmackerScene(uint32 fileHash, bool doubleSurface, bool canSkip, bool canAbort);
+	void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool canSkip, bool canAbort);
 	void createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash);
 	void createDemoScene();
 	bool updateChild();
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 12fe408..0329f58 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -1175,7 +1175,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	_ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100);
 	_ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100);
 
-	_class599 = insertStaticSprite(0x316C4BB4, 1015);
+	_ssCeiling = insertStaticSprite(0x316C4BB4, 1015);
 
 	if (which < 0) {
 		// Restoring game
@@ -1231,11 +1231,11 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
 	tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y,
 		_ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2());
 
-	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 258, 191, _class599->getDrawRect().y, false);
-	_asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _class599->getDrawRect().y, false);
-	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR));
-	_asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _class599->getDrawRect().y, false);
-	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _class599->getDrawRect().y, false);
+	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 258, 191, _ssCeiling->getDrawRect().y, false);
+	_asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _ssCeiling->getDrawRect().y, false);
+	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _ssCeiling->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR));
+	_asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _ssCeiling->getDrawRect().y, false);
+	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _ssCeiling->getDrawRect().y, false);
 
 	_asDoor = insertSprite<AsScene1002Door>(tempClipRect);
 	tempSprite = insertSprite<AsScene1002BoxingGloveHitEffect>();
@@ -1374,11 +1374,11 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entit
 		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
 		break;
 	case 0x8000:
-		setSpriteSurfacePriority(_class599, 995);
+		setSpriteSurfacePriority(_ssCeiling, 995);
 		setSpriteSurfacePriority(_ssLadderArch, 995);
 		break;
 	case 0x8001:
-		setSpriteSurfacePriority(_class599, 1015);
+		setSpriteSurfacePriority(_ssCeiling, 1015);
 		setSpriteSurfacePriority(_ssLadderArch, 1015);
 		break;
 	}	
@@ -1566,9 +1566,8 @@ uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entit
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
+		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
 			leaveScene(0);			
-		}
 		break;
 	}
 	return 0;
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 32228a2..2cc9a55 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -249,7 +249,7 @@ protected:
 	Sprite *_ssLadderArchPart1;
 	Sprite *_ssLadderArchPart2;
 	Sprite *_ssLadderArchPart3;
-	Sprite *_class599;
+	Sprite *_ssCeiling;
 	Sprite *_asKlaymanLadderHands;
 	Sprite *_asKlaymanPeekHand;
 	Sprite *_asOutsideDoorBackground;
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 290b8fa..20eebe2 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -24,16 +24,16 @@
 
 namespace Neverhood {
 
-SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort)
-	: Scene(vm, parentModule), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false),
+SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool canSkip, bool canAbort)
+	: Scene(vm, parentModule), _doubleSurface(doubleSurface), _canSkip(canSkip), _canAbort(canAbort), _videoPlayedBefore(false),
 	_fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) {
 
-	debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort);
+	debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort);
 
 	// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
 	
 	if (getGlobalVar(V_SMACKER_CAN_ABORT)) {
-		_flag1 = true;
+		_canSkip = true;
 		_canAbort = true;
 	}
 	
@@ -105,7 +105,7 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam &param, En
 	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0009:
-		if ((_videoPlayedBefore && _flag1) || (_canAbort && _flag1))
+		if ((_videoPlayedBefore && _canSkip) || (_canAbort && _canSkip))
 			_playNextVideoFlag = true;
 		break;
 	case 0x000C:
diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h
index 54de28a..7ed2e02 100644
--- a/engines/neverhood/smackerscene.h
+++ b/engines/neverhood/smackerscene.h
@@ -31,14 +31,14 @@ namespace Neverhood {
 
 class SmackerScene : public Scene {
 public:
-	SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort);
+	SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool canSkip, bool canAbort);
 	virtual ~SmackerScene();
 	void setFileHash(uint32 fileHash);
 	void setFileHashList(const uint32 *fileHashList);
 	void nextVideo();
 protected:
 	bool _doubleSurface;
-	bool _flag1;
+	bool _canSkip;
 	bool _canAbort;
 	bool _videoPlayedBefore;
 	bool _playNextVideoFlag;


Commit: e51bea9b4e4d2857b1225cdd7c0ebbe137b530ee
    https://github.com/scummvm/scummvm/commit/e51bea9b4e4d2857b1225cdd7c0ebbe137b530ee
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:40-07:00

Commit Message:
NEVERHOOD: Don't load a DataResource if the same data is already loaded; this fixes a nasty bug in several scenes which use message lists from a DataResource

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/scene.cpp
    engines/neverhood/staticdata.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index d037cf5..f22a0d1 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -400,9 +400,9 @@ void GameModule::startup() {
 	// <<<DEBUG
 
 #if 1
-	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 0;
-	createModule(2500, -1);
+	_vm->gameState().which = 1;
+	_vm->gameState().sceneNum = 1;
+	createModule(1000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 5;
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 869bebb..269d13d 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -353,7 +353,9 @@ DataResource::~DataResource() {
 }
 
 void DataResource::load(uint32 fileHash) {
-	debug(2, "DataResource::load(%08X)", fileHash);
+	if (_resourceHandle.fileHash() == fileHash)
+		return;
+	debug("DataResource::load(%08X)", fileHash);
 	const byte *data = NULL;
 	uint32 dataSize = 0;
 	unload();
@@ -497,7 +499,6 @@ void DataResource::load(uint32 fileHash) {
 }
 
 void DataResource::unload() {
-	_vm->_res->unloadResource(_resourceHandle);
 	_directory.clear();
 	_points.clear();
 	for (Common::Array<NPointArray*>::iterator it = _pointArrays.begin(); it != _pointArrays.end(); ++it)
@@ -516,6 +517,7 @@ void DataResource::unload() {
 	for (Common::Array<DRSubRectList*>::iterator it = _drSubRectLists.begin(); it != _drSubRectLists.end(); ++it)
 		delete (*it);
 	_drSubRectLists.clear();
+	_vm->_res->unloadResource(_resourceHandle);
 }
 
 NPoint DataResource::getPoint(uint32 nameHash) {
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 30b93bd..866b75d 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -397,7 +397,16 @@ void Scene::processMessageList() {
 		_messageListStatus = 0;
 	}
 	
-	if (_messageList && _klayman) {
+	if (_messageList && _klayman) {	
+
+#if 0
+		debug("MessageList: %p, %d", (void*)_messageList, _messageList->size());
+		for (uint i = 0; i < _messageList->size(); ++i) {
+			if (i == _messageListIndex) debugN("**"); else debugN("  ");
+			debug("(%08X, %08X)", (*_messageList)[i].messageNum, (*_messageList)[i].messageValue);
+		}
+		debug("--------------------------------");
+#endif
 	
 		while (_messageList && _messageListIndex < _messageListCount && !_isKlaymanBusy) {
 			uint32 messageNum = (*_messageList)[_messageListIndex].messageNum;
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index 4593594..3f89c22 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -42,7 +42,7 @@ void StaticData::load(const char *filename) {
 	
 	// Load message lists
 	uint32 messageListsCount = fd.readUint32LE();
-	debug("messageListsCount: %d", messageListsCount);
+	debug(3, "messageListsCount: %d", messageListsCount);
 	for (uint32 i = 0; i < messageListsCount; i++) {
 		MessageList *messageList = new MessageList();
 		uint32 id = fd.readUint32LE();
@@ -58,7 +58,7 @@ void StaticData::load(const char *filename) {
 
 	// Load rect lists
 	uint32 rectListsCount = fd.readUint32LE();
-	debug("rectListsCount: %d", rectListsCount);
+	debug(3, "rectListsCount: %d", rectListsCount);
 	for (uint32 i = 0; i < rectListsCount; i++) {
 		RectList *rectList = new RectList();
 		uint32 id = fd.readUint32LE();
@@ -87,7 +87,7 @@ void StaticData::load(const char *filename) {
 	
 	// Load hit rects
 	uint32 hitRectListsCount = fd.readUint32LE();
-	debug("hitRectListsCount: %d", hitRectListsCount);
+	debug(3, "hitRectListsCount: %d", hitRectListsCount);
 	for (uint32 i = 0; i < hitRectListsCount; i++) {
 		HitRectList *hitRectList = new HitRectList();
 		uint32 id = fd.readUint32LE();
@@ -106,7 +106,7 @@ void StaticData::load(const char *filename) {
 
 	// Load navigation lists
 	uint32 navigationListsCount = fd.readUint32LE();
-	debug("navigationListsCount: %d", navigationListsCount);
+	debug(3, "navigationListsCount: %d", navigationListsCount);
 	for (uint32 i = 0; i < navigationListsCount; i++) {
 		NavigationList *navigationList = new NavigationList();
 		uint32 id = fd.readUint32LE();
@@ -127,7 +127,7 @@ void StaticData::load(const char *filename) {
 
 	// Load HallOfRecordsInfo items
 	uint32 hallOfRecordsInfoItemsCount = fd.readUint32LE();
-	debug("hallOfRecordsInfoItemsCount: %d", hallOfRecordsInfoItemsCount);
+	debug(3, "hallOfRecordsInfoItemsCount: %d", hallOfRecordsInfoItemsCount);
 	for (uint32 i = 0; i < hallOfRecordsInfoItemsCount; i++) {
 		HallOfRecordsInfo *hallOfRecordsInfo = new HallOfRecordsInfo();
 		uint32 id = fd.readUint32LE();
@@ -142,7 +142,7 @@ void StaticData::load(const char *filename) {
 
 	// Load TrackInfo items
 	uint32 trackInfoItemsCount = fd.readUint32LE();
-	debug("trackInfoItemsCount: %d", trackInfoItemsCount);
+	debug(3, "trackInfoItemsCount: %d", trackInfoItemsCount);
 	for (uint32 i = 0; i < trackInfoItemsCount; i++) {
 		TrackInfo *trackInfo = new TrackInfo();
 		uint32 id = fd.readUint32LE();


Commit: 5ff11f00413d1adf1a5abf11e0f5d3db19945064
    https://github.com/scummvm/scummvm/commit/5ff11f00413d1adf1a5abf11e0f5d3db19945064
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:41-07:00

Commit Message:
NEVERHOOD: Rework the sound system

- Move code from the manager classes to the sound/music classes

Changed paths:
    engines/neverhood/neverhood.cpp
    engines/neverhood/sound.cpp
    engines/neverhood/sound.h



diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index fcaf756..d4b0984 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -168,7 +168,7 @@ void NeverhoodEngine::mainLoop() {
 			nextFrameTime = _screen->getNextFrameTime();
 		};
 		_soundMan->update();
-		_audioResourceMan->update();
+		_audioResourceMan->updateMusic();
 		_system->updateScreen();
 		_system->delayMillis(10);
 	}
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index d055107..9e0e572 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -27,9 +27,6 @@
 
 namespace Neverhood {
 
-// TODO Put more stuff into the constructors/destructors of the item structs
-// TODO Some parts are quite bad here, but my priority is to get sound working at all
-
 SoundResource::SoundResource(NeverhoodEngine *vm)
 	: _vm(vm), _soundIndex(-1) {
 }
@@ -39,14 +36,16 @@ SoundResource::~SoundResource() {
 }
 
 bool SoundResource::isPlaying() { 
-	return _soundIndex >= 0 &&
-		_vm->_audioResourceMan->isSoundPlaying(_soundIndex); 
+	AudioResourceManSoundItem *soundItem = getSoundItem();
+	return soundItem ? soundItem->isPlaying() : false;
 }
 
 void SoundResource::load(uint32 fileHash) {
 	unload();
 	_soundIndex = _vm->_audioResourceMan->addSound(fileHash);
-	_vm->_audioResourceMan->loadSound(_soundIndex);
+	AudioResourceManSoundItem *soundItem = getSoundItem();
+	if (soundItem)
+		soundItem->loadSound();
 }
 
 void SoundResource::unload() {
@@ -62,32 +61,40 @@ void SoundResource::play(uint32 fileHash) {
 }
 
 void SoundResource::play() {
-	if (_soundIndex >= 0)
-		_vm->_audioResourceMan->playSound(_soundIndex, false);
+	AudioResourceManSoundItem *soundItem = getSoundItem();
+	if (soundItem)
+		soundItem->playSound(false);
 }
 
 void SoundResource::stop() {
-	if (_soundIndex >= 0)
-		_vm->_audioResourceMan->stopSound(_soundIndex);
+	AudioResourceManSoundItem *soundItem = getSoundItem();
+	if (soundItem)
+		soundItem->stopSound();
 }
 
 void SoundResource::setVolume(int16 volume) {
-	if (_soundIndex >= 0)
-		_vm->_audioResourceMan->setSoundVolume(_soundIndex, volume);
+	AudioResourceManSoundItem *soundItem = getSoundItem();
+	if (soundItem)
+		soundItem->setVolume(volume);
 }
 
 void SoundResource::setPan(int16 pan) {
-	if (_soundIndex >= 0)
-		_vm->_audioResourceMan->setSoundPan(_soundIndex, pan);
+	AudioResourceManSoundItem *soundItem = getSoundItem();
+	if (soundItem)
+		soundItem->setPan(pan);
+}
+
+AudioResourceManSoundItem *SoundResource::getSoundItem() {
+	return _vm->_audioResourceMan->getSoundItem(_soundIndex);
 }
 
 MusicResource::MusicResource(NeverhoodEngine *vm)
 	: _vm(vm), _musicIndex(-1) {
 }
 
-bool MusicResource::isPlaying() { 
-	return _musicIndex >= 0 &&
-		_vm->_audioResourceMan->isMusicPlaying(_musicIndex); 
+bool MusicResource::isPlaying() {
+	AudioResourceManMusicItem *musicItem = getMusicItem();
+	return musicItem && musicItem->isPlaying(); 
 }
 
 void MusicResource::load(uint32 fileHash) {
@@ -96,29 +103,46 @@ void MusicResource::load(uint32 fileHash) {
 }
 
 void MusicResource::unload() {
-	if (_musicIndex >= 0) {
-		_vm->_audioResourceMan->unloadMusic(_musicIndex);
+	AudioResourceManMusicItem *musicItem = getMusicItem();
+	if (musicItem) {
+		musicItem->unloadMusic();
 		_musicIndex = -1;
 	}
 }
 
 void MusicResource::play(int16 fadeVolumeStep) {
-	if (_musicIndex >= 0)
-		_vm->_audioResourceMan->playMusic(_musicIndex, fadeVolumeStep);
+	AudioResourceManMusicItem *musicItem = getMusicItem();
+	if (musicItem)
+		musicItem->playMusic(fadeVolumeStep);
 }
 
 void MusicResource::stop(int16 fadeVolumeStep) {
-	if (_musicIndex >= 0)
-		_vm->_audioResourceMan->stopMusic(_musicIndex, fadeVolumeStep);
+	AudioResourceManMusicItem *musicItem = getMusicItem();
+	if (musicItem)
+		musicItem->stopMusic(fadeVolumeStep);
 }
 
 void MusicResource::setVolume(int16 volume) {
-	if (_musicIndex >= 0)
-		_vm->_audioResourceMan->setMusicVolume(_musicIndex, volume);
+	AudioResourceManMusicItem *musicItem = getMusicItem();
+	if (musicItem)
+		musicItem->setVolume(volume);
 }
 
-MusicItem::MusicItem()
-	: _musicResource(NULL) {
+AudioResourceManMusicItem *MusicResource::getMusicItem() {
+	return _vm->_audioResourceMan->getMusicItem(_musicIndex);
+}
+
+MusicItem::MusicItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 musicFileHash)
+	: _vm(vm), _musicResource(NULL) {
+	
+	_groupNameHash = groupNameHash;
+	_fileHash = musicFileHash;
+	_play = false;
+	_stop = false;
+	_fadeVolumeStep = 0;
+	_countdown = 24;
+	_musicResource = new MusicResource(_vm);
+	_musicResource->load(musicFileHash);
 }
 
 MusicItem::~MusicItem() {
@@ -127,10 +151,39 @@ MusicItem::~MusicItem() {
 	delete _musicResource;
 }
 
-SoundItem::SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash,
+void MusicItem::startMusic(int16 countdown, int16 fadeVolumeStep) {
+	_play = true;
+	_stop = false;
+	_countdown = countdown;
+	_fadeVolumeStep = fadeVolumeStep;
+}
+
+void MusicItem::stopMusic(int16 countdown, int16 fadeVolumeStep) {
+	_play = false;
+	_stop = true;
+	_countdown = countdown;
+	_fadeVolumeStep = fadeVolumeStep;
+}
+
+void MusicItem::update() {
+	if (_countdown) {
+		--_countdown;
+	} else if (_play && !_musicResource->isPlaying()) {
+		debug(1, "MusicItem: play music %08X (fade %d)", _fileHash, _fadeVolumeStep);
+		_musicResource->play(_fadeVolumeStep);
+		_fadeVolumeStep = 0;
+	} else if (_stop) {
+		debug(1, "MusicItem: stop music %08X (fade %d)", _fileHash, _fadeVolumeStep);
+		_musicResource->stop(_fadeVolumeStep);
+		_fadeVolumeStep = 0;
+		_stop = false;
+	}
+}
+
+SoundItem::SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFileHash,
 	bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
 	bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown)
-	: _soundResource(NULL),	_nameHash(nameHash), _soundFileHash(soundFileHash),
+	: _vm(vm), _soundResource(NULL), _groupNameHash(groupNameHash), _fileHash(soundFileHash),
 	_playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0),
 	_playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown),
 	_playLooping(false), _currCountdown(currCountdown) {
@@ -145,28 +198,70 @@ SoundItem::~SoundItem() {
 	delete _soundResource;
 }
 
+void SoundItem::setSoundParams(bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
+	int16 firstMinCountdown, int16 firstMaxCountdown) {
+	
+	_playOnceAfterCountdown = false;
+	_playLooping = false;
+	_playOnceAfterRandomCountdown = playOnceAfterRandomCountdown;
+	if (minCountdown > 0)
+		_minCountdown = minCountdown;
+	if (maxCountdown > 0)
+		_maxCountdown = maxCountdown;
+	if (firstMinCountdown >= firstMaxCountdown)
+		_currCountdown = firstMinCountdown;
+	else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown)
+		_currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown);
+}
+
+void SoundItem::playSoundLooping() {
+	_playOnceAfterRandomCountdown = false;
+	_playOnceAfterCountdown = false;
+	_playLooping = true;
+}
+
+void SoundItem::stopSound() {
+	_playOnceAfterRandomCountdown = false;
+	_playOnceAfterCountdown = false;
+	_playLooping = false;
+	_soundResource->stop();
+}
+
+void SoundItem::setVolume(int volume) {
+	_soundResource->setVolume(volume);
+}
+
+void SoundItem::update() {
+	if (_playOnceAfterCountdown) {
+		if (_currCountdown == 0) {
+			_currCountdown = _initialCountdown;
+		} else if (--_currCountdown == 0) {
+			_soundResource->play();
+		}
+	} else if (_playOnceAfterRandomCountdown) {
+		if (_currCountdown == 0) {
+			if (_minCountdown > 0 && _maxCountdown > 0 && _minCountdown < _maxCountdown)
+				_currCountdown = _vm->_rnd->getRandomNumberRng(_minCountdown, _maxCountdown);
+		} else if (--_currCountdown == 0) {
+			_soundResource->play();
+		}
+	} else if (_playLooping && !_soundResource->isPlaying()) {
+		_soundResource->play(); // TODO Looping parameter?
+	}
+}
+
 // SoundMan
 
 SoundMan::SoundMan(NeverhoodEngine *vm)
-	: _vm(vm),
-	_soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) {
+	: _vm(vm), _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) {
 }
 
 SoundMan::~SoundMan() {
 	// TODO Clean up
 }
 
-void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) {
-	MusicItem *musicItem = new MusicItem();
-	musicItem->_nameHash = nameHash;
-	musicItem->_musicFileHash = musicFileHash;
-	musicItem->_play = false;
-	musicItem->_stop = false;
-	musicItem->_fadeVolumeStep = 0;
-	musicItem->_countdown = 24;
-	musicItem->_musicResource = new MusicResource(_vm);
-	musicItem->_musicResource->load(musicFileHash);
-	addMusicItem(musicItem);
+void SoundMan::addMusic(uint32 groupNameHash, uint32 musicFileHash) {
+	addMusicItem(new MusicItem(_vm, groupNameHash, musicFileHash));
 }
 
 void SoundMan::deleteMusic(uint32 musicFileHash) {
@@ -183,32 +278,23 @@ void SoundMan::deleteMusic(uint32 musicFileHash) {
 
 void SoundMan::startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) {
 	MusicItem *musicItem = getMusicItemByHash(musicFileHash);
-	if (musicItem) {
-		musicItem->_play = true;
-		musicItem->_stop = false;
-		musicItem->_countdown = countdown;
-		musicItem->_fadeVolumeStep = fadeVolumeStep;
-	}
+	if (musicItem)
+		musicItem->startMusic(countdown, fadeVolumeStep);
 }
 
 void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) {
 	MusicItem *musicItem = getMusicItemByHash(musicFileHash);
-	if (musicItem) {
-		musicItem->_play = false;
-		musicItem->_stop = true;
-		musicItem->_countdown = countdown;
-		musicItem->_fadeVolumeStep = fadeVolumeStep;
-	}
+	if (musicItem)
+		musicItem->stopMusic(countdown, fadeVolumeStep);
 }
 
-void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) {
-	SoundItem *soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 50, 600, false, 0, false, 0);
-	addSoundItem(soundItem);
+void SoundMan::addSound(uint32 groupNameHash, uint32 soundFileHash) {
+	addSoundItem(new SoundItem(_vm, groupNameHash, soundFileHash, false, 50, 600, false, 0, false, 0));
 }
 
-void SoundMan::addSoundList(uint32 nameHash, const uint32 *soundFileHashList) {
+void SoundMan::addSoundList(uint32 groupNameHash, const uint32 *soundFileHashList) {
 	while (*soundFileHashList)
-		addSound(nameHash, *soundFileHashList++);
+		addSound(groupNameHash, *soundFileHashList++);
 }
 
 void SoundMan::deleteSound(uint32 soundFileHash) {
@@ -227,19 +313,9 @@ void SoundMan::setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCoun
 	int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) {
 
 	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
-	if (soundItem) {
-		soundItem->_playOnceAfterCountdown = false;
-		soundItem->_playLooping = false;
-		soundItem->_playOnceAfterRandomCountdown = playOnceAfterRandomCountdown;
-		if (minCountdown > 0)
-			soundItem->_minCountdown = minCountdown;
-		if (maxCountdown > 0)
-			soundItem->_maxCountdown = maxCountdown;
-		if (firstMinCountdown >= firstMaxCountdown)
-			soundItem->_currCountdown = firstMinCountdown;
-		else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown)
-			soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown);
-	}
+	if (soundItem)
+		soundItem->setSoundParams(playOnceAfterRandomCountdown, minCountdown, maxCountdown,
+			firstMinCountdown, firstMaxCountdown);
 }
 
 void SoundMan::setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown,
@@ -252,120 +328,84 @@ void SoundMan::setSoundListParams(const uint32 *soundFileHashList, bool playOnce
 
 void SoundMan::playSoundLooping(uint32 soundFileHash) {
 	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
-	if (soundItem) {
-		soundItem->_playOnceAfterRandomCountdown = false;
-		soundItem->_playOnceAfterCountdown = false;
-		soundItem->_playLooping = true;
-	}
+	if (soundItem)
+		soundItem->playSoundLooping();
 }
 
 void SoundMan::stopSound(uint32 soundFileHash) {
 	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
-	if (soundItem) {
-		soundItem->_playOnceAfterRandomCountdown = false;
-		soundItem->_playOnceAfterCountdown = false;
-		soundItem->_playLooping = false;
-		soundItem->_soundResource->stop();
-	}
+	if (soundItem)
+		soundItem->stopSound();
 }
 
 void SoundMan::setSoundVolume(uint32 soundFileHash, int volume) {
 	SoundItem *soundItem = getSoundItemByHash(soundFileHash);
 	if (soundItem)
-		soundItem->_soundResource->setVolume(volume);
+		soundItem->setVolume(volume);
 }
 
 void SoundMan::update() {
 	
 	for (uint i = 0; i < _soundItems.size(); ++i) {
 		SoundItem *soundItem = _soundItems[i];
-		if (soundItem) {
-			if (soundItem->_playOnceAfterCountdown) {
-				if (soundItem->_currCountdown == 0) {
-					soundItem->_currCountdown = soundItem->_initialCountdown;
-				} else if (--soundItem->_currCountdown == 0) {
-					soundItem->_soundResource->play();
-				}
-			} else if (soundItem->_playOnceAfterRandomCountdown) {
-				if (soundItem->_currCountdown == 0) {
-					if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown)
-						soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown);
-				} else if (--soundItem->_currCountdown == 0) {
-					soundItem->_soundResource->play();
-				}
-			} else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) {
-				soundItem->_soundResource->play(); // TODO Looping parameter?
-			}
-		}
+		if (soundItem)
+			soundItem->update();
 	}
 
 	for (uint i = 0; i < _musicItems.size(); ++i) {
 		MusicItem *musicItem = _musicItems[i];
-		if (musicItem) {
-			if (musicItem->_countdown) {
-				--musicItem->_countdown;
-			} else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) {
-				debug(1, "SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
-				musicItem->_musicResource->play(musicItem->_fadeVolumeStep);
-				musicItem->_fadeVolumeStep = 0;
-			} else if (musicItem->_stop) {
-				debug(1, "SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep);
-				musicItem->_musicResource->stop(musicItem->_fadeVolumeStep);
-				musicItem->_fadeVolumeStep = 0;
-				musicItem->_stop = false;
-			}
-		}
+		if (musicItem)
+			musicItem->update();
 	}
 
 }
 
-void SoundMan::deleteGroup(uint32 nameHash) {
-	deleteMusicGroup(nameHash);
-	deleteSoundGroup(nameHash);
+void SoundMan::deleteGroup(uint32 groupNameHash) {
+	deleteMusicGroup(groupNameHash);
+	deleteSoundGroup(groupNameHash);
 }
 
-void SoundMan::deleteMusicGroup(uint32 nameHash) {
+void SoundMan::deleteMusicGroup(uint32 groupNameHash) {
 	for (uint index = 0; index < _musicItems.size(); ++index) {
 		MusicItem *musicItem = _musicItems[index];
-		if (musicItem && musicItem->_nameHash == nameHash) {
+		if (musicItem && musicItem->getGroupNameHash() == groupNameHash) {
 			delete musicItem;
 			_musicItems[index] = NULL;
 		}
 	}
 }
 
-void SoundMan::deleteSoundGroup(uint32 nameHash) {
+void SoundMan::deleteSoundGroup(uint32 groupNameHash) {
 
-	if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) {
+	if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->getGroupNameHash() == groupNameHash) {
 		deleteSoundByIndex(_soundIndex1);
 		_soundIndex1 = -1;
 	}
 
-	if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->_nameHash == nameHash) {
+	if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->getGroupNameHash() == groupNameHash) {
 		deleteSoundByIndex(_soundIndex2);
 		_soundIndex2 = -1;
 	}
 
 	for (uint index = 0; index < _soundItems.size(); ++index)
-		if (_soundItems[index] && _soundItems[index]->_nameHash == nameHash)
+		if (_soundItems[index] && _soundItems[index]->getGroupNameHash() == groupNameHash)
 			deleteSoundByIndex(index);
 
 }
 
-void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown) {
+void SoundMan::playTwoSounds(uint32 groupNameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown) {
 
-	SoundItem *soundItem;
 	int16 currCountdown1 = _initialCountdown;
 	int16 currCountdown2 = _initialCountdown / 2;
 
 	if (_soundIndex1 != -1) {
-		currCountdown1 = _soundItems[_soundIndex1]->_currCountdown;
+		currCountdown1 = _soundItems[_soundIndex1]->getCurrCountdown();
 		deleteSoundByIndex(_soundIndex1);
 		_soundIndex1 = -1;
 	}
 
 	if (_soundIndex2 != -1) {
-		currCountdown2 = _soundItems[_soundIndex2]->_currCountdown;
+		currCountdown2 = _soundItems[_soundIndex2]->getCurrCountdown();
 		deleteSoundByIndex(_soundIndex2);
 		_soundIndex2 = -1;
 	}
@@ -374,24 +414,22 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun
 		_initialCountdown = initialCountdown;
 
 	if (soundFileHash1 != 0) {
-		soundItem = new SoundItem(_vm, nameHash, soundFileHash1, false, 0, 0,
+		SoundItem *soundItem = new SoundItem(_vm, groupNameHash, soundFileHash1, false, 0, 0,
 			_playOnceAfterCountdown, _initialCountdown, false, currCountdown1);
-		soundItem->_soundResource->setVolume(80);
+		soundItem->setVolume(80);
 		_soundIndex1 = addSoundItem(soundItem);
 	}
 
 	if (soundFileHash2 != 0) {
-		soundItem = new SoundItem(_vm, nameHash, soundFileHash2, false, 0, 0,
+		SoundItem *soundItem = new SoundItem(_vm, groupNameHash, soundFileHash2, false, 0, 0,
 			_playOnceAfterCountdown, _initialCountdown, false, currCountdown2);
-		soundItem->_soundResource->setVolume(80);
+		soundItem->setVolume(80);
 		_soundIndex2 = addSoundItem(soundItem);
 	}
 
 }
 
-void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) {
-
-	SoundItem *soundItem;
+void SoundMan::playSoundThree(uint32 groupNameHash, uint32 soundFileHash) {
 
 	if (_soundIndex3 != -1) {
 		deleteSoundByIndex(_soundIndex3);
@@ -399,8 +437,7 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) {
 	}
 
 	if (soundFileHash != 0) {
-		soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 0, 0,
-			false, _initialCountdown3, false, 0);
+		SoundItem *soundItem = new SoundItem(_vm, groupNameHash, soundFileHash, false, 0, 0, false, _initialCountdown3, false, 0);
 		_soundIndex3 = addSoundItem(soundItem);
 	}
 	
@@ -408,28 +445,28 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) {
 
 void SoundMan::setTwoSoundsPlayFlag(bool playOnceAfterCountdown) {
 	if (_soundIndex1 != -1)
-		_soundItems[_soundIndex1]->_playOnceAfterCountdown = playOnceAfterCountdown;
+		_soundItems[_soundIndex1]->setPlayOnceAfterCountdown(playOnceAfterCountdown);
 	if (_soundIndex2 != -1)
-		_soundItems[_soundIndex2]->_playOnceAfterCountdown = playOnceAfterCountdown;
+		_soundItems[_soundIndex2]->setPlayOnceAfterCountdown(playOnceAfterCountdown);
 	_playOnceAfterCountdown = playOnceAfterCountdown;
 }
 
 void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) {
 	if (_soundIndex3 != -1)
-		_soundItems[_soundIndex3]->_playOnceAfterCountdown = playOnceAfterCountdown;
+		_soundItems[_soundIndex3]->setPlayOnceAfterCountdown(playOnceAfterCountdown);
 	_playOnceAfterCountdown3 = playOnceAfterCountdown;
 }
 
 MusicItem *SoundMan::getMusicItemByHash(uint32 musicFileHash) {
 	for (uint i = 0; i < _musicItems.size(); ++i)
-		if (_musicItems[i] && _musicItems[i]->_musicFileHash == musicFileHash)
+		if (_musicItems[i] && _musicItems[i]->getFileHash() == musicFileHash)
 			return _musicItems[i];
 	return NULL;
 }
 
 SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) {
 	for (uint i = 0; i < _soundItems.size(); ++i)
-		if (_soundItems[i] && _soundItems[i]->_soundFileHash == soundFileHash)
+		if (_soundItems[i] && _soundItems[i]->getFileHash() == soundFileHash)
 			return _soundItems[i];
 	return NULL;
 }
@@ -510,128 +547,205 @@ int NeverhoodAudioStream::readBuffer(int16 *buffer, const int numSamples) {
 	return numSamples - samplesLeft;
 }
 
-AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm)
-	: _vm(vm) {
+AudioResourceManSoundItem::AudioResourceManSoundItem(NeverhoodEngine *vm, uint32 fileHash)
+	: _vm(vm), _fileHash(fileHash), _data(NULL), _isLoaded(false), _isPlaying(false),
+	_volume(100), _panning(50) {
+
+	_vm->_res->queryResource(_fileHash, _resourceHandle);
 }
 
-AudioResourceMan::~AudioResourceMan() {
+void AudioResourceManSoundItem::loadSound() {
+	if (!_data && _resourceHandle.isValid() &&
+		(_resourceHandle.type() == kResTypeSound || _resourceHandle.type() == kResTypeMusic)) {
+		_vm->_res->loadResource(_resourceHandle);
+		_data = _resourceHandle.data();
+	}
 }
 
-int16 AudioResourceMan::addSound(uint32 fileHash) {
-	AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem();
-	_vm->_res->queryResource(fileHash, soundItem->_resourceHandle);
-	soundItem->_fileHash = fileHash;
-	soundItem->_data = NULL;
-	soundItem->_isLoaded = false;
-	soundItem->_isPlaying = false;
-	soundItem->_volume = 100;
-	soundItem->_panning = 50;
-	for (uint i = 0; i < _soundItems.size(); ++i)
-		if (!_soundItems[i]) {
-			_soundItems[i] = soundItem;
-			return i;
-		}
-	int16 soundIndex = (int16)_soundItems.size();
-	_soundItems.push_back(soundItem);
-	return soundIndex;
+void AudioResourceManSoundItem::unloadSound() {
+	if (_vm->_mixer->isSoundHandleActive(_soundHandle))
+		_vm->_mixer->stopHandle(_soundHandle);
+	_vm->_res->unloadResource(_resourceHandle);
+	_data = NULL;
 }
 
-void AudioResourceMan::removeSound(int16 soundIndex) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	unloadSound(soundIndex);
-	delete soundItem;
-	_soundItems[soundIndex] = NULL;
-}
-
-void AudioResourceMan::loadSound(int16 soundIndex) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (!soundItem->_data && soundItem->_resourceHandle.isValid() &&
-		(soundItem->_resourceHandle.type() == kResTypeSound || soundItem->_resourceHandle.type() == kResTypeMusic)) {
-		_vm->_res->loadResource(soundItem->_resourceHandle);
-		soundItem->_data = soundItem->_resourceHandle.data();
+void AudioResourceManSoundItem::setVolume(int16 volume) {
+	_volume = MIN<int16>(volume, 100);
+	if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle))
+		_vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_volume));
+}
+
+void AudioResourceManSoundItem::setPan(int16 pan) {
+	_panning = MIN<int16>(pan, 100);
+	if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle))
+		_vm->_mixer->setChannelVolume(_soundHandle, PANNING(_panning));
+}
+
+void AudioResourceManSoundItem::playSound(bool looping) {
+	if (!_data)
+		loadSound();
+	if (_data) {
+		const byte *shiftValue = _resourceHandle.extData();
+		Common::MemoryReadStream *stream = new Common::MemoryReadStream(_data, _resourceHandle.size(), DisposeAfterUse::NO);
+		NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream);
+		_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle,
+			audioStream, -1, VOLUME(_volume), PANNING(_panning));
+		debug(1, "playing sound %08X", _fileHash);
+		_isPlaying = true;
 	}
 }
 
-void AudioResourceMan::unloadSound(int16 soundIndex) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
-		_vm->_mixer->stopHandle(soundItem->_soundHandle);
-	_vm->_res->unloadResource(soundItem->_resourceHandle);
-	soundItem->_data = NULL;
+void AudioResourceManSoundItem::stopSound() {
+	if (_vm->_mixer->isSoundHandleActive(_soundHandle))
+		_vm->_mixer->stopHandle(_soundHandle);
+	_isPlaying = false;
 }
 
-void AudioResourceMan::setSoundVolume(int16 soundIndex, int16 volume) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	soundItem->_volume = MIN<int16>(volume, 100);
-	if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
-		_vm->_mixer->setChannelVolume(soundItem->_soundHandle, VOLUME(soundItem->_volume));
+bool AudioResourceManSoundItem::isPlaying() {
+	return _vm->_mixer->isSoundHandleActive(_soundHandle);
 }
 
-void AudioResourceMan::setSoundPan(int16 soundIndex, int16 pan) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	soundItem->_panning = MIN<int16>(pan, 100);
-	if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
-		_vm->_mixer->setChannelVolume(soundItem->_soundHandle, PANNING(soundItem->_panning));
+AudioResourceManMusicItem::AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash)
+	: _vm(vm), _fileHash(fileHash), _terminate(false), _canRestart(false),
+	_volume(100), _panning(50),	_start(false), _isFadingIn(false), _isFadingOut(false) {
+
 }
 
-void AudioResourceMan::playSound(int16 soundIndex, bool looping) {
+void AudioResourceManMusicItem::playMusic(int16 fadeVolumeStep) {
+	if (!_isPlaying) {
+		_isFadingIn = false;
+		_isFadingOut = false;
+		if (fadeVolumeStep != 0) {
+			_isFadingIn = true;
+			_fadeVolume = 0;
+			_fadeVolumeStep = fadeVolumeStep;
+		}
+		_start = true;
+		_terminate = false;
+	}
+}
 
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (!soundItem->_data)
-		loadSound(soundIndex);
+void AudioResourceManMusicItem::stopMusic(int16 fadeVolumeStep) {
+	if (_vm->_mixer->isSoundHandleActive(_soundHandle)) {
+		if (fadeVolumeStep != 0) {
+			if (_isFadingIn)
+				_isFadingIn = false;
+			else
+				_fadeVolume = _volume;
+			_isFadingOut = true;
+			_fadeVolumeStep = fadeVolumeStep;
+		} else {
+			_vm->_mixer->stopHandle(_soundHandle);
+		}
+		_isPlaying = false;
+	}
+}
 
-	if (!soundItem->_data)
-		return;
-		
-	const byte *shiftValue = soundItem->_resourceHandle.extData();
-	
-	Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO);
-	NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream);
+void AudioResourceManMusicItem::unloadMusic() {
+	if (_isFadingOut) {
+		_canRestart = true;
+	} else {
+		if (_vm->_mixer->isSoundHandleActive(_soundHandle))
+			_vm->_mixer->stopHandle(_soundHandle);
+		_isPlaying = false;
+		_terminate = true;
+	}
+}
 
-	_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle,
-		audioStream, -1, VOLUME(soundItem->_volume), PANNING(soundItem->_panning));
-		
-	debug(1, "playing sound %08X", soundItem->_fileHash);
-	
-	soundItem->_isPlaying = true;
+void AudioResourceManMusicItem::setVolume(int16 volume) {
+	_volume = MIN<int16>(volume, 100);
+	if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle))
+		_vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_volume));
+}
+
+void AudioResourceManMusicItem::restart() {
+	_canRestart = false;
+	_isFadingOut = false;
+	_isFadingIn = true;
+}
+
+void AudioResourceManMusicItem::update() {
+
+	if (_start && !_vm->_mixer->isSoundHandleActive(_soundHandle)) {
+		ResourceHandle resourceHandle;
+		_vm->_res->queryResource(_fileHash, resourceHandle);
+		Common::SeekableReadStream *stream = _vm->_res->createStream(_fileHash);
+		const byte *shiftValue = resourceHandle.extData();
+		NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream);
+		_vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle,
+			audioStream, -1, VOLUME(_isFadingIn ? _fadeVolume : _volume),
+			PANNING(_panning));
+		_start = false;
+		_isPlaying = true;
+	}
 	
+	if (_vm->_mixer->isSoundHandleActive(_soundHandle)) {
+		if (_isFadingIn) {
+			_fadeVolume += _fadeVolumeStep;
+			if (_fadeVolume >= _volume) {
+				_fadeVolume = _volume;
+				_isFadingIn = false;
+			}
+			_vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_fadeVolume));
+		}
+		if (_isFadingOut) {
+			_fadeVolume -= _fadeVolumeStep;
+			if (_fadeVolume < 0)
+				_fadeVolume = 0;
+			_vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_fadeVolume));
+			if (_fadeVolume == 0) {
+				_isFadingOut = false;
+				stopMusic(0);
+				if (_canRestart)
+					unloadMusic();
+			}
+		}
+	}
+
 }
 
-void AudioResourceMan::stopSound(int16 soundIndex) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle))
-		_vm->_mixer->stopHandle(soundItem->_soundHandle);
-	soundItem->_isPlaying = false;
+AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm)
+	: _vm(vm) {
 }
 
-bool AudioResourceMan::isSoundPlaying(int16 soundIndex) {
-	AudioResourceManSoundItem *soundItem = _soundItems[soundIndex];
-	return _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle);
+AudioResourceMan::~AudioResourceMan() {
 }
 
-int16 AudioResourceMan::loadMusic(uint32 fileHash) {
+int16 AudioResourceMan::addSound(uint32 fileHash) {
+	AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem(_vm, fileHash);
+
+	for (uint i = 0; i < _soundItems.size(); ++i)
+		if (!_soundItems[i]) {
+			_soundItems[i] = soundItem;
+			return i;
+		}
 
+	int16 soundIndex = (int16)_soundItems.size();
+	_soundItems.push_back(soundItem);
+	return soundIndex;
+}
+
+void AudioResourceMan::removeSound(int16 soundIndex) {
+	AudioResourceManSoundItem *soundItem = getSoundItem(soundIndex);
+	if (soundItem) {
+		soundItem->unloadSound();
+		delete soundItem;
+		_soundItems[soundIndex] = NULL;
+	}
+}
+
+int16 AudioResourceMan::loadMusic(uint32 fileHash) {
 	AudioResourceManMusicItem *musicItem;
 
 	for (uint i = 0; i < _musicItems.size(); ++i) {
 		musicItem = _musicItems[i];
-		if (musicItem && musicItem->_fileHash == fileHash && musicItem->_remove) {
-			musicItem->_remove = false;
-			musicItem->_isFadingOut = false;
-			musicItem->_isFadingIn = true;
+		if (musicItem && musicItem->getFileHash() == fileHash && musicItem->canRestart()) {
+			musicItem->restart();
 			return i;
 		}
 	}
-	
-	musicItem = new AudioResourceManMusicItem();
-	musicItem->_fileHash = fileHash;
-	musicItem->_isPlaying = false;
-	musicItem->_remove = false;
-	musicItem->_volume = 100;
-	musicItem->_panning = 50;
-	musicItem->_start = false;
-	musicItem->_isFadingIn = false;
-	musicItem->_isFadingOut = false;
+
+	musicItem = new AudioResourceManMusicItem(_vm, fileHash);
 
 	for (uint i = 0; i < _musicItems.size(); ++i) {
 		if (!_musicItems[i]) {
@@ -646,106 +760,25 @@ int16 AudioResourceMan::loadMusic(uint32 fileHash) {
 	
 }
 
-void AudioResourceMan::unloadMusic(int16 musicIndex) {
-	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
-	if (musicItem->_isFadingOut) {
-		musicItem->_remove = true;
-	} else {
-		if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle))
-			_vm->_mixer->stopHandle(musicItem->_soundHandle);
-		musicItem->_isPlaying = false;
-		_musicItems[musicIndex] = NULL;
-	}
-}
-
-void AudioResourceMan::setMusicVolume(int16 musicIndex, int16 volume) {
-	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
-	musicItem->_volume = MIN<int16>(volume, 100);
-	if (musicItem->_isPlaying && _vm->_mixer->isSoundHandleActive(musicItem->_soundHandle))
-		_vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_volume));
-}	
-
-void AudioResourceMan::playMusic(int16 musicIndex, int16 fadeVolumeStep) {
-	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
-	if (!musicItem->_isPlaying) {
-		musicItem->_isFadingIn = false;
-		musicItem->_isFadingOut = false;
-		if (fadeVolumeStep != 0) {
-			musicItem->_isFadingIn = true;
-			musicItem->_fadeVolume = 0;
-			musicItem->_fadeVolumeStep = fadeVolumeStep;
-		}
-		musicItem->_start = true;
-	}
-}
-
-void AudioResourceMan::stopMusic(int16 musicIndex, int16 fadeVolumeStep) {
-	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
-	if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
-		if (fadeVolumeStep != 0) {
-			if (musicItem->_isFadingIn)
-				musicItem->_isFadingIn = false;
-			else
-				musicItem->_fadeVolume = musicItem->_volume;
-			musicItem->_isFadingOut = true;
-			musicItem->_fadeVolumeStep = fadeVolumeStep;
-		} else {
-			_vm->_mixer->stopHandle(musicItem->_soundHandle);
-		}
-		musicItem->_isPlaying = false;
-	}
-}
-
-bool AudioResourceMan::isMusicPlaying(int16 musicIndex) {
-	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
-	return musicItem->_isPlaying;
-}
-
-void AudioResourceMan::updateMusicItem(int16 musicIndex) {
-	AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
-
-	if (musicItem->_start && !_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
-		ResourceHandle resourceHandle;
-		_vm->_res->queryResource(musicItem->_fileHash, resourceHandle);
-		Common::SeekableReadStream *stream = _vm->_res->createStream(musicItem->_fileHash);
-		const byte *shiftValue = resourceHandle.extData();
-		NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream);
-		_vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &musicItem->_soundHandle,
-			audioStream, -1, VOLUME(musicItem->_isFadingIn ? musicItem->_fadeVolume : musicItem->_volume),
-			PANNING(musicItem->_panning));
-		musicItem->_start = false;
-		musicItem->_isPlaying = true;
-	}
-	
-	if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) {
-		if (musicItem->_isFadingIn) {
-			musicItem->_fadeVolume += musicItem->_fadeVolumeStep;
-			if (musicItem->_fadeVolume >= musicItem->_volume) {
-				musicItem->_fadeVolume = musicItem->_volume;
-				musicItem->_isFadingIn = false;
-			}
-			_vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume));
-		}
-		if (musicItem->_isFadingOut) {
-			musicItem->_fadeVolume -= musicItem->_fadeVolumeStep;
-			if (musicItem->_fadeVolume < 0)
-				musicItem->_fadeVolume = 0;
-			_vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume));
-			if (musicItem->_fadeVolume == 0) {
-				musicItem->_isFadingOut = false;
-				stopMusic(musicIndex, 0);
-				if (musicItem->_remove)
-					unloadMusic(musicIndex);
+void AudioResourceMan::updateMusic() {
+	for (uint musicIndex = 0; musicIndex < _musicItems.size(); ++musicIndex) {
+		AudioResourceManMusicItem *musicItem = _musicItems[musicIndex];
+		if (musicItem) {
+			musicItem->update();
+			if (musicItem->isTerminated()) {
+				delete musicItem;
+				_musicItems[musicIndex] = NULL;
 			}
 		}
 	}
+}
 
+AudioResourceManSoundItem *AudioResourceMan::getSoundItem(int16 index) {
+	return (index >= 0 && index < (int16)_soundItems.size()) ? _soundItems[index] : NULL;
 }
 
-void AudioResourceMan::update() {
-	for (uint i = 0; i < _musicItems.size(); ++i)
-		if (_musicItems[i])
-			updateMusicItem(i);
+AudioResourceManMusicItem *AudioResourceMan::getMusicItem(int16 index) {
+	return (index >= 0 && index < (int16)_musicItems.size()) ? _musicItems[index] : NULL;
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index 8bfd5af..e0e45e9 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -37,6 +37,10 @@ namespace Neverhood {
 // Convert panning from percent (50% equals center) to -127..0..+127
 #define PANNING(panning) (254 / 100 * (panning) - 127)
 
+class AudioResourceManSoundItem;
+class AudioResourceManMusicItem;
+class AudioResourceMan;
+
 class SoundResource {
 public:
 	SoundResource(NeverhoodEngine *vm);
@@ -51,7 +55,8 @@ public:
 	void setPan(int16 pan);
 protected:
 	NeverhoodEngine *_vm;
-	int16 _soundIndex;	
+	int16 _soundIndex;
+	AudioResourceManSoundItem *getSoundItem();
 };
 
 class MusicResource {
@@ -66,23 +71,49 @@ public:
 protected:
 	NeverhoodEngine *_vm;
 	int16 _musicIndex;	
+	AudioResourceManMusicItem *getMusicItem();
 };
 
-struct MusicItem {
-	uint32 _nameHash;
-	uint32 _musicFileHash;
+class MusicItem {
+public:
+	MusicItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 musicFileHash);
+	~MusicItem();
+	void startMusic(int16 countdown, int16 fadeVolumeStep);
+	void stopMusic(int16 countdown, int16 fadeVolumeStep);
+	void update();
+	uint32 getGroupNameHash() const { return _groupNameHash; }
+	uint32 getFileHash() const { return _fileHash; }
+protected:	
+	NeverhoodEngine *_vm;
+	uint32 _groupNameHash;
+	uint32 _fileHash;
 	bool _play;
 	bool _stop;
 	int16 _fadeVolumeStep;
 	int16 _countdown;
 	MusicResource *_musicResource;
-	MusicItem();
-	~MusicItem();
 };
 
-struct SoundItem {
-	uint32 _nameHash;
-	uint32 _soundFileHash;
+class SoundItem {
+public:
+	SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFileHash,
+		bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
+		bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown);
+	~SoundItem();
+	void setSoundParams(bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
+		int16 firstMinCountdown, int16 firstMaxCountdown);
+	void playSoundLooping();
+	void stopSound();
+	void setVolume(int volume);
+	void update();
+	void setPlayOnceAfterCountdown(bool playOnceAfterCountdown) { _playOnceAfterCountdown = playOnceAfterCountdown; }
+	uint32 getGroupNameHash() const { return _groupNameHash; }
+	uint32 getFileHash() const { return _fileHash; }
+	int16 getCurrCountdown() const { return _currCountdown; }
+protected:	
+	NeverhoodEngine *_vm;
+	uint32 _groupNameHash;
+	uint32 _fileHash;
 	bool _playOnceAfterRandomCountdown;
 	int16 _minCountdown;
 	int16 _maxCountdown;
@@ -91,29 +122,30 @@ struct SoundItem {
 	bool _playLooping;
 	int16 _currCountdown;
 	SoundResource *_soundResource;
-
-	SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash,
-		bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown,
-		bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown);
-	~SoundItem();
 };
 
 // TODO Give this a better name
 
+/*
+template<class T>
+class SoundManItems : public Common::Array<T> {
+};
+*/
+
 class SoundMan {
 public:
 	SoundMan(NeverhoodEngine *vm);
 	~SoundMan();
 
 	// Music
-	void addMusic(uint32 nameHash, uint32 musicFileHash);
+	void addMusic(uint32 groupNameHash, uint32 musicFileHash);
 	void deleteMusic(uint32 musicFileHash);
 	void startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep);
 	void stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep);
 	
 	// Sound
-	void addSound(uint32 nameHash, uint32 soundFileHash);
-	void addSoundList(uint32 nameHash, const uint32 *soundFileHashList);
+	void addSound(uint32 groupNameHash, uint32 soundFileHash);
+	void addSoundList(uint32 groupNameHash, const uint32 *soundFileHashList);
 	void deleteSound(uint32 soundFileHash);
 	void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown,
 		int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown);
@@ -125,11 +157,11 @@ public:
 	
 	// Misc
 	void update();
-	void deleteGroup(uint32 nameHash);
-	void deleteMusicGroup(uint32 nameHash);
-	void deleteSoundGroup(uint32 nameHash);
-	void playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown);
-	void playSoundThree(uint32 nameHash, uint32 soundFileHash);
+	void deleteGroup(uint32 groupNameHash);
+	void deleteMusicGroup(uint32 groupNameHash);
+	void deleteSoundGroup(uint32 groupNameHash);
+	void playTwoSounds(uint32 groupNameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown);
+	void playSoundThree(uint32 groupNameHash, uint32 soundFileHash);
 	void setTwoSoundsPlayFlag(bool playOnceAfterCountdown);
 	void setSoundThreePlayFlag(bool playOnceAfterCountdown);
 
@@ -182,7 +214,18 @@ private:
 
 // TODO Rename these
 
-struct AudioResourceManSoundItem {
+class AudioResourceManSoundItem {
+public:	
+	AudioResourceManSoundItem(NeverhoodEngine *vm, uint32 fileHash);
+	void loadSound();
+	void unloadSound();
+	void setVolume(int16 volume);
+	void setPan(int16 pan);
+	void playSound(bool looping);
+	void stopSound();
+	bool isPlaying();
+protected:	
+	NeverhoodEngine *_vm;
 	uint32 _fileHash;
 	ResourceHandle _resourceHandle;
 	const byte *_data;
@@ -193,10 +236,25 @@ struct AudioResourceManSoundItem {
 	Audio::SoundHandle _soundHandle;
 };
 
-struct AudioResourceManMusicItem {
+class AudioResourceManMusicItem {
+public:
+	AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash);
+	void playMusic(int16 fadeVolumeStep);
+	void stopMusic(int16 fadeVolumeStep);
+	void unloadMusic();
+	void setVolume(int16 volume);
+	void restart();
+	void update();
+	bool isPlaying() const { return _isPlaying; }
+	bool canRestart() const { return _canRestart; }
+	bool isTerminated() const { return _terminate; }
+	uint32 getFileHash() const { return _fileHash; }
+protected:	
+	NeverhoodEngine *_vm;
 	uint32 _fileHash;
 	bool _isPlaying;
-	bool _remove;
+	bool _canRestart;
+	bool _terminate;
 	int16 _volume;
 	int16 _panning;
 	bool _start;
@@ -214,23 +272,12 @@ public:
 	
 	int16 addSound(uint32 fileHash);
 	void removeSound(int16 soundIndex);
-	void loadSound(int16 soundIndex);
-	void unloadSound(int16 soundIndex);
-	void setSoundVolume(int16 soundIndex, int16 volume);
-	void setSoundPan(int16 soundIndex, int16 pan);
-	void playSound(int16 soundIndex, bool looping);
-	void stopSound(int16 soundIndex);
-	bool isSoundPlaying(int16 soundIndex);
-	
+
 	int16 loadMusic(uint32 fileHash);
-	void unloadMusic(int16 musicIndex);
-	void setMusicVolume(int16 musicIndex, int16 volume);
-	void playMusic(int16 musicIndex, int16 fadeVolumeStep);
-	void stopMusic(int16 musicIndex, int16 fadeVolumeStep);
-	bool isMusicPlaying(int16 musicIndex);
-	void updateMusicItem(int16 musicIndex);
+	void updateMusic();
 	
-	void update();
+	AudioResourceManSoundItem *getSoundItem(int16 index);
+	AudioResourceManMusicItem *getMusicItem(int16 index);
 	
 protected:
 	NeverhoodEngine *_vm;


Commit: ac1dc3e4db23572b9a7d6855bfbdc20f9044a612
    https://github.com/scummvm/scummvm/commit/ac1dc3e4db23572b9a7d6855bfbdc20f9044a612
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:41-07:00

Commit Message:
NEVERHOOD: Fix Module1300::createScene

Changed paths:
    engines/neverhood/module1300.cpp
    engines/neverhood/scene.cpp



diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index a0a1167..690ca7c 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -111,7 +111,7 @@ Module1300::~Module1300() {
 void Module1300::createScene(int sceneNum, int which) {
 	debug("Module1300::createScene(%d, %d)", sceneNum, which);
 	_sceneNum = sceneNum;
-	switch (_vm->gameState().sceneNum) {
+	switch (_sceneNum) {
 	case 1:
 		_vm->gameState().sceneNum = 1;
 		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 866b75d..63242a4 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -258,15 +258,15 @@ void Scene::leaveScene(uint32 result) {
 
 uint32 Scene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	switch (messageNum) {
-	case 0: // mouse moved
+	case 0x0000: // mouse moved
 		if (_mouseCursor && _mouseCursor->hasMessageHandler())
 			sendMessage(_mouseCursor, 0x4002, param);
 		break;
-	case 1: // mouse clicked
+	case 0x0001: // mouse clicked
 		_mouseClicked = true;
 		_mouseClickPos = param.asPoint();
 		break;
-	case 6:
+	case 0x0006:
 		sendMessage(_parentModule, 0x1009, param);		
 		break;
 	case 0x1006:


Commit: 4389d32974cd0965624d30b6566fcc8e1c2a72b4
    https://github.com/scummvm/scummvm/commit/4389d32974cd0965624d30b6566fcc8e1c2a72b4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:41-07:00

Commit Message:
NEVERHOOD: Rename "Klayman" to "Klaymen" (the correct name of the game's hero)

Changed paths:
  A engines/neverhood/klaymen.cpp
  A engines/neverhood/klaymen.h
  R engines/neverhood/klayman.cpp
  R engines/neverhood/klayman.h
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/messages.h
    engines/neverhood/module.mk
    engines/neverhood/module1000.cpp
    engines/neverhood/module1000.h
    engines/neverhood/module1100.cpp
    engines/neverhood/module1200.cpp
    engines/neverhood/module1200.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1300.h
    engines/neverhood/module1400.cpp
    engines/neverhood/module1400.h
    engines/neverhood/module1600.cpp
    engines/neverhood/module1600.h
    engines/neverhood/module1700.cpp
    engines/neverhood/module1800.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/module2000.cpp
    engines/neverhood/module2100.cpp
    engines/neverhood/module2100.h
    engines/neverhood/module2200.cpp
    engines/neverhood/module2200.h
    engines/neverhood/module2400.cpp
    engines/neverhood/module2400.h
    engines/neverhood/module2500.cpp
    engines/neverhood/module2500.h
    engines/neverhood/module2700.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module2800.h
    engines/neverhood/resource.cpp
    engines/neverhood/resource.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index f22a0d1..cf56522 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -395,7 +395,7 @@ void GameModule::startup() {
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 2, 2);
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 3, 0);
 	setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4);
-	setGlobalVar(V_KLAYMAN_SMALL, 1);
+	setGlobalVar(V_KLAYMEN_SMALL, 1);
 	setGlobalVar(V_SHRINK_LIGHTS_ON, 0);
 	// <<<DEBUG
 
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index d3fe15f..3672aa6 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -48,11 +48,11 @@ enum {
 	V_COLUMN_TEXT_NAME			= 0xC8C28808,
 	V_CLICKED_COLUMN_INDEX		= 0x48A68852,
 	V_CLICKED_COLUMN_ROW		= 0x49C40058,
-	// Klayman
-	V_KLAYMAN_SMALL				= 0x1860C990,			// Is Klayman small?
-	V_KLAYMAN_FRAMEINDEX		= 0x18288913,
-	V_KLAYMAN_IS_DELTA_X		= 0xC0418A02,
-	V_KLAYMAN_SAVED_X			= 0x00D30138,
+	// Klaymen
+	V_KLAYMEN_SMALL				= 0x1860C990,			// Is Klaymen small?
+	V_KLAYMEN_FRAMEINDEX		= 0x18288913,
+	V_KLAYMEN_IS_DELTA_X		= 0xC0418A02,
+	V_KLAYMEN_SAVED_X			= 0x00D30138,
 	V_CAR_DELTA_X				= 0x21E60190,
 	// Flags
 	V_CRYSTAL_COLORS_INIT		= 0xDE2EC914,
@@ -129,8 +129,8 @@ enum {
 	V_TELEPORTER_WHICH			= 0x60826830,
 	V_TELEPORTER_DEST_AVAILABLE	= 0x2C145A98,
 	// Inventory
-	V_HAS_NEEDLE				= 0x31C63C51,			// Has Klayman the needle?
-	V_HAS_FINAL_KEY				= 0xC0780812,			// Has Klayman the key from the diskplayer?
+	V_HAS_NEEDLE				= 0x31C63C51,			// Has Klaymen the needle?
+	V_HAS_FINAL_KEY				= 0xC0780812,			// Has Klaymen the key from the diskplayer?
 	V_HAS_TEST_TUBE				= 0x45080C38,
 	// Arrays
 	// NOTE "GOOD" means the solution, "CURR" is the current setup of the puzzle variables
diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp
deleted file mode 100644
index 0dfd29b..0000000
--- a/engines/neverhood/klayman.cpp
+++ /dev/null
@@ -1,6240 +0,0 @@
-/* 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/klayman.h"
-#include "neverhood/resourceman.h"
-#include "neverhood/scene.h"
-#include "neverhood/staticdata.h"
-
-namespace Neverhood {
-
-static const KlaymanIdleTableItem klaymanTable1[] = {
-	{1, &Klayman::stDoIdlePickEar},
-	{1, &Klayman::stDoIdleSpinHead},
-	{1, &Klayman::stDoIdleArms},
-	{1, &Klayman::stDoIdleChest},
-	{1, &Klayman::stDoIdleHeadOff}
-}; 
-
-static const KlaymanIdleTableItem klaymanTable2[] = {
-	{1, &Klayman::stDoIdlePickEar},
-	{1, &Klayman::stDoIdleSpinHead},
-	{1, &Klayman::stDoIdleChest},
-	{1, &Klayman::stDoIdleHeadOff}
-}; 
-
-static const KlaymanIdleTableItem klaymanTable3[] = {
-	{1, &Klayman::stDoIdleTeleporterHands},
-	{1, &Klayman::stDoIdleTeleporterHands2}
-}; 
-
-static const KlaymanIdleTableItem klaymanTable4[] = {
-	{1, &Klayman::stDoIdleSpinHead},
-	{1, &Klayman::stDoIdleChest},
-	{1, &Klayman::stDoIdleHeadOff},
-};
-
-static const KlaymanIdleTableItem klaymanIdleTable1002[] = {
-	{1, &Klayman::stDoIdlePickEar},
-	{2, &Klayman::stIdleWonderAbout}
-}; 
-
-// Klayman
-
-Klayman::Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
-	: AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
-	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
-	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
-	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
-	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
-	
-	createSurface(surfacePriority, 320, 200);
-	_x = x;
-	_y = y;
-	_destX = x;
-	_destY = y;
-	_flags = 2;
-	setKlaymanIdleTable1();
-	stTryStandIdle();
-	SetUpdateHandler(&Klayman::update);
-}
-
-void Klayman::xUpdate() {
-	// Empty
-}
-
-uint32 Klayman::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	}
-	return 0;
-}
-
-void Klayman::update() {
-	AnimatedSprite::update();
-	xUpdate();
-}
-
-void Klayman::setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount) {
-	_idleTable = table;
-	_idleTableCount = tableCount;
-	_idleTableMaxValue = 0;
-	for (int i = 0; i < tableCount; i++)
-		_idleTableMaxValue += table[i].value;
-}
-
-void Klayman::setKlaymanIdleTable1() {
-	setKlaymanIdleTable(klaymanTable1, ARRAYSIZE(klaymanTable1));
-}
-
-void Klayman::setKlaymanIdleTable2() {
-	setKlaymanIdleTable(klaymanTable2, ARRAYSIZE(klaymanTable2));
-}
-
-void Klayman::setKlaymanIdleTable3() {
-	setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3));
-}
-
-void Klayman::stDoIdlePickEar() {
-	startIdleAnimation(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar));
-}
-
-void Klayman::stIdlePickEar() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x5B20C814, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmIdlePickEar);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-	FinalizeState(&Klayman::evIdlePickEarDone);
-}
-
-uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x04DBC02C) {
-			playSound(0, 0x44528AA1);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::evIdlePickEarDone() {
-	stopSound(0);
-}
-
-void Klayman::stDoIdleSpinHead() {
-	startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::stIdleSpinHead));
-}
-
-void Klayman::stIdleSpinHead() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0xD122C137, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmIdleSpinHead);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-}
-
-uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x808A0008) {
-			playSound(0, 0xD948A340);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stDoIdleArms() {
-	startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::stIdleArms));
-}
-
-void Klayman::stIdleArms() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x543CD054, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmIdleArms);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-	FinalizeState(&Klayman::evIdleArmsDone);
-}
-
-void Klayman::evIdleArmsDone() {
-	stopSound(0);
-}
-
-uint32 Klayman::hmIdleArms(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x5A0F0104) {
-			playSound(0, 0x7970A100);
-		} else if (param.asInteger() == 0x9A9A0109) {
-			playSound(0, 0xD170CF04);
-		} else if (param.asInteger() == 0x989A2169) {
-			playSound(0, 0xD073CF14);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stDoIdleChest() {
-	startIdleAnimation(0x40A0C034, AnimationCallback(&Klayman::stIdleChest));
-}
-
-void Klayman::stIdleChest() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x40A0C034, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmIdleChest);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-}
-
-uint32 Klayman::hmIdleChest(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x0D2A0288) {
-			playSound(0, 0xD192A368);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stDoIdleHeadOff() {
-	startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::stIdleHeadOff));
-}
-
-void Klayman::stIdleHeadOff() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x5120E137, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmIdleHeadOff);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-}
-
-uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0xC006000C) {
-			playSound(0, 0x9D406340);
-		} else if (param.asInteger() == 0x2E4A2940) {
-			playSound(0, 0x53A4A1D4);
-		} else if (param.asInteger() == 0xAA0A0860) {
-			playSound(0, 0x5BE0A3C6);
-		} else if (param.asInteger() == 0xC0180260) {
-			playSound(0, 0x5D418366);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stIdleWonderAbout() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0xD820A114, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-}
-
-void Klayman::stSitIdleTeleporter() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x582EC138, 0, -1);
-	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-	_idleCounter = 0;
-	_blinkCounter = 0;
-	_idleCounterMax = 8;
-	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-}
-
-void Klayman::upSitIdleTeleporter() {
-	update();
-	_idleCounter++;
-	if (_idleCounter >= _idleCounterMax) {
-		_idleCounter = 0;
-		if (_idleTable) {
-			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
-			for (int i = 0; i < _idleTableCount; i++) {
-				if (randomValue < _idleTable[i].value) {
-					(this->*(_idleTable[i].callback))();
-					_idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24;
-					break;
-				}
-				randomValue -= _idleTable[i].value;
-			}
-		}
-	} else if (++_blinkCounter >= _blinkCounterMax) {
-		_blinkCounter = 0;
-		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-		stSitIdleTeleporterBlink();
-	}
-}
-
-void Klayman::stSitIdleTeleporterBlink() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x5C24C018, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stSitIdleTeleporterBlinkSecond);
-}
-
-void Klayman::stSitIdleTeleporterBlinkSecond() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x5C24C018, 0, -1);
-	SetUpdateHandler(&Klayman::upSitIdleTeleporter);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stPickUpNeedle() {
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	if (!stStartAction(AnimationCallback(&Klayman::stPickUpNeedle))) {
-		_status2 = 1;
-		_acceptInput = false;
-		startAnimation(0x1449C169, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPickUpObject);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void Klayman::stPickUpTube() {
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	if (!stStartAction(AnimationCallback(&Klayman::stPickUpTube))) {
-		_status2 = 1;
-		_acceptInput = false;
-		startAnimation(0x0018C032, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPickUpTube);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-uint32 Klayman::hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0xC1380080) {
-			sendMessage(_attachedSprite, 0x4806, 0);
-			playSound(0, 0xC8004340);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x03020231) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0x67221A03) {
-			playSound(0, 0x44051000);
-		} else if (param.asInteger() == 0x925A0C1E) {
-			playSound(0, 0x40E5884D);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stTurnToUseInTeleporter() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0xD229823D, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stReturnFromUseInTeleporter() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x9A2801E0, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stStepOver() {
-	if (!stStartAction(AnimationCallback(&Klayman::stStepOver))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x004AA310, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stSitInTeleporter() {
-	if (!stStartAction(AnimationCallback(&Klayman::stSitInTeleporter))) {
-		_status2 = 0;
-		_acceptInput = false;
-		startAnimation(0x392A0330, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmSitInTeleporter);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x001A2832) {
-			playSound(0, 0xC0E4884C);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stGetUpFromTeleporter() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x913AB120, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-/////////////////////////////////////////////////////////////////
-
-void Klayman::stopWalking() {
-	_destX = _x;
-	if (!_isWalking && !_isSneaking && !_isLargeStep) {
-		gotoState(NULL);
-		gotoNextStateExt();
-	}
-}
-
-void Klayman::startIdleAnimation(uint32 fileHash, AnimationCb callback) {
-	debug("startIdleAnimation(%08X)", fileHash);
-	NextState(callback);
-	SetUpdateHandler(&Klayman::upIdleAnimation);
-}
-
-void Klayman::upIdleAnimation() {
-	gotoNextStateExt();
-	update();
-}
-
-bool Klayman::stStartActionFromIdle(AnimationCb callback) {
-	if (_status2 == 2) {
-		_status2 = 1;
-		_acceptInput = false; 
-		startAnimation(0x9A7020B8, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmStartAction);
-		SetSpriteUpdate(NULL);
-		NextState(callback);
-		return true;
-	}
-	return false;
-}
-
-void Klayman::gotoNextStateExt() {
-	if (_finalizeStateCb) {
-		AnimationCb cb = _finalizeStateCb;
-		_finalizeStateCb = NULL;
-		(this->*cb)();
-	}
-	if (_nextStateCb) {
-		AnimationCb cb = _nextStateCb;
-		_nextStateCb = NULL;
-		(this->*cb)();
-	} else {
-		// Inform the scene that the current Klayman animation sequence has finished
-		sendMessage(_parentScene, 0x1006, 0);
-	}
-}
-
-void Klayman::sub41C770() {
-	_flagFA = false;
-	_status3 = 1;
-}
-
-void Klayman::sub41C790() {
-	if (_flagFA)
-		_status3 = 0;
-}
-
-void Klayman::stTryStandIdle() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTryStandIdle))) {
-		_status2 = 1;
-		_acceptInput = true;
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::upStandIdle);
-		SetMessageHandler(&Klayman::hmLowLevel);
-		SetSpriteUpdate(NULL);
-		_idleCounter = 0;
-		_blinkCounter = 0;
-		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
-	}
-}
-
-void Klayman::upStandIdle() {
-	update();
-	if (++_idleCounter >= 720) {
-		_idleCounter = 0;
-		if (_idleTable) {
-			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1);
-			for (int i = 0; i < _idleTableCount; i++) {
-				if (randomValue < _idleTable[i].value) {
-					(this->*(_idleTable[i].callback))();
-					break;
-				}
-				randomValue -= _idleTable[i].value;
-			}
-		}
-	} else if (++_blinkCounter >= _blinkCounterMax) {
-		_blinkCounter = 0;
-		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-		stIdleBlink();
-	}
-}
-
-uint32 Klayman::hmLowLevel(int messageNum, const MessageParam &param, Entity *sender) {
-	Sprite::handleMessage(messageNum, param, sender);
-	uint32 messageResult = xHandleMessage(messageNum, param);
-	switch (messageNum) {
-	case 0x1008:
-		messageResult = _acceptInput;
-		break;
-	case 0x1014:
-		_attachedSprite = (Sprite*)(param.asEntity());
-		break;
-	case 0x1019:
-		gotoNextStateExt();
-		break;
-	case 0x101C:
-		sub41C770();
-		break;
-	case 0x1021:
-		sub41C790();
-		break;
-	case 0x481C:
-		_status3 = param.asInteger();
-		_flagFA = true;
-		messageResult = 1;
-		break;
-	case 0x482C:
-		if (param.asInteger() != 0) {
-			_pathPoints = _dataResource.getPointArray(param.asInteger());
-		} else {
-			_pathPoints = NULL;
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stIdleBlink() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x5900C41E, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stStandAround);
-}
-
-uint32 Klayman::hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextStateExt();
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stStandAround() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x5420E254, 0, -1);
-	SetUpdateHandler(&Klayman::upStandIdle);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmStartAction(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x271AA210) {
-			playSound(0, 0x4924AAC4);
-		} else if (param.asInteger() == 0x2B22AA81) {
-			playSound(0, 0x0A2AA8E0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-
-void Klayman::startWalkToX(int16 x, bool flag) {
-	int16 xdiff = ABS(x - _x);
-	if (x == _x) {
-		_destX = x;
-		if (!_isWalking && !_isSneaking && !_isLargeStep) {
-			gotoState(NULL);
-			gotoNextStateExt();
-		}
-	} else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) {
-		_destX = x;
-		gotoState(NULL);
-		gotoNextStateExt();
-	} else if (xdiff <= 42 && _status3 != 3) {
-		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
-			_destX = x;
-		} else {
-			_destX = x;
-			GotoState(&Klayman::stSneak);
-		}
-	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
-		_destX = x;
-	} else if (flag) {
-		_destX = x;
-		GotoState(&Klayman::stStartWalkingExt);
-	} else {
-		_destX = x;
-		GotoState(&Klayman::stStartWalking);
-	}
-}
-
-void Klayman::stWakeUp() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0x527AC970, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stSleeping() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x5A38C110, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmSleeping);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmSleeping(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x03060012) {
-			playSound(0, 0xC0238244);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-bool Klayman::stStartAction(AnimationCb callback3) {
-	if (_status2 == 1) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x5C7080D4, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmStartAction);
-		SetSpriteUpdate(&Klayman::suAction);
-		NextState(callback3);
-		return true;
-	} else {
-		_x = _destX;
-		return false;
-	}
-}
-
-void Klayman::suAction() {
-
-	int16 xdiff = _destX - _x;
-
-	if (_doDeltaX) {
-		_x -= _deltaX;
-	} else {
-		_x += _deltaX;
-	}
-	_deltaX = 0;
-	
-	if (_doDeltaY) {
-		_y -= _deltaY;
-	} else {
-		_y += _deltaY;
-	}
-	_deltaY = 0;
-	
-	if (_frameChanged) {
-		if (xdiff > 6)
-			_x += 6;
-		else if (xdiff < -6)
-			_x -= 6;
-		else
-			_x = _destX;				
-	}
-	
-	updateBounds();
-	
-}
-
-void Klayman::suSneaking() {
-	
-	int16 xdiff = _destX - _x;
-	
-	if (_currFrameIndex == 9) {
-		if (xdiff > 26)
-			_deltaX += xdiff - 26;
-		else if (xdiff < -26)			
-			_deltaX -= xdiff + 26;
-	}
-
-	if (xdiff > _deltaX)
-		xdiff = _deltaX;
-	else if (xdiff < -_deltaX)
-		xdiff = -_deltaX;
-	_deltaX = 0;				
-
-	if (_destX != _x) {
-		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
-		_x += xdiff;
-		if (_pathPoints) {
-			walkAlongPathPoints();
-		} else {
-			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
-			if (hitRectNext->type == 0x5002) {
-				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
-			} else if (hitRectNext->type == 0x5003) {
-				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
-			} else if (hitRectPrev->type == 0x5002) {
-				if (xdiff > 0) {
-					_y = hitRectPrev->rect.y2;
-				} else {
-					_y = hitRectPrev->rect.y1;
-				}
-			} else if (hitRectPrev->type == 0x5003) {
-				if (xdiff < 0) {
-					_y = hitRectPrev->rect.y2;
-				} else {
-					_y = hitRectPrev->rect.y1;
-				}
-			}
-		}
-		updateBounds();
-	}
-	
-}
-
-void Klayman::stSneak() {
-	_status2 = 1;
-	_isSneaking = true;
-	_acceptInput = true;
-	setDoDeltaX(_destX < _x ? 1 : 0);
-	startAnimation(0x5C48C506, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmSneaking);
-	SetSpriteUpdate(&Klayman::suSneaking);
-	FinalizeState(&Klayman::evSneakingDone);	
-}
-
-void Klayman::evSneakingDone() {
-	_isSneaking = false;
-}
-
-uint32 Klayman::hmSneaking(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x4924AAC4);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0A2AA8E0);
-		} else if (param.asInteger() == 0x32188010) {
-			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
-		} else if (param.asInteger() == 0x02A2909C) {
-			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
-		}
-		break;
-	case 0x3002:
-		_x = _destX;
-		gotoNextStateExt();
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stStartWalking() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) {
-		_status2 = 0;
-		_isWalking = true;
-		_acceptInput = true;
-		setDoDeltaX(_destX < _x ? 1 : 0);
-		startAnimation(0x242C0198, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		NextState(&Klayman::stWalkingFirst);
-		FinalizeState(&Klayman::evStartWalkingDone);	
-	}
-}
-
-void Klayman::evStartWalkingDone() {
-	_isWalking = false;
-}
-
-uint32 Klayman::hmStartWalking(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101) {
-			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stWalkingFirst() {
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::suWalkingFirst);
-	NextState(&Klayman::stUpdateWalkingFirst);
-	FinalizeState(&Klayman::evStartWalkingDone);	
-}
-
-void Klayman::suWalkingFirst() {
-	SetSpriteUpdate(&Klayman::suWalkingTestExit);
-	_deltaX = 0;
-}
-
-uint32 Klayman::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101) {
-			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stUpdateWalkingFirst() {
-	if (_status3 == 2) {
-		gotoNextStateExt();
-	} else if (_status3 == 3) {
-		stWalkingOpenDoor();
-	} else {
-		_isSneaking = true;
-		_acceptInput = true;
-		if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
-			if (_status3 == 0) {
-				_status2 = 1;
-				startAnimation(0xF234EE31, 0, -1);
-			} else {
-				_status2 = 2;
-				startAnimation(0xF135CC21, 0, -1);
-			}
-		} else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
-			if (_status3 == 0) {
-				_status2 = 1;
-				startAnimation(0x8604A152, 0, -1);
-			} else {
-				_status2 = 2;
-				startAnimation(0xA246A132, 0, -1);
-			}
-		}
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmSneaking);
-		SetSpriteUpdate(&Klayman::suSneaking);
-		FinalizeState(&Klayman::evSneakingDone);	
-	}
-}
-
-void Klayman::suWalkingTestExit() {
-	int16 xdiff = ABS(_destX - _x);
-	int16 xdelta = _destX - _x;
-	
-	if (xdelta > _deltaX)
-		xdelta = _deltaX;
-	else if (xdelta < -_deltaX)
-		xdelta = -_deltaX;
-		
-	_deltaX = 0;		
-
-	if (xdiff == 0 ||
-		(_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) ||
-		(_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) ||
-		(_status3 == 3 && xdiff < 30) ||
-		(_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
-		sendMessage(this, 0x1019, 0);
-	} else {
-		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
-		_x += xdelta;
-		if (_pathPoints) {
-			walkAlongPathPoints();
-		} else {
-			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
-			if (hitRectNext->type == 0x5002) {
-				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
-			} else if (hitRectNext->type == 0x5003) {
-				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
-			} else if (hitRectPrev->type == 0x5002) {
-				_y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
-			} else if (hitRectPrev->type == 0x5003) {
-				_y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
-			} else if (_flagF6 && xdelta != 0) {
-				if (hitRectNext->type == 0x5000) {
-					_y++;
-				} else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) {
-					_y--;
-				}
-			}
-		}
-		updateBounds();
-	}
-	
-}
-
-uint32 Klayman::hmLever(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stPickUpGeneric() {
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	if (!stStartAction(AnimationCallback(&Klayman::stPickUpGeneric))) {
-		_status2 = 1;
-		_acceptInput = false;
-		startAnimation(0x1C28C178, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPickUpObject);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-uint32 Klayman::hmPickUpObject(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0xC1380080) {
-			sendMessage(_attachedSprite, 0x4806, 0);
-			playSound(0, 0x40208200);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x03020231) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0x67221A03) {
-			playSound(0, 0x44051000);
-		} else if (param.asInteger() == 0x2EAE0303) {
-			playSound(0, 0x03630300);
-		} else if (param.asInteger() == 0x61CE4467) {
-			playSound(0, 0x03630300);
-		}
-		break;
-	}
-	return messageResult;
-
-}
-
-void Klayman::stPressButton() {
-	if (!stStartAction(AnimationCallback(&Klayman::stPressButton))) {
-		_status2 = 2;
-		_acceptInput = true;
-		startAnimation(0x1C02B03D, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-uint32 Klayman::hmPressButton(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x0D01B294) {
-			sendMessage(_attachedSprite, 0x480B, 0);
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x4924AAC4);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0A2AA8E0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stPressFloorButton() {
-	if (!stStartAction(AnimationCallback(&Klayman::stPressFloorButton))) {
-		_status2 = 2;
-		_acceptInput = true;
-		startAnimation(0x1C16B033, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void Klayman::stPressButtonSide() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stPressButtonSide))) {
-		_status2 = 1;
-		_acceptInput = true;
-		startAnimation(0x1CD89029, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPressButton);
-		SetSpriteUpdate(&Klayman::suAction);
-	}
-}
-
-void Klayman::startSpecialWalkRight(int16 x) {
-	if (_x == x) {
-		_destX = x;
-		gotoState(NULL);
-		gotoNextStateExt();
-	} else if (_x < x) {
-		startWalkToX(x, false);
-	} else if (_x - x <= 105) {
-		startWalkToXExt(x);
-	} else {
-		startWalkToX(x, false);
-	}
-}
-
-void Klayman::startSpecialWalkLeft(int16 x) {
-	if (x == _x) {
-		_destX = x;
-		gotoState(NULL);
-		gotoNextStateExt();
-	} else if (x < _x) {
-		startWalkToX(x, false);
-	} else if (x - _x <= 105) {
-		startWalkToXExt(x);
-	} else {
-		startWalkToX(x, false);
-	}
-}
-
-void Klayman::startWalkToXSmall(int16 x) {
-	_status3 = 2;
-	if (_x == x) {
-		_destX = x;
-		if (_isWalking) {
-			GotoState(NULL);
-			gotoNextStateExt();
-		}
-	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
-		_destX = x;
-	} else {
-		_destX = x;
-		GotoState(&Klayman::stStartWalkingSmall);
-	}
-}
-
-void Klayman::stStartWalkingSmall() {
-	_isWalking = true;
-	_acceptInput = true;
-	_status3 = 2;
-	setDoDeltaX(_destX < _x ? 1 : 0);
-	startAnimation(0x3A4CD934, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkingSmall);
-	SetSpriteUpdate(&Klayman::suWalkingTestExit);
-	FinalizeState(&Klayman::evStartWalkingDone);
-}
-
-uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101)
-			playSound(0, 0x4924AAC4);
-		else if (param.asInteger() == 0x0A2A9098)
-			playSound(0, 0x0A2AA8E0);
-	}
-	return messageResult;
-}
-
-void Klayman::stStandIdleSmall() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x90D0D1D0, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stWonderAboutAfterSmall() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x11C8D156, 30, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stWonderAboutHalfSmall() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x11C8D156, 0, 10);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stWonderAboutSmall() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x11C8D156, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stWalkToFrontNoStepSmall() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimationByHash(0x3F9CC394, 0x14884392, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x80C110B5)
-			sendMessage(_parentScene, 0x482A, 0);
-		else if (param.asInteger() == 0x110010D1)
-			sendMessage(_parentScene, 0x482B, 0);
-		else if (param.asInteger() == 0x32180101)
-			playSound(0, 0x4924AAC4);
-		else if (param.asInteger() == 0x0A2A9098)
-			playSound(0, 0x0A2AA8E0);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stWalkToFront2Small() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2F1C4694, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stWalkToFrontSmall() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x3F9CC394, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stTurnToBackHalfSmall() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimationByHash(0x37ECD436, 0, 0x8520108C);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stTurnToBackWalkSmall() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x16EDDE36, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stTurnToBackSmall() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x37ECD436, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkFrontBackSmall);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stPullCord() {
-	if (!stStartAction(AnimationCallback(&Klayman::stPullCord))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x3F28E094, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPullReleaseCord);
-		SetSpriteUpdate(NULL);
-		NextState(&Klayman::stReleaseCord);
-	}
-}
-
-void Klayman::stReleaseCord() {
-	_acceptInput = false;
-	startAnimation(0x3A28C094, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmPullReleaseCord);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmPullReleaseCord(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-			sendMessage(_attachedSprite, 0x480F, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stUseTube() {
-	if (!stStartAction(AnimationCallback(&Klayman::stUseTube))) {
-		_status2 = 1;
-		_acceptInput = false;
-		startAnimation(0x1A38A814, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmUseTube);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-uint32 Klayman::hmUseTube(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x02B20220)
-			playSound(0, 0xC5408620);
-		else if (param.asInteger() == 0x0A720138)
-			playSound(0, 0xD4C08010);
-		else if (param.asInteger() == 0x03020231)
-			playSound(0, 0xD4C08010);
-		else if (param.asInteger() == 0xB613A180)
-			playSound(0, 0x44051000);
-		else if (param.asInteger() == 0x67221A03)
-			playSound(0, 0x44051000);
-		else if (param.asInteger() == 0x038A010B)
-			playSound(0, 0x00018040);
-		else if (param.asInteger() == 0x422B0280)
-			playSound(0, 0x166FC6E0);
-		else if (param.asInteger() == 0x925A0C1E)
-			playSound(0, 0x40E5884D);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stWalkingFirstExt() {
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x5A2CBC00, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::suWalkingFirst);
-	NextState(&Klayman::stUpdateWalkingFirst);
-	FinalizeState(&Klayman::evStartWalkingDone);
-}
-
-void Klayman::stStartWalkingExt() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalkingExt))) {
-		_status2 = 0;
-		_isWalking = true;
-		_acceptInput = true;
-		setDoDeltaX(_destX < _x ? 1 : 0);
-		startAnimation(0x272C1199, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmStartWalking);
-		SetSpriteUpdate(&Klayman::suWalkingTestExit);
-		NextState(&Klayman::stWalkingFirstExt);
-		FinalizeState(&Klayman::evStartWalkingDone);
-	}
-}
-
-void Klayman::sub41CC40(int16 x1, int16 x2) {
-	if (_x > x1) {
-		if (_x == x1 + x2) {
-			_destX = x1 + x2;
-			gotoState(NULL);
-			gotoNextStateExt();
-		} else if (_x < x1 + x2) {
-			startWalkToXExt(x1 + x2);
-		} else {
-			startWalkToX(x1 + x2, false);
-		}
-	} else {
-		if (_x == x1 - x2) {
-			_destX = x1 - x2;
-			gotoState(NULL);
-			gotoNextStateExt();
-		} else if (_x > x1 - x2) {
-			startWalkToXExt(x1 - x2);
-		} else {
-			startWalkToX(x1 - x2, false);
-		}
-	}
-}
-
-void Klayman::startWalkToXExt(int16 x) {
-	int16 xdiff = ABS(x - _x);
-	if (x == _x) {
-		_destX = x;
-		if (!_isWalking && !_isSneaking && !_isLargeStep) {
-			gotoState(NULL);
-			gotoNextStateExt();
-		}
-	} else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) {
-		_destX = x;
-		gotoState(NULL);
-		gotoNextStateExt();
-	} else if (xdiff <= 42 && _status3 != 3) {
-		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
-			_destX = x;
-		} else {
-			_destX = x;
-			GotoState(&Klayman::stSneak);
-		}
-	} else if (_isLargeStep && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
-		_destX = x;
-	} else {
-		_destX = x;
-		GotoState(&Klayman::stLargeStep);
-	}
-}
-
-void Klayman::stLargeStep() {
-	_status2 = 2;
-	_isLargeStep = true;
-	_acceptInput = true;
-	setDoDeltaX(_destX >= _x ? 1 : 0);
-	startAnimation(0x08B28116, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLargeStep);
-	SetSpriteUpdate(&Klayman::suLargeStep);
-	FinalizeState(&Klayman::evLargeStepDone);	
-}
-
-void Klayman::evLargeStepDone() {
-	_isLargeStep = false;
-}
-
-void Klayman::suLargeStep() {
-	int16 xdiff = _destX - _x;
-	
-	if (_doDeltaX) {
-		_deltaX = -_deltaX;
-	}
-	
-	if (_currFrameIndex == 7) {
-		_deltaX = xdiff;
-	}
-
-	if ((xdiff > 0 && xdiff > _deltaX) || (xdiff < 0 && xdiff < _deltaX))
-		xdiff = _deltaX;
-
-	_deltaX = 0;
-	
-	if (_x != _destX) {
-		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
-		_x += xdiff;
-		if (_pathPoints) {
-			walkAlongPathPoints();
-		} else {
-			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
-			if (hitRectNext->type == 0x5002) {
-				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
-			} else if (hitRectNext->type == 0x5003) {
-				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
-			} else if (hitRectPrev->type == 0x5002) {
-				_y = xdiff > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
-			} else if (hitRectPrev->type == 0x5003) {
-				_y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
-			}
-		}
-		updateBounds();
-	}
-}
-
-uint32 Klayman::hmLargeStep(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x4924AAC4);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0A2AA8E0);
-		}
-		break;
-	case 0x3002:
-		_x = _destX;
-		gotoNextStateExt();
-		break;		
-	}
-	return messageResult;
-}
-
-void Klayman::stWonderAboutHalf() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xD820A114, 0, 10);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stWonderAboutAfter() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0xD820A114, 30, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stTurnToUseHalf() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x9B250AD2, 0, 7);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmTurnToUse);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x4924AAC4);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0A2AA8E0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stTurnAwayFromUse() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x98F88391, 4, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmTurnToUse);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stWonderAbout() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0xD820A114, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stPeekWall() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0xAC20C012, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmPeekWall);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmPeekWall(int messageNum, const MessageParam &param, Entity *sender) {
-	int16 speedUpFrameIndex;
-	switch (messageNum) {
-	case 0x1008:
-		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_currFrameIndex < speedUpFrameIndex)
-			startAnimation(0xAC20C012, speedUpFrameIndex, -1);
-		return 0;
-	case 0x100D:
-		if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0460E2FA);
-		}
-		break;
-	}
-	return hmLowLevelAnimation(messageNum, param, sender);
-}
-
-void Klayman::stJumpToRing1() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing1))) {
-		_status2 = 0;
-		startAnimation(0xD82890BA, 0, -1);
-		setupJumpToRing();
-	}
-}
-
-void Klayman::setupJumpToRing() {
-	_acceptInput = false;
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmJumpToRing);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	NextState(&Klayman::stHangOnRing);
-	sendMessage(_attachedSprite, 0x482B, 0);
-}
-
-uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x168050A0) {
-			sendMessage(_attachedSprite, 0x4806, 0);
-			_acceptInput = true;
-		} else if (param.asInteger() == 0x320AC306) {
-			playSound(0, 0x5860C640);
-		} else if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::suUpdateDestX() {
-	AnimatedSprite::updateDeltaXY();
-	_destX = _x;
-}
-
-void Klayman::stHangOnRing() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x4829E0B8, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stJumpToRing2() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing2))) {
-		_status2 = 0;
-		startAnimation(0x900980B2, 0, -1);
-		setupJumpToRing();
-	}
-}
-
-void Klayman::stJumpToRing3() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing3))) {
-		_status2 = 0;
-		_acceptInput = false;
-		startAnimation(0xBA1910B2, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-		SetMessageHandler(&Klayman::hmJumpToRing3);
-		NextState(&Klayman::stHoldRing3);
-		sendMessage(_attachedSprite, 0x482B, 0);
-	}
-}
-
-uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x168050A0) {
-			sendMessage(_attachedSprite, 0x4806, 0);
-		} else if (param.asInteger() == 0x320AC306) {
-			playSound(0, 0x5860C640);
-		} else if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stHoldRing3() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x4A293FB0, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmHoldRing3);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmHoldRing3(int messageNum, const MessageParam &param, Entity *sender) {
-	if (messageNum == 0x1008) {
-		stReleaseRing();
-		return 0;
-	}
-	return hmLowLevel(messageNum, param, sender);
-}
-
-void Klayman::stReleaseRing() {
-	_status2 = 1;
-	_acceptInput = false;
-	sendMessage(_attachedSprite, 0x4807, 0);
-	_attachedSprite = NULL;
-	startAnimation(0xB869A4B9, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stJumpToRing4() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing4))) {
-		_status2 = 0;
-		startAnimation(0xB8699832, 0, -1);
-		setupJumpToRing();
-	}
-}
-
-void Klayman::sub41CCE0(int16 x) {
-	sub41CC40(_attachedSprite->getX(), x);
-}
-
-void Klayman::stContinueClimbLadderUp() {
-	_status2 = 0;
-	_acceptInput = true;
-	_ladderStatus = 3;
-	startAnimationByHash(0x3A292504, 0x01084280, 0);
-	_newStickFrameHash = 0x01084280;
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-	gotoNextStateExt();
-}
-
-void Klayman::stStartClimbLadderDown() {
-	if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderDown))) {
-		_status2 = 0;
-		if (_destY < _y) {
-			if (_ladderStatus == 1) {
-				_ladderStatus = 2;
-				stClimbLadderHalf();
-			} else {
-				gotoNextStateExt();
-			}
-		} else if (_ladderStatus == 0) {
-			_ladderStatus = 2;
-			_acceptInput = false;
-			startAnimation(0x122D1505, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
-		} else if (_ladderStatus == 3) {
-			_ladderStatus = 2;
-			_acceptInput = true;
-			startAnimationByHash(0x122D1505, 0x01084280, 0);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
-		} else if (_ladderStatus == 1) {
-			_ladderStatus = 2;
-			_acceptInput = true;
-			startAnimation(0x122D1505, 29 - _currFrameIndex, -1);
-		} 
-	}
-}
-
-void Klayman::stClimbLadderHalf() {
-	_status2 = 2;
-	if (_ladderStatus == 1) {
-		_ladderStatus = 0;
-		_acceptInput = false;
-		startAnimationByHash(0x3A292504, 0x02421405, 0);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmClimbLadderHalf);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	} else if (_ladderStatus == 2) {
-		_ladderStatus = 0;
-		_acceptInput = false;
-		startAnimationByHash(0x122D1505, 0x02421405, 0);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmClimbLadderHalf);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	} else {
-		gotoNextStateExt();
-	}
-}
-
-uint32 Klayman::hmClimbLadderHalf(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x489B025C) {
-			playSound(0, 0x52C4C2D7);
-		} else if (param.asInteger() == 0x400A0E64) {
-			playSound(0, 0x50E081D9);
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0460E2FA);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x01084280) {
-			_acceptInput = true;
-		} else if (param.asInteger() == 0x489B025C) {
-			playSound(0, 0x52C4C2D7);
-		} else if (param.asInteger() == 0x400A0E64) {
-			playSound(0, 0x50E081D9);
-		} else if (param.asInteger() == 0x02421405) {
-			if (_ladderStatus == 1) {
-				startAnimationByHash(0x3A292504, 0x01084280, 0);
-				if (_destY >= _y - 30)
-					sendMessage(this, 0x1019, 0);
-			} else {
-				startAnimationByHash(0x122D1505, 0x01084280, 0);
-				if (_destY <= _y)
-					sendMessage(this, 0x1019, 0);
-			}
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stStartClimbLadderUp() {
-	if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderUp))) {
-		_status2 = 0;
-		if (_destY >= _y - 30) {
-			gotoNextStateExt();
-		} else if (_ladderStatus == 0) {
-			_ladderStatus = 1;
-			_acceptInput = false;
-			startAnimation(0x3A292504, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
-		} else if (_ladderStatus == 3) {
-			_ladderStatus = 1;
-			_acceptInput = true;
-			startAnimationByHash(0x3A292504, 0x01084280, 0);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmClimbLadderUpDown);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
-		} else if (_ladderStatus == 2) {
-			_ladderStatus = 1;
-			_acceptInput = true;
-			startAnimation(0x3A292504, 29 - _currFrameIndex, -1);
-		}
-	}
-}
-
-void Klayman::stWalkToFrontNoStep() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimationByHash(0xF229C003, 0x14884392, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalkToFront);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x80C110B5) {
-			sendMessage(_parentScene, 0x482A, 0);
-		} else if (param.asInteger() == 0x110010D1) {
-			sendMessage(_parentScene, 0x482B, 0);
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stWalkToFront() {
-	if (!stStartAction(AnimationCallback(&Klayman::stWalkToFront))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0xF229C003, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stTurnToFront() {
-	if (!stStartAction(AnimationCallback(&Klayman::stTurnToFront))) {
-		_status2 = 0;
-		_acceptInput = false;
-		startAnimationByHash(0xCA221107, 0, 0x8520108C);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stTurnToBack() {
-	if (!stStartAction(AnimationCallback(&Klayman::stTurnToBack))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0xCA221107, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmWalkToFront);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stLandOnFeet() {
-	_status2 = 1;
-	_acceptInput = true;
-	startAnimation(0x18118554, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLandOnFeet);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x320AC306) {
-			playSound(0, 0x5860C640);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stTurnToBackToUse() {
-	if (!stStartAction(AnimationCallback(&Klayman::stTurnToBackToUse))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x91540140, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmTurnToBackToUse);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0xC61A0119) {
-			playSound(0, 0x402338C2);
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x4924AAC4);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0A2AA8E0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stClayDoorOpen() {
-	if (!stStartAction(AnimationCallback(&Klayman::stClayDoorOpen))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x5CCCB330, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmClayDoorOpen);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-uint32 Klayman::hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x040D4186) {
-			sendMessage(_attachedSprite, 0x4808, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stTurnToUse() {
-	if (!stStartAction(AnimationCallback(&Klayman::stTurnToUse))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x9B250AD2, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmTurnToUse);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stReturnFromUse() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimation(0x98F88391, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmTurnToUse);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stWalkingOpenDoor() {
-	_isWalkingOpenDoorNotified = false;
-	_acceptInput = false;
-	startAnimation(0x11A8E012, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmStartWalking);
-	SetSpriteUpdate(&Klayman::suWalkingOpenDoor);
-}
-
-void Klayman::suWalkingOpenDoor() {
-	if (!_isWalkingOpenDoorNotified && ABS(_destX - _x) < 80) {
-		sendMessage(_parentScene, 0x4829, 0);
-		_isWalkingOpenDoorNotified = true;
-	}
-	AnimatedSprite::updateDeltaXY();
-}
-
-void Klayman::stMoveObjectSkipTurnFaceObject() {
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	_isMoveObjectRequested = false;
-	_acceptInput = true;
-	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	SetMessageHandler(&Klayman::hmMoveObjectTurn);
-}
-
-void Klayman::evMoveObjectTurnDone() {
-	sendMessage(_attachedSprite, 0x4807, 0);
-}
-
-uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x01084280) {
-			sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
-		} else if (param.asInteger() == 0x02421405) {
-			if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
-				stMoveObjectSkipTurn();
-			} else {
-				FinalizeState(&Klayman::evMoveObjectTurnDone);
-				SetMessageHandler(&Klayman::hmLowLevelAnimation);
-			}
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0460E2FA);
-		}
-		break;
-	case 0x480A:
-		_isMoveObjectRequested = true;
-		return 0;		
-	}
-	return hmLowLevelAnimation(messageNum, param, sender);
-}
-
-void Klayman::stMoveObjectSkipTurn() {
-	_isMoveObjectRequested = false;
-	_acceptInput = true;
-	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	SetMessageHandler(&Klayman::hmMoveObjectTurn);
-}
-
-void Klayman::stMoveObjectFaceObject() {
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) {
-		_status2 = 2;
-		_isMoveObjectRequested = false;
-		_acceptInput = true;
-		startAnimation(0x0C1CA072, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmMoveObjectTurn);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stUseLever() {
-	if (!stStartAction(AnimationCallback(&Klayman::stUseLever))) {
-		_status2 = 0;
-		if (_isLeverDown) {
-			stUseLeverRelease();
-		} else {
-			sendMessage(_attachedSprite, 0x482B, 0);
-			startAnimation(0x0C303040, 0, -1);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
-			SetMessageHandler(&Klayman::hmLever);
-			SetUpdateHandler(&Klayman::update);
-			NextState(&Klayman::stPullLeverDown);
-			_acceptInput = false;
-		}
-	}
-}
-
-// Exactly the same code as sub420DA0 which was removed
-void Klayman::stPullLeverDown() {
-	startAnimation(0x0D318140, 0, -1);
-	sendMessage(_attachedSprite, 0x480F, 0);
-	NextState(&Klayman::stHoldLeverDown);
-}
-
-void Klayman::stHoldLeverDown() {
-	startAnimation(0x4464A440, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	_isLeverDown = true;
-	_acceptInput = true;
-}
-
-void Klayman::stUseLeverRelease() {
-	startAnimation(0x09018068, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLever);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	sendMessage(_attachedSprite, 0x4807, 0);
-	NextState(&Klayman::stPullLeverDown);
-	_acceptInput = false;
-}
-
-void Klayman::stReleaseLever() {
-	if (_isLeverDown) {
-		_status2 = 2;
-		startAnimation(0x09018068, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmLever);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-		sendMessage(_attachedSprite, 0x4807, 0);
-		NextState(&Klayman::stLetGoOfLever);
-		_acceptInput = false;
-		_isLeverDown = false;
-	} else {
-		gotoNextStateExt();
-	}
-}
-
-void Klayman::stLetGoOfLever() {
-	startAnimation(0x0928C048, 0, -1);
-	FinalizeState(&Klayman::evLeverReleasedEvent);
-}
-
-void Klayman::evLeverReleasedEvent() {
-	sendMessage(_attachedSprite, 0x482A, 0);
-}
-
-void Klayman::stInsertDisk() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) {
-		_status2 = 2;
-		_tapesToInsert = 0;
-		for (uint32 i = 0; i < 20; i++) {
-			if (getSubVar(VA_HAS_TAPE, i)) {
-				setSubVar(VA_IS_TAPE_INSERTED, i, 1);
-				setSubVar(VA_HAS_TAPE, i, 0);
-				_tapesToInsert++;
-			}
-		}
-		if (_tapesToInsert == 0) {
-			GotoState(NULL);
-			gotoNextStateExt();
-		} else {
-			startAnimation(0xD8C8D100, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmInsertDisk);
-			SetSpriteUpdate(&Klayman::suAction);
-			_acceptInput = false;
-			_tapesToInsert--;
-		}
-	}
-}
-
-uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) {
-			nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
-		} else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
-			_tapesToInsert--;
-			startAnimationByHash(0xD8C8D100, 0x01084280, 0);
-		} else if (param.asInteger() == 0x062A1510) {
-			playSound(0, 0x41688704);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			playSound(0, 0x44051000);
-		} else if (param.asInteger() == 0x0E040501) {
-			playSound(1, 0xC6A129C1);
-		}
-	}
-	return messageResult;
-}
-
-void Klayman::walkAlongPathPoints() {
-	if (_x <= (*_pathPoints)[0].x)
-		_y = (*_pathPoints)[0].y;
-	else if (_x >= (*_pathPoints)[_pathPoints->size() - 1].x)
-		_y = (*_pathPoints)[_pathPoints->size() - 1].y;
-	else {
-		int16 deltaX = _x - (*_pathPoints)[0].x, deltaXIncr = 0;
-		uint index = 0;
-		while (deltaX > 0) {
-			NPoint pt2 = (*_pathPoints)[index];
-			NPoint pt1 = index + 1 >= _pathPoints->size() ? (*_pathPoints)[0] : (*_pathPoints)[index + 1];
-			int16 xd = ABS(pt1.x - pt2.x);
-			int16 yd = ABS(pt1.y - pt2.y);
-			if (deltaX + deltaXIncr >= xd) {
-				deltaX -= xd;
-				deltaX += deltaXIncr;
-				++index;
-				if (index >= _pathPoints->size())
-					index = 0;
-				_y = (*_pathPoints)[index].y;
-			} else {
-				deltaXIncr += deltaX;
-				if (pt1.y >= pt2.y) {
-					_y = pt2.y + (yd * deltaXIncr) / xd;
-				} else {
-					_y = pt2.y - (yd * deltaXIncr) / xd;
-				}
-				deltaX = 0;
-			}
-		}
-	}
-}
-
-void Klayman::stJumpToGrab() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimationByHash(0x00AB8C10, 0x01084280, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suJumpToGrab);
-	SetMessageHandler(&Klayman::hmJumpToGrab);
-}
-
-void Klayman::suJumpToGrab() {
-	updateDeltaXY();
-	if (_y >= _destY) {
-		_y = _destY;
-		updateBounds();
-		gotoNextStateExt();
-	}
-}
-
-uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x168050A0)
-			sendMessage(_attachedSprite, 0x4806, 0);
-		else if (param.asInteger() == 0x320AC306)
-			startAnimationByHash(0x00AB8C10, 0x01084280, 0);
-		else if (param.asInteger() == 0x4AB28209)
-			sendMessage(_attachedSprite, 0x482A, 0);
-		else if (param.asInteger() == 0x88001184)
-			sendMessage(_attachedSprite, 0x482B, 0);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stFinishGrow() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimation(0x38445000, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::hmFinishGrow);
-}
-
-uint32 Klayman::hmFinishGrow(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x040C4C01)
-			playSound(0, 0x01E11140);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stTurnToUseExt() {
-	if (!stStartAction(AnimationCallback(&Klayman::stTurnToUseExt))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x1B3D8216, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmTurnToUse);
-		SetSpriteUpdate(&Klayman::suUpdateDestX);
-	}
-}
-
-void Klayman::stJumpToGrabFall() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpToGrabFall))) {
-		_status2 = 0;
-		_acceptInput = false;
-		startAnimation(0x00AB8C10, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmJumpToGrab);
-		SetSpriteUpdate(&Klayman::suJumpToGrab);
-		sendMessage(_attachedSprite, 0x482B, 0);
-	}
-}
-
-void Klayman::stJumpToGrabRelease() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimationByHash(0x00AB8C10, 0x320AC306, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmJumpToGrabRelease);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stReleaseRing);
-}
-
-uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x320AC306)
-			playSound(0, 0x5860C640);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stDoIdleTeleporterHands() {
-	startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::stIdleTeleporterHands));
-}
-
-void Klayman::stIdleTeleporterHands() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x90EF8D38, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stSitIdleTeleporterBlinkSecond);
-}
-
-void Klayman::stDoIdleTeleporterHands2() {
-	startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::stIdleTeleporterHands2));
-}
-
-void Klayman::stIdleTeleporterHands2() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0x900F0930, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stSitIdleTeleporterBlinkSecond);
-}
-
-void Klayman::teleporterAppear(uint32 fileHash) {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(fileHash, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmTeleporterAppearDisappear);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::teleporterDisappear(uint32 fileHash) {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(fileHash, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmTeleporterAppearDisappear);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4E0A2C24) {
-			playSound(0, 0x85B10BB8);
-		} else if (param.asInteger() == 0x4E6A0CA0) {
-			playSound(0, 0xC5B709B0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x80C110B5)
-			sendMessage(_parentScene, 0x482A, 0);
-		else if (param.asInteger() == 0x33288344)
-			playSound(2, 0x10688664);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stShrink() {
-	_status2 = 0;
-	_acceptInput = false;
-	playSound(0, 0x4C69EA53);
-	startAnimation(0x1AE88904, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmShrink);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-void Klayman::stStandWonderAbout() {
-	if (_x > 260)
-		setDoDeltaX(1);
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xD820A114, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-	_newStickFrameIndex = 10;
-}
-
-uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1008:
-		if (_potionFlag1) {
-			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
-			messageResult = 0;
-		} else
-			_potionFlag2 = true;
-		break;
-	case 0x100D:
-		if (param.asInteger() == 0x0002418E)
-			sendMessage(_parentScene, 0x2000, 0);
-		else if (param.asInteger() == 0x924090C2) {
-			_potionFlag1 = true;
-			if (_potionFlag2) {
-				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
-				messageResult = 0;
-			}
-		} else if (param.asInteger() == 0x004A2148)
-			_potionFlag1 = false;
-		else if (param.asInteger() == 0x02B20220)
-			playSound(0, 0xC5408620);
-		else if (param.asInteger() == 0x0A720138)
-			playSound(0, 0xD4C08010);
-		else if (param.asInteger() == 0x03020231)
-			playSound(0, 0xD4C08010);
-		else if (param.asInteger() == 0xB613A180)
-			playSound(0, 0x44051000);
-		else if (param.asInteger() == 0x67221A03)
-			playSound(0, 0x44051000);
-		else if (param.asInteger() == 0x038A010B)
-			playSound(0, 0x00018040);
-		else if (param.asInteger() == 0x422B0280)
-			playSound(0, 0x166FC6E0);
-		else if (param.asInteger() == 0x925A0C1E)
-			playSound(0, 0x40E5884D);
-		else if (param.asInteger() == 0x000F0082)
-			playSound(0, 0x546CDCC1);
-		else if (param.asInteger() == 0x00020814)
-			playSound(0, 0x786CC6D0);
-		else if (param.asInteger() == 0x06020500)
-			playSound(0, 0x1069C0E1);
-		else if (param.asInteger() == 0x02128C00)
-			playSound(0, 0x5068C4C3);
-		else if (param.asInteger() == 0x82022030)
-			playSound(0, 0x5C48C0E8);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x32180101)
-			playSound(0, 0x405002D8);
-		else if (param.asInteger() == 0x0A2A9098)
-			playSound(0, 0x0460E2FA);
-		else if (param.asInteger() == 0xD00A0C0C)
-			playSound(3);
-		else if (param.asInteger() == 0x04121920)
-			playSound(4);
-		else if (param.asInteger() == 0x030B4480)
-			playSound(5);
-		else if (param.asInteger() == 0x422B0280)
-			playSound(6);
-		else if (param.asInteger() == 0x038A010B)
-			playSound(7);
-		else if (param.asInteger() == 0x67221A03)
-			playSound(0, 0x44051000);
-		else if (param.asInteger() == 0x02B20220)
-			playSound(0, 0xC5408620);
-		else if (param.asInteger() == 0x925A0C1E)
-			playSound(0, 0x40E5884D);
-		else if (param.asInteger() == 0x03020231)
-			playSound(0, 0xD4C08010);
-		else if (param.asInteger() == 0x08040840)
-			setDoDeltaX(2);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stGrow() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2838C010, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmGrow);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-void Klayman::stDrinkPotion() {
-	_status2 = 1;
-	_acceptInput = false;
-	_potionFlag1 = false;
-	_potionFlag2 = false;
-	startAnimation(0x1C388C04, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmDrinkPotion);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-uint32 Klayman::hmInsertKey(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (_keysToInsert == 0 && param.asInteger() == 0x06040580) {
-			nextAnimationByHash(0xDC409440, 0x46431401, 0);
-		} else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) {
-			_keysToInsert--;
-			startAnimationByHash(0xDC409440, 0x01084280, 0);
-		} else if (param.asInteger() == 0x062A1510) {
-			playSound(0, 0x41688704);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			playSound(0, 0x44051000);
-		} else if (param.asInteger() == 0x0E4C8141) {
-			playSound(0, 0xDC4A1280);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stInsertKey() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertKey))) {
-		_status2 = 2;
-		_keysToInsert = 0;
-		for (uint32 i = 0; i < 3; i++) {
-			if (getSubVar(VA_HAS_KEY, i)) {
-				bool more;
-				setSubVar(VA_IS_KEY_INSERTED, i, 1);
-				setSubVar(VA_HAS_KEY, i, 0);
-				do {
-					more = false;
-					setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
-					for (uint j = 0; j < i && !more; j++) {
-						if (getSubVar(VA_IS_KEY_INSERTED, j) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i))
-							more = true;
-					}
-					if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i))
-						more = true;
-				} while (more);
-				_keysToInsert++;
-			} 
-		}
-		if (_keysToInsert == 0) {
-			GotoState(NULL);
-			gotoNextStateExt();
-		} else {
-			_acceptInput = false;
-			startAnimation(0xDC409440, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmInsertKey);
-			SetSpriteUpdate(&Klayman::suAction);
-			_keysToInsert--;
-		}
-	}
-}
-
-uint32 Klayman::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x04684052) {
-			_acceptInput = true;
-			sendMessage(_parentScene, 0x2002, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stReadNote() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimation(0x123E9C9F, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmReadNote);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-uint32 Klayman::hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	int16 speedUpFrameIndex;
-	switch (messageNum) {
-	case 0x1008:
-		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_currFrameIndex < speedUpFrameIndex) {
-			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
-			_y = 438;
-		}
-		messageResult = 0;
-		break;
-	case 0x100D:
-		if (param.asInteger() == 0x1A1A0785) {
-			playSound(0, 0x40F0A342);
-		} else if (param.asInteger() == 0x60428026) {
-			playSound(0, 0x40608A59);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stHitByDoor() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0x35AA8059, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmHitByDoor);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	playSound(0, 0x402E82D4);
-}
-
-uint32 Klayman::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == calcHash("PopBalloon")) {
-			sendMessage(_parentScene, 0x2000, 0);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			playSound(0, 0x44051000);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::upPeekWallBlink() {
-	Klayman::update();
-	_blinkCounter++;
-	if (_blinkCounter >= _blinkCounterMax)
-		stPeekWallBlink();
-}
-
-void Klayman::stPeekWall1() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xAC20C012, 8, 37);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stPeekWallBlink);
-}
-
-void Klayman::stPeekWall2() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0xAC20C012, 43, 49);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-}
-
-void Klayman::stPeekWallBlink() {
-	_blinkCounter = 0;
-	_status2 = 0;
-	_acceptInput = true;
-	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
-	startAnimation(0xAC20C012, 38, 42);
-	SetUpdateHandler(&Klayman::upPeekWallBlink);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	_newStickFrameIndex = 42;
-}
-
-void Klayman::stPeekWallReturn() {
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x2426932E, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmPeekWallReturn);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stPullHammerLever() {
-	if (!stStartAction(AnimationCallback(&Klayman::stPullHammerLever))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x00648953, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmPullHammerLever);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	}
-}
-
-uint32 Klayman::hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::hmLever(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209)
-			sendMessage(_attachedSprite, 0x480F, 0);
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::suRidePlatformDown() {
-	_platformDeltaY++;
-	_y += _platformDeltaY;
-	if (_y > 600)
-		sendMessage(this, 0x1019, 0);
-}
-
-void Klayman::stRidePlatformDown() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatformDown))) {
-		_status2 = 1;
-		sendMessage(_parentScene, 0x4803, 0);
-		_acceptInput = false;
-		_platformDeltaY = 0;
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmLowLevel);
-		SetSpriteUpdate(&Klayman::suRidePlatformDown);
-		_vm->_soundMan->playSoundLooping(0xD3B02847);
-	}
-}
-
-void Klayman::stCrashDown() {
-	playSound(0, 0x41648271);
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimationByHash(0x000BAB02, 0x88003000, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	NextState(&Klayman::stCrashDownFinished);
-}
-
-void Klayman::stCrashDownFinished() {
-	setDoDeltaX(2);
-	stTryStandIdle();
-}
-
-void Klayman::upSpitOutFall() {
-	Klayman::update();
-	if (_countdown1 != 0 && (--_countdown1 == 0)) {
-		_surface->setVisible(true);
-		SetUpdateHandler(&Klayman::update);
-	}
-}
-
-uint32 Klayman::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x168050A0) {
-			sendMessage(_attachedSprite, 0x480F, 0);
-		} else if (param.asInteger() == 0x586B0300) {
-			sendMessage(_otherSprite, 0x480E, 1);
-		} else if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x4811:
-		playSound(0, 0x5252A0E4);
-		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
-		if (_doDeltaX) {
-			_x = ((Sprite*)sender)->getX() - 75;
-		} else {
-			_x = ((Sprite*)sender)->getX() + 75;
-		}
-		_y = ((Sprite*)sender)->getY() - 200;
-		if (param.asInteger() == 0) {
-			stSpitOutFall0();
-		} else if (param.asInteger() == 1) {
-			// NOTE This is never used and the code was removed
-			// Also the animations used here in the original don't exist...
-		} else if (param.asInteger() == 2) {
-			stSpitOutFall2();
-		}
-		break;
-	}
-	return 0;
-}
-
-uint32 Klayman::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x942D2081) {
-			_acceptInput = false;
-			sendMessage(_attachedSprite, 0x2003, 0);
-		} else if (param.asInteger() == 0xDA600012) {
-			stHitByBoxingGlove();
-		} else if (param.asInteger() == 0x0D01B294) {
-			_acceptInput = false;
-			sendMessage(_attachedSprite, 0x480B, 0);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x01084280) {
-			sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX);
-		} else if (param.asInteger() == 0x02421405) {
-			if (_isMoveObjectRequested) {
-				if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0)
-					stContinueMovingVenusFlyTrap();
-			} else {
-				SetMessageHandler(&Klayman::hmFirstMoveVenusFlyTrap);
-			}
-		} else if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0460E2FA);
-		}
-		break;
-	case 0x480A:
-		_isMoveObjectRequested = true;
-		return 0;
-	}
-	return hmLowLevelAnimation(messageNum, param, sender);
-}
-
-uint32 Klayman::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_attachedSprite, 0x482A, 0);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_attachedSprite, 0x482B, 0);
-		} else if (param.asInteger() == 0x32180101) {
-			playSound(0, 0x405002D8);
-		} else if (param.asInteger() == 0x0A2A9098) {
-			playSound(0, 0x0460E2FA);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
-	int16 speedUpFrameIndex;
-	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1008:
-		speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash);
-		if (_currFrameIndex < speedUpFrameIndex) {
-			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
-			_y = 435;
-		}
-		messageResult = 0;
-		break;
-	case 0x100D:
-		if (param.asInteger() == 0x1A1A0785) {
-			playSound(0, 0x40F0A342);
-		} else if (param.asInteger() == 0x60428026) {
-			playSound(0, 0x40608A59);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Klayman::hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmLowLevel(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x1307050A) {
-			playSound(0, 0x40428A09);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::suFallDown() {
-	AnimatedSprite::updateDeltaXY();
-	HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
-	if (hitRect->type == 0x5001) {
-		_y = hitRect->rect.y1;
-		updateBounds();
-		sendMessage(this, 0x1019, 0);
-	}
-	_parentScene->checkCollision(this, 0xFFFF, 0x4810, 0);
-}
-
-void Klayman::stJumpToRingVenusFlyTrap() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpToRingVenusFlyTrap))) {
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0x584984B4, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmJumpToRingVenusFlyTrap);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		NextState(&Klayman::stLandOnFeet);
-		sendMessage(_attachedSprite, 0x482B, 0);
-	}
-}
-
-void Klayman::stStandIdleSpecial() {
-	playSound(0, 0x56548280);
-	_status2 = 0;
-	_acceptInput = false;
-	_surface->setVisible(false);
-	startAnimation(0x5420E254, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmStandIdleSpecial);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stSpitOutFall0() {
-	_countdown1 = 1;
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x000BAB02, 0, -1);
-	SetUpdateHandler(&Klayman::upSpitOutFall);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(&Klayman::suFallDown);
-	NextState(&Klayman::stFalling);
-	sendMessage(_parentScene, 0x8000, 0);
-}
-
-void Klayman::stSpitOutFall2() {
-	_countdown1 = 1;
-	_status2 = 0;
-	_acceptInput = false;
-	startAnimation(0x9308C132, 0, -1);
-	SetUpdateHandler(&Klayman::upSpitOutFall);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(&Klayman::suFallDown);
-	NextState(&Klayman::stFalling);
-	sendMessage(_parentScene, 0x8000, 0);
-}
-
-void Klayman::stFalling() {
-	sendMessage(_parentScene, 0x1024, 1);
-	playSound(0, 0x41648271);
-	_status2 = 1;
-	_acceptInput = false;
-	_isWalking = false;
-	startAnimationByHash(0x000BAB02, 0x88003000, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(NULL);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	NextState(&Klayman::stFallTouchdown);
-	sendMessage(_parentScene, 0x2002, 0);
-	_attachedSprite = NULL;
-	sendMessage(_parentScene, 0x8001, 0);
-}
-
-void Klayman::stFallTouchdown() {
-	setDoDeltaX(2);
-	stTryStandIdle();
-}
-
-void Klayman::stJumpAndFall() {
-	if (!stStartAction(AnimationCallback(&Klayman::stJumpAndFall))) {
-		sendMessage(_parentScene, 0x1024, 3);
-		_status2 = 2;
-		_acceptInput = false;
-		startAnimation(0xB93AB151, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmJumpAndFall);
-		SetSpriteUpdate(&Klayman::suFallDown);
-		NextState(&Klayman::stLandOnFeet);
-	}
-}
-
-void Klayman::stDropFromRing() {
-	if (_attachedSprite) {
-		_x = _attachedSprite->getX();
-		sendMessage(_attachedSprite, 0x4807, 0);
-		_attachedSprite = NULL;
-	}
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimation(0x586984B1, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(&Klayman::suFallDown);
-	NextState(&Klayman::stLandOnFeet);
-}
-
-void Klayman::stPressDoorButton() {
-	_status2 = 2;
-	_acceptInput = true;
-	setDoDeltaX(0);
-	startAnimation(0x1CD89029, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmPressDoorButton);
-	SetSpriteUpdate(&Klayman::suAction);
-}
-
-void Klayman::stHitByBoxingGlove() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0x35AA8059, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmHitByBoxingGlove);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	FinalizeState(&Klayman::evHitByBoxingGloveDone);
-}
-
-void Klayman::evHitByBoxingGloveDone() {
-	sendMessage(_parentScene, 0x1024, 1);
-}
-
-void Klayman::stMoveVenusFlyTrap() {
-	if (!stStartAction(AnimationCallback(&Klayman::stMoveVenusFlyTrap))) {
-		_status2 = 2;
-		_isMoveObjectRequested = false;
-		_acceptInput = true;
-		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-		startAnimation(0x5C01A870, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmMoveVenusFlyTrap);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		FinalizeState(&Klayman::evMoveVenusFlyTrapDone);
-	}
-}
-
-void Klayman::stContinueMovingVenusFlyTrap() {
-	_isMoveObjectRequested = false;
-	_acceptInput = true;
-	startAnimationByHash(0x5C01A870, 0x01084280, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmMoveVenusFlyTrap);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	FinalizeState(&Klayman::evMoveVenusFlyTrapDone);
-}
-
-void Klayman::evMoveVenusFlyTrapDone() {
-	sendMessage(_attachedSprite, 0x482A, 0);
-}
-
-void Klayman::suFallSkipJump() {
-	updateDeltaXY();
-	HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
-	if (hitRect->type == 0x5001) {
-		_y = hitRect->rect.y1;
-		updateBounds();
-		sendMessage(this, 0x1019, 0);
-	}
-}
-
-void Klayman::stFallSkipJump() {
-	_status2 = 2;
-	_acceptInput = false;
-	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suFallSkipJump);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	NextState(&Klayman::stLandOnFeet);
-}
-
-void Klayman::upMoveObject() {
-	if (_x >= 380)
-		gotoNextStateExt();
-	Klayman::update();		
-}
-
-uint32 Klayman::hmMatch(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x51281850) {
-			setGlobalVar(V_TNT_DUMMY_FUSE_LIT, 1);
-		} else if (param.asInteger() == 0x43000538) {
-			playSound(0, 0x21043059);
-		} else if (param.asInteger() == 0x02B20220) {
-			playSound(0, 0xC5408620);
-		} else if (param.asInteger() == 0x0A720138) {
-			playSound(0, 0xD4C08010);
-		} else if (param.asInteger() == 0xB613A180) {
-			playSound(0, 0x44051000);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stFetchMatch() {
-	if (!stStartAction(AnimationCallback(&Klayman::stFetchMatch))) {
-		_status2 = 0;
-		_acceptInput = false;
-		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-		startAnimation(0x9CAA0218, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmMatch);
-		SetSpriteUpdate(NULL);
-		NextState(&Klayman::stLightMatch);
-	}
-}
-
-void Klayman::stLightMatch() {
-	_status2 = 1;
-	_acceptInput = false;
-	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
-	startAnimation(0x1222A513, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmMatch);
-	SetSpriteUpdate(NULL);
-}
-
-uint32 Klayman::hmMoveObject(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x01084280) {
-			playSound(0, 0x405002D8);
-			sendMessage(_attachedSprite, 0x480B, 0);
-		} else if (param.asInteger() == 0x02421405) {
-			if (_moveObjectCountdown != 0) {
-				_moveObjectCountdown--;
-				stContinueMoveObject();
-			} else {
-				SetMessageHandler(&Klayman::hmLowLevelAnimation);
-			}
-		}
-		break;
-	}
-	return Klayman::hmLowLevelAnimation(messageNum, param, sender);
-}
-
-uint32 Klayman::hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x000F0082) {
-			playSound(0, 0x74E2810F);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stMoveObject() {
-	if (!stStartAction(AnimationCallback(&Klayman::stMoveObject))) {
-		_status2 = 2;
-		_acceptInput = false;
-		_moveObjectCountdown = 8;
-		setDoDeltaX(0);
-		startAnimation(0x0C1CA072, 0, -1);
-		SetUpdateHandler(&Klayman::upMoveObject);
-		SetMessageHandler(&Klayman::hmMoveObject);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	}
-}
-
-void Klayman::stContinueMoveObject() {
-	_acceptInput = false;
-	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
-	SetUpdateHandler(&Klayman::upMoveObject);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-	SetMessageHandler(&Klayman::hmMoveObject);
-}
-
-void Klayman::stTumbleHeadless() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTumbleHeadless))) {
-		_status2 = 1;
-		_acceptInput = false;
-		setDoDeltaX(0);
-		startAnimation(0x2821C590, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmTumbleHeadless);
-		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-		NextState(&Klayman::stTryStandIdle);
-		sendMessage(_parentScene, 0x8000, 0);
-		playSound(0, 0x62E0A356);
-	}
-}
-
-void Klayman::stCloseEyes() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stCloseEyes))) {
-		_status2 = 1;
-		_acceptInput = false;		
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmLowLevel);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-uint32 Klayman::hmSpit(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x16401CA6) {
-			_canSpitPipe = true;
-			if (_contSpitPipe)
-				spitIntoPipe();
-		} else if (param.asInteger() == 0xC11C0008) {
-			_canSpitPipe = false;
-			_acceptInput = false;
-			_readyToSpit = false;
-		} else if (param.asInteger() == 0x018A0001) {
-			sendMessage(_parentScene, 0x2001, _spitDestPipeIndex);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Klayman::stTrySpitIntoPipe() {
-	if (_readyToSpit) {
-		_contSpitPipe = true;
-		_spitContDestPipeIndex = _spitPipeIndex;
-		if (_canSpitPipe)
-			spitIntoPipe();
-	} else if (!stStartAction(AnimationCallback(&Klayman::stTrySpitIntoPipe))) {
-		_status2 = 2;
-		_acceptInput = true;
-		_spitDestPipeIndex = _spitPipeIndex;
-		_readyToSpit = true;
-		_canSpitPipe = false;
-		_contSpitPipe = false;
-		startAnimation(0x1808B150, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmSpit);
-		SetSpriteUpdate(NULL);
-	}
-}
-
-void Klayman::spitIntoPipe() {
-	_contSpitPipe = false;
-	_spitDestPipeIndex = _spitContDestPipeIndex;
-	_canSpitPipe = false;
-	_acceptInput = false;
-	startAnimation(0x1B08B553, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmSpit);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stContSpitIntoPipe);
-}
-
-void Klayman::stContSpitIntoPipe() {
-	_canSpitPipe = true;
-	_acceptInput = true;
-	startAnimationByHash(0x1808B150, 0x16401CA6, 0);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmSpit);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::suRidePlatform() {
-	_x = _attachedSprite->getX() - 20;
-	_y = _attachedSprite->getY() + 46;
-	updateBounds();
-}
-
-void Klayman::stRidePlatform() {
-	if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatform))) {
-		_status2 = 1;
-		_acceptInput = true;
-		startAnimation(0x5420E254, 0, -1);
-		SetUpdateHandler(&Klayman::update);
-		SetMessageHandler(&Klayman::hmLowLevel);
-		SetSpriteUpdate(&Klayman::suRidePlatform);
-	}
-}
-
-void Klayman::stInteractLever() {
-	if (!stStartAction(AnimationCallback(&Klayman::stInteractLever))) {
-		_status2 = 0;
-		if (_isLeverDown) {
-			stUseLeverRelease();
-		} else {
-			_acceptInput = false;
-			startAnimation(0x0C303040, 0, -1);
-			SetUpdateHandler(&Klayman::update);
-			SetMessageHandler(&Klayman::hmLever);
-			SetSpriteUpdate(&Klayman::suUpdateDestX);
-			NextState(&Klayman::stPullLever);
-		}
-	}
-}
-
-void Klayman::stPullLever() {
-	startAnimation(0x0D318140, 0, -1);
-	NextState(&Klayman::stLookLeverDown);
-	sendMessage(_attachedSprite, 0x480F, 0);
-}
-
-void Klayman::stLookLeverDown() {
-	_acceptInput = true;
-	_isLeverDown = true;
-	startAnimation(0x1564A2C0, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-	NextState(&Klayman::stWaitLeverDown);
-}
-
-void Klayman::stWaitLeverDown() {
-	_acceptInput = true;
-	_isLeverDown = true;
-	startAnimation(0x4464A440, 0, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(&Klayman::suUpdateDestX);
-}
-
-void Klayman::stStartWalkingResume() {
-	int16 frameIndex = getGlobalVar(V_KLAYMAN_FRAMEINDEX) + _walkResumeFrameIncr;
-	if (frameIndex < 0 || frameIndex > 13)
-		frameIndex = 0;
-	_status2 = 0;
-	_isWalking = true;
-	_acceptInput = true;
-	startAnimation(0x1A249001, frameIndex, -1);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmWalking);
-	SetSpriteUpdate(&Klayman::suWalkingFirst);
-	NextState(&Klayman::stUpdateWalkingFirst);
-	FinalizeState(&Klayman::evStartWalkingDone);
-}
-
-void Klayman::upPeekInsideBlink() {
-	update();
-	++_blinkCounter;
-	if (_blinkCounter >= _blinkCounterMax)
-		stPeekInsideBlink();
-}
-
-void Klayman::stPeekInside() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xAC20C012, 8, 37);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-	NextState(&Klayman::stPeekInsideBlink);
-}
-
-void Klayman::stPeekInsideReturn() {
-	_status2 = 1;
-	_acceptInput = false;
-	startAnimation(0xAC20C012, 43, 49);
-	SetUpdateHandler(&Klayman::update);
-	SetMessageHandler(&Klayman::hmLowLevelAnimation);
-	SetSpriteUpdate(NULL);
-}
-
-void Klayman::stPeekInsideBlink() {
-	_status2 = 0;
-	_acceptInput = true;
-	startAnimation(0xAC20C012, 38, 42);
-	_newStickFrameIndex = 42;
-	SetUpdateHandler(&Klayman::upPeekInsideBlink);
-	SetMessageHandler(&Klayman::hmLowLevel);
-	SetSpriteUpdate(NULL);
-	_blinkCounter = 0;
-	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-}
-
-//##############################################################################
-
-// KmScene1001
-
-KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-}
-
-uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;		
-	case 0x4804:
-		if (param.asInteger() == 2)
-			GotoState(&Klayman::stSleeping);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stPullHammerLever);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4836:
-		if (param.asInteger() == 1) {
-			sendMessage(_parentScene, 0x2002, 0);
-			GotoState(&Klayman::stWakeUp);
-		}
-		break;		
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-// KmScene1002
-
-KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	setKlaymanIdleTable1();
-	
-}
-
-void KmScene1002::xUpdate() {
-	if (_x >= 250 && _x <= 435 && _y >= 420) {
-		if (_idleTableNum == 0) {
-			setKlaymanIdleTable(klaymanIdleTable1002, ARRAYSIZE(klaymanIdleTable1002));
-			_idleTableNum = 1;
-		}
-	} else if (_idleTableNum == 1) {
-		setKlaymanIdleTable1();
-		_idleTableNum = 0;
-	}
-}
-	
-uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x2001:
-		GotoState(&Klayman::stStandIdleSpecial);
-		break;
-	case 0x2007:
-		_otherSprite = (Sprite*)param.asEntity();
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004: 
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4803:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stJumpAndFall);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stDropFromRing);
-		}
-		break;
-	case 0x4804:
-		GotoState(&Klayman::stPeekWall);
-		break;
-	case 0x4805:
-		switch (param.asInteger()) {
-		case 1:
-			GotoState(&Klayman::stJumpToRing1);
-			break;
-		case 2:
-			GotoState(&Klayman::stJumpToRing2);
-			break;
-		case 3:
-			GotoState(&Klayman::stJumpToRing3);
-			break;
-		case 4:
-			GotoState(&Klayman::stJumpToRing4);
-			break;
-		}
-		break;
-	case 0x480A:	  
-		GotoState(&Klayman::stMoveVenusFlyTrap);
-		break;
-	case 0x480D:			   
-		GotoState(&Klayman::stJumpToRingVenusFlyTrap);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:  
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stPressDoorButton);
-		}
-		break;
-	case 0x4817:				  
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:				
-		sub41CCE0(param.asInteger());
-		break;
-	case 0x4820:  
-		sendMessage(_parentScene, 0x2005, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);	 
-		break;
-	case 0x4821:	
-		sendMessage(_parentScene, 0x2005, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);	 
-		break;
-	case 0x4822:  
-		sendMessage(_parentScene, 0x2005, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);	 
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2006, 0);
-		GotoState(&Klayman::stClimbLadderHalf);	 
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840: 
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-// KmScene1004
-
-KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	_dataResource.load(0x01900A04);	
-}
-
-uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReadNote);
-		break;
-	case 0x4820:
-		sendMessage(_parentScene, 0x2000, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);
-		break;
-	case 0x4821:
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);
-		break;
-	case 0x4822:
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2001, 0);
-		GotoState(&Klayman::stClimbLadderHalf);
-		break;
-	case 0x4824:
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = _dataResource.getPoint(param.asInteger()).y;
-		GotoState(&Klayman::stStartClimbLadderDown);
-		break;
-	case 0x4825:
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = _dataResource.getPoint(param.asInteger()).y;
-		GotoState(&Klayman::stStartClimbLadderUp);
-		break;
-	case 0x4828:
-		GotoState(&Klayman::stTurnToBackToUse);
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	// Empty
-}
-
-uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;		
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stSitIdleTeleporter);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stWalkingFirst);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483D:
-		teleporterAppear(0x2C2A4A1C);
-		break;
-	case 0x483E:
-		teleporterDisappear(0x3C2E4245);
-		break;
-	}
-	return messageResult;
-}
-
-// KmScene1201
-
-KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
-	_flagF6 = true;
-	
-}
-
-uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x480A:
-		GotoState(&Klayman::stMoveObject);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case 0x4813:
-		GotoState(&Klayman::stFetchMatch);
-		break;
-	case 0x4814:
-		GotoState(&Klayman::stTumbleHeadless);
-		break;
-	case 0x4815:
-		GotoState(&Klayman::stCloseEyes);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stPressButtonSide);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x481F:
-		GotoState(&Klayman::stWonderAbout);
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	// Empty
-}
-
-uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4804:
-		GotoState(&Klayman::stPeekWall1);
-		break;
-	case 0x483B:
-		GotoState(&Klayman::stPeekWallReturn);
-		break;
-	case 0x483C:
-		GotoState(&Klayman::stPeekWall2);
-		break;
-	}
-	return 0;
-}
-
-KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	// Empty	
-}
-
-uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;		
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;						
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	// Empty	
-}
-
-uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;		
-	case 0x4804:
-		GotoState(&Klayman::stCrashDown);
-		break;		
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	}
-	return 0;
-}
-
-KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-}
-
-uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stSitIdleTeleporter);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case NM_KLAYMAN_INSERT_DISK:
-		GotoState(&Klayman::stInsertDisk);		
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		else
-			GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		else
-			GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483D:
-		teleporterAppear(0xEE084A04);
-		break;																				
-	case 0x483E:
-		teleporterDisappear(0xB86A4274);
-		break;																				
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return messageResult;
-}
-
-KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	// Empty	
-}
-
-uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x480A:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
-		} else {
-			GotoState(&Klayman::stMoveObjectFaceObject);
-		}	
-		break;		
-	case 0x480D:
-		GotoState(&Klayman::stUseLever);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case NM_KLAYMAN_INSERT_DISK:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stInsertKey);		
-		} else {
-			GotoState(&Klayman::stInsertDisk);		
-		}
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case NM_KLAYMAN_RELEASE_LEVER:
-		GotoState(&Klayman::stReleaseLever);
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-// KmScene1401
-
-KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	// Empty	
-}
-
-uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;		
-	case 0x480A:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
-		} else {
-			GotoState(&Klayman::stMoveObjectFaceObject);
-		}	
-		break;		
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;						
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	}
-	return 0;
-}
-
-// KmScene1402
-
-KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	SetFilterY(&Sprite::defFilterY);	
-}
-
-uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;		
-	case 0x480A:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
-		} else {
-			GotoState(&Klayman::stMoveObjectFaceObject);
-		}
-		break;		
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;						
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	}
-	return 0;
-}
-
-// KmScene1403
-
-KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4));
-}
-
-uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x480A:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
-		} else {
-			GotoState(&Klayman::stMoveObjectFaceObject);
-		}
-		break;		
-	case 0x480D:
-		GotoState(&Klayman::stUseLever);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case NM_KLAYMAN_RELEASE_LEVER:
-		GotoState(&Klayman::stReleaseLever);
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-// KmScene1404
-
-KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	// Empty	
-}
-
-uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x480A:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stMoveObjectSkipTurnFaceObject);
-		} else {
-			GotoState(&Klayman::stMoveObjectFaceObject);
-		}
-		break;		
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case NM_KLAYMAN_INSERT_DISK:
-		GotoState(&Klayman::stInsertDisk);		
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-}
-
-uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2032:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stSitIdleTeleporter);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2032, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2032, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return messageResult;
-}
-
-// KmScene1705
-
-KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	// Empty	
-}
-
-uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::stSitIdleTeleporter);
-		} else {
-			GotoState(&Klayman::stTryStandIdle);
-		}
-		break;
-	case 0x4803:
-		GotoState(&Klayman::stFallSkipJump);
-		break;				
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		}
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483D:
-		teleporterAppear(0x5E0A4905);
-		break;																				
-	case 0x483E:
-		teleporterDisappear(0xD86E4477);
-		break;																				
-	}
-	return messageResult;
-}
-
-KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	// Empty	
-}
-
-uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	// Empty	
-}
-
-uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::stSitIdleTeleporter);
-		} else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stWalkingFirst);
-		} else
-			GotoState(&Klayman::stPeekWall);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter) {
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		}
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483D:
-		teleporterAppear(0xBE68CC54);
-		break;
-	case 0x483E:
-		teleporterDisappear(0x18AB4ED4);
-		break;
-	}
-	return messageResult;
-}
-
-KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	// Empty
-}
-
-uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stSitIdleTeleporter);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4811:
-		GotoState(&Klayman::stHitByDoor);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter)//CHECKME
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483D:
-		teleporterAppear(0xFF290E30);
-		break;
-	case 0x483E:
-		teleporterDisappear(0x9A28CA1C);
-		break;
-	}
-	return messageResult;	
-}
-
-KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	_surface->setClipRects(clipRects, clipRectsCount);
-
-	_dataResource.load(0x04104242);
-	_flagF6 = false;
-}
-
-uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stPressButtonSide);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;	
-}
-
-KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-	
-uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x4819:
-		GotoState(&Klayman::stClayDoorOpen);
-		break;
-	case NM_KLAYMAN_INSERT_DISK:
-		GotoState(&Klayman::stInsertDisk);		
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-void KmScene2205::xUpdate() {
-	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
-}
-	
-uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stStartWalkingResume);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	_walkResumeFrameIncr = 1;
-	_vm->_soundMan->addSound(0x80101800, 0xD3B02847);
-}
-
-KmScene2206::~KmScene2206() {
-	_vm->_soundMan->deleteSoundGroup(0x80101800);
-}
-
-void KmScene2206::xUpdate() {
-	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
-}
-	
-uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4803:
-		GotoState(&Klayman::stRidePlatformDown);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stStartWalkingResume);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-	
-uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x2001:
-		GotoState(&Klayman::stRidePlatform);
-		break;
-	case 0x2005:
-		suRidePlatform();
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stInteractLever);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case NM_KLAYMAN_RELEASE_LEVER:
-		GotoState(&Klayman::stReleaseLever);
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-void KmScene2242::xUpdate() {
-	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
-}
-
-uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stStartWalkingResume);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPickUpTube);
-		} else {
-			GotoState(&Klayman::stPickUpGeneric);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	}
-	return 0;
-}
-
-KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-void KmHallOfRecords::xUpdate() {
-	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
-}
-
-uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stStartWalkingResume);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	}
-	return 0;
-}
-
-KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-void KmScene2247::xUpdate() {
-	setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex);
-}
-
-uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stStartWalkingResume);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	}
-	return 0;
-}
-  
-KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-	
-uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x4832:
-		GotoState(&Klayman::stUseTube);
-		break;
-	case 0x4833:
-		if (param.asInteger() == 1)
-			GotoState(&Klayman::stWonderAbout);
-		else {
-			_spitPipeIndex = sendMessage(_parentScene, 0x2000, 0);
-			GotoState(&Klayman::stTrySpitIntoPipe);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;		
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return messageResult;
-}
-
-KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (!getGlobalVar(V_TV_JOKE_TOLD))
-			GotoState(&Klayman::stStandWonderAbout);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stWalkingFirst);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840:
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return messageResult;
-}
-
-KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stPullCord);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case NM_KLAYMAN_PRESS_BUTTON:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stPressButton);
-		} else if (param.asInteger() == 2) {
-			GotoState(&Klayman::stPressFloorButton);
-		} else {
-			GotoState(&Klayman::stPressButtonSide);
-		} 
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x4820:  
-		sendMessage(_parentScene, 0x2000, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);	 
-		break;
-	case 0x4821:	
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);	 
-		break;
-	case 0x4822:  
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);	 
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2001, 0);
-		GotoState(&Klayman::stClimbLadderHalf);	 
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840: 
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return messageResult;
-}
-	
-KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	_surface->setClipRects(clipRects, clipRectsCount);
-	
-}
-
-uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		if (param.asInteger() != 0) {
-			_destX = param.asInteger();
-			GotoState(&Klayman::stWalkingFirst);
-		} else {
-			GotoState(&Klayman::stPeekWall);
-		}
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2)
-			GotoState(&Klayman::stPickUpNeedle);
-		else if (param.asInteger() == 1)
-			GotoState(&Klayman::stPickUpTube);
-		else
-			GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481A:
-		GotoState(&Klayman::stInsertDisk);		
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		else
-			sub41CCE0(param.asPoint().x);
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x4820:  
-		sendMessage(_parentScene, 0x2000, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);	 
-		break;
-	case 0x4821:	
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);	 
-		break;
-	case 0x4822:  
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);	 
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2001, 0);
-		GotoState(&Klayman::stClimbLadderHalf);	 
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840: 
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return messageResult;
-}
-	
-KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-	
-uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stSitIdleTeleporter);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	}
-	return messageResult;
-}
-
-KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-	
-uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4804:
-		GotoState(&Klayman::stPeekInside);
-		break;
-	case 0x483C:
-		GotoState(&Klayman::stPeekInsideReturn);
-		break;
-	}
-	return 0;
-}
-
-KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;						
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	}
-	return 0;
-}
-
-KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	_surface->setClipRects(clipRects, clipRectsCount);
-	
-	_dataResource.load(0x00900849);
-}
-
-uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4803:
-		_destY = param.asInteger();
-		GotoState(&Klayman::stJumpToGrab);
-		break;
-	case 0x4804:
-		if (param.asInteger() == 3)
-			GotoState(&Klayman::stFinishGrow);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stPullCord);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else {
-			GotoState(&Klayman::stWonderAboutHalf);
-		}
-		break;
-	case 0x482E:	 
-		GotoState(&Klayman::stWalkToFront);
-		break;
-	case 0x482F:
-		GotoState(&Klayman::stTurnToBack);
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4838:
-		GotoState(&Klayman::stJumpToGrabRelease);
-		break;
-	}
-	return 0;
-}
-
-KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	
-	_dataResource.load(0x81120132);
-}
-
-uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToXSmall(param.asPoint().x);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stStandIdleSmall);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x4818:
-		startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1)
-			GotoState(&Klayman::stWonderAboutAfterSmall);
-		else if (param.asInteger() == 0)
-			GotoState(&Klayman::stWonderAboutHalfSmall);
-		else
-			GotoState(&Klayman::stWonderAboutSmall);
-		break;
-	case 0x482E:
-		if (param.asInteger() == 1)
-			GotoState(&Klayman::stWalkToFrontNoStepSmall);
-		else if (param.asInteger() == 2)
-			GotoState(&Klayman::stWalkToFront2Small);
-		else
-			GotoState(&Klayman::stWalkToFrontSmall);
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1)
-			GotoState(&Klayman::stTurnToBackHalfSmall);
-		else if (param.asInteger() == 2)
-			GotoState(&Klayman::stTurnToBackWalkSmall);
-		else
-			GotoState(&Klayman::stTurnToBackSmall);
-		break;
-	case 0x4830:
-		GotoState(&Klayman::stShrink);
-		break;
-	}
-	return 0;
-}
-
-KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
-	uint32 messageResult = 0;
-	switch (messageNum) {
-	case 0x2000:
-		_isSittingInTeleporter = param.asInteger() != 0;
-		messageResult = 1;
-		break;
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stSitIdleTeleporter);
-		else
-			GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x481D:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stTurnToUseInTeleporter);
-		break;
-	case 0x481E:
-		if (_isSittingInTeleporter)
-			GotoState(&Klayman::stReturnFromUseInTeleporter);
-		break;
-	case 0x4834:
-		GotoState(&Klayman::stStepOver);
-		break;
-	case 0x4835:
-		sendMessage(_parentScene, 0x2000, 1);
-		_isSittingInTeleporter = true;
-		GotoState(&Klayman::stSitInTeleporter);
-		break;																		
-	case 0x4836:
-		sendMessage(_parentScene, 0x2000, 0);
-		_isSittingInTeleporter = false;
-		GotoState(&Klayman::stGetUpFromTeleporter);
-		break;
-	case 0x483D:
-		teleporterAppear(0xDE284B74);
-		break;
-	case 0x483E:
-		teleporterDisappear(0xD82A4094);
-		break;
-	}
-	return messageResult;
-}
-
-KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-	bool flag, NRect *clipRects, uint clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	if (flag) {
-		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
-		delete _surface;
-		createSurface(1000, dimensions.width, dimensions.height);
-		loadSound(3, 0x58E0C341);
-		loadSound(4, 0x40A00342);
-		loadSound(5, 0xD0A1C348);
-		loadSound(6, 0x166FC6E0);
-		loadSound(7, 0x00018040);
-	}
-	
-	_dataResource.load(0x98182003);
-	_surface->setClipRects(clipRects, clipRectsCount);
-
-}
-
-uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		startWalkToX(440, true);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stPullCord);
-		break;
-	case 0x4816:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stPressButtonSide); 
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x4831:
-		GotoState(&Klayman::stGrow);
-		break;
-	case 0x4832:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stDrinkPotion);
-		} else {
-			GotoState(&Klayman::stUseTube);
-		}
-		break;
-	}
-	return 0;
-}
-
-KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-	bool flag, NRect *clipRects, uint clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	if (flag) {
-		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
-		delete _surface;
-		createSurface(1000, dimensions.width, dimensions.height);
-		loadSound(3, 0x58E0C341);
-		loadSound(4, 0x40A00342);
-		loadSound(5, 0xD0A1C348);
-		loadSound(6, 0x166FC6E0);
-		loadSound(7, 0x00018040);
-	}
-
-	_dataResource.load(0x1830009A);
-	_surface->setClipRects(clipRects, clipRectsCount);
-	
-}
-
-uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4804:
-		startWalkToX(226, true);
-		break;
-	case 0x480D:
-		GotoState(&Klayman::stPullCord);
-		break;
-	case 0x4816:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stPressButtonSide); 
-		}
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x4831:
-		GotoState(&Klayman::stGrow);
-		break;
-	case 0x4832:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stDrinkPotion);
-		} else {
-			GotoState(&Klayman::stUseTube);
-		}
-		break;
-	}
-	return 0;
-}
-
-KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) 
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToXSmall(param.asPoint().x);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stStandIdleSmall);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x);
-		break;
-	case 0x481F:
-		if (param.asInteger() == 1)
-			GotoState(&Klayman::stWonderAboutAfterSmall);
-		else if (param.asInteger() == 0)
-			GotoState(&Klayman::stWonderAboutHalfSmall);
-		else
-			GotoState(&Klayman::stWonderAboutSmall);
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStepSmall);
-		} else {
-			GotoState(&Klayman::stWalkToFrontSmall);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToBackHalfSmall);
-		} else {
-			GotoState(&Klayman::stTurnToBackSmall);
-		}
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	}
-	return 0;
-}
-
-KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-
-	_surface->setClipRects(clipRects, clipRectsCount);
-	
-}
-		
-uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4803:
-		_destY = param.asInteger();
-		GotoState(&Klayman::stJumpToGrab);
-		break;
-	case 0x4804:
-		if (param.asInteger() == 3)
-			GotoState(&Klayman::stFinishGrow);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;		
-	case 0x4818:
-		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
-		break;
-	case 0x481F:
-		if (param.asInteger() == 0) {
-			GotoState(&Klayman::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
-			GotoState(&Klayman::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
-			GotoState(&Klayman::stTurnAwayFromUse);
-		} else if (param.asInteger() == 5) {
-			GotoState(&Klayman::stTurnToUseExt);
-		} else {
-			GotoState(&Klayman::stWonderAbout);
-		}
-		break;
-	case 0x4820:  
-		sendMessage(_parentScene, 0x2000, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);	 
-		break;
-	case 0x4821:	
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);	 
-		break;
-	case 0x4822:  
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);	 
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2001, 0);
-		GotoState(&Klayman::stClimbLadderHalf);	 
-		break;
-	case 0x4824:
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = _dataResource.getPoint(param.asInteger()).y;
-		GotoState(&Klayman::stStartClimbLadderDown);
-		break;
-	case 0x4825:
-		sendMessage(_parentScene, 0x2000, 0);
-		_destY = _dataResource.getPoint(param.asInteger()).y;
-		GotoState(&Klayman::stStartClimbLadderUp);
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x4837:
-		stopWalking();
-		break;
-	}
-	return 0;
-}
-
-KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klayman(vm, parentScene, x, y, 1000, 1000) {
-	// Empty
-}
-
-uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
-	switch (messageNum) {
-	case 0x4001:
-	case 0x4800:
-		startWalkToX(param.asPoint().x, false);
-		break;
-	case 0x4004:
-		GotoState(&Klayman::stTryStandIdle);
-		break;
-	case 0x4805:
-		_destY = param.asInteger();
-		GotoState(&Klayman::stJumpToGrabFall);
-		break;
-	case NM_KLAYMAN_PICKUP:
-		if (param.asInteger() == 2)
-			GotoState(&Klayman::stPickUpNeedle);
-		else if (param.asInteger() == 1)
-			GotoState(&Klayman::stPickUpTube);
-		else
-			GotoState(&Klayman::stPickUpGeneric);
-		break;
-	case 0x4817:
-		setDoDeltaX(param.asInteger());
-		gotoNextStateExt();
-		break;
-	case 0x481A:
-		GotoState(&Klayman::stInsertDisk);		
-		break;
-	case 0x481B:
-		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		else
-			sub41CCE0(param.asPoint().x);
-		break;
-	case 0x481D:
-		GotoState(&Klayman::stTurnToUse);
-		break;
-	case 0x481E:
-		GotoState(&Klayman::stReturnFromUse);
-		break;
-	case 0x4820:  
-		sendMessage(_parentScene, 0x2001, 0);
-		GotoState(&Klayman::stContinueClimbLadderUp);	 
-		break;
-	case 0x4821:	
-		sendMessage(_parentScene, 0x2001, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderDown);	 
-		break;
-	case 0x4822:  
-		sendMessage(_parentScene, 0x2001, 0);
-		_destY = param.asInteger();
-		GotoState(&Klayman::stStartClimbLadderUp);	 
-		break;
-	case 0x4823:
-		sendMessage(_parentScene, 0x2002, 0);
-		GotoState(&Klayman::stClimbLadderHalf);	 
-		break;
-	case 0x482D:
-		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
-		gotoNextStateExt();
-		break;
-	case 0x482E:	 
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stWalkToFrontNoStep);
-		} else {
-			GotoState(&Klayman::stWalkToFront);
-		}
-		break;
-	case 0x482F:
-		if (param.asInteger() == 1) {
-			GotoState(&Klayman::stTurnToFront);
-		} else {
-			GotoState(&Klayman::stTurnToBack);
-		}
-		break;
-	case 0x483F:
-		startSpecialWalkRight(param.asInteger());
-		break;
-	case 0x4840: 
-		startSpecialWalkLeft(param.asInteger());
-		break;
-	}
-	return 0;
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h
deleted file mode 100644
index 99fcceb..0000000
--- a/engines/neverhood/klayman.h
+++ /dev/null
@@ -1,764 +0,0 @@
-/* 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_KLAYMAN_H
-#define NEVERHOOD_KLAYMAN_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/sprite.h"
-#include "neverhood/graphics.h"
-#include "neverhood/resource.h"
-
-namespace Neverhood {
-
-// TODO This code is horrible and weird and a lot of stuff needs renaming once a better name is found
-// TODO Also the methods should probably rearranged and be grouped together more consistently
-
-class Klayman;
-class Scene;
-
-const uint32 kKlaymanSpeedUpHash = 0x004A2148;
-
-#include "common/pack-start.h"	// START STRUCT PACKING
-
-struct KlaymanIdleTableItem {
-	int value;
-	void (Klayman::*callback)();
-};
-
-#include "common/pack-end.h"	// END STRUCT PACKING
-
-class Klayman : public AnimatedSprite {
-public:
-	Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);
-
-	void update();
-
-	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
-	void upIdleAnimation();
-
-	void stDoIdlePickEar();
-	void stIdlePickEar();
-	void evIdlePickEarDone();
-	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stDoIdleSpinHead();
-	void stIdleSpinHead();
-	uint32 hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stDoIdleArms();
-	void stIdleArms();
-	void evIdleArmsDone();
-	uint32 hmIdleArms(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stDoIdleChest();
-	void stIdleChest();
-	uint32 hmIdleChest(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stDoIdleHeadOff();
-	void stIdleHeadOff();
-	uint32 hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stIdleWonderAbout();
-
-	void stDoIdleTeleporterHands();
-	void stIdleTeleporterHands();
-	
-	void stDoIdleTeleporterHands2();
-	void stIdleTeleporterHands2();
-
-	void stTryStandIdle();
-	void stStandAround();
-	void upStandIdle();
-	void stIdleBlink();
-	
-	bool stStartAction(AnimationCb callback3);
-	bool stStartActionFromIdle(AnimationCb callback);
-	uint32 hmStartAction(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stSneak();
-	uint32 hmSneaking(int messageNum, const MessageParam &param, Entity *sender);
-	void suSneaking();
-	void evSneakingDone();
-
-	void stStartWalking();
-	void stStartWalkingExt();
-	void stWalkingOpenDoor();
-	void suWalkingOpenDoor();
-	void stStepOver();
-	uint32 hmStartWalking(int messageNum, const MessageParam &param, Entity *sender);
-	void evStartWalkingDone();
-
-	void stWalkingFirst();
-	void stWalkingFirstExt();
-	void stStartWalkingResume();
-	void stUpdateWalkingFirst();
-	uint32 hmWalking(int messageNum, const MessageParam &param, Entity *sender);
-	void suWalkingFirst();
-
-	void stWalkToFrontNoStep();
-	void stWalkToFront();
-	void stTurnToFront();
-	void stTurnToBack();
-	uint32 hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stTurnToBackToUse();
-	uint32 hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPickUpGeneric();
-	void stPickUpNeedle();
-	uint32 hmPickUpObject(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPickUpTube();
-	uint32 hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stTurnToUse();
-	void stTurnToUseHalf();
-	void stTurnAwayFromUse();
-	void stReturnFromUse();
-	void stTurnToUseExt();
-	uint32 hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stLargeStep();
-	uint32 hmLargeStep(int messageNum, const MessageParam &param, Entity *sender);
-	void suLargeStep();
-	void evLargeStepDone();
-
-	void stInsertKey();
-	uint32 hmInsertKey(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stReadNote();
-	uint32 hmReadNote(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stHitByDoor();
-	uint32 hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPeekWall();
-	uint32 hmPeekWall(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPeekWallReturn();
-	uint32 hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPeekWallBlink();
-	void upPeekWallBlink();
-
-	void stPeekWall1();
-
-	void stPeekWall2();
-
-	void stPullHammerLever();
-	uint32 hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stRidePlatformDown();
-	void suRidePlatformDown();
-
-	void stCrashDown();
-	void stCrashDownFinished();
-
-	void stShrink();
-	uint32 hmShrink(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stGrow();
-	uint32 hmGrow(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stDrinkPotion();
-	uint32 hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPullCord();
-	void stReleaseCord();
-	uint32 hmPullReleaseCord(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stUseTube();
-	uint32 hmUseTube(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stUseLever();
-	void stUseLeverRelease();
-	void stReleaseLever();
-	void stInteractLever();
-	uint32 hmLever(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stLetGoOfLever();
-	void evLeverReleasedEvent();
-
-	void stWakeUp();
-
-	void stSleeping();
-	uint32 hmSleeping(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPressButton();
-	void stPressFloorButton();
-	void stPressButtonSide();
-	uint32 hmPressButton(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stWonderAbout();
-	void stWonderAboutHalf();
-	void stWonderAboutAfter();
-
-	void stStandWonderAbout();
-
-	void stStartClimbLadderUp();
-	void stStartClimbLadderDown();
-	uint32 hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stContinueClimbLadderUp();
-
-	void stClimbLadderHalf();
-	uint32 hmClimbLadderHalf(int messageNum, const MessageParam &param, Entity *sender);
-
-	void setupJumpToRing();
-	void stJumpToRing1();
-	void stJumpToRing2();
-	void stJumpToRing4();
-	uint32 hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stHangOnRing();
-
-	void stJumpToRing3();
-	uint32 hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stHoldRing3();
-	uint32 hmHoldRing3(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stReleaseRing();
-
-	void stLandOnFeet();
-	uint32 hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPullLeverDown();
-	void stHoldLeverDown();
-
-	void stInsertDisk();
-	uint32 hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stMoveObjectSkipTurnFaceObject();
-	void stMoveObjectSkipTurn();
-	void stMoveObjectFaceObject();
-	uint32 hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender);
-	void evMoveObjectTurnDone();
-
-	void stJumpToGrab();
-	void stJumpToGrabFall();
-	uint32 hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender);
-	void suJumpToGrab();
-	
-	void stJumpToGrabRelease();
-	uint32 hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stSitInTeleporter();
-	uint32 hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stSitIdleTeleporter();
-	void upSitIdleTeleporter();
-
-	void stSitIdleTeleporterBlink();
-
-	void stSitIdleTeleporterBlinkSecond();
-
-	void stTurnToUseInTeleporter();
-
-	void stReturnFromUseInTeleporter();
-
-	void stGetUpFromTeleporter();
-
-	void teleporterAppear(uint32 fileHash);
-	void teleporterDisappear(uint32 fileHash);
-	uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stClayDoorOpen();
-	uint32 hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stFallSkipJump();
-	void suFallSkipJump();
-
-	void stMoveObject();
-	void stContinueMoveObject();
-	uint32 hmMoveObject(int messageNum, const MessageParam &param, Entity *sender);
-	void upMoveObject();
-
-	void stCloseEyes();
-
-	void stTumbleHeadless();
-	uint32 hmTumbleHeadless(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stFetchMatch();
-	void stLightMatch();
-	uint32 hmMatch(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stHitByBoxingGlove();
-	uint32 hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender);
-	void evHitByBoxingGloveDone();
-
-	void stStandIdleSmall();
-	void stWonderAboutSmall();
-	void stWonderAboutHalfSmall();
-	void stWonderAboutAfterSmall();
-
-	void stWalkToFrontNoStepSmall();
-	void stWalkToFrontSmall();
-	void stWalkToFront2Small();
-	void stTurnToBackHalfSmall();
-	void stTurnToBackWalkSmall();
-	void stTurnToBackSmall();
-	uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stFinishGrow();
-	uint32 hmFinishGrow(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void stJumpToRingVenusFlyTrap();
-	uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stDropFromRing();
-
-	void stStandIdleSpecial();
-	uint32 hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stPressDoorButton();
-	uint32 hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stSpitOutFall0();
-	void stSpitOutFall2();
-	void suFallDown();
-	void upSpitOutFall();
-
-	void stJumpAndFall();
-	uint32 hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stFalling();
-	void stFallTouchdown();
-
-	void stMoveVenusFlyTrap();
-	void stContinueMovingVenusFlyTrap();
-	uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender);
-	void evMoveVenusFlyTrapDone();
-
-	void stPeekInside();
-	void stPeekInsideReturn();
-	void stPeekInsideBlink();
-	void upPeekInsideBlink();
-
-	////////////////////////////////////////////////////////////////////////////
-
-	void stopWalking();
-	
-	void suAction();
-	void suUpdateDestX();
-	void suWalkingTestExit();
-
-	uint32 hmLowLevel(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender);
-
-	void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount);
-	void setKlaymanIdleTable1();
-	void setKlaymanIdleTable2();
-	void setKlaymanIdleTable3();
-	
-	void setSoundFlag(bool value) { _soundFlag = value; }
-
-	void spitIntoPipe();
-	void stTrySpitIntoPipe();
-	void stContSpitIntoPipe();
-	uint32 hmSpit(int messageNum, const MessageParam &param, Entity *sender);
-
-	void stRidePlatform();
-	void suRidePlatform();
-	void stPullLever();
-	void stLookLeverDown();
-	void stWaitLeverDown();
-
-protected:
-	Scene *_parentScene;
-	Sprite *_attachedSprite;
-	int _ladderStatus;
-	bool _isWalking;
-	bool _isSneaking;
-	bool _isLargeStep;
-	bool _isMoveObjectRequested;
-	bool _acceptInput;
-	int16 _destX, _destY;
-	int16 _idleCounter, _idleCounterMax;
-	int16 _blinkCounter, _blinkCounterMax;
-	int16 _countdown1;
-	int16 _tapesToInsert, _keysToInsert;
-	bool _flagF6;
-	bool _isLeverDown;
-	bool _isWalkingOpenDoorNotified;
-	int _status2;
-	bool _flagFA;
-	int _status3;
-	const KlaymanIdleTableItem *_idleTable;
-	int _idleTableCount;
-	int _idleTableMaxValue;
-	NPointArray *_pathPoints;
-	bool _soundFlag;
-	
-	bool _isSittingInTeleporter;
-
-	bool _potionFlag1;
-	bool _potionFlag2;
-
-	int16 _platformDeltaY;
-
-	Sprite *_otherSprite;
-	int _idleTableNum;
-
-	int16 _walkResumeFrameIncr;
-
-	int _moveObjectCountdown;
-
-	bool _canSpitPipe;
-	bool _contSpitPipe;
-	bool _readyToSpit;
-	uint32 _spitPipeIndex;
-	uint32 _spitDestPipeIndex;
-	uint32 _spitContDestPipeIndex;
-
-	virtual void xUpdate();
-	// TODO Check if this can be turned into a void result
-	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
-
-	void startWalkToX(int16 x, bool flag);
-	void startWalkToXExt(int16 x);
-	void startWalkToXSmall(int16 x);
-	void startSpecialWalkLeft(int16 x);
-	void startSpecialWalkRight(int16 x);
-	void sub41CC40(int16 x1, int16 x2);
-	void sub41CCE0(int16 x);
-
-	void gotoNextStateExt();
-	void sub41C770();
-	void sub41C790();
-
-	void stStartWalkingSmall();
-	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
-	
-	void walkAlongPathPoints();
-	
-};
-
-class KmScene1001 : public Klayman {
-public:
-	KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:	
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1002 : public Klayman {
-public:
-	KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	void xUpdate();	
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1004 : public Klayman {
-public:
-	KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1109 : public Klayman {
-public:
-	KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1201 : public Klayman {
-public:
-	KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1303 : public Klayman {
-public:
-	KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1304 : public Klayman {
-public:
-	KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1305 : public Klayman {
-public:
-	KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1306 : public Klayman {
-public:
-	KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1308 : public Klayman {
-public:
-	KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1401 : public Klayman {
-public:
-	KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1402 : public Klayman {
-public:
-	KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1403 : public Klayman {
-public:
-	KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1404 : public Klayman {
-public:
-	KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1608 : public Klayman {
-public:
-	KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1705 : public Klayman {
-public:
-	KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene1901 : public Klayman {
-public:
-	KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2001 : public Klayman {
-public:
-	KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2101 : public Klayman {
-public:
-	KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2201 : public Klayman {
-public:
-	KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2203 : public Klayman {
-public:
-	KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2205 : public Klayman {
-public:
-	KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	void xUpdate();
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2206 : public Klayman {
-public:
-	KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-	~KmScene2206();
-protected:
-	void xUpdate();
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2207 : public Klayman {
-public:
-	KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2242 : public Klayman {
-public:
-	KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	void xUpdate();
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmHallOfRecords : public Klayman {
-public:
-	KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	void xUpdate();
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2247 : public Klayman {
-public:
-	KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	void xUpdate();
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2401 : public Klayman {
-public:
-	KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2402 : public Klayman {
-public:
-	KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2403 : public Klayman {
-public:
-	KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2406 : public Klayman {
-public:
-	KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2501 : public Klayman {
-public:
-	KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2732 : public Klayman {
-public:
-	KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2801 : public Klayman {
-public:
-	KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2803 : public Klayman {
-public:
-	KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2803Small : public Klayman {
-public:
-	KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2805 : public Klayman {
-public:
-	KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2806 : public Klayman {
-public:
-	KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-		bool flag, NRect *clipRects, uint clipRectsCount);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2809 : public Klayman {
-public:
-	KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-		bool flag, NRect *clipRects, uint clipRectsCount);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2810Small : public Klayman {
-public:
-	KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2810 : public Klayman {
-public:
-	KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-		NRect *clipRects, uint clipRectsCount);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-class KmScene2812 : public Klayman {
-public:
-	KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y);
-protected:
-	uint32 xHandleMessage(int messageNum, const MessageParam &param);
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_KLAYMAN_H */
diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
new file mode 100644
index 0000000..6d139b1
--- /dev/null
+++ b/engines/neverhood/klaymen.cpp
@@ -0,0 +1,6240 @@
+/* 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/klaymen.h"
+#include "neverhood/resourceman.h"
+#include "neverhood/scene.h"
+#include "neverhood/staticdata.h"
+
+namespace Neverhood {
+
+static const KlaymenIdleTableItem klaymenTable1[] = {
+	{1, &Klaymen::stDoIdlePickEar},
+	{1, &Klaymen::stDoIdleSpinHead},
+	{1, &Klaymen::stDoIdleArms},
+	{1, &Klaymen::stDoIdleChest},
+	{1, &Klaymen::stDoIdleHeadOff}
+}; 
+
+static const KlaymenIdleTableItem klaymenTable2[] = {
+	{1, &Klaymen::stDoIdlePickEar},
+	{1, &Klaymen::stDoIdleSpinHead},
+	{1, &Klaymen::stDoIdleChest},
+	{1, &Klaymen::stDoIdleHeadOff}
+}; 
+
+static const KlaymenIdleTableItem klaymenTable3[] = {
+	{1, &Klaymen::stDoIdleTeleporterHands},
+	{1, &Klaymen::stDoIdleTeleporterHands2}
+}; 
+
+static const KlaymenIdleTableItem klaymenTable4[] = {
+	{1, &Klaymen::stDoIdleSpinHead},
+	{1, &Klaymen::stDoIdleChest},
+	{1, &Klaymen::stDoIdleHeadOff},
+};
+
+static const KlaymenIdleTableItem klaymenIdleTable1002[] = {
+	{1, &Klaymen::stDoIdlePickEar},
+	{2, &Klaymen::stIdleWonderAbout}
+}; 
+
+// Klaymen
+
+Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
+	: AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
+	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
+	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
+	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
+	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
+	
+	createSurface(surfacePriority, 320, 200);
+	_x = x;
+	_y = y;
+	_destX = x;
+	_destY = y;
+	_flags = 2;
+	setKlaymenIdleTable1();
+	stTryStandIdle();
+	SetUpdateHandler(&Klaymen::update);
+}
+
+void Klaymen::xUpdate() {
+	// Empty
+}
+
+uint32 Klaymen::xHandleMessage(int messageNum, const MessageParam &param) {
+	switch (messageNum) {
+	case 0x4001:
+	case 0x4800:
+		startWalkToX(param.asPoint().x, false);
+		break;
+	case 0x4004:
+		GotoState(&Klaymen::stTryStandIdle);
+		break;
+	case 0x4818:
+		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
+		break;
+	}
+	return 0;
+}
+
+void Klaymen::update() {
+	AnimatedSprite::update();
+	xUpdate();
+}
+
+void Klaymen::setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount) {
+	_idleTable = table;
+	_idleTableCount = tableCount;
+	_idleTableMaxValue = 0;
+	for (int i = 0; i < tableCount; i++)
+		_idleTableMaxValue += table[i].value;
+}
+
+void Klaymen::setKlaymenIdleTable1() {
+	setKlaymenIdleTable(klaymenTable1, ARRAYSIZE(klaymenTable1));
+}
+
+void Klaymen::setKlaymenIdleTable2() {
+	setKlaymenIdleTable(klaymenTable2, ARRAYSIZE(klaymenTable2));
+}
+
+void Klaymen::setKlaymenIdleTable3() {
+	setKlaymenIdleTable(klaymenTable3, ARRAYSIZE(klaymenTable3));
+}
+
+void Klaymen::stDoIdlePickEar() {
+	startIdleAnimation(0x5B20C814, AnimationCallback(&Klaymen::stIdlePickEar));
+}
+
+void Klaymen::stIdlePickEar() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x5B20C814, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmIdlePickEar);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+	FinalizeState(&Klaymen::evIdlePickEarDone);
+}
+
+uint32 Klaymen::hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x04DBC02C) {
+			playSound(0, 0x44528AA1);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::evIdlePickEarDone() {
+	stopSound(0);
+}
+
+void Klaymen::stDoIdleSpinHead() {
+	startIdleAnimation(0xD122C137, AnimationCallback(&Klaymen::stIdleSpinHead));
+}
+
+void Klaymen::stIdleSpinHead() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0xD122C137, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmIdleSpinHead);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+}
+
+uint32 Klaymen::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x808A0008) {
+			playSound(0, 0xD948A340);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stDoIdleArms() {
+	startIdleAnimation(0x543CD054, AnimationCallback(&Klaymen::stIdleArms));
+}
+
+void Klaymen::stIdleArms() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x543CD054, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmIdleArms);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+	FinalizeState(&Klaymen::evIdleArmsDone);
+}
+
+void Klaymen::evIdleArmsDone() {
+	stopSound(0);
+}
+
+uint32 Klaymen::hmIdleArms(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x5A0F0104) {
+			playSound(0, 0x7970A100);
+		} else if (param.asInteger() == 0x9A9A0109) {
+			playSound(0, 0xD170CF04);
+		} else if (param.asInteger() == 0x989A2169) {
+			playSound(0, 0xD073CF14);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stDoIdleChest() {
+	startIdleAnimation(0x40A0C034, AnimationCallback(&Klaymen::stIdleChest));
+}
+
+void Klaymen::stIdleChest() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x40A0C034, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmIdleChest);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+}
+
+uint32 Klaymen::hmIdleChest(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0D2A0288) {
+			playSound(0, 0xD192A368);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stDoIdleHeadOff() {
+	startIdleAnimation(0x5120E137, AnimationCallback(&Klaymen::stIdleHeadOff));
+}
+
+void Klaymen::stIdleHeadOff() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x5120E137, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmIdleHeadOff);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+}
+
+uint32 Klaymen::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC006000C) {
+			playSound(0, 0x9D406340);
+		} else if (param.asInteger() == 0x2E4A2940) {
+			playSound(0, 0x53A4A1D4);
+		} else if (param.asInteger() == 0xAA0A0860) {
+			playSound(0, 0x5BE0A3C6);
+		} else if (param.asInteger() == 0xC0180260) {
+			playSound(0, 0x5D418366);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stIdleWonderAbout() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+}
+
+void Klaymen::stSitIdleTeleporter() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x582EC138, 0, -1);
+	SetUpdateHandler(&Klaymen::upSitIdleTeleporter);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+	_idleCounter = 0;
+	_blinkCounter = 0;
+	_idleCounterMax = 8;
+	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+}
+
+void Klaymen::upSitIdleTeleporter() {
+	update();
+	_idleCounter++;
+	if (_idleCounter >= _idleCounterMax) {
+		_idleCounter = 0;
+		if (_idleTable) {
+			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
+			for (int i = 0; i < _idleTableCount; i++) {
+				if (randomValue < _idleTable[i].value) {
+					(this->*(_idleTable[i].callback))();
+					_idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24;
+					break;
+				}
+				randomValue -= _idleTable[i].value;
+			}
+		}
+	} else if (++_blinkCounter >= _blinkCounterMax) {
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+		stSitIdleTeleporterBlink();
+	}
+}
+
+void Klaymen::stSitIdleTeleporterBlink() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x5C24C018, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stSitIdleTeleporterBlinkSecond);
+}
+
+void Klaymen::stSitIdleTeleporterBlinkSecond() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x5C24C018, 0, -1);
+	SetUpdateHandler(&Klaymen::upSitIdleTeleporter);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stPickUpNeedle() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klaymen::stPickUpNeedle))) {
+		_status2 = 1;
+		_acceptInput = false;
+		startAnimation(0x1449C169, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPickUpObject);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void Klaymen::stPickUpTube() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klaymen::stPickUpTube))) {
+		_status2 = 1;
+		_acceptInput = false;
+		startAnimation(0x0018C032, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPickUpTube);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+uint32 Klaymen::hmPickUpTube(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC1380080) {
+			sendMessage(_attachedSprite, 0x4806, 0);
+			playSound(0, 0xC8004340);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x03020231) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0x67221A03) {
+			playSound(0, 0x44051000);
+		} else if (param.asInteger() == 0x925A0C1E) {
+			playSound(0, 0x40E5884D);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stTurnToUseInTeleporter() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0xD229823D, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stReturnFromUseInTeleporter() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x9A2801E0, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stStepOver() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stStepOver))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x004AA310, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmStartWalking);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stSitInTeleporter() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stSitInTeleporter))) {
+		_status2 = 0;
+		_acceptInput = false;
+		startAnimation(0x392A0330, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmSitInTeleporter);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+uint32 Klaymen::hmSitInTeleporter(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x001A2832) {
+			playSound(0, 0xC0E4884C);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stGetUpFromTeleporter() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x913AB120, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+/////////////////////////////////////////////////////////////////
+
+void Klaymen::stopWalking() {
+	_destX = _x;
+	if (!_isWalking && !_isSneaking && !_isLargeStep) {
+		gotoState(NULL);
+		gotoNextStateExt();
+	}
+}
+
+void Klaymen::startIdleAnimation(uint32 fileHash, AnimationCb callback) {
+	debug("startIdleAnimation(%08X)", fileHash);
+	NextState(callback);
+	SetUpdateHandler(&Klaymen::upIdleAnimation);
+}
+
+void Klaymen::upIdleAnimation() {
+	gotoNextStateExt();
+	update();
+}
+
+bool Klaymen::stStartActionFromIdle(AnimationCb callback) {
+	if (_status2 == 2) {
+		_status2 = 1;
+		_acceptInput = false; 
+		startAnimation(0x9A7020B8, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmStartAction);
+		SetSpriteUpdate(NULL);
+		NextState(callback);
+		return true;
+	}
+	return false;
+}
+
+void Klaymen::gotoNextStateExt() {
+	if (_finalizeStateCb) {
+		AnimationCb cb = _finalizeStateCb;
+		_finalizeStateCb = NULL;
+		(this->*cb)();
+	}
+	if (_nextStateCb) {
+		AnimationCb cb = _nextStateCb;
+		_nextStateCb = NULL;
+		(this->*cb)();
+	} else {
+		// Inform the scene that the current Klaymen animation sequence has finished
+		sendMessage(_parentScene, 0x1006, 0);
+	}
+}
+
+void Klaymen::sub41C770() {
+	_flagFA = false;
+	_status3 = 1;
+}
+
+void Klaymen::sub41C790() {
+	if (_flagFA)
+		_status3 = 0;
+}
+
+void Klaymen::stTryStandIdle() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTryStandIdle))) {
+		_status2 = 1;
+		_acceptInput = true;
+		startAnimation(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klaymen::upStandIdle);
+		SetMessageHandler(&Klaymen::hmLowLevel);
+		SetSpriteUpdate(NULL);
+		_idleCounter = 0;
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
+	}
+}
+
+void Klaymen::upStandIdle() {
+	update();
+	if (++_idleCounter >= 720) {
+		_idleCounter = 0;
+		if (_idleTable) {
+			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1);
+			for (int i = 0; i < _idleTableCount; i++) {
+				if (randomValue < _idleTable[i].value) {
+					(this->*(_idleTable[i].callback))();
+					break;
+				}
+				randomValue -= _idleTable[i].value;
+			}
+		}
+	} else if (++_blinkCounter >= _blinkCounterMax) {
+		_blinkCounter = 0;
+		_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
+		stIdleBlink();
+	}
+}
+
+uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam &param, Entity *sender) {
+	Sprite::handleMessage(messageNum, param, sender);
+	uint32 messageResult = xHandleMessage(messageNum, param);
+	switch (messageNum) {
+	case 0x1008:
+		messageResult = _acceptInput;
+		break;
+	case 0x1014:
+		_attachedSprite = (Sprite*)(param.asEntity());
+		break;
+	case 0x1019:
+		gotoNextStateExt();
+		break;
+	case 0x101C:
+		sub41C770();
+		break;
+	case 0x1021:
+		sub41C790();
+		break;
+	case 0x481C:
+		_status3 = param.asInteger();
+		_flagFA = true;
+		messageResult = 1;
+		break;
+	case 0x482C:
+		if (param.asInteger() != 0) {
+			_pathPoints = _dataResource.getPointArray(param.asInteger());
+		} else {
+			_pathPoints = NULL;
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stIdleBlink() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x5900C41E, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stStandAround);
+}
+
+uint32 Klaymen::hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x3002:
+		gotoNextStateExt();
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stStandAround() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x5420E254, 0, -1);
+	SetUpdateHandler(&Klaymen::upStandIdle);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmStartAction(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x271AA210) {
+			playSound(0, 0x4924AAC4);
+		} else if (param.asInteger() == 0x2B22AA81) {
+			playSound(0, 0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+
+void Klaymen::startWalkToX(int16 x, bool flag) {
+	int16 xdiff = ABS(x - _x);
+	if (x == _x) {
+		_destX = x;
+		if (!_isWalking && !_isSneaking && !_isLargeStep) {
+			gotoState(NULL);
+			gotoNextStateExt();
+		}
+	} else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) {
+		_destX = x;
+		gotoState(NULL);
+		gotoNextStateExt();
+	} else if (xdiff <= 42 && _status3 != 3) {
+		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
+			_destX = x;
+		} else {
+			_destX = x;
+			GotoState(&Klaymen::stSneak);
+		}
+	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_destX = x;
+	} else if (flag) {
+		_destX = x;
+		GotoState(&Klaymen::stStartWalkingExt);
+	} else {
+		_destX = x;
+		GotoState(&Klaymen::stStartWalking);
+	}
+}
+
+void Klaymen::stWakeUp() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimation(0x527AC970, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stSleeping() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x5A38C110, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmSleeping);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmSleeping(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x03060012) {
+			playSound(0, 0xC0238244);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+bool Klaymen::stStartAction(AnimationCb callback3) {
+	if (_status2 == 1) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x5C7080D4, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmStartAction);
+		SetSpriteUpdate(&Klaymen::suAction);
+		NextState(callback3);
+		return true;
+	} else {
+		_x = _destX;
+		return false;
+	}
+}
+
+void Klaymen::suAction() {
+
+	int16 xdiff = _destX - _x;
+
+	if (_doDeltaX) {
+		_x -= _deltaX;
+	} else {
+		_x += _deltaX;
+	}
+	_deltaX = 0;
+	
+	if (_doDeltaY) {
+		_y -= _deltaY;
+	} else {
+		_y += _deltaY;
+	}
+	_deltaY = 0;
+	
+	if (_frameChanged) {
+		if (xdiff > 6)
+			_x += 6;
+		else if (xdiff < -6)
+			_x -= 6;
+		else
+			_x = _destX;				
+	}
+	
+	updateBounds();
+	
+}
+
+void Klaymen::suSneaking() {
+	
+	int16 xdiff = _destX - _x;
+	
+	if (_currFrameIndex == 9) {
+		if (xdiff > 26)
+			_deltaX += xdiff - 26;
+		else if (xdiff < -26)			
+			_deltaX -= xdiff + 26;
+	}
+
+	if (xdiff > _deltaX)
+		xdiff = _deltaX;
+	else if (xdiff < -_deltaX)
+		xdiff = -_deltaX;
+	_deltaX = 0;				
+
+	if (_destX != _x) {
+		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
+		_x += xdiff;
+		if (_pathPoints) {
+			walkAlongPathPoints();
+		} else {
+			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
+			if (hitRectNext->type == 0x5002) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
+			} else if (hitRectNext->type == 0x5003) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
+			} else if (hitRectPrev->type == 0x5002) {
+				if (xdiff > 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			} else if (hitRectPrev->type == 0x5003) {
+				if (xdiff < 0) {
+					_y = hitRectPrev->rect.y2;
+				} else {
+					_y = hitRectPrev->rect.y1;
+				}
+			}
+		}
+		updateBounds();
+	}
+	
+}
+
+void Klaymen::stSneak() {
+	_status2 = 1;
+	_isSneaking = true;
+	_acceptInput = true;
+	setDoDeltaX(_destX < _x ? 1 : 0);
+	startAnimation(0x5C48C506, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmSneaking);
+	SetSpriteUpdate(&Klaymen::suSneaking);
+	FinalizeState(&Klaymen::evSneakingDone);	
+}
+
+void Klaymen::evSneakingDone() {
+	_isSneaking = false;
+}
+
+uint32 Klaymen::hmSneaking(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0A2AA8E0);
+		} else if (param.asInteger() == 0x32188010) {
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
+		} else if (param.asInteger() == 0x02A2909C) {
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
+		}
+		break;
+	case 0x3002:
+		_x = _destX;
+		gotoNextStateExt();
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stStartWalking() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalking))) {
+		_status2 = 0;
+		_isWalking = true;
+		_acceptInput = true;
+		setDoDeltaX(_destX < _x ? 1 : 0);
+		startAnimation(0x242C0198, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmStartWalking);
+		SetSpriteUpdate(&Klaymen::suWalkingTestExit);
+		NextState(&Klaymen::stWalkingFirst);
+		FinalizeState(&Klaymen::evStartWalkingDone);	
+	}
+}
+
+void Klaymen::evStartWalkingDone() {
+	_isWalking = false;
+}
+
+uint32 Klaymen::hmStartWalking(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stWalkingFirst() {
+	_status2 = 0;
+	_isWalking = true;
+	_acceptInput = true;
+	startAnimation(0x1A249001, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalking);
+	SetSpriteUpdate(&Klaymen::suWalkingFirst);
+	NextState(&Klaymen::stUpdateWalkingFirst);
+	FinalizeState(&Klaymen::evStartWalkingDone);	
+}
+
+void Klaymen::suWalkingFirst() {
+	SetSpriteUpdate(&Klaymen::suWalkingTestExit);
+	_deltaX = 0;
+}
+
+uint32 Klaymen::hmWalking(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stUpdateWalkingFirst() {
+	if (_status3 == 2) {
+		gotoNextStateExt();
+	} else if (_status3 == 3) {
+		stWalkingOpenDoor();
+	} else {
+		_isSneaking = true;
+		_acceptInput = true;
+		if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
+			if (_status3 == 0) {
+				_status2 = 1;
+				startAnimation(0xF234EE31, 0, -1);
+			} else {
+				_status2 = 2;
+				startAnimation(0xF135CC21, 0, -1);
+			}
+		} else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
+			if (_status3 == 0) {
+				_status2 = 1;
+				startAnimation(0x8604A152, 0, -1);
+			} else {
+				_status2 = 2;
+				startAnimation(0xA246A132, 0, -1);
+			}
+		}
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmSneaking);
+		SetSpriteUpdate(&Klaymen::suSneaking);
+		FinalizeState(&Klaymen::evSneakingDone);	
+	}
+}
+
+void Klaymen::suWalkingTestExit() {
+	int16 xdiff = ABS(_destX - _x);
+	int16 xdelta = _destX - _x;
+	
+	if (xdelta > _deltaX)
+		xdelta = _deltaX;
+	else if (xdelta < -_deltaX)
+		xdelta = -_deltaX;
+		
+	_deltaX = 0;		
+
+	if (xdiff == 0 ||
+		(_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) ||
+		(_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) ||
+		(_status3 == 3 && xdiff < 30) ||
+		(_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
+		sendMessage(this, 0x1019, 0);
+	} else {
+		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
+		_x += xdelta;
+		if (_pathPoints) {
+			walkAlongPathPoints();
+		} else {
+			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
+			if (hitRectNext->type == 0x5002) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
+			} else if (hitRectNext->type == 0x5003) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
+			} else if (hitRectPrev->type == 0x5002) {
+				_y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
+			} else if (hitRectPrev->type == 0x5003) {
+				_y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
+			} else if (_flagF6 && xdelta != 0) {
+				if (hitRectNext->type == 0x5000) {
+					_y++;
+				} else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) {
+					_y--;
+				}
+			}
+		}
+		updateBounds();
+	}
+	
+}
+
+uint32 Klaymen::hmLever(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stPickUpGeneric() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klaymen::stPickUpGeneric))) {
+		_status2 = 1;
+		_acceptInput = false;
+		startAnimation(0x1C28C178, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPickUpObject);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+uint32 Klaymen::hmPickUpObject(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC1380080) {
+			sendMessage(_attachedSprite, 0x4806, 0);
+			playSound(0, 0x40208200);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x03020231) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0x67221A03) {
+			playSound(0, 0x44051000);
+		} else if (param.asInteger() == 0x2EAE0303) {
+			playSound(0, 0x03630300);
+		} else if (param.asInteger() == 0x61CE4467) {
+			playSound(0, 0x03630300);
+		}
+		break;
+	}
+	return messageResult;
+
+}
+
+void Klaymen::stPressButton() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stPressButton))) {
+		_status2 = 2;
+		_acceptInput = true;
+		startAnimation(0x1C02B03D, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPressButton);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+uint32 Klaymen::hmPressButton(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x0D01B294) {
+			sendMessage(_attachedSprite, 0x480B, 0);
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stPressFloorButton() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stPressFloorButton))) {
+		_status2 = 2;
+		_acceptInput = true;
+		startAnimation(0x1C16B033, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPressButton);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+void Klaymen::stPressButtonSide() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stPressButtonSide))) {
+		_status2 = 1;
+		_acceptInput = true;
+		startAnimation(0x1CD89029, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPressButton);
+		SetSpriteUpdate(&Klaymen::suAction);
+	}
+}
+
+void Klaymen::startSpecialWalkRight(int16 x) {
+	if (_x == x) {
+		_destX = x;
+		gotoState(NULL);
+		gotoNextStateExt();
+	} else if (_x < x) {
+		startWalkToX(x, false);
+	} else if (_x - x <= 105) {
+		startWalkToXExt(x);
+	} else {
+		startWalkToX(x, false);
+	}
+}
+
+void Klaymen::startSpecialWalkLeft(int16 x) {
+	if (x == _x) {
+		_destX = x;
+		gotoState(NULL);
+		gotoNextStateExt();
+	} else if (x < _x) {
+		startWalkToX(x, false);
+	} else if (x - _x <= 105) {
+		startWalkToXExt(x);
+	} else {
+		startWalkToX(x, false);
+	}
+}
+
+void Klaymen::startWalkToXSmall(int16 x) {
+	_status3 = 2;
+	if (_x == x) {
+		_destX = x;
+		if (_isWalking) {
+			GotoState(NULL);
+			gotoNextStateExt();
+		}
+	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_destX = x;
+	} else {
+		_destX = x;
+		GotoState(&Klaymen::stStartWalkingSmall);
+	}
+}
+
+void Klaymen::stStartWalkingSmall() {
+	_isWalking = true;
+	_acceptInput = true;
+	_status3 = 2;
+	setDoDeltaX(_destX < _x ? 1 : 0);
+	startAnimation(0x3A4CD934, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkingSmall);
+	SetSpriteUpdate(&Klaymen::suWalkingTestExit);
+	FinalizeState(&Klaymen::evStartWalkingDone);
+}
+
+uint32 Klaymen::hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101)
+			playSound(0, 0x4924AAC4);
+		else if (param.asInteger() == 0x0A2A9098)
+			playSound(0, 0x0A2AA8E0);
+	}
+	return messageResult;
+}
+
+void Klaymen::stStandIdleSmall() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x90D0D1D0, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stWonderAboutAfterSmall() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x11C8D156, 30, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stWonderAboutHalfSmall() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x11C8D156, 0, 10);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stWonderAboutSmall() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x11C8D156, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stWalkToFrontNoStepSmall() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimationByHash(0x3F9CC394, 0x14884392, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+uint32 Klaymen::hmWalkFrontBackSmall(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5)
+			sendMessage(_parentScene, 0x482A, 0);
+		else if (param.asInteger() == 0x110010D1)
+			sendMessage(_parentScene, 0x482B, 0);
+		else if (param.asInteger() == 0x32180101)
+			playSound(0, 0x4924AAC4);
+		else if (param.asInteger() == 0x0A2A9098)
+			playSound(0, 0x0A2AA8E0);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stWalkToFront2Small() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2F1C4694, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+void Klaymen::stWalkToFrontSmall() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x3F9CC394, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+void Klaymen::stTurnToBackHalfSmall() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimationByHash(0x37ECD436, 0, 0x8520108C);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+void Klaymen::stTurnToBackWalkSmall() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x16EDDE36, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+void Klaymen::stTurnToBackSmall() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x37ECD436, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkFrontBackSmall);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+void Klaymen::stPullCord() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stPullCord))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x3F28E094, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPullReleaseCord);
+		SetSpriteUpdate(NULL);
+		NextState(&Klaymen::stReleaseCord);
+	}
+}
+
+void Klaymen::stReleaseCord() {
+	_acceptInput = false;
+	startAnimation(0x3A28C094, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmPullReleaseCord);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmPullReleaseCord(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+			sendMessage(_attachedSprite, 0x480F, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stUseTube() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stUseTube))) {
+		_status2 = 1;
+		_acceptInput = false;
+		startAnimation(0x1A38A814, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmUseTube);
+		SetSpriteUpdate(NULL);
+	}
+}
+
+uint32 Klaymen::hmUseTube(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x02B20220)
+			playSound(0, 0xC5408620);
+		else if (param.asInteger() == 0x0A720138)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0x03020231)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0xB613A180)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x67221A03)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x038A010B)
+			playSound(0, 0x00018040);
+		else if (param.asInteger() == 0x422B0280)
+			playSound(0, 0x166FC6E0);
+		else if (param.asInteger() == 0x925A0C1E)
+			playSound(0, 0x40E5884D);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stWalkingFirstExt() {
+	_status2 = 0;
+	_isWalking = true;
+	_acceptInput = true;
+	startAnimation(0x5A2CBC00, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalking);
+	SetSpriteUpdate(&Klaymen::suWalkingFirst);
+	NextState(&Klaymen::stUpdateWalkingFirst);
+	FinalizeState(&Klaymen::evStartWalkingDone);
+}
+
+void Klaymen::stStartWalkingExt() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalkingExt))) {
+		_status2 = 0;
+		_isWalking = true;
+		_acceptInput = true;
+		setDoDeltaX(_destX < _x ? 1 : 0);
+		startAnimation(0x272C1199, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmStartWalking);
+		SetSpriteUpdate(&Klaymen::suWalkingTestExit);
+		NextState(&Klaymen::stWalkingFirstExt);
+		FinalizeState(&Klaymen::evStartWalkingDone);
+	}
+}
+
+void Klaymen::sub41CC40(int16 x1, int16 x2) {
+	if (_x > x1) {
+		if (_x == x1 + x2) {
+			_destX = x1 + x2;
+			gotoState(NULL);
+			gotoNextStateExt();
+		} else if (_x < x1 + x2) {
+			startWalkToXExt(x1 + x2);
+		} else {
+			startWalkToX(x1 + x2, false);
+		}
+	} else {
+		if (_x == x1 - x2) {
+			_destX = x1 - x2;
+			gotoState(NULL);
+			gotoNextStateExt();
+		} else if (_x > x1 - x2) {
+			startWalkToXExt(x1 - x2);
+		} else {
+			startWalkToX(x1 - x2, false);
+		}
+	}
+}
+
+void Klaymen::startWalkToXExt(int16 x) {
+	int16 xdiff = ABS(x - _x);
+	if (x == _x) {
+		_destX = x;
+		if (!_isWalking && !_isSneaking && !_isLargeStep) {
+			gotoState(NULL);
+			gotoNextStateExt();
+		}
+	} else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) {
+		_destX = x;
+		gotoState(NULL);
+		gotoNextStateExt();
+	} else if (xdiff <= 42 && _status3 != 3) {
+		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
+			_destX = x;
+		} else {
+			_destX = x;
+			GotoState(&Klaymen::stSneak);
+		}
+	} else if (_isLargeStep && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
+		_destX = x;
+	} else {
+		_destX = x;
+		GotoState(&Klaymen::stLargeStep);
+	}
+}
+
+void Klaymen::stLargeStep() {
+	_status2 = 2;
+	_isLargeStep = true;
+	_acceptInput = true;
+	setDoDeltaX(_destX >= _x ? 1 : 0);
+	startAnimation(0x08B28116, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLargeStep);
+	SetSpriteUpdate(&Klaymen::suLargeStep);
+	FinalizeState(&Klaymen::evLargeStepDone);	
+}
+
+void Klaymen::evLargeStepDone() {
+	_isLargeStep = false;
+}
+
+void Klaymen::suLargeStep() {
+	int16 xdiff = _destX - _x;
+	
+	if (_doDeltaX) {
+		_deltaX = -_deltaX;
+	}
+	
+	if (_currFrameIndex == 7) {
+		_deltaX = xdiff;
+	}
+
+	if ((xdiff > 0 && xdiff > _deltaX) || (xdiff < 0 && xdiff < _deltaX))
+		xdiff = _deltaX;
+
+	_deltaX = 0;
+	
+	if (_x != _destX) {
+		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
+		_x += xdiff;
+		if (_pathPoints) {
+			walkAlongPathPoints();
+		} else {
+			HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y);
+			if (hitRectNext->type == 0x5002) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2);
+			} else if (hitRectNext->type == 0x5003) {
+				_y = MAX<int16>(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2);
+			} else if (hitRectPrev->type == 0x5002) {
+				_y = xdiff > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
+			} else if (hitRectPrev->type == 0x5003) {
+				_y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
+			}
+		}
+		updateBounds();
+	}
+}
+
+uint32 Klaymen::hmLargeStep(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0A2AA8E0);
+		}
+		break;
+	case 0x3002:
+		_x = _destX;
+		gotoNextStateExt();
+		break;		
+	}
+	return messageResult;
+}
+
+void Klaymen::stWonderAboutHalf() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, 10);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stWonderAboutAfter() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 30, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stTurnToUseHalf() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x9B250AD2, 0, 7);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmTurnToUse);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmTurnToUse(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stTurnAwayFromUse() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x98F88391, 4, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmTurnToUse);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stWonderAbout() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stPeekWall() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmPeekWall);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmPeekWall(int messageNum, const MessageParam &param, Entity *sender) {
+	int16 speedUpFrameIndex;
+	switch (messageNum) {
+	case 0x1008:
+		speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash);
+		if (_currFrameIndex < speedUpFrameIndex)
+			startAnimation(0xAC20C012, speedUpFrameIndex, -1);
+		return 0;
+	case 0x100D:
+		if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0460E2FA);
+		}
+		break;
+	}
+	return hmLowLevelAnimation(messageNum, param, sender);
+}
+
+void Klaymen::stJumpToRing1() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing1))) {
+		_status2 = 0;
+		startAnimation(0xD82890BA, 0, -1);
+		setupJumpToRing();
+	}
+}
+
+void Klaymen::setupJumpToRing() {
+	_acceptInput = false;
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmJumpToRing);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	NextState(&Klaymen::stHangOnRing);
+	sendMessage(_attachedSprite, 0x482B, 0);
+}
+
+uint32 Klaymen::hmJumpToRing(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0) {
+			sendMessage(_attachedSprite, 0x4806, 0);
+			_acceptInput = true;
+		} else if (param.asInteger() == 0x320AC306) {
+			playSound(0, 0x5860C640);
+		} else if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::suUpdateDestX() {
+	AnimatedSprite::updateDeltaXY();
+	_destX = _x;
+}
+
+void Klaymen::stHangOnRing() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x4829E0B8, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stJumpToRing2() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing2))) {
+		_status2 = 0;
+		startAnimation(0x900980B2, 0, -1);
+		setupJumpToRing();
+	}
+}
+
+void Klaymen::stJumpToRing3() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing3))) {
+		_status2 = 0;
+		_acceptInput = false;
+		startAnimation(0xBA1910B2, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+		SetMessageHandler(&Klaymen::hmJumpToRing3);
+		NextState(&Klaymen::stHoldRing3);
+		sendMessage(_attachedSprite, 0x482B, 0);
+	}
+}
+
+uint32 Klaymen::hmJumpToRing3(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0) {
+			sendMessage(_attachedSprite, 0x4806, 0);
+		} else if (param.asInteger() == 0x320AC306) {
+			playSound(0, 0x5860C640);
+		} else if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stHoldRing3() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x4A293FB0, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmHoldRing3);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmHoldRing3(int messageNum, const MessageParam &param, Entity *sender) {
+	if (messageNum == 0x1008) {
+		stReleaseRing();
+		return 0;
+	}
+	return hmLowLevel(messageNum, param, sender);
+}
+
+void Klaymen::stReleaseRing() {
+	_status2 = 1;
+	_acceptInput = false;
+	sendMessage(_attachedSprite, 0x4807, 0);
+	_attachedSprite = NULL;
+	startAnimation(0xB869A4B9, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stJumpToRing4() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing4))) {
+		_status2 = 0;
+		startAnimation(0xB8699832, 0, -1);
+		setupJumpToRing();
+	}
+}
+
+void Klaymen::sub41CCE0(int16 x) {
+	sub41CC40(_attachedSprite->getX(), x);
+}
+
+void Klaymen::stContinueClimbLadderUp() {
+	_status2 = 0;
+	_acceptInput = true;
+	_ladderStatus = 3;
+	startAnimationByHash(0x3A292504, 0x01084280, 0);
+	_newStickFrameHash = 0x01084280;
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+	gotoNextStateExt();
+}
+
+void Klaymen::stStartClimbLadderDown() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderDown))) {
+		_status2 = 0;
+		if (_destY < _y) {
+			if (_ladderStatus == 1) {
+				_ladderStatus = 2;
+				stClimbLadderHalf();
+			} else {
+				gotoNextStateExt();
+			}
+		} else if (_ladderStatus == 0) {
+			_ladderStatus = 2;
+			_acceptInput = false;
+			startAnimation(0x122D1505, 0, -1);
+			SetUpdateHandler(&Klaymen::update);
+			SetMessageHandler(&Klaymen::hmClimbLadderUpDown);
+			SetSpriteUpdate(&Klaymen::suUpdateDestX);
+		} else if (_ladderStatus == 3) {
+			_ladderStatus = 2;
+			_acceptInput = true;
+			startAnimationByHash(0x122D1505, 0x01084280, 0);
+			SetUpdateHandler(&Klaymen::update);
+			SetMessageHandler(&Klaymen::hmClimbLadderUpDown);
+			SetSpriteUpdate(&Klaymen::suUpdateDestX);
+		} else if (_ladderStatus == 1) {
+			_ladderStatus = 2;
+			_acceptInput = true;
+			startAnimation(0x122D1505, 29 - _currFrameIndex, -1);
+		} 
+	}
+}
+
+void Klaymen::stClimbLadderHalf() {
+	_status2 = 2;
+	if (_ladderStatus == 1) {
+		_ladderStatus = 0;
+		_acceptInput = false;
+		startAnimationByHash(0x3A292504, 0x02421405, 0);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmClimbLadderHalf);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	} else if (_ladderStatus == 2) {
+		_ladderStatus = 0;
+		_acceptInput = false;
+		startAnimationByHash(0x122D1505, 0x02421405, 0);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmClimbLadderHalf);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	} else {
+		gotoNextStateExt();
+	}
+}
+
+uint32 Klaymen::hmClimbLadderHalf(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x489B025C) {
+			playSound(0, 0x52C4C2D7);
+		} else if (param.asInteger() == 0x400A0E64) {
+			playSound(0, 0x50E081D9);
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmClimbLadderUpDown(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			_acceptInput = true;
+		} else if (param.asInteger() == 0x489B025C) {
+			playSound(0, 0x52C4C2D7);
+		} else if (param.asInteger() == 0x400A0E64) {
+			playSound(0, 0x50E081D9);
+		} else if (param.asInteger() == 0x02421405) {
+			if (_ladderStatus == 1) {
+				startAnimationByHash(0x3A292504, 0x01084280, 0);
+				if (_destY >= _y - 30)
+					sendMessage(this, 0x1019, 0);
+			} else {
+				startAnimationByHash(0x122D1505, 0x01084280, 0);
+				if (_destY <= _y)
+					sendMessage(this, 0x1019, 0);
+			}
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stStartClimbLadderUp() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderUp))) {
+		_status2 = 0;
+		if (_destY >= _y - 30) {
+			gotoNextStateExt();
+		} else if (_ladderStatus == 0) {
+			_ladderStatus = 1;
+			_acceptInput = false;
+			startAnimation(0x3A292504, 0, -1);
+			SetUpdateHandler(&Klaymen::update);
+			SetMessageHandler(&Klaymen::hmClimbLadderUpDown);
+			SetSpriteUpdate(&Klaymen::suUpdateDestX);
+		} else if (_ladderStatus == 3) {
+			_ladderStatus = 1;
+			_acceptInput = true;
+			startAnimationByHash(0x3A292504, 0x01084280, 0);
+			SetUpdateHandler(&Klaymen::update);
+			SetMessageHandler(&Klaymen::hmClimbLadderUpDown);
+			SetSpriteUpdate(&Klaymen::suUpdateDestX);
+		} else if (_ladderStatus == 2) {
+			_ladderStatus = 1;
+			_acceptInput = true;
+			startAnimation(0x3A292504, 29 - _currFrameIndex, -1);
+		}
+	}
+}
+
+void Klaymen::stWalkToFrontNoStep() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimationByHash(0xF229C003, 0x14884392, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmWalkToFront);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+uint32 Klaymen::hmWalkToFront(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5) {
+			sendMessage(_parentScene, 0x482A, 0);
+		} else if (param.asInteger() == 0x110010D1) {
+			sendMessage(_parentScene, 0x482B, 0);
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stWalkToFront() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stWalkToFront))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0xF229C003, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmWalkToFront);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stTurnToFront() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToFront))) {
+		_status2 = 0;
+		_acceptInput = false;
+		startAnimationByHash(0xCA221107, 0, 0x8520108C);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmWalkToFront);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stTurnToBack() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBack))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0xCA221107, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmWalkToFront);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stLandOnFeet() {
+	_status2 = 1;
+	_acceptInput = true;
+	startAnimation(0x18118554, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLandOnFeet);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x320AC306) {
+			playSound(0, 0x5860C640);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stTurnToBackToUse() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBackToUse))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x91540140, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmTurnToBackToUse);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+uint32 Klaymen::hmTurnToBackToUse(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0xC61A0119) {
+			playSound(0, 0x402338C2);
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x4924AAC4);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0A2AA8E0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stClayDoorOpen() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stClayDoorOpen))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x5CCCB330, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmClayDoorOpen);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+uint32 Klaymen::hmClayDoorOpen(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x040D4186) {
+			sendMessage(_attachedSprite, 0x4808, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stTurnToUse() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUse))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x9B250AD2, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmTurnToUse);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stReturnFromUse() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimation(0x98F88391, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmTurnToUse);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+}
+
+void Klaymen::stWalkingOpenDoor() {
+	_isWalkingOpenDoorNotified = false;
+	_acceptInput = false;
+	startAnimation(0x11A8E012, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmStartWalking);
+	SetSpriteUpdate(&Klaymen::suWalkingOpenDoor);
+}
+
+void Klaymen::suWalkingOpenDoor() {
+	if (!_isWalkingOpenDoorNotified && ABS(_destX - _x) < 80) {
+		sendMessage(_parentScene, 0x4829, 0);
+		_isWalkingOpenDoorNotified = true;
+	}
+	AnimatedSprite::updateDeltaXY();
+}
+
+void Klaymen::stMoveObjectSkipTurnFaceObject() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	_isMoveObjectRequested = false;
+	_acceptInput = true;
+	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	SetMessageHandler(&Klaymen::hmMoveObjectTurn);
+}
+
+void Klaymen::evMoveObjectTurnDone() {
+	sendMessage(_attachedSprite, 0x4807, 0);
+}
+
+uint32 Klaymen::hmMoveObjectTurn(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0);
+		} else if (param.asInteger() == 0x02421405) {
+			if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) {
+				stMoveObjectSkipTurn();
+			} else {
+				FinalizeState(&Klaymen::evMoveObjectTurnDone);
+				SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+			}
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0460E2FA);
+		}
+		break;
+	case 0x480A:
+		_isMoveObjectRequested = true;
+		return 0;		
+	}
+	return hmLowLevelAnimation(messageNum, param, sender);
+}
+
+void Klaymen::stMoveObjectSkipTurn() {
+	_isMoveObjectRequested = false;
+	_acceptInput = true;
+	startAnimationByHash(0x0C1CA072, 0x01084280, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	SetMessageHandler(&Klaymen::hmMoveObjectTurn);
+}
+
+void Klaymen::stMoveObjectFaceObject() {
+	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
+	if (!stStartAction(AnimationCallback(&Klaymen::stMoveObjectFaceObject))) {
+		_status2 = 2;
+		_isMoveObjectRequested = false;
+		_acceptInput = true;
+		startAnimation(0x0C1CA072, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmMoveObjectTurn);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stUseLever() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stUseLever))) {
+		_status2 = 0;
+		if (_isLeverDown) {
+			stUseLeverRelease();
+		} else {
+			sendMessage(_attachedSprite, 0x482B, 0);
+			startAnimation(0x0C303040, 0, -1);
+			SetSpriteUpdate(&Klaymen::suUpdateDestX);
+			SetMessageHandler(&Klaymen::hmLever);
+			SetUpdateHandler(&Klaymen::update);
+			NextState(&Klaymen::stPullLeverDown);
+			_acceptInput = false;
+		}
+	}
+}
+
+// Exactly the same code as sub420DA0 which was removed
+void Klaymen::stPullLeverDown() {
+	startAnimation(0x0D318140, 0, -1);
+	sendMessage(_attachedSprite, 0x480F, 0);
+	NextState(&Klaymen::stHoldLeverDown);
+}
+
+void Klaymen::stHoldLeverDown() {
+	startAnimation(0x4464A440, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	_isLeverDown = true;
+	_acceptInput = true;
+}
+
+void Klaymen::stUseLeverRelease() {
+	startAnimation(0x09018068, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLever);
+	SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	sendMessage(_attachedSprite, 0x4807, 0);
+	NextState(&Klaymen::stPullLeverDown);
+	_acceptInput = false;
+}
+
+void Klaymen::stReleaseLever() {
+	if (_isLeverDown) {
+		_status2 = 2;
+		startAnimation(0x09018068, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmLever);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+		sendMessage(_attachedSprite, 0x4807, 0);
+		NextState(&Klaymen::stLetGoOfLever);
+		_acceptInput = false;
+		_isLeverDown = false;
+	} else {
+		gotoNextStateExt();
+	}
+}
+
+void Klaymen::stLetGoOfLever() {
+	startAnimation(0x0928C048, 0, -1);
+	FinalizeState(&Klaymen::evLeverReleasedEvent);
+}
+
+void Klaymen::evLeverReleasedEvent() {
+	sendMessage(_attachedSprite, 0x482A, 0);
+}
+
+void Klaymen::stInsertDisk() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertDisk))) {
+		_status2 = 2;
+		_tapesToInsert = 0;
+		for (uint32 i = 0; i < 20; i++) {
+			if (getSubVar(VA_HAS_TAPE, i)) {
+				setSubVar(VA_IS_TAPE_INSERTED, i, 1);
+				setSubVar(VA_HAS_TAPE, i, 0);
+				_tapesToInsert++;
+			}
+		}
+		if (_tapesToInsert == 0) {
+			GotoState(NULL);
+			gotoNextStateExt();
+		} else {
+			startAnimation(0xD8C8D100, 0, -1);
+			SetUpdateHandler(&Klaymen::update);
+			SetMessageHandler(&Klaymen::hmInsertDisk);
+			SetSpriteUpdate(&Klaymen::suAction);
+			_acceptInput = false;
+			_tapesToInsert--;
+		}
+	}
+}
+
+uint32 Klaymen::hmInsertDisk(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) {
+			nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0);
+		} else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) {
+			_tapesToInsert--;
+			startAnimationByHash(0xD8C8D100, 0x01084280, 0);
+		} else if (param.asInteger() == 0x062A1510) {
+			playSound(0, 0x41688704);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			playSound(0, 0x44051000);
+		} else if (param.asInteger() == 0x0E040501) {
+			playSound(1, 0xC6A129C1);
+		}
+	}
+	return messageResult;
+}
+
+void Klaymen::walkAlongPathPoints() {
+	if (_x <= (*_pathPoints)[0].x)
+		_y = (*_pathPoints)[0].y;
+	else if (_x >= (*_pathPoints)[_pathPoints->size() - 1].x)
+		_y = (*_pathPoints)[_pathPoints->size() - 1].y;
+	else {
+		int16 deltaX = _x - (*_pathPoints)[0].x, deltaXIncr = 0;
+		uint index = 0;
+		while (deltaX > 0) {
+			NPoint pt2 = (*_pathPoints)[index];
+			NPoint pt1 = index + 1 >= _pathPoints->size() ? (*_pathPoints)[0] : (*_pathPoints)[index + 1];
+			int16 xd = ABS(pt1.x - pt2.x);
+			int16 yd = ABS(pt1.y - pt2.y);
+			if (deltaX + deltaXIncr >= xd) {
+				deltaX -= xd;
+				deltaX += deltaXIncr;
+				++index;
+				if (index >= _pathPoints->size())
+					index = 0;
+				_y = (*_pathPoints)[index].y;
+			} else {
+				deltaXIncr += deltaX;
+				if (pt1.y >= pt2.y) {
+					_y = pt2.y + (yd * deltaXIncr) / xd;
+				} else {
+					_y = pt2.y - (yd * deltaXIncr) / xd;
+				}
+				deltaX = 0;
+			}
+		}
+	}
+}
+
+void Klaymen::stJumpToGrab() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimationByHash(0x00AB8C10, 0x01084280, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetSpriteUpdate(&Klaymen::suJumpToGrab);
+	SetMessageHandler(&Klaymen::hmJumpToGrab);
+}
+
+void Klaymen::suJumpToGrab() {
+	updateDeltaXY();
+	if (_y >= _destY) {
+		_y = _destY;
+		updateBounds();
+		gotoNextStateExt();
+	}
+}
+
+uint32 Klaymen::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0)
+			sendMessage(_attachedSprite, 0x4806, 0);
+		else if (param.asInteger() == 0x320AC306)
+			startAnimationByHash(0x00AB8C10, 0x01084280, 0);
+		else if (param.asInteger() == 0x4AB28209)
+			sendMessage(_attachedSprite, 0x482A, 0);
+		else if (param.asInteger() == 0x88001184)
+			sendMessage(_attachedSprite, 0x482B, 0);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stFinishGrow() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimation(0x38445000, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klaymen::hmFinishGrow);
+}
+
+uint32 Klaymen::hmFinishGrow(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x040C4C01)
+			playSound(0, 0x01E11140);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stTurnToUseExt() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUseExt))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x1B3D8216, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmTurnToUse);
+		SetSpriteUpdate(&Klaymen::suUpdateDestX);
+	}
+}
+
+void Klaymen::stJumpToGrabFall() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToGrabFall))) {
+		_status2 = 0;
+		_acceptInput = false;
+		startAnimation(0x00AB8C10, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmJumpToGrab);
+		SetSpriteUpdate(&Klaymen::suJumpToGrab);
+		sendMessage(_attachedSprite, 0x482B, 0);
+	}
+}
+
+void Klaymen::stJumpToGrabRelease() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimationByHash(0x00AB8C10, 0x320AC306, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmJumpToGrabRelease);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stReleaseRing);
+}
+
+uint32 Klaymen::hmJumpToGrabRelease(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x320AC306)
+			playSound(0, 0x5860C640);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stDoIdleTeleporterHands() {
+	startIdleAnimation(0x90EF8D38, AnimationCallback(&Klaymen::stIdleTeleporterHands));
+}
+
+void Klaymen::stIdleTeleporterHands() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x90EF8D38, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stSitIdleTeleporterBlinkSecond);
+}
+
+void Klaymen::stDoIdleTeleporterHands2() {
+	startIdleAnimation(0x900F0930, AnimationCallback(&Klaymen::stIdleTeleporterHands2));
+}
+
+void Klaymen::stIdleTeleporterHands2() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0x900F0930, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stSitIdleTeleporterBlinkSecond);
+}
+
+void Klaymen::teleporterAppear(uint32 fileHash) {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(fileHash, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmTeleporterAppearDisappear);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::teleporterDisappear(uint32 fileHash) {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(fileHash, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmTeleporterAppearDisappear);
+	SetSpriteUpdate(NULL);
+}
+
+uint32 Klaymen::hmTeleporterAppearDisappear(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4E0A2C24) {
+			playSound(0, 0x85B10BB8);
+		} else if (param.asInteger() == 0x4E6A0CA0) {
+			playSound(0, 0xC5B709B0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmShrink(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x80C110B5)
+			sendMessage(_parentScene, 0x482A, 0);
+		else if (param.asInteger() == 0x33288344)
+			playSound(2, 0x10688664);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stShrink() {
+	_status2 = 0;
+	_acceptInput = false;
+	playSound(0, 0x4C69EA53);
+	startAnimation(0x1AE88904, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmShrink);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+void Klaymen::stStandWonderAbout() {
+	if (_x > 260)
+		setDoDeltaX(1);
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xD820A114, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(NULL);
+	_newStickFrameIndex = 10;
+}
+
+uint32 Klaymen::hmDrinkPotion(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1008:
+		if (_potionFlag1) {
+			startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+			messageResult = 0;
+		} else
+			_potionFlag2 = true;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x0002418E)
+			sendMessage(_parentScene, 0x2000, 0);
+		else if (param.asInteger() == 0x924090C2) {
+			_potionFlag1 = true;
+			if (_potionFlag2) {
+				startAnimationByHash(0x1C388C04, 0x004A2148, 0);
+				messageResult = 0;
+			}
+		} else if (param.asInteger() == 0x004A2148)
+			_potionFlag1 = false;
+		else if (param.asInteger() == 0x02B20220)
+			playSound(0, 0xC5408620);
+		else if (param.asInteger() == 0x0A720138)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0x03020231)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0xB613A180)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x67221A03)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x038A010B)
+			playSound(0, 0x00018040);
+		else if (param.asInteger() == 0x422B0280)
+			playSound(0, 0x166FC6E0);
+		else if (param.asInteger() == 0x925A0C1E)
+			playSound(0, 0x40E5884D);
+		else if (param.asInteger() == 0x000F0082)
+			playSound(0, 0x546CDCC1);
+		else if (param.asInteger() == 0x00020814)
+			playSound(0, 0x786CC6D0);
+		else if (param.asInteger() == 0x06020500)
+			playSound(0, 0x1069C0E1);
+		else if (param.asInteger() == 0x02128C00)
+			playSound(0, 0x5068C4C3);
+		else if (param.asInteger() == 0x82022030)
+			playSound(0, 0x5C48C0E8);
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmGrow(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x32180101)
+			playSound(0, 0x405002D8);
+		else if (param.asInteger() == 0x0A2A9098)
+			playSound(0, 0x0460E2FA);
+		else if (param.asInteger() == 0xD00A0C0C)
+			playSound(3);
+		else if (param.asInteger() == 0x04121920)
+			playSound(4);
+		else if (param.asInteger() == 0x030B4480)
+			playSound(5);
+		else if (param.asInteger() == 0x422B0280)
+			playSound(6);
+		else if (param.asInteger() == 0x038A010B)
+			playSound(7);
+		else if (param.asInteger() == 0x67221A03)
+			playSound(0, 0x44051000);
+		else if (param.asInteger() == 0x02B20220)
+			playSound(0, 0xC5408620);
+		else if (param.asInteger() == 0x925A0C1E)
+			playSound(0, 0x40E5884D);
+		else if (param.asInteger() == 0x03020231)
+			playSound(0, 0xD4C08010);
+		else if (param.asInteger() == 0x08040840)
+			setDoDeltaX(2);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stGrow() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2838C010, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmGrow);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+void Klaymen::stDrinkPotion() {
+	_status2 = 1;
+	_acceptInput = false;
+	_potionFlag1 = false;
+	_potionFlag2 = false;
+	startAnimation(0x1C388C04, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmDrinkPotion);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+uint32 Klaymen::hmInsertKey(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (_keysToInsert == 0 && param.asInteger() == 0x06040580) {
+			nextAnimationByHash(0xDC409440, 0x46431401, 0);
+		} else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) {
+			_keysToInsert--;
+			startAnimationByHash(0xDC409440, 0x01084280, 0);
+		} else if (param.asInteger() == 0x062A1510) {
+			playSound(0, 0x41688704);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			playSound(0, 0x44051000);
+		} else if (param.asInteger() == 0x0E4C8141) {
+			playSound(0, 0xDC4A1280);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stInsertKey() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertKey))) {
+		_status2 = 2;
+		_keysToInsert = 0;
+		for (uint32 i = 0; i < 3; i++) {
+			if (getSubVar(VA_HAS_KEY, i)) {
+				bool more;
+				setSubVar(VA_IS_KEY_INSERTED, i, 1);
+				setSubVar(VA_HAS_KEY, i, 0);
+				do {
+					more = false;
+					setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1));
+					for (uint j = 0; j < i && !more; j++) {
+						if (getSubVar(VA_IS_KEY_INSERTED, j) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i))
+							more = true;
+					}
+					if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i))
+						more = true;
+				} while (more);
+				_keysToInsert++;
+			} 
+		}
+		if (_keysToInsert == 0) {
+			GotoState(NULL);
+			gotoNextStateExt();
+		} else {
+			_acceptInput = false;
+			startAnimation(0xDC409440, 0, -1);
+			SetUpdateHandler(&Klaymen::update);
+			SetMessageHandler(&Klaymen::hmInsertKey);
+			SetSpriteUpdate(&Klaymen::suAction);
+			_keysToInsert--;
+		}
+	}
+}
+
+uint32 Klaymen::hmReadNote(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x04684052) {
+			_acceptInput = true;
+			sendMessage(_parentScene, 0x2002, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stReadNote() {
+	_status2 = 2;
+	_acceptInput = false;
+	startAnimation(0x123E9C9F, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmReadNote);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+}
+
+uint32 Klaymen::hmHitByDoor(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	int16 speedUpFrameIndex;
+	switch (messageNum) {
+	case 0x1008:
+		speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash);
+		if (_currFrameIndex < speedUpFrameIndex) {
+			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
+			_y = 438;
+		}
+		messageResult = 0;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x1A1A0785) {
+			playSound(0, 0x40F0A342);
+		} else if (param.asInteger() == 0x60428026) {
+			playSound(0, 0x40608A59);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::stHitByDoor() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimation(0x35AA8059, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmHitByDoor);
+	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	playSound(0, 0x402E82D4);
+}
+
+uint32 Klaymen::hmPeekWallReturn(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == calcHash("PopBalloon")) {
+			sendMessage(_parentScene, 0x2000, 0);
+		} else if (param.asInteger() == 0x02B20220) {
+			playSound(0, 0xC5408620);
+		} else if (param.asInteger() == 0x0A720138) {
+			playSound(0, 0xD4C08010);
+		} else if (param.asInteger() == 0xB613A180) {
+			playSound(0, 0x44051000);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::upPeekWallBlink() {
+	Klaymen::update();
+	_blinkCounter++;
+	if (_blinkCounter >= _blinkCounterMax)
+		stPeekWallBlink();
+}
+
+void Klaymen::stPeekWall1() {
+	_status2 = 0;
+	_acceptInput = true;
+	startAnimation(0xAC20C012, 8, 37);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(NULL);
+	NextState(&Klaymen::stPeekWallBlink);
+}
+
+void Klaymen::stPeekWall2() {
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimation(0xAC20C012, 43, 49);
+	SetUpdateHandler(&Klaymen::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+}
+
+void Klaymen::stPeekWallBlink() {
+	_blinkCounter = 0;
+	_status2 = 0;
+	_acceptInput = true;
+	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
+	startAnimation(0xAC20C012, 38, 42);
+	SetUpdateHandler(&Klaymen::upPeekWallBlink);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	_newStickFrameIndex = 42;
+}
+
+void Klaymen::stPeekWallReturn() {
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x2426932E, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmPeekWallReturn);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stPullHammerLever() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stPullHammerLever))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x00648953, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmPullHammerLever);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+	}
+}
+
+uint32 Klaymen::hmPullHammerLever(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = Klaymen::hmLever(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209)
+			sendMessage(_attachedSprite, 0x480F, 0);
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::suRidePlatformDown() {
+	_platformDeltaY++;
+	_y += _platformDeltaY;
+	if (_y > 600)
+		sendMessage(this, 0x1019, 0);
+}
+
+void Klaymen::stRidePlatformDown() {
+	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatformDown))) {
+		_status2 = 1;
+		sendMessage(_parentScene, 0x4803, 0);
+		_acceptInput = false;
+		_platformDeltaY = 0;
+		startAnimation(0x5420E254, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmLowLevel);
+		SetSpriteUpdate(&Klaymen::suRidePlatformDown);
+		_vm->_soundMan->playSoundLooping(0xD3B02847);
+	}
+}
+
+void Klaymen::stCrashDown() {
+	playSound(0, 0x41648271);
+	_status2 = 1;
+	_acceptInput = false;
+	startAnimationByHash(0x000BAB02, 0x88003000, 0);
+	SetUpdateHandler(&Klaymen::update);
+	SetSpriteUpdate(NULL);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	NextState(&Klaymen::stCrashDownFinished);
+}
+
+void Klaymen::stCrashDownFinished() {
+	setDoDeltaX(2);
+	stTryStandIdle();
+}
+
+void Klaymen::upSpitOutFall() {
+	Klaymen::update();
+	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+		_surface->setVisible(true);
+		SetUpdateHandler(&Klaymen::update);
+	}
+}
+
+uint32 Klaymen::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x168050A0) {
+			sendMessage(_attachedSprite, 0x480F, 0);
+		} else if (param.asInteger() == 0x586B0300) {
+			sendMessage(_otherSprite, 0x480E, 1);
+		} else if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmStandIdleSpecial(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x4811:
+		playSound(0, 0x5252A0E4);
+		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
+		if (_doDeltaX) {
+			_x = ((Sprite*)sender)->getX() - 75;
+		} else {
+			_x = ((Sprite*)sender)->getX() + 75;
+		}
+		_y = ((Sprite*)sender)->getY() - 200;
+		if (param.asInteger() == 0) {
+			stSpitOutFall0();
+		} else if (param.asInteger() == 1) {
+			// NOTE This is never used and the code was removed
+			// Also the animations used here in the original don't exist...
+		} else if (param.asInteger() == 2) {
+			stSpitOutFall2();
+		}
+		break;
+	}
+	return 0;
+}
+
+uint32 Klaymen::hmPressDoorButton(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x942D2081) {
+			_acceptInput = false;
+			sendMessage(_attachedSprite, 0x2003, 0);
+		} else if (param.asInteger() == 0xDA600012) {
+			stHitByBoxingGlove();
+		} else if (param.asInteger() == 0x0D01B294) {
+			_acceptInput = false;
+			sendMessage(_attachedSprite, 0x480B, 0);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x01084280) {
+			sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX);
+		} else if (param.asInteger() == 0x02421405) {
+			if (_isMoveObjectRequested) {
+				if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0)
+					stContinueMovingVenusFlyTrap();
+			} else {
+				SetMessageHandler(&Klaymen::hmFirstMoveVenusFlyTrap);
+			}
+		} else if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0460E2FA);
+		}
+		break;
+	case 0x480A:
+		_isMoveObjectRequested = true;
+		return 0;
+	}
+	return hmLowLevelAnimation(messageNum, param, sender);
+}
+
+uint32 Klaymen::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x4AB28209) {
+			sendMessage(_attachedSprite, 0x482A, 0);
+		} else if (param.asInteger() == 0x88001184) {
+			sendMessage(_attachedSprite, 0x482B, 0);
+		} else if (param.asInteger() == 0x32180101) {
+			playSound(0, 0x405002D8);
+		} else if (param.asInteger() == 0x0A2A9098) {
+			playSound(0, 0x0460E2FA);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmHitByBoxingGlove(int messageNum, const MessageParam &param, Entity *sender) {
+	int16 speedUpFrameIndex;
+	uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x1008:
+		speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash);
+		if (_currFrameIndex < speedUpFrameIndex) {
+			startAnimation(0x35AA8059, speedUpFrameIndex, -1);
+			_y = 435;
+		}
+		messageResult = 0;
+		break;
+	case 0x100D:
+		if (param.asInteger() == 0x1A1A0785) {
+			playSound(0, 0x40F0A342);
+		} else if (param.asInteger() == 0x60428026) {
+			playSound(0, 0x40608A59);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+uint32 Klaymen::hmJumpAndFall(int messageNum, const MessageParam &param, Entity *sender) {
+	uint32 messageResult = hmLowLevel(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x100D:
+		if (param.asInteger() == 0x1307050A) {
+			playSound(0, 0x40428A09);
+		}
+		break;
+	}
+	return messageResult;
+}
+
+void Klaymen::suFallDown() {
+	AnimatedSprite::updateDeltaXY();
+	HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10);
+	if (hitRect->type == 0x5001) {
+		_y = hitRect->rect.y1;
+		updateBounds();
+		sendMessage(this, 0x1019, 0);
+	}
+	_parentScene->checkCollision(this, 0xFFFF, 0x4810, 0);
+}
+
+void Klaymen::stJumpToRingVenusFlyTrap() {
+	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRingVenusFlyTrap))) {
+		_status2 = 2;
+		_acceptInput = false;
+		startAnimation(0x584984B4, 0, -1);
+		SetUpdateHandler(&Klaymen::update);
+		SetMessageHandler(&Klaymen::hmJumpToRingVenusFlyTrap);
+		SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
+		NextState(&Klaymen::stLandOnFeet);
+		sendMessage(_attachedSprite, 0x482B, 0);
+	}
+}
+
+void Klaymen::stStandIdleSpecial() {
+	playSound(0, 0x56548280);
+	_status2 = 0;
+	_acceptInput = false;
+	_surface->setVisible(false);
+	startAnimation(0x5420E254, 0, -1);
+	SetUpdateHandler(&Klaymen::update);
+	SetMessageHandler(&Klaymen::hmStandIdleSpecial);
+	SetSpriteUpdate(NULL);
+}
+
+void Klaymen::stSpitOutFall0() {
+	_countdown1 = 1;
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x000BAB02, 0, -1);
+	SetUpdateHandler(&Klaymen::upSpitOutFall);
+	SetMessageHandler(&Klaymen::hmLowLevel);
+	SetSpriteUpdate(&Klaymen::suFallDown);
+	NextState(&Klaymen::stFalling);
+	sendMessage(_parentScene, 0x8000, 0);
+}
+
+void Klaymen::stSpitOutFall2() {
+	_countdown1 = 1;
+	_status2 = 0;
+	_acceptInput = false;
+	startAnimation(0x9308C132, 0, -1);
+	SetUpdateHandler(&Klaymen::upSpitOutFall);
+	SetMessageHandler(&Klaymen::hmLowLevelAnimation);
+	SetSpriteUpdate(&Klaymen::suFallDown);
+	NextState(&Klaymen::stFalling);
+	sendMessage(_parentScene, 0x8000, 0);
+}
+
+void Klaymen::stFalling() {
+	sendMessage(_parentScene, 0x1024, 1);
+	playSound(0, 0x41648271);
+	_status2 = 1;
+	_acceptInput = false;


Commit: 490d447ed19d481c9e15847c9bb43223b71c7847
    https://github.com/scummvm/scummvm/commit/490d447ed19d481c9e15847c9bb43223b71c7847
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Implement restart functionality (from both main menu and game logic)

- Some minor cleanup

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/gamevars.cpp
    engines/neverhood/gamevars.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/module1600.cpp
    engines/neverhood/module1900.cpp
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index cf56522..fa8a6d5 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -75,7 +75,7 @@ enum {
 
 GameModule::GameModule(NeverhoodEngine *vm)
 	: Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1),
-	_mainMenuRequested(false), _gameWasLoaded(false) {
+	_restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) {
 	
 	// Other initializations moved to actual engine class
 	_vm->_soundMan->playSoundThree(0x002D0031, 0x8861079);
@@ -400,9 +400,9 @@ void GameModule::startup() {
 	// <<<DEBUG
 
 #if 1
-	_vm->gameState().which = 1;
-	_vm->gameState().sceneNum = 1;
-	createModule(1000, -1);
+	_vm->gameState().which = 0;
+	_vm->gameState().sceneNum = 8;
+	createModule(1800, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 5;
@@ -473,7 +473,17 @@ void GameModule::restoreGame() {
 	createModuleByHash(getGlobalVar(V_MODULE_NAME));
 }
 
+void GameModule::requestRestartGame(bool requestMainMenu) {
+	_restartGameRequested = true;
+	_mainMenuRequested = requestMainMenu;
+}
+
 void GameModule::checkMainMenu() {
+	if (_restartGameRequested) {
+		_restartGameRequested = false;
+		_vm->_gameVars->clear();
+		restoreGame();
+	}
 	if (_mainMenuRequested)
 		openMainMenu();
 }
@@ -646,7 +656,8 @@ void GameModule::createModuleByHash(uint32 nameHash) {
 		createModule(3000, -1);
 		break;
 	default:
-		error("GameModule::createModuleByHash() Unknown module name %08X", nameHash);
+		createModule(1000, 0);
+		break;
 	}
 }
 
@@ -673,9 +684,7 @@ void GameModule::updateModule() {
 		case 1300:
 			if (_moduleResult == 1) {
 				// The game was successfully finished
-				// TODO Restart the game/show main menu
-				// TODO _gameState.clear();
-				// TODO GameModule_handleKeyEscape
+				requestRestartGame(true);
 			} else
 				createModule(2900, 0);
 			break;
@@ -702,9 +711,7 @@ void GameModule::updateModule() {
 		case 1800:
 			if (_moduleResult == 1) {
 				// Game over, Klaymen jumped into the hole
-				// TODO Restart the game/show main menu
-				// TODO _gameState.clear();
-				// TODO GameModule_handleKeyEscape
+				requestRestartGame(true);
 			} else if (_moduleResult == 2)
 				createModule(2700, 0);
 			else if (_moduleResult == 3)
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index ee6b000..b212a19 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -34,6 +34,7 @@ public:
 	virtual ~GameModule();
 	void startup();
 	void restoreGame();
+	void requestRestartGame(bool requestMainMenu);
 	void checkMainMenu();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
@@ -57,6 +58,7 @@ protected:
 	Entity *_prevChildObject;
 	int _prevModuleNum;
 	bool _gameWasLoaded;
+	bool _restartGameRequested;
 	bool _mainMenuRequested;
 	bool _someFlag1;
 	bool _field2C;
diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp
index 57d9547..87f5fe6 100644
--- a/engines/neverhood/gamevars.cpp
+++ b/engines/neverhood/gamevars.cpp
@@ -28,6 +28,11 @@ GameVars::GameVars() {
 	addVar(0, 0);
 }
 
+void GameVars::clear() {
+	_vars.clear();
+	addVar(0, 0);
+}
+
 void GameVars::loadState(Common::InSaveFile *in) {
 	uint varCount;
 	_vars.clear();
diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h
index 3672aa6..5337c13 100644
--- a/engines/neverhood/gamevars.h
+++ b/engines/neverhood/gamevars.h
@@ -172,6 +172,7 @@ struct GameVar {
 class GameVars {
 public:
 	GameVars();
+	void clear();
 	void loadState(Common::InSaveFile *in);
 	void saveState(Common::OutSaveFile *out);
 	uint32 getGlobalVar(uint32 nameHash);
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 71b216b..b86fc70 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "neverhood/menumodule.h"
+#include "neverhood/gamemodule.h"
 
 namespace Neverhood {
 
@@ -31,6 +32,18 @@ enum {
 	SAVE_GAME_MENU	= 3
 };
 
+enum {
+	kMainMenuRestartGame	= 0,
+	kMainMenuLoadGame		= 1,
+	kMainMenuSaveGame		= 2,
+	kMainMenuResumeGame		= 3,
+	kMainMenuQuitGame		= 4,
+	kMainMenuCredits		= 5,
+	kMainMenuMakingOf		= 6,
+	kMainMenuToggleMusic	= 7,
+	kMainMenuDeleteGame		= 8
+};
+
 static const uint32 kMakingOfSmackerFileHashList[] = {
 	0x21082409,
 	0x21082809,
@@ -97,42 +110,34 @@ void MenuModule::updateScene() {
 		case MAIN_MENU:
 			// TODO
 			switch (_moduleResult) {
-			case 0:
-				// 0048A2A5
-				debug("RESTART GAME");
+			case kMainMenuRestartGame:
+				_vm->_gameModule->requestRestartGame(false);
+				leaveModule(0);
 				break;
-			case 1:
-				debug("LOAD GAME");
+			case kMainMenuLoadGame:
 				// TODO createLoadGameMenu();
 				break;
-			case 2:
-				debug("SAVE GAME");
+			case kMainMenuSaveGame:
 				createScene(SAVE_GAME_MENU, -1);
 				break;
-			case 3:
-				debug("RESUME GAME");
+			case kMainMenuResumeGame:
 				leaveModule(0);
 				break;
-			case 4:
-				debug("QUIT GAME");
+			case kMainMenuQuitGame:
 				leaveModule(0);
 				_vm->quitGame();
 				break;
-			case 5:
-				debug("CREDITS");
+			case kMainMenuCredits:
 				createScene(CREDITS_SCENE, -1);
 				break;
-			case 6:
-				debug("MAKING OF");
+			case kMainMenuMakingOf:
 				createScene(MAKING_OF, -1);
 				break;
-			case 7:
-				debug("TOGGLE MUSIC");
+			case kMainMenuToggleMusic:
 				// TODO Toggle music 0048A367
 				createScene(MAIN_MENU, -1);
 				break;
-			case 8:
-				debug("DELETE GAME");
+			case kMainMenuDeleteGame:
 				// TODO createDeleteGameMenu();
 				break;
 			default:
@@ -270,30 +275,14 @@ uint32 MainMenu::handleMessage(int messageNum, const MessageParam &param, Entity
 }
 
 static const uint32 kCreditsSceneFileHashes[] = {
-	0x6081128C,
-	0x608112BC,
-	0x608112DC,
-	0x6081121C,
-	0x6081139C,
-	0x6081109C,
-	0x6081169C,
-	0x60811A9C,
-	0x6081029C,
-	0x0081128C,
-	0x008112BC,
-	0x008012BC,
-	0x008112DC,
-	0x0081121C,
-	0x0081139C,
-	0x0081109C,
-	0x0081169C,
-	0x00811A9C,
-	0x0081029C,
-	0x0081329C,
-	0xC08112BC,
-	0xC08112DC,
-	0xC081121C,
-	0xC081139C,
+	0x6081128C, 0x608112BC, 0x608112DC,
+	0x6081121C, 0x6081139C, 0x6081109C,
+	0x6081169C, 0x60811A9C, 0x6081029C,
+	0x0081128C, 0x008112BC, 0x008012BC,
+	0x008112DC, 0x0081121C, 0x0081139C,
+	0x0081109C, 0x0081169C, 0x00811A9C,
+	0x0081029C, 0x0081329C, 0xC08112BC,
+	0xC08112DC, 0xC081121C, 0xC081139C,
 	0
 };
 
@@ -353,7 +342,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, En
 	case 0x0009:
 		leaveScene(0);
 		break;
-	case 0x000B://TODO Implement this message
+	case 0x000B:
 		if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort)
 			leaveScene(0);
 		break;
@@ -388,6 +377,7 @@ void WidgetScene::setCurrWidget(Widget *newWidget) {
 }
 
 void WidgetScene::handleEvent(int16 itemID, int eventType) {
+	// Empty
 }
 
 Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
@@ -403,7 +393,7 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene
 
 void Widget::onClick() {
 	_parentScene->setCurrWidget(this);
-	// TODO _parentScene->onClick(_itemID, 0);
+	// TODO? _parentScene->onClick(_itemID, 0);
 }
 
 void Widget::setPosition(int16 x, int16 y) {
@@ -490,7 +480,7 @@ void TextLabelWidget::clear() {
 
 void TextLabelWidget::onClick() {
 	Widget::onClick();
-	// TODO Click handler?
+	// TODO? Click handler
 }
 
 void TextLabelWidget::setString(const byte *string, int stringLen) {
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
index bb6874e..cc1aa2c 100644
--- a/engines/neverhood/module1600.cpp
+++ b/engines/neverhood/module1600.cpp
@@ -28,12 +28,8 @@
 namespace Neverhood {
 
 static const uint32 kModule1600SoundList[] = {
-	0x90805C50,
-	0x90804450,
-	0xB4005E60,
-	0x91835066,
-	0x90E14440,
-	0
+	0x90805C50, 0x90804450, 0xB4005E60,
+	0x91835066, 0x90E14440, 0
 };
 
 Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index 31bf05b..348306f 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -199,9 +199,9 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene
 }
 
 void AsScene1907Symbol::update() {
-	AnimatedSprite::updateAnim();
+	updateAnim();
 	handleSpriteUpdate();
-	AnimatedSprite::updatePosition();
+	updatePosition();
 	if (_plugInFailed && _plugInTryCount == 0)
 		_plugInFailed = false;
 }
@@ -488,8 +488,8 @@ AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm)
 }
 
 void AsScene1907WaterHint::update() {
-	AnimatedSprite::updateAnim();
-	AnimatedSprite::updatePosition();
+	updateAnim();
+	updatePosition();
 }
 
 uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam &param, Entity *sender) {
@@ -629,19 +629,19 @@ void Scene1907::plugInFailed() {
 }
 
 int Scene1907::getRandomPositionIndex() {
-	bool flag = false;
+	bool found = false;
 	int index = 0;
 	// Check if any position is free
 	for (int i = 0; i < 9; i++)
 		if (_positionFree[i])
-			flag = true;
-	if (flag) {
+			found = true;
+	if (found) {
 		// Get a random free position
-		flag = false;
-		while (!flag) {
+		found = false;
+		while (!found) {
 			index = _vm->_rnd->getRandomNumber(9 - 1);
 			if (_positionFree[index])
-				flag = true;
+				found = true;
 		}
 	}
 	return index;
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index d4b0984..bfba0b9 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -122,8 +122,6 @@ Common::Error NeverhoodEngine::run() {
 	delete _gameVars;
 	delete _staticData;
 	
-	debug("Ok.");
-
 	return Common::kNoError;
 }
 


Commit: 379a8cbbe031c0c637029946b4cebea1e3e72bd5
    https://github.com/scummvm/scummvm/commit/379a8cbbe031c0c637029946b4cebea1e3e72bd5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Add support for loading/saving games with the game's own menu

- Add LoadGameMenu class

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h
    engines/neverhood/neverhood.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/saveload.cpp



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index fa8a6d5..48462a2 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -75,7 +75,7 @@ enum {
 
 GameModule::GameModule(NeverhoodEngine *vm)
 	: Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1),
-	_restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) {
+	_restoreGameRequested(false), _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) {
 	
 	// Other initializations moved to actual engine class
 	_vm->_soundMan->playSoundThree(0x002D0031, 0x8861079);
@@ -464,13 +464,8 @@ void GameModule::startup() {
 #endif
 }
 
-void GameModule::restoreGame() {
-	delete _childObject;
-	delete _prevChildObject;
-	_childObject = NULL;
-	_prevChildObject = NULL;
-	_prevModuleNum = 0;
-	createModuleByHash(getGlobalVar(V_MODULE_NAME));
+void GameModule::requestRestoreGame() {
+	_restoreGameRequested = true;
 }
 
 void GameModule::requestRestartGame(bool requestMainMenu) {
@@ -478,11 +473,27 @@ void GameModule::requestRestartGame(bool requestMainMenu) {
 	_mainMenuRequested = requestMainMenu;
 }
 
-void GameModule::checkMainMenu() {
+void GameModule::redrawPrevChildObject() {
+	if (_prevChildObject) {
+		_prevChildObject->draw();
+		_vm->_screen->update();
+	}
+}
+
+void GameModule::checkRequests() {
 	if (_restartGameRequested) {
 		_restartGameRequested = false;
 		_vm->_gameVars->clear();
-		restoreGame();
+		requestRestoreGame();
+	}
+	if (_restoreGameRequested) {
+		_restoreGameRequested = false;
+		delete _childObject;
+		delete _prevChildObject;
+		_childObject = NULL;
+		_prevChildObject = NULL;
+		_prevModuleNum = 0;
+		createModuleByHash(getGlobalVar(V_MODULE_NAME));
 	}
 	if (_mainMenuRequested)
 		openMainMenu();
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index b212a19..04fc780 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -33,9 +33,10 @@ public:
 	GameModule(NeverhoodEngine *vm);
 	virtual ~GameModule();
 	void startup();
-	void restoreGame();
+	void requestRestoreGame();
 	void requestRestartGame(bool requestMainMenu);
-	void checkMainMenu();
+	void redrawPrevChildObject();
+	void checkRequests();
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseDown(int16 x, int16 y);
 	void handleMouseUp(int16 x, int16 y);
@@ -58,6 +59,7 @@ protected:
 	Entity *_prevChildObject;
 	int _prevModuleNum;
 	bool _gameWasLoaded;
+	bool _restoreGameRequested;
 	bool _restartGameRequested;
 	bool _mainMenuRequested;
 	bool _someFlag1;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index b86fc70..396d8cf 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -23,13 +23,16 @@
 #include "neverhood/menumodule.h"
 #include "neverhood/gamemodule.h"
 
+#include "engines/savestate.h"
+
 namespace Neverhood {
 
 enum {
 	MAIN_MENU		= 0,
 	CREDITS_SCENE	= 1,
 	MAKING_OF		= 2,
-	SAVE_GAME_MENU	= 3
+	LOAD_GAME_MENU	= 3,
+	SAVE_GAME_MENU	= 4
 };
 
 enum {
@@ -77,10 +80,14 @@ MenuModule::~MenuModule() {
 	_vm->_screen->setPaletteData(_savedPaletteData);
 }
 
+void MenuModule::setLoadgameInfo(uint slot) {
+	_savegameSlot = slot;
+	debug("LOADGAME: slot = %d", slot);
+}
+
 void MenuModule::setSavegameInfo(const Common::String &description, uint slot, bool newSavegame) {
 	_savegameDescription = description;
-	_savegameSlot = slot;
-	_newSavegame = newSavegame;
+	_savegameSlot = newSavegame ? _savegameList->size() : slot;
 	debug("SAVEGAME: description = [%s]; slot = %d; new = %d", description.c_str(), slot, newSavegame);
 }
 
@@ -96,6 +103,9 @@ void MenuModule::createScene(int sceneNum, int which) {
 	case MAKING_OF:
 		createSmackerScene(kMakingOfSmackerFileHashList, false, true, true);
 		break;
+	case LOAD_GAME_MENU:
+		createLoadGameMenu();
+		break;
 	case SAVE_GAME_MENU:
 		createSaveGameMenu();
 		break;
@@ -108,14 +118,13 @@ void MenuModule::updateScene() {
 	if (!updateChild()) {
 		switch (_sceneNum) {
 		case MAIN_MENU:
-			// TODO
 			switch (_moduleResult) {
 			case kMainMenuRestartGame:
 				_vm->_gameModule->requestRestartGame(false);
 				leaveModule(0);
 				break;
 			case kMainMenuLoadGame:
-				// TODO createLoadGameMenu();
+				createScene(LOAD_GAME_MENU, -1);
 				break;
 			case kMainMenuSaveGame:
 				createScene(SAVE_GAME_MENU, -1);
@@ -149,8 +158,11 @@ void MenuModule::updateScene() {
 		case MAKING_OF:
 			createScene(MAIN_MENU, -1);
 			break;
+		case LOAD_GAME_MENU:
+			handleLoadGameMenuAction(_moduleResult != 1);
+			break;
 		case SAVE_GAME_MENU:
-			handleSaveGameMenuAction(_moduleResult);
+			handleSaveGameMenuAction(_moduleResult != 1);
 			break;
 		default:
 			break;
@@ -163,27 +175,71 @@ uint32 MenuModule::handleMessage(int messageNum, const MessageParam &param, Enti
 	return Module::handleMessage(messageNum, param, sender);;
 }
 
+void MenuModule::createLoadGameMenu() {
+	_savegameSlot = -1;
+	_savegameList = new Common::StringArray();
+	loadSavegameList();
+	_childObject = new LoadGameMenu(_vm, this, _savegameList);
+}
+
 void MenuModule::createSaveGameMenu() {
-	// TODO Load actual savegames list :)
-	_savegameList = new StringArray();
-	_savegameList->push_back(Common::String("Annoying scene"));
-	_savegameList->push_back(Common::String("Stuff happens"));
-	for (uint i = 0; i < 33; ++i)
-		_savegameList->push_back(Common::String::format("Game %d", i));
+	_savegameSlot = -1;
+	_savegameList = new Common::StringArray();
+	loadSavegameList();
 	_childObject = new SaveGameMenu(_vm, this, _savegameList);
 }
 
-void MenuModule::handleSaveGameMenuAction(int action) {
-	if (action != 0) {
-		createScene(MAIN_MENU, -1);
-	} else {
-		// TODO Actual saving later 0048A62E
-		createScene(MAIN_MENU, -1);
+void MenuModule::handleLoadGameMenuAction(bool doLoad) {
+	createScene(MAIN_MENU, -1);
+	if (doLoad && _savegameSlot >= 0) {
+		_vm->loadGameState(_savegameSlot);
+		leaveModule(0);
+	}
+	delete _savegameList;
+	_savegameList = NULL;
+}
+
+void MenuModule::handleSaveGameMenuAction(bool doSave) {
+	createScene(MAIN_MENU, -1);
+	if (doSave && _savegameSlot >= 0) {
+		// Restore the scene palette and background so that the correct thumbnail is saved
+		byte *menuPaletteData = _vm->_screen->getPaletteData();
+		_vm->_screen->setPaletteData(_savedPaletteData);
+		_vm->_gameModule->redrawPrevChildObject();
+		_vm->saveGameState(_savegameSlot, _savegameDescription);
+		_vm->_screen->setPaletteData(menuPaletteData);
+		leaveModule(0);
 	}
 	delete _savegameList;
 	_savegameList = NULL;
 }
 
+void MenuModule::loadSavegameList() {
+
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Neverhood::NeverhoodEngine::SaveHeader header;
+	Common::String pattern = _vm->getTargetName();
+	pattern += ".???";
+	
+	Common::StringArray filenames;
+	filenames = saveFileMan->listSavefiles(pattern.c_str());
+	Common::sort(filenames.begin(), filenames.end());
+
+	SaveStateList saveList;
+	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) {
+		int slotNum = atoi(file->c_str() + file->size() - 3);
+		if (slotNum >= 0 && slotNum <= 999) {
+			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
+			if (in) {
+				if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError)
+					_savegameList->push_back(header.description);
+				delete in;
+			}
+		}
+	}
+
+}
+
 MenuButton::MenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex, uint32 fileHash, const NRect &collisionBounds)
 	: StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) {
 
@@ -393,7 +449,6 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene
 
 void Widget::onClick() {
 	_parentScene->setCurrWidget(this);
-	// TODO? _parentScene->onClick(_itemID, 0);
 }
 
 void Widget::setPosition(int16 x, int16 y) {
@@ -494,7 +549,7 @@ TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 item
 	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
 	_maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect),
 	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0),
-	_modified(false) {
+	_modified(false), _readOnly(false) {
 
 	_maxVisibleChars = (_rect.x2 - _rect.x1) / _fontSurface->getCharWidth();
 	_cursorPos = 0;
@@ -543,17 +598,19 @@ void TextEditWidget::addSprite() {
 	cursorSpriteResource.load(_cursorFileHash, true);
 	_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
 	_cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
-	_cursorSurface->setVisible(true);
+	_cursorSurface->setVisible(!_readOnly);
 	refresh();
 }
 
 void TextEditWidget::enterWidget() {
-	_cursorSurface->setVisible(true);
+	if (!_readOnly)
+		_cursorSurface->setVisible(true);
 	refresh();
 }
 
 void TextEditWidget::exitWidget() {
-	_cursorSurface->setVisible(false);
+	if (!_readOnly)
+		_cursorSurface->setVisible(false);
 	refresh();
 }
 
@@ -568,7 +625,7 @@ void TextEditWidget::drawCursor() {
 		NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight);
 		_surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _fontSurface->getCharWidth(),
 			_rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect);
-	} else
+	} else if (!_readOnly)
 		_cursorSurface->setVisible(false);
 }
 
@@ -628,10 +685,11 @@ void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) {
 		}
 		break;
 	default:
+		doRefresh = false;
 		break;
 	}
 	if (doRefresh) {
-		_cursorSurface->setVisible(true);
+		_cursorSurface->setVisible(!_readOnly);
 		_cursorTicks = 0;
 		refresh();
 	}
@@ -645,7 +703,7 @@ void TextEditWidget::refresh() {
 
 void TextEditWidget::update() {
 	Widget::update();
-	if (_parentScene->getCurrWidget() == this && _cursorTicks++ == 10) {
+	if (!_readOnly && _parentScene->getCurrWidget() == this && _cursorTicks++ == 10) {
 		_cursorSurface->setVisible(!_cursorSurface->getVisible());
 		refresh();
 		_cursorTicks = 0;
@@ -667,7 +725,7 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam &param,
 
 SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 	int baseObjectPriority, int baseSurfacePriority,
-	StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect)
+	Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect)
 	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
 	_savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect),
 	_maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) {
@@ -687,7 +745,6 @@ void SavegameListBox::onClick() {
 			_currIndex = newIndex;
 			refresh();
 			_parentScene->setCurrWidget(this);
-			debug("_currIndex = %d", _currIndex);
 			_parentScene->handleEvent(_itemID, 5);
 		}
 	}
@@ -707,7 +764,7 @@ void SavegameListBox::addSprite() {
 }
 
 void SavegameListBox::buildItems() {
-	StringArray &savegameList = *_savegameList;
+	Common::StringArray &savegameList = *_savegameList;
 	int16 itemX = _rect.x1, itemY = 0;
 	for (uint i = 0; i < savegameList.size(); ++i) {
 		const byte *string = (const byte*)savegameList[i].c_str();
@@ -770,7 +827,7 @@ void SavegameListBox::pageDown() {
 	}
 }
 
-SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList)
+SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList)
 	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
 
 	static const uint32 kSaveGameMenuButtonFileHashes[] = {
@@ -819,7 +876,6 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra
 		addCollisionSprite(menuButton);
 	}
 
-
 	SetUpdateHandler(&Scene::update);
 	SetMessageHandler(&SaveGameMenu::handleMessage);
 }
@@ -885,4 +941,119 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
+LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList)
+	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
+
+	static const uint32 kLoadGameMenuButtonFileHashes[] = {
+		0x100B2091,
+		0x84822B03,
+		0x20E22087,
+		0x04040107,
+		0x04820122,
+		0x24423047
+	};
+	
+	static const NRect kLoadGameMenuButtonCollisionBounds[] = {
+		NRect( 44, 115, 108, 147),
+		NRect( 52, 396, 112, 426),
+		NRect(188, 116, 245, 196),
+		NRect(189, 209, 239, 269),
+		NRect(187, 301, 233, 349),
+		NRect(182, 358, 241, 433)
+	};
+
+	static const NRect kListBoxRect(0, 0, 320, 271);
+	static const NRect kTextEditRect(0, 0, 320, 17);
+	static const NRect kMouseRect(263, 48, 583, 65);
+
+	_fontSurface = new FontSurface(_vm, calcHash("bgLoadTinyAlphabet"), 32, 7, 32, 11, 17);
+	
+	setBackground(0x98620234);
+	setPalette(0x98620234);
+	insertScreenMouse(0x2023098E, &kMouseRect);
+	insertStaticSprite(0x0BC600A3, 200);
+	insertStaticSprite(0x0F960021, 200);
+
+	_listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, 1000, 1000,
+		_savegameList, _fontSurface, 0x04040409, kListBoxRect);
+	_listBox->addSprite();
+
+	_textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 1000, 1000, 29,
+		_fontSurface, 0x10924C03, kTextEditRect);
+	_textEditWidget->setCursor(0x18032303, 2, 13);
+	_textEditWidget->setReadOnly(true);
+	_textEditWidget->addSprite();
+	setCurrWidget(_textEditWidget);
+	
+	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
+		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
+			kLoadGameMenuButtonFileHashes[buttonIndex], kLoadGameMenuButtonCollisionBounds[buttonIndex]);
+		addCollisionSprite(menuButton);
+	}
+
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&LoadGameMenu::handleMessage);
+}
+
+LoadGameMenu::~LoadGameMenu() {
+	delete _fontSurface;
+}
+
+void LoadGameMenu::handleEvent(int16 itemID, int eventType) {
+	if (itemID == 69 && eventType == 5) {
+		uint currIndex = _listBox->getCurrIndex();
+		_textEditWidget->setString((*_savegameList)[currIndex]);
+		setCurrWidget(_textEditWidget);
+	}
+}
+
+uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+#if 0	
+	case 0x000A:
+		sendMessage(_textEditWidget, 0x000A, param.asInteger());
+		setCurrWidget(_textEditWidget);
+		break;
+#endif		
+	case 0x000B:
+		if (param.asInteger() == Common::KEYCODE_RETURN) {
+			((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
+			leaveScene(0);
+		} else if (param.asInteger() == Common::KEYCODE_ESCAPE) {
+			leaveScene(1);
+		}/* else {
+			sendMessage(_textEditWidget, 0x000B, param.asInteger());
+			setCurrWidget(_textEditWidget);
+		}*/
+		break;
+	case 0x2000:
+		// Handle menu button click
+		switch (param.asInteger()) {
+		case 0:
+			// TODO Same handling as Return, merge
+			((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
+			leaveScene(0);
+			break;
+		case 1:
+			leaveScene(1);
+			break;
+		case 2:
+			_listBox->pageUp();
+			break;
+		case 3:
+			_listBox->scrollUp();
+			break;
+		case 4:
+			_listBox->scrollDown();
+			break;
+		case 5:
+			_listBox->pageDown();
+			break;
+		}
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 51c32aa..0836795 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -24,31 +24,33 @@
 #define NEVERHOOD_MENUMODULE_H
 
 #include "common/str.h"
+#include "common/str-array.h"
 #include "neverhood/neverhood.h"
 #include "neverhood/module.h"
 #include "neverhood/scene.h"
 
 namespace Neverhood {
 
-typedef Common::Array<Common::String> StringArray;
-
 class MenuModule : public Module {
 public:
 	MenuModule(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~MenuModule();
+	void setLoadgameInfo(uint slot);
 	void setSavegameInfo(const Common::String &description, uint slot, bool newSavegame);
 protected:
 	int _sceneNum;
 	byte *_savedPaletteData;
-	StringArray *_savegameList;
+	Common::StringArray *_savegameList;
 	Common::String _savegameDescription;
-	uint _savegameSlot;
-	bool _newSavegame;
+	int _savegameSlot;
 	void createScene(int sceneNum, int which);
 	void updateScene();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void createLoadGameMenu();
 	void createSaveGameMenu();
-	void handleSaveGameMenuAction(int action);
+	void handleLoadGameMenuAction(bool doLoad);
+	void handleSaveGameMenuAction(bool doSave);
+	void loadSavegameList();
 };
 
 class MenuButton : public StaticSprite {
@@ -158,6 +160,7 @@ public:
 	void handleAsciiKey(char ch);
 	void handleKeyDown(Common::KeyCode keyCode);
 	void refresh();
+	void setReadOnly(bool value) { _readOnly = value; }
 	bool isModified() const { return _modified; }
 protected:
 	NRect _rect;
@@ -173,6 +176,7 @@ protected:
 	uint32 _cursorFileHash;
 	int16 _cursorWidth, _cursorHeight;
 	bool _modified;
+	bool _readOnly;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };
@@ -181,7 +185,7 @@ class SavegameListBox : public Widget {
 public:
 	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 		int baseObjectPriority, int baseSurfacePriority,
-		StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
+		Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
 	virtual void onClick();
 	virtual void addSprite();
 	void buildItems();
@@ -199,7 +203,7 @@ protected:
 	Common::Array<TextLabelWidget*> _textLabelItems;
 	int _firstVisibleItem;
 	int _lastVisibleItem;
-	StringArray *_savegameList;
+	Common::StringArray *_savegameList;
 	FontSurface *_fontSurface;
 	uint _currIndex;
 	int _maxVisibleItemsCount;
@@ -207,11 +211,26 @@ protected:
 
 class SaveGameMenu : public WidgetScene {
 public:
-	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList);
+	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList);
 	~SaveGameMenu();
 	virtual void handleEvent(int16 itemID, int eventType);
 protected:
-	StringArray *_savegameList;
+	Common::StringArray *_savegameList;
+	FontSurface *_fontSurface;
+	SavegameListBox *_listBox;
+	TextEditWidget *_textEditWidget;
+	Common::String _savegameDescription;
+	void update();
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class LoadGameMenu : public WidgetScene {
+public:
+	LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList);
+	~LoadGameMenu();
+	virtual void handleEvent(int16 itemID, int eventType);
+protected:
+	Common::StringArray *_savegameList;
 	FontSurface *_fontSurface;
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index bfba0b9..7b068bd 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -159,7 +159,7 @@ void NeverhoodEngine::mainLoop() {
 			}
 		}
 		if (_system->getMillis() >= nextFrameTime) {
-			_gameModule->checkMainMenu();
+			_gameModule->checkRequests();
 			_gameModule->handleUpdate();
 			_gameModule->draw();
 			_screen->update();
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 3653127..14c283b 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -28,6 +28,7 @@
 #include "common/keyboard.h"
 #include "common/random.h"
 #include "common/savefile.h"
+#include "common/str-array.h"
 #include "common/system.h"
 #include "audio/mixer.h"
 #include "engines/engine.h"
@@ -72,6 +73,7 @@ public:
 	Common::Platform getPlatform() const;
 	bool hasFeature(EngineFeature f) const;
 	bool isDemo() const;
+	Common::String getTargetName() { return _targetName; };
 
 	Common::RandomSource *_rnd;
 
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index e1ef954..2f97ade 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -125,7 +125,7 @@ void NeverhoodEngine::loadgame(const char *filename) {
 	_gameState.sceneNum = _gameVars->getGlobalVar(V_CURRENT_SCENE);
 	_gameState.which = _gameVars->getGlobalVar(V_CURRENT_SCENE_WHICH);
 
-	_gameModule->restoreGame();
+	_gameModule->requestRestoreGame();
 
 	delete in;
 


Commit: 4c6e82fc05134b71481c56ce70b9d26268a66cd5
    https://github.com/scummvm/scummvm/commit/4c6e82fc05134b71481c56ce70b9d26268a66cd5
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Remove objectPriority and surfacePriority parameters from the Klaymen class constructor since they always have the same value (1000)

Changed paths:
    engines/neverhood/klaymen.cpp
    engines/neverhood/klaymen.h



diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
index 6d139b1..4323d73 100644
--- a/engines/neverhood/klaymen.cpp
+++ b/engines/neverhood/klaymen.cpp
@@ -60,14 +60,14 @@ static const KlaymenIdleTableItem klaymenIdleTable1002[] = {
 
 // Klaymen
 
-Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects)
-	: AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
-	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true),
+Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects)
+	: AnimatedSprite(vm, 1000), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
+	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _status2(0), _acceptInput(true),
 	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
 	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
 	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
 	
-	createSurface(surfacePriority, 320, 200);
+	createSurface(1000, 320, 200);
 	_x = x;
 	_y = y;
 	_destX = x;
@@ -3344,12 +3344,10 @@ void Klaymen::stPeekInsideBlink() {
 	_blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
 }
 
-//##############################################################################
-
 // KmScene1001
 
 KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 }
 
 uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3368,10 +3366,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&Klaymen::stPullHammerLever);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -3427,7 +3425,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1002
 
 KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	setKlaymenIdleTable1();
 	
@@ -3492,7 +3490,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:			   
 		GotoState(&Klaymen::stJumpToRingVenusFlyTrap);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:  
+	case 0x4816:  
 		if (param.asInteger() == 0) {
 			GotoState(&Klaymen::stPressDoorButton);
 		}
@@ -3549,7 +3547,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1004
 
 KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	_dataResource.load(0x01900A04);	
 }
@@ -3615,7 +3613,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	// Empty
 }
@@ -3683,7 +3681,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1201
 
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4));
 	_flagF6 = true;
@@ -3702,7 +3700,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480A:
 		GotoState(&Klaymen::stMoveObject);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4813:
@@ -3714,7 +3712,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4815:
 		GotoState(&Klaymen::stCloseEyes);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 0) {
 			GotoState(&Klaymen::stPressButtonSide);
 		}
@@ -3754,7 +3752,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	// Empty
 }
@@ -3775,7 +3773,7 @@ uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	// Empty	
 }
@@ -3789,7 +3787,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klaymen::stTryStandIdle);
 		break;		
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3829,7 +3827,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	// Empty	
 }
@@ -3855,7 +3853,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 }
 
@@ -3876,7 +3874,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		else
 			GotoState(&Klaymen::stTryStandIdle);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -3885,7 +3883,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPickUpGeneric);
 		}
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -3898,7 +3896,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
-	case NM_KLAYMEN_INSERT_DISK:
+	case 0x481A:
 		GotoState(&Klaymen::stInsertDisk);		
 		break;
 	case 0x481B:
@@ -3981,7 +3979,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	// Empty	
 }
@@ -4005,7 +4003,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&Klaymen::stUseLever);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4018,7 +4016,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
-	case NM_KLAYMEN_INSERT_DISK:
+	case 0x481A:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stInsertKey);		
 		} else {
@@ -4038,7 +4036,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x481E:
 		GotoState(&Klaymen::stReturnFromUse);
 		break;
-	case NM_KLAYMEN_RELEASE_LEVER:
+	case 0x4827:
 		GotoState(&Klaymen::stReleaseLever);
 		break;
 	case 0x4834:
@@ -4057,7 +4055,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1401
 
 KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	// Empty	
 }
@@ -4078,7 +4076,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stMoveObjectFaceObject);
 		}	
 		break;		
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4132,7 +4130,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1402
 
 KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	SetFilterY(&Sprite::defFilterY);	
 }
@@ -4177,7 +4175,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1403
 
 KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4));
 }
@@ -4201,7 +4199,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&Klaymen::stUseLever);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4221,7 +4219,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 			sub41CCE0(param.asPoint().x);
 		}
 		break;
-	case NM_KLAYMEN_RELEASE_LEVER:
+	case 0x4827:
 		GotoState(&Klaymen::stReleaseLever);
 		break;
 	case 0x483F:
@@ -4237,7 +4235,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1404
 
 KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	// Empty	
 }
@@ -4258,7 +4256,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stMoveObjectFaceObject);
 		}
 		break;		
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4271,7 +4269,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
-	case NM_KLAYMEN_INSERT_DISK:
+	case 0x481A:
 		GotoState(&Klaymen::stInsertDisk);		
 		break;
 	case 0x481B:
@@ -4315,7 +4313,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 }
 
 uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4335,7 +4333,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		else
 			GotoState(&Klaymen::stTryStandIdle);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4406,7 +4404,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 // KmScene1705
 
 KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	// Empty	
 }
@@ -4423,16 +4421,15 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_isSittingInTeleporter) {
+		if (_isSittingInTeleporter)
 			GotoState(&Klaymen::stSitIdleTeleporter);
-		} else {
+		else
 			GotoState(&Klaymen::stTryStandIdle);
-		}
 		break;
 	case 0x4803:
 		GotoState(&Klaymen::stFallSkipJump);
 		break;				
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4499,7 +4496,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	// Empty	
 }
@@ -4538,7 +4535,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	// Empty	
 }
@@ -4555,9 +4552,9 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(param.asPoint().x, false);
 		break;
 	case 0x4004:
-		if (_isSittingInTeleporter) {
+		if (_isSittingInTeleporter)
 			GotoState(&Klaymen::stSitIdleTeleporter);
-		} else
+		else
 			GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x4804:
@@ -4604,7 +4601,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	// Empty
 }
@@ -4629,7 +4626,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4811:
 		GotoState(&Klaymen::stHitByDoor);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4638,7 +4635,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPickUpGeneric);
 		}
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4690,7 +4687,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	_surface->setClipRects(clipRects, clipRectsCount);
 
@@ -4707,10 +4704,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 0) {
 			GotoState(&Klaymen::stPressButtonSide);
 		}
@@ -4764,7 +4761,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 	
@@ -4777,7 +4774,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -4786,7 +4783,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPickUpGeneric);
 		}
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4805,7 +4802,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4819:
 		GotoState(&Klaymen::stClayDoorOpen);
 		break;
-	case NM_KLAYMEN_INSERT_DISK:
+	case 0x481A:
 		GotoState(&Klaymen::stInsertDisk);		
 		break;
 	case 0x481B:
@@ -4836,7 +4833,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -4861,7 +4858,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPeekWall);
 		}
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 0) {
 			GotoState(&Klaymen::stPressButtonSide);
 		} 
@@ -4884,7 +4881,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	_walkResumeFrameIncr = 1;
 	_vm->_soundMan->addSound(0x80101800, 0xD3B02847);
@@ -4918,14 +4915,14 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPeekWall);
 		}
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPickUpTube);
 		} else {
 			GotoState(&Klaymen::stPickUpGeneric);
 		}
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -4990,7 +4987,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 	
@@ -5013,10 +5010,10 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&Klaymen::stInteractLever);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5036,7 +5033,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 			sub41CCE0(param.asPoint().x);
 		}
 		break;
-	case NM_KLAYMEN_RELEASE_LEVER:
+	case 0x4827:
 		GotoState(&Klaymen::stReleaseLever);
 		break;
 	case 0x482D:
@@ -5054,7 +5051,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5079,7 +5076,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPeekWall);
 		}
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2) {
 			GotoState(&Klaymen::stPickUpNeedle);
 		} else if (param.asInteger() == 1) {
@@ -5124,7 +5121,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5178,7 +5175,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 }
 
 KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5232,7 +5229,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 }
   
 KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 	
@@ -5246,7 +5243,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5315,7 +5312,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5340,10 +5337,10 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPeekWall);
 		}
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5387,7 +5384,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5404,10 +5401,10 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x480D:
 		GotoState(&Klaymen::stPullCord);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
-	case NM_KLAYMEN_PRESS_BUTTON:
+	case 0x4816:
 		if (param.asInteger() == 1) {
 			GotoState(&Klaymen::stPressButton);
 		} else if (param.asInteger() == 2) {
@@ -5473,7 +5470,7 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 	
 KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	_surface->setClipRects(clipRects, clipRectsCount);
 	
@@ -5497,7 +5494,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stPeekWall);
 		}
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
 		else if (param.asInteger() == 1)
@@ -5566,7 +5563,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 	
 KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 	
@@ -5617,7 +5614,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 	
@@ -5634,7 +5631,7 @@ uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5647,7 +5644,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 	case 0x4004:
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4817:
@@ -5706,7 +5703,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	_surface->setClipRects(clipRects, clipRectsCount);
 	
@@ -5770,7 +5767,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	
 	_dataResource.load(0x81120132);
 }
@@ -5823,7 +5820,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &para
 }
 
 KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -5881,7 +5878,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	if (flag) {
 		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
@@ -5942,7 +5939,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
 	bool flag, NRect *clipRects, uint clipRectsCount)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	if (flag) {
 		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
@@ -6002,7 +5999,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) 
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -6052,7 +6049,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
 }
 
 KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 
 	_surface->setClipRects(clipRects, clipRectsCount);
 	
@@ -6075,7 +6072,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() == 3)
 			GotoState(&Klaymen::stFinishGrow);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4817:
@@ -6147,7 +6144,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: Klaymen(vm, parentScene, x, y, 1000, 1000) {
+	: Klaymen(vm, parentScene, x, y) {
 	// Empty
 }
 
@@ -6164,7 +6161,7 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
 		_destY = param.asInteger();
 		GotoState(&Klaymen::stJumpToGrabFall);
 		break;
-	case NM_KLAYMEN_PICKUP:
+	case 0x4812:
 		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
 		else if (param.asInteger() == 1)
diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h
index 6e5a843..31f8e5a 100644
--- a/engines/neverhood/klaymen.h
+++ b/engines/neverhood/klaymen.h
@@ -49,7 +49,7 @@ struct KlaymenIdleTableItem {
 
 class Klaymen : public AnimatedSprite {
 public:
-	Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL);
+	Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects = NULL);
 
 	void update();
 


Commit: c218cb46e0181cdb213c9cc0486acb880bbf9d29
    https://github.com/scummvm/scummvm/commit/c218cb46e0181cdb213c9cc0486acb880bbf9d29
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Remove unneeded braces

Changed paths:
    engines/neverhood/klaymen.cpp



diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
index 4323d73..18a8b34 100644
--- a/engines/neverhood/klaymen.cpp
+++ b/engines/neverhood/klaymen.cpp
@@ -3370,13 +3370,12 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3390,17 +3389,16 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -3459,11 +3457,10 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x4803:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stJumpAndFall);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stDropFromRing);
-		}
 		break;
 	case 0x4804:
 		GotoState(&Klaymen::stPeekWall);
@@ -3491,9 +3488,8 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stJumpToRingVenusFlyTrap);
 		break;
 	case 0x4816:  
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stPressDoorButton);
-		}
 		break;
 	case 0x4817:				  
 		setDoDeltaX(param.asInteger());
@@ -3521,18 +3517,16 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stClimbLadderHalf);	 
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -3639,9 +3633,8 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stWalkingFirst);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3713,9 +3706,8 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stCloseEyes);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stPressButtonSide);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3788,13 +3780,12 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;		
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3808,13 +3799,12 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;						
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -3875,22 +3865,20 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -3919,35 +3907,32 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stReturnFromUse);
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
 		gotoNextStateExt();
 		break;
 	case 0x482E:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x4834:
 		GotoState(&Klaymen::stStepOver);
@@ -3994,41 +3979,37 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x480A:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
-		} else {
+		else
 			GotoState(&Klaymen::stMoveObjectFaceObject);
-		}	
 		break;		
 	case 0x480D:
 		GotoState(&Klaymen::stUseLever);
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481A:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stInsertKey);		
-		} else {
+		else
 			GotoState(&Klaymen::stInsertDisk);		
-		}
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4070,20 +4051,18 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;		
 	case 0x480A:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
-		} else {
+		else
 			GotoState(&Klaymen::stMoveObjectFaceObject);
-		}	
 		break;		
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4097,31 +4076,28 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;						
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
 		gotoNextStateExt();
 		break;
 	case 0x482E:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	}
 	return 0;
@@ -4145,11 +4121,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;		
 	case 0x480A:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
-		} else {
+		else
 			GotoState(&Klaymen::stMoveObjectFaceObject);
-		}
 		break;		
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4190,23 +4165,21 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x480A:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
-		} else {
+		else
 			GotoState(&Klaymen::stMoveObjectFaceObject);
-		}
 		break;		
 	case 0x480D:
 		GotoState(&Klaymen::stUseLever);
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4250,20 +4223,18 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x480A:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject);
-		} else {
+		else
 			GotoState(&Klaymen::stMoveObjectFaceObject);
-		}
 		break;		
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4273,11 +4244,10 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stInsertDisk);		
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4286,17 +4256,16 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stReturnFromUse);
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4334,13 +4303,12 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4362,17 +4330,16 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stReturnFromUseInTeleporter);
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -4430,24 +4397,22 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stFallSkipJump);
 		break;				
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter) {
@@ -4455,22 +4420,20 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481E:
-		if (_isSittingInTeleporter) {
+		if (_isSittingInTeleporter)
 			GotoState(&Klaymen::stReturnFromUseInTeleporter);
-		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x4834:
 		GotoState(&Klaymen::stStepOver);
@@ -4573,9 +4536,8 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam &param) {
 			GotoState(&Klaymen::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_isSittingInTeleporter) {
+		if (_isSittingInTeleporter)
 			GotoState(&Klaymen::stReturnFromUseInTeleporter);
-		}
 		break;
 	case 0x4834:
 		GotoState(&Klaymen::stStepOver);
@@ -4627,40 +4589,37 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stHitByDoor);
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter)
 			GotoState(&Klaymen::stTurnToUseInTeleporter);
 		break;
 	case 0x481E:
-		if (_isSittingInTeleporter)//CHECKME
+		if (_isSittingInTeleporter)
 			GotoState(&Klaymen::stReturnFromUseInTeleporter);
 		break;
 	case 0x4834:
@@ -4708,9 +4667,8 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stPressButtonSide);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger() ? 1 : 0);
@@ -4737,18 +4695,16 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -4775,22 +4731,20 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4806,11 +4760,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stInsertDisk);		
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4854,14 +4807,12 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stStartWalkingResume);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4816:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4911,25 +4862,22 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stStartWalkingResume);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4812:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -4943,35 +4891,32 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
 		gotoNextStateExt();
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x4837:
 		stopWalking();
@@ -5014,24 +4959,22 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x4827:
 		GotoState(&Klaymen::stReleaseLever);
@@ -5072,42 +5015,38 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stStartWalkingResume);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4812:
-		if (param.asInteger() == 2) {
+		if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPickUpNeedle);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPickUpTube);
-		} else {
+		else
 			GotoState(&Klaymen::stPickUpGeneric);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -5142,26 +5081,24 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stStartWalkingResume);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -5196,26 +5133,24 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stStartWalkingResume);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
@@ -5244,51 +5179,46 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stTryStandIdle);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
 		gotoNextStateExt();
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x4832:
 		GotoState(&Klaymen::stUseTube);
@@ -5333,45 +5263,41 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stWalkingFirst);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4812:
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());
@@ -5405,37 +5331,34 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stPickUpGeneric);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stPressButton);
-		} else if (param.asInteger() == 2) {
+		else if (param.asInteger() == 2)
 			GotoState(&Klaymen::stPressFloorButton);
-		} else {
+		else
 			GotoState(&Klaymen::stPressButtonSide);
-		} 
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x4820:  
 		sendMessage(_parentScene, 0x2000, 0);
@@ -5490,9 +5413,8 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 		if (param.asInteger() != 0) {
 			_destX = param.asInteger();
 			GotoState(&Klaymen::stWalkingFirst);
-		} else {
+		} else
 			GotoState(&Klaymen::stPeekWall);
-		}
 		break;
 	case 0x4812:
 		if (param.asInteger() == 2)
@@ -5522,17 +5444,16 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stReturnFromUse);
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x4820:  
 		sendMessage(_parentScene, 0x2000, 0);
@@ -5652,11 +5573,10 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;						
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -5665,35 +5585,32 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stReturnFromUse);
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 0) {
+		else if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x482D:
 		setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0);
 		gotoNextStateExt();
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x4837:
 		stopWalking();
@@ -5744,11 +5661,10 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stReturnFromUse);
 		break;
 	case 0x481F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAboutHalf);
-		}
 		break;
 	case 0x482E:	 
 		GotoState(&Klaymen::stWalkToFront);
@@ -5912,9 +5828,8 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stPullCord);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stPressButtonSide); 
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -5927,11 +5842,10 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stGrow);
 		break;
 	case 0x4832:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stDrinkPotion);
-		} else {
+		else
 			GotoState(&Klaymen::stUseTube);
-		}
 		break;
 	}
 	return 0;
@@ -5973,9 +5887,8 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stPullCord);
 		break;
 	case 0x4816:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stPressButtonSide); 
-		}
 		break;
 	case 0x4817:
 		setDoDeltaX(param.asInteger());
@@ -5988,11 +5901,10 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stGrow);
 		break;
 	case 0x4832:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stDrinkPotion);
-		} else {
+		else
 			GotoState(&Klaymen::stUseTube);
-		}
 		break;
 	}
 	return 0;
@@ -6028,18 +5940,16 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam &para
 			GotoState(&Klaymen::stWonderAboutSmall);
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStepSmall);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFrontSmall);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToBackHalfSmall);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBackSmall);
-		}
 		break;
 	case 0x4837:
 		stopWalking();
@@ -6083,26 +5993,24 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
+		if (param.asPoint().y != 0)
 			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
+		else
 			sub41CCE0(param.asPoint().x);
-		}
 		break;
 	case 0x481F:
-		if (param.asInteger() == 0) {
+		if (param.asInteger() == 0)
 			GotoState(&Klaymen::stWonderAboutHalf);
-		} else if (param.asInteger() == 1) {
+		else if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWonderAboutAfter);
-		} else if (param.asInteger() == 3) {
+		else if (param.asInteger() == 3)
 			GotoState(&Klaymen::stTurnToUseHalf);
-		} else if (param.asInteger() == 4) {
+		else if (param.asInteger() == 4)
 			GotoState(&Klaymen::stTurnAwayFromUse);
-		} else if (param.asInteger() == 5) {
+		else if (param.asInteger() == 5)
 			GotoState(&Klaymen::stTurnToUseExt);
-		} else {
+		else
 			GotoState(&Klaymen::stWonderAbout);
-		}
 		break;
 	case 0x4820:  
 		sendMessage(_parentScene, 0x2000, 0);
@@ -6211,18 +6119,16 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x482E:	 
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stWalkToFrontNoStep);
-		} else {
+		else
 			GotoState(&Klaymen::stWalkToFront);
-		}
 		break;
 	case 0x482F:
-		if (param.asInteger() == 1) {
+		if (param.asInteger() == 1)
 			GotoState(&Klaymen::stTurnToFront);
-		} else {
+		else
 			GotoState(&Klaymen::stTurnToBack);
-		}
 		break;
 	case 0x483F:
 		startSpecialWalkRight(param.asInteger());


Commit: 1383c5f39504dfc4dc3b1b5e5f99645077abc5fe
    https://github.com/scummvm/scummvm/commit/1383c5f39504dfc4dc3b1b5e5f99645077abc5fe
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Rename stuff in the Klaymen class

Changed paths:
    engines/neverhood/klaymen.cpp
    engines/neverhood/klaymen.h



diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
index 18a8b34..484d7aa 100644
--- a/engines/neverhood/klaymen.cpp
+++ b/engines/neverhood/klaymen.cpp
@@ -62,9 +62,9 @@ static const KlaymenIdleTableItem klaymenIdleTable1002[] = {
 
 Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects)
 	: AnimatedSprite(vm, 1000), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
-	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _status2(0), _acceptInput(true),
-	_attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
-	_flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
+	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _busyStatus(0), _acceptInput(true),
+	_attachedSprite(NULL), _isWalking(false), _actionStatus(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
+	_doYHitIncr(false), _isLeverDown(false), _isSittingInTeleporter(false), _actionStatusChanged(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
 	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
 	
 	createSurface(1000, 320, 200);
@@ -128,7 +128,7 @@ void Klaymen::stDoIdlePickEar() {
 }
 
 void Klaymen::stIdlePickEar() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x5B20C814, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -159,7 +159,7 @@ void Klaymen::stDoIdleSpinHead() {
 }
 
 void Klaymen::stIdleSpinHead() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0xD122C137, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -185,7 +185,7 @@ void Klaymen::stDoIdleArms() {
 }
 
 void Klaymen::stIdleArms() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x543CD054, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -220,7 +220,7 @@ void Klaymen::stDoIdleChest() {
 }
 
 void Klaymen::stIdleChest() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x40A0C034, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -246,7 +246,7 @@ void Klaymen::stDoIdleHeadOff() {
 }
 
 void Klaymen::stIdleHeadOff() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x5120E137, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -274,7 +274,7 @@ uint32 Klaymen::hmIdleHeadOff(int messageNum, const MessageParam &param, Entity
 }
 
 void Klaymen::stIdleWonderAbout() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -284,7 +284,7 @@ void Klaymen::stIdleWonderAbout() {
 }
 
 void Klaymen::stSitIdleTeleporter() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x582EC138, 0, -1);
 	SetUpdateHandler(&Klaymen::upSitIdleTeleporter);
@@ -320,7 +320,7 @@ void Klaymen::upSitIdleTeleporter() {
 }
 
 void Klaymen::stSitIdleTeleporterBlink() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -330,7 +330,7 @@ void Klaymen::stSitIdleTeleporterBlink() {
 }
 
 void Klaymen::stSitIdleTeleporterBlinkSecond() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x5C24C018, 0, -1);
 	SetUpdateHandler(&Klaymen::upSitIdleTeleporter);
@@ -341,7 +341,7 @@ void Klaymen::stSitIdleTeleporterBlinkSecond() {
 void Klaymen::stPickUpNeedle() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klaymen::stPickUpNeedle))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = false;
 		startAnimation(0x1449C169, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -353,7 +353,7 @@ void Klaymen::stPickUpNeedle() {
 void Klaymen::stPickUpTube() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klaymen::stPickUpTube))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = false;
 		startAnimation(0x0018C032, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -384,7 +384,7 @@ uint32 Klaymen::hmPickUpTube(int messageNum, const MessageParam &param, Entity *
 }
 
 void Klaymen::stTurnToUseInTeleporter() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0xD229823D, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -393,7 +393,7 @@ void Klaymen::stTurnToUseInTeleporter() {
 }
 
 void Klaymen::stReturnFromUseInTeleporter() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x9A2801E0, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -403,7 +403,7 @@ void Klaymen::stReturnFromUseInTeleporter() {
 
 void Klaymen::stStepOver() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stStepOver))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x004AA310, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -414,7 +414,7 @@ void Klaymen::stStepOver() {
 
 void Klaymen::stSitInTeleporter() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stSitInTeleporter))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_acceptInput = false;
 		startAnimation(0x392A0330, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -436,7 +436,7 @@ uint32 Klaymen::hmSitInTeleporter(int messageNum, const MessageParam &param, Ent
 }
 
 void Klaymen::stGetUpFromTeleporter() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x913AB120, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -466,8 +466,8 @@ void Klaymen::upIdleAnimation() {
 }
 
 bool Klaymen::stStartActionFromIdle(AnimationCb callback) {
-	if (_status2 == 2) {
-		_status2 = 1;
+	if (_busyStatus == 2) {
+		_busyStatus = 1;
 		_acceptInput = false; 
 		startAnimation(0x9A7020B8, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -495,19 +495,19 @@ void Klaymen::gotoNextStateExt() {
 	}
 }
 
-void Klaymen::sub41C770() {
-	_flagFA = false;
-	_status3 = 1;
+void Klaymen::beginAction() {
+	_actionStatusChanged = false;
+	_actionStatus = 1;
 }
 
-void Klaymen::sub41C790() {
-	if (_flagFA)
-		_status3 = 0;
+void Klaymen::endAction() {
+	if (_actionStatusChanged)
+		_actionStatus = 0;
 }
 
 void Klaymen::stTryStandIdle() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTryStandIdle))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klaymen::upStandIdle);
@@ -554,14 +554,14 @@ uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam &param, Entity *se
 		gotoNextStateExt();
 		break;
 	case 0x101C:
-		sub41C770();
+		beginAction();
 		break;
 	case 0x1021:
-		sub41C790();
+		endAction();
 		break;
 	case 0x481C:
-		_status3 = param.asInteger();
-		_flagFA = true;
+		_actionStatus = param.asInteger();
+		_actionStatusChanged = true;
 		messageResult = 1;
 		break;
 	case 0x482C:
@@ -576,7 +576,7 @@ uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam &param, Entity *se
 }
 
 void Klaymen::stIdleBlink() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x5900C41E, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -596,7 +596,7 @@ uint32 Klaymen::hmLowLevelAnimation(int messageNum, const MessageParam &param, E
 }
 
 void Klaymen::stStandAround() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x5420E254, 0, -1);
 	SetUpdateHandler(&Klaymen::upStandIdle);
@@ -619,7 +619,7 @@ uint32 Klaymen::hmStartAction(int messageNum, const MessageParam &param, Entity
 }
 
 
-void Klaymen::startWalkToX(int16 x, bool flag) {
+void Klaymen::startWalkToX(int16 x, bool walkExt) {
 	int16 xdiff = ABS(x - _x);
 	if (x == _x) {
 		_destX = x;
@@ -631,7 +631,7 @@ void Klaymen::startWalkToX(int16 x, bool flag) {
 		_destX = x;
 		gotoState(NULL);
 		gotoNextStateExt();
-	} else if (xdiff <= 42 && _status3 != 3) {
+	} else if (xdiff <= 42 && _actionStatus != 3) {
 		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
 			_destX = x;
 		} else {
@@ -640,7 +640,7 @@ void Klaymen::startWalkToX(int16 x, bool flag) {
 		}
 	} else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) {
 		_destX = x;
-	} else if (flag) {
+	} else if (walkExt) {
 		_destX = x;
 		GotoState(&Klaymen::stStartWalkingExt);
 	} else {
@@ -650,7 +650,7 @@ void Klaymen::startWalkToX(int16 x, bool flag) {
 }
 
 void Klaymen::stWakeUp() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimation(0x527AC970, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -659,7 +659,7 @@ void Klaymen::stWakeUp() {
 }
 
 void Klaymen::stSleeping() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x5A38C110, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -680,8 +680,8 @@ uint32 Klaymen::hmSleeping(int messageNum, const MessageParam &param, Entity *se
 }
 
 bool Klaymen::stStartAction(AnimationCb callback3) {
-	if (_status2 == 1) {
-		_status2 = 2;
+	if (_busyStatus == 1) {
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x5C7080D4, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -774,7 +774,7 @@ void Klaymen::suSneaking() {
 }
 
 void Klaymen::stSneak() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_isSneaking = true;
 	_acceptInput = true;
 	setDoDeltaX(_destX < _x ? 1 : 0);
@@ -813,7 +813,7 @@ uint32 Klaymen::hmSneaking(int messageNum, const MessageParam &param, Entity *se
 
 void Klaymen::stStartWalking() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalking))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_isWalking = true;
 		_acceptInput = true;
 		setDoDeltaX(_destX < _x ? 1 : 0);
@@ -845,7 +845,7 @@ uint32 Klaymen::hmStartWalking(int messageNum, const MessageParam &param, Entity
 }
 
 void Klaymen::stWalkingFirst() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, 0, -1);
@@ -876,27 +876,27 @@ uint32 Klaymen::hmWalking(int messageNum, const MessageParam &param, Entity *sen
 }
 
 void Klaymen::stUpdateWalkingFirst() {
-	if (_status3 == 2) {
+	if (_actionStatus == 2) {
 		gotoNextStateExt();
-	} else if (_status3 == 3) {
+	} else if (_actionStatus == 3) {
 		stWalkingOpenDoor();
 	} else {
 		_isSneaking = true;
 		_acceptInput = true;
 		if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) {
-			if (_status3 == 0) {
-				_status2 = 1;
+			if (_actionStatus == 0) {
+				_busyStatus = 1;
 				startAnimation(0xF234EE31, 0, -1);
 			} else {
-				_status2 = 2;
+				_busyStatus = 2;
 				startAnimation(0xF135CC21, 0, -1);
 			}
 		} else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) {
-			if (_status3 == 0) {
-				_status2 = 1;
+			if (_actionStatus == 0) {
+				_busyStatus = 1;
 				startAnimation(0x8604A152, 0, -1);
 			} else {
-				_status2 = 2;
+				_busyStatus = 2;
 				startAnimation(0xA246A132, 0, -1);
 			}
 		}
@@ -919,10 +919,10 @@ void Klaymen::suWalkingTestExit() {
 	_deltaX = 0;		
 
 	if (xdiff == 0 ||
-		(_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) ||
-		(_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) ||
-		(_status3 == 3 && xdiff < 30) ||
-		(_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
+		(_actionStatus != 2 && _actionStatus != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) ||
+		(_actionStatus != 2 && _actionStatus != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) ||
+		(_actionStatus == 3 && xdiff < 30) ||
+		(_actionStatus == 3 && xdiff < 150 && _currFrameIndex >= 6)) {
 		sendMessage(this, 0x1019, 0);
 	} else {
 		HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y);
@@ -939,7 +939,7 @@ void Klaymen::suWalkingTestExit() {
 				_y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
 			} else if (hitRectPrev->type == 0x5003) {
 				_y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1;
-			} else if (_flagF6 && xdelta != 0) {
+			} else if (_doYHitIncr && xdelta != 0) {
 				if (hitRectNext->type == 0x5000) {
 					_y++;
 				} else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) {
@@ -969,7 +969,7 @@ uint32 Klaymen::hmLever(int messageNum, const MessageParam &param, Entity *sende
 void Klaymen::stPickUpGeneric() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klaymen::stPickUpGeneric))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = false;
 		startAnimation(0x1C28C178, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1004,7 +1004,7 @@ uint32 Klaymen::hmPickUpObject(int messageNum, const MessageParam &param, Entity
 
 void Klaymen::stPressButton() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stPressButton))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = true;
 		startAnimation(0x1C02B03D, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1031,7 +1031,7 @@ uint32 Klaymen::hmPressButton(int messageNum, const MessageParam &param, Entity
 
 void Klaymen::stPressFloorButton() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stPressFloorButton))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = true;
 		startAnimation(0x1C16B033, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1042,7 +1042,7 @@ void Klaymen::stPressFloorButton() {
 
 void Klaymen::stPressButtonSide() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stPressButtonSide))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = true;
 		startAnimation(0x1CD89029, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1080,7 +1080,7 @@ void Klaymen::startSpecialWalkLeft(int16 x) {
 }
 
 void Klaymen::startWalkToXSmall(int16 x) {
-	_status3 = 2;
+	_actionStatus = 2;
 	if (_x == x) {
 		_destX = x;
 		if (_isWalking) {
@@ -1098,7 +1098,7 @@ void Klaymen::startWalkToXSmall(int16 x) {
 void Klaymen::stStartWalkingSmall() {
 	_isWalking = true;
 	_acceptInput = true;
-	_status3 = 2;
+	_actionStatus = 2;
 	setDoDeltaX(_destX < _x ? 1 : 0);
 	startAnimation(0x3A4CD934, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1120,7 +1120,7 @@ uint32 Klaymen::hmWalkingSmall(int messageNum, const MessageParam &param, Entity
 }
 
 void Klaymen::stStandIdleSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x90D0D1D0, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1129,7 +1129,7 @@ void Klaymen::stStandIdleSmall() {
 }
 
 void Klaymen::stWonderAboutAfterSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 30, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1138,7 +1138,7 @@ void Klaymen::stWonderAboutAfterSmall() {
 }
 
 void Klaymen::stWonderAboutHalfSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 0, 10);
 	SetUpdateHandler(&Klaymen::update);
@@ -1147,7 +1147,7 @@ void Klaymen::stWonderAboutHalfSmall() {
 }
 
 void Klaymen::stWonderAboutSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x11C8D156, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1156,7 +1156,7 @@ void Klaymen::stWonderAboutSmall() {
 }
 
 void Klaymen::stWalkToFrontNoStepSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimationByHash(0x3F9CC394, 0x14884392, 0);
 	SetUpdateHandler(&Klaymen::update);
@@ -1182,7 +1182,7 @@ uint32 Klaymen::hmWalkFrontBackSmall(int messageNum, const MessageParam &param,
 }
 
 void Klaymen::stWalkToFront2Small() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x2F1C4694, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1191,7 +1191,7 @@ void Klaymen::stWalkToFront2Small() {
 }
 
 void Klaymen::stWalkToFrontSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x3F9CC394, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1200,7 +1200,7 @@ void Klaymen::stWalkToFrontSmall() {
 }
 
 void Klaymen::stTurnToBackHalfSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimationByHash(0x37ECD436, 0, 0x8520108C);
 	SetUpdateHandler(&Klaymen::update);
@@ -1209,7 +1209,7 @@ void Klaymen::stTurnToBackHalfSmall() {
 }
 
 void Klaymen::stTurnToBackWalkSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x16EDDE36, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1218,7 +1218,7 @@ void Klaymen::stTurnToBackWalkSmall() {
 }
 
 void Klaymen::stTurnToBackSmall() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x37ECD436, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1228,7 +1228,7 @@ void Klaymen::stTurnToBackSmall() {
 
 void Klaymen::stPullCord() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stPullCord))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x3F28E094, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1263,7 +1263,7 @@ uint32 Klaymen::hmPullReleaseCord(int messageNum, const MessageParam &param, Ent
 
 void Klaymen::stUseTube() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stUseTube))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = false;
 		startAnimation(0x1A38A814, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1298,7 +1298,7 @@ uint32 Klaymen::hmUseTube(int messageNum, const MessageParam &param, Entity *sen
 }
 
 void Klaymen::stWalkingFirstExt() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x5A2CBC00, 0, -1);
@@ -1311,7 +1311,7 @@ void Klaymen::stWalkingFirstExt() {
 
 void Klaymen::stStartWalkingExt() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalkingExt))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_isWalking = true;
 		_acceptInput = true;
 		setDoDeltaX(_destX < _x ? 1 : 0);
@@ -1324,26 +1324,26 @@ void Klaymen::stStartWalkingExt() {
 	}
 }
 
-void Klaymen::sub41CC40(int16 x1, int16 x2) {
-	if (_x > x1) {
-		if (_x == x1 + x2) {
-			_destX = x1 + x2;
+void Klaymen::startWalkToXDistance(int16 destX, int16 distance) {
+	if (_x > destX) {
+		if (_x == destX + distance) {
+			_destX = destX + distance;
 			gotoState(NULL);
 			gotoNextStateExt();
-		} else if (_x < x1 + x2) {
-			startWalkToXExt(x1 + x2);
+		} else if (_x < destX + distance) {
+			startWalkToXExt(destX + distance);
 		} else {
-			startWalkToX(x1 + x2, false);
+			startWalkToX(destX + distance, false);
 		}
 	} else {
-		if (_x == x1 - x2) {
-			_destX = x1 - x2;
+		if (_x == destX - distance) {
+			_destX = destX - distance;
 			gotoState(NULL);
 			gotoNextStateExt();
-		} else if (_x > x1 - x2) {
-			startWalkToXExt(x1 - x2);
+		} else if (_x > destX - distance) {
+			startWalkToXExt(destX - distance);
 		} else {
-			startWalkToX(x1 - x2, false);
+			startWalkToX(destX - distance, false);
 		}
 	}
 }
@@ -1360,7 +1360,7 @@ void Klaymen::startWalkToXExt(int16 x) {
 		_destX = x;
 		gotoState(NULL);
 		gotoNextStateExt();
-	} else if (xdiff <= 42 && _status3 != 3) {
+	} else if (xdiff <= 42 && _actionStatus != 3) {
 		if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) {
 			_destX = x;
 		} else {
@@ -1376,7 +1376,7 @@ void Klaymen::startWalkToXExt(int16 x) {
 }
 
 void Klaymen::stLargeStep() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_isLargeStep = true;
 	_acceptInput = true;
 	setDoDeltaX(_destX >= _x ? 1 : 0);
@@ -1447,7 +1447,7 @@ uint32 Klaymen::hmLargeStep(int messageNum, const MessageParam &param, Entity *s
 }
 
 void Klaymen::stWonderAboutHalf() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, 10);
 	SetUpdateHandler(&Klaymen::update);
@@ -1456,7 +1456,7 @@ void Klaymen::stWonderAboutHalf() {
 }
 
 void Klaymen::stWonderAboutAfter() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0xD820A114, 30, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1465,7 +1465,7 @@ void Klaymen::stWonderAboutAfter() {
 }
 
 void Klaymen::stTurnToUseHalf() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x9B250AD2, 0, 7);
 	SetUpdateHandler(&Klaymen::update);
@@ -1488,7 +1488,7 @@ uint32 Klaymen::hmTurnToUse(int messageNum, const MessageParam &param, Entity *s
 }
 
 void Klaymen::stTurnAwayFromUse() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x98F88391, 4, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1497,7 +1497,7 @@ void Klaymen::stTurnAwayFromUse() {
 }
 
 void Klaymen::stWonderAbout() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1506,7 +1506,7 @@ void Klaymen::stWonderAbout() {
 }
 
 void Klaymen::stPeekWall() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0xAC20C012, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1535,7 +1535,7 @@ uint32 Klaymen::hmPeekWall(int messageNum, const MessageParam &param, Entity *se
 
 void Klaymen::stJumpToRing1() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing1))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		startAnimation(0xD82890BA, 0, -1);
 		setupJumpToRing();
 	}
@@ -1575,7 +1575,7 @@ void Klaymen::suUpdateDestX() {
 }
 
 void Klaymen::stHangOnRing() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x4829E0B8, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1585,7 +1585,7 @@ void Klaymen::stHangOnRing() {
 
 void Klaymen::stJumpToRing2() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing2))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		startAnimation(0x900980B2, 0, -1);
 		setupJumpToRing();
 	}
@@ -1593,7 +1593,7 @@ void Klaymen::stJumpToRing2() {
 
 void Klaymen::stJumpToRing3() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing3))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_acceptInput = false;
 		startAnimation(0xBA1910B2, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1623,7 +1623,7 @@ uint32 Klaymen::hmJumpToRing3(int messageNum, const MessageParam &param, Entity
 }
 
 void Klaymen::stHoldRing3() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x4A293FB0, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1640,7 +1640,7 @@ uint32 Klaymen::hmHoldRing3(int messageNum, const MessageParam &param, Entity *s
 }
 
 void Klaymen::stReleaseRing() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	sendMessage(_attachedSprite, 0x4807, 0);
 	_attachedSprite = NULL;
@@ -1652,18 +1652,18 @@ void Klaymen::stReleaseRing() {
 
 void Klaymen::stJumpToRing4() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing4))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		startAnimation(0xB8699832, 0, -1);
 		setupJumpToRing();
 	}
 }
 
-void Klaymen::sub41CCE0(int16 x) {
-	sub41CC40(_attachedSprite->getX(), x);
+void Klaymen::startWalkToAttachedSpriteXDistance(int16 distance) {
+	startWalkToXDistance(_attachedSprite->getX(), distance);
 }
 
 void Klaymen::stContinueClimbLadderUp() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	_ladderStatus = 3;
 	startAnimationByHash(0x3A292504, 0x01084280, 0);
@@ -1676,7 +1676,7 @@ void Klaymen::stContinueClimbLadderUp() {
 
 void Klaymen::stStartClimbLadderDown() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderDown))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		if (_destY < _y) {
 			if (_ladderStatus == 1) {
 				_ladderStatus = 2;
@@ -1707,7 +1707,7 @@ void Klaymen::stStartClimbLadderDown() {
 }
 
 void Klaymen::stClimbLadderHalf() {
-	_status2 = 2;
+	_busyStatus = 2;
 	if (_ladderStatus == 1) {
 		_ladderStatus = 0;
 		_acceptInput = false;
@@ -1773,7 +1773,7 @@ uint32 Klaymen::hmClimbLadderUpDown(int messageNum, const MessageParam &param, E
 
 void Klaymen::stStartClimbLadderUp() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderUp))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		if (_destY >= _y - 30) {
 			gotoNextStateExt();
 		} else if (_ladderStatus == 0) {
@@ -1799,7 +1799,7 @@ void Klaymen::stStartClimbLadderUp() {
 }
 
 void Klaymen::stWalkToFrontNoStep() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = false;
 	startAnimationByHash(0xF229C003, 0x14884392, 0);
 	SetUpdateHandler(&Klaymen::update);
@@ -1827,7 +1827,7 @@ uint32 Klaymen::hmWalkToFront(int messageNum, const MessageParam &param, Entity
 
 void Klaymen::stWalkToFront() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stWalkToFront))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0xF229C003, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1838,7 +1838,7 @@ void Klaymen::stWalkToFront() {
 
 void Klaymen::stTurnToFront() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToFront))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_acceptInput = false;
 		startAnimationByHash(0xCA221107, 0, 0x8520108C);
 		SetUpdateHandler(&Klaymen::update);
@@ -1849,7 +1849,7 @@ void Klaymen::stTurnToFront() {
 
 void Klaymen::stTurnToBack() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBack))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0xCA221107, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1859,7 +1859,7 @@ void Klaymen::stTurnToBack() {
 }
 
 void Klaymen::stLandOnFeet() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = true;
 	startAnimation(0x18118554, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -1881,7 +1881,7 @@ uint32 Klaymen::hmLandOnFeet(int messageNum, const MessageParam &param, Entity *
 
 void Klaymen::stTurnToBackToUse() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBackToUse))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x91540140, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1908,7 +1908,7 @@ uint32 Klaymen::hmTurnToBackToUse(int messageNum, const MessageParam &param, Ent
 
 void Klaymen::stClayDoorOpen() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stClayDoorOpen))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x5CCCB330, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1931,7 +1931,7 @@ uint32 Klaymen::hmClayDoorOpen(int messageNum, const MessageParam &param, Entity
 
 void Klaymen::stTurnToUse() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUse))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x9B250AD2, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -1941,7 +1941,7 @@ void Klaymen::stTurnToUse() {
 }
 
 void Klaymen::stReturnFromUse() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = false;
 	startAnimation(0x98F88391, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2017,7 +2017,7 @@ void Klaymen::stMoveObjectSkipTurn() {
 void Klaymen::stMoveObjectFaceObject() {
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	if (!stStartAction(AnimationCallback(&Klaymen::stMoveObjectFaceObject))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_isMoveObjectRequested = false;
 		_acceptInput = true;
 		startAnimation(0x0C1CA072, 0, -1);
@@ -2029,7 +2029,7 @@ void Klaymen::stMoveObjectFaceObject() {
 
 void Klaymen::stUseLever() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stUseLever))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		if (_isLeverDown) {
 			stUseLeverRelease();
 		} else {
@@ -2072,7 +2072,7 @@ void Klaymen::stUseLeverRelease() {
 
 void Klaymen::stReleaseLever() {
 	if (_isLeverDown) {
-		_status2 = 2;
+		_busyStatus = 2;
 		startAnimation(0x09018068, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
 		SetMessageHandler(&Klaymen::hmLever);
@@ -2097,7 +2097,7 @@ void Klaymen::evLeverReleasedEvent() {
 
 void Klaymen::stInsertDisk() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertDisk))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_tapesToInsert = 0;
 		for (uint32 i = 0; i < 20; i++) {
 			if (getSubVar(VA_HAS_TAPE, i)) {
@@ -2178,7 +2178,7 @@ void Klaymen::walkAlongPathPoints() {
 }
 
 void Klaymen::stJumpToGrab() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimationByHash(0x00AB8C10, 0x01084280, 0);
 	SetUpdateHandler(&Klaymen::update);
@@ -2213,7 +2213,7 @@ uint32 Klaymen::hmJumpToGrab(int messageNum, const MessageParam &param, Entity *
 }
 
 void Klaymen::stFinishGrow() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = false;
 	startAnimation(0x38445000, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2234,7 +2234,7 @@ uint32 Klaymen::hmFinishGrow(int messageNum, const MessageParam &param, Entity *
 
 void Klaymen::stTurnToUseExt() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUseExt))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x1B3D8216, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -2245,7 +2245,7 @@ void Klaymen::stTurnToUseExt() {
 
 void Klaymen::stJumpToGrabFall() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToGrabFall))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_acceptInput = false;
 		startAnimation(0x00AB8C10, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -2256,7 +2256,7 @@ void Klaymen::stJumpToGrabFall() {
 }
 
 void Klaymen::stJumpToGrabRelease() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimationByHash(0x00AB8C10, 0x320AC306, 0);
 	SetUpdateHandler(&Klaymen::update);
@@ -2281,7 +2281,7 @@ void Klaymen::stDoIdleTeleporterHands() {
 }
 
 void Klaymen::stIdleTeleporterHands() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x90EF8D38, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2295,7 +2295,7 @@ void Klaymen::stDoIdleTeleporterHands2() {
 }
 
 void Klaymen::stIdleTeleporterHands2() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0x900F0930, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2305,7 +2305,7 @@ void Klaymen::stIdleTeleporterHands2() {
 }
 
 void Klaymen::teleporterAppear(uint32 fileHash) {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(fileHash, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2314,7 +2314,7 @@ void Klaymen::teleporterAppear(uint32 fileHash) {
 }
 
 void Klaymen::teleporterDisappear(uint32 fileHash) {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(fileHash, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2350,7 +2350,7 @@ uint32 Klaymen::hmShrink(int messageNum, const MessageParam &param, Entity *send
 }
 
 void Klaymen::stShrink() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	playSound(0, 0x4C69EA53);
 	startAnimation(0x1AE88904, 0, -1);
@@ -2362,7 +2362,7 @@ void Klaymen::stShrink() {
 void Klaymen::stStandWonderAbout() {
 	if (_x > 260)
 		setDoDeltaX(1);
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0xD820A114, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2457,7 +2457,7 @@ uint32 Klaymen::hmGrow(int messageNum, const MessageParam &param, Entity *sender
 }
 
 void Klaymen::stGrow() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x2838C010, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2466,7 +2466,7 @@ void Klaymen::stGrow() {
 }
 
 void Klaymen::stDrinkPotion() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	_potionFlag1 = false;
 	_potionFlag2 = false;
@@ -2503,7 +2503,7 @@ uint32 Klaymen::hmInsertKey(int messageNum, const MessageParam &param, Entity *s
 
 void Klaymen::stInsertKey() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertKey))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_keysToInsert = 0;
 		for (uint32 i = 0; i < 3; i++) {
 			if (getSubVar(VA_HAS_KEY, i)) {
@@ -2551,7 +2551,7 @@ uint32 Klaymen::hmReadNote(int messageNum, const MessageParam &param, Entity *se
 }
 
 void Klaymen::stReadNote() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = false;
 	startAnimation(0x123E9C9F, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2583,7 +2583,7 @@ uint32 Klaymen::hmHitByDoor(int messageNum, const MessageParam &param, Entity *s
 }
 
 void Klaymen::stHitByDoor() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2618,7 +2618,7 @@ void Klaymen::upPeekWallBlink() {
 }
 
 void Klaymen::stPeekWall1() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klaymen::update);
@@ -2628,7 +2628,7 @@ void Klaymen::stPeekWall1() {
 }
 
 void Klaymen::stPeekWall2() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimation(0xAC20C012, 43, 49);
 	SetUpdateHandler(&Klaymen::update);
@@ -2638,7 +2638,7 @@ void Klaymen::stPeekWall2() {
 
 void Klaymen::stPeekWallBlink() {
 	_blinkCounter = 0;
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	_blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24;
 	startAnimation(0xAC20C012, 38, 42);
@@ -2649,7 +2649,7 @@ void Klaymen::stPeekWallBlink() {
 }
 
 void Klaymen::stPeekWallReturn() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x2426932E, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2659,7 +2659,7 @@ void Klaymen::stPeekWallReturn() {
 
 void Klaymen::stPullHammerLever() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stPullHammerLever))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x00648953, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -2688,7 +2688,7 @@ void Klaymen::suRidePlatformDown() {
 
 void Klaymen::stRidePlatformDown() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatformDown))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		sendMessage(_parentScene, 0x4803, 0);
 		_acceptInput = false;
 		_platformDeltaY = 0;
@@ -2702,7 +2702,7 @@ void Klaymen::stRidePlatformDown() {
 
 void Klaymen::stCrashDown() {
 	playSound(0, 0x41648271);
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
 	SetUpdateHandler(&Klaymen::update);
@@ -2879,7 +2879,7 @@ void Klaymen::suFallDown() {
 
 void Klaymen::stJumpToRingVenusFlyTrap() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRingVenusFlyTrap))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0x584984B4, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -2892,7 +2892,7 @@ void Klaymen::stJumpToRingVenusFlyTrap() {
 
 void Klaymen::stStandIdleSpecial() {
 	playSound(0, 0x56548280);
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	_surface->setVisible(false);
 	startAnimation(0x5420E254, 0, -1);
@@ -2903,7 +2903,7 @@ void Klaymen::stStandIdleSpecial() {
 
 void Klaymen::stSpitOutFall0() {
 	_countdown1 = 1;
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x000BAB02, 0, -1);
 	SetUpdateHandler(&Klaymen::upSpitOutFall);
@@ -2915,7 +2915,7 @@ void Klaymen::stSpitOutFall0() {
 
 void Klaymen::stSpitOutFall2() {
 	_countdown1 = 1;
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x9308C132, 0, -1);
 	SetUpdateHandler(&Klaymen::upSpitOutFall);
@@ -2928,7 +2928,7 @@ void Klaymen::stSpitOutFall2() {
 void Klaymen::stFalling() {
 	sendMessage(_parentScene, 0x1024, 1);
 	playSound(0, 0x41648271);
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	_isWalking = false;
 	startAnimationByHash(0x000BAB02, 0x88003000, 0);
@@ -2949,7 +2949,7 @@ void Klaymen::stFallTouchdown() {
 void Klaymen::stJumpAndFall() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stJumpAndFall))) {
 		sendMessage(_parentScene, 0x1024, 3);
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		startAnimation(0xB93AB151, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -2965,7 +2965,7 @@ void Klaymen::stDropFromRing() {
 		sendMessage(_attachedSprite, 0x4807, 0);
 		_attachedSprite = NULL;
 	}
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = false;
 	startAnimation(0x586984B1, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -2975,7 +2975,7 @@ void Klaymen::stDropFromRing() {
 }
 
 void Klaymen::stPressDoorButton() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = true;
 	setDoDeltaX(0);
 	startAnimation(0x1CD89029, 0, -1);
@@ -2985,7 +2985,7 @@ void Klaymen::stPressDoorButton() {
 }
 
 void Klaymen::stHitByBoxingGlove() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimation(0x35AA8059, 0, -1);
 	SetUpdateHandler(&Klaymen::update);
@@ -3000,7 +3000,7 @@ void Klaymen::evHitByBoxingGloveDone() {
 
 void Klaymen::stMoveVenusFlyTrap() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stMoveVenusFlyTrap))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_isMoveObjectRequested = false;
 		_acceptInput = true;
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
@@ -3037,7 +3037,7 @@ void Klaymen::suFallSkipJump() {
 }
 
 void Klaymen::stFallSkipJump() {
-	_status2 = 2;
+	_busyStatus = 2;
 	_acceptInput = false;
 	startAnimationByHash(0xB93AB151, 0x40A100F8, 0);
 	SetUpdateHandler(&Klaymen::update);
@@ -3074,7 +3074,7 @@ uint32 Klaymen::hmMatch(int messageNum, const MessageParam &param, Entity *sende
 
 void Klaymen::stFetchMatch() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stFetchMatch))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		_acceptInput = false;
 		setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 		startAnimation(0x9CAA0218, 0, -1);
@@ -3086,7 +3086,7 @@ void Klaymen::stFetchMatch() {
 }
 
 void Klaymen::stLightMatch() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0);
 	startAnimation(0x1222A513, 0, -1);
@@ -3128,7 +3128,7 @@ uint32 Klaymen::hmTumbleHeadless(int messageNum, const MessageParam &param, Enti
 
 void Klaymen::stMoveObject() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stMoveObject))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = false;
 		_moveObjectCountdown = 8;
 		setDoDeltaX(0);
@@ -3149,7 +3149,7 @@ void Klaymen::stContinueMoveObject() {
 
 void Klaymen::stTumbleHeadless() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTumbleHeadless))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = false;
 		setDoDeltaX(0);
 		startAnimation(0x2821C590, 0, -1);
@@ -3164,7 +3164,7 @@ void Klaymen::stTumbleHeadless() {
 
 void Klaymen::stCloseEyes() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stCloseEyes))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = false;		
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -3200,7 +3200,7 @@ void Klaymen::stTrySpitIntoPipe() {
 		if (_canSpitPipe)
 			spitIntoPipe();
 	} else if (!stStartAction(AnimationCallback(&Klaymen::stTrySpitIntoPipe))) {
-		_status2 = 2;
+		_busyStatus = 2;
 		_acceptInput = true;
 		_spitDestPipeIndex = _spitPipeIndex;
 		_readyToSpit = true;
@@ -3242,7 +3242,7 @@ void Klaymen::suRidePlatform() {
 
 void Klaymen::stRidePlatform() {
 	if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatform))) {
-		_status2 = 1;
+		_busyStatus = 1;
 		_acceptInput = true;
 		startAnimation(0x5420E254, 0, -1);
 		SetUpdateHandler(&Klaymen::update);
@@ -3253,7 +3253,7 @@ void Klaymen::stRidePlatform() {
 
 void Klaymen::stInteractLever() {
 	if (!stStartAction(AnimationCallback(&Klaymen::stInteractLever))) {
-		_status2 = 0;
+		_busyStatus = 0;
 		if (_isLeverDown) {
 			stUseLeverRelease();
 		} else {
@@ -3295,7 +3295,7 @@ void Klaymen::stStartWalkingResume() {
 	int16 frameIndex = getGlobalVar(V_KLAYMEN_FRAMEINDEX) + _walkResumeFrameIncr;
 	if (frameIndex < 0 || frameIndex > 13)
 		frameIndex = 0;
-	_status2 = 0;
+	_busyStatus = 0;
 	_isWalking = true;
 	_acceptInput = true;
 	startAnimation(0x1A249001, frameIndex, -1);
@@ -3314,7 +3314,7 @@ void Klaymen::upPeekInsideBlink() {
 }
 
 void Klaymen::stPeekInside() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0xAC20C012, 8, 37);
 	SetUpdateHandler(&Klaymen::update);
@@ -3324,7 +3324,7 @@ void Klaymen::stPeekInside() {
 }
 
 void Klaymen::stPeekInsideReturn() {
-	_status2 = 1;
+	_busyStatus = 1;
 	_acceptInput = false;
 	startAnimation(0xAC20C012, 43, 49);
 	SetUpdateHandler(&Klaymen::update);
@@ -3333,7 +3333,7 @@ void Klaymen::stPeekInsideReturn() {
 }
 
 void Klaymen::stPeekInsideBlink() {
-	_status2 = 0;
+	_busyStatus = 0;
 	_acceptInput = true;
 	startAnimation(0xAC20C012, 38, 42);
 	_newStickFrameIndex = 42;
@@ -3382,11 +3382,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0)
@@ -3426,7 +3425,6 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	: Klaymen(vm, parentScene, x, y) {
 	
 	setKlaymenIdleTable1();
-	
 }
 
 void KmScene1002::xUpdate() {
@@ -3496,7 +3494,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x481B:				
-		sub41CCE0(param.asInteger());
+		startWalkToAttachedSpriteXDistance(param.asInteger());
 		break;
 	case 0x4820:  
 		sendMessage(_parentScene, 0x2005, 0);
@@ -3677,8 +3675,7 @@ KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	: Klaymen(vm, parentScene, x, y) {
 	
 	setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4));
-	_flagF6 = true;
-	
+	_doYHitIncr = true;
 }
 
 uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3714,11 +3711,10 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -3792,11 +3788,10 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;						
 	case 0x481F:
 		if (param.asInteger() == 1)
@@ -3845,6 +3840,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
 	
+	// Empty
 }
 
 uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -3888,11 +3884,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam &param) {
 		GotoState(&Klaymen::stInsertDisk);		
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter)
@@ -4007,9 +4002,9 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4069,11 +4064,10 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;						
 	case 0x481F:
 		if (param.asInteger() == 1)
@@ -4131,11 +4125,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;						
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4186,11 +4179,10 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x4827:
 		GotoState(&Klaymen::stReleaseLever);
@@ -4209,7 +4201,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
-	
+
 	// Empty	
 }
 
@@ -4245,9 +4237,9 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4283,6 +4275,8 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
+	// Empty
 }
 
 uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4315,11 +4309,10 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter)
@@ -4410,9 +4403,9 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter) {
@@ -4610,9 +4603,9 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		if (_isSittingInTeleporter)
@@ -4649,9 +4642,7 @@ KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	: Klaymen(vm, parentScene, x, y) {
 
 	_surface->setClipRects(clipRects, clipRectsCount);
-
 	_dataResource.load(0x04104242);
-	_flagF6 = false;
 }
 
 uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -4678,11 +4669,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 		startWalkToX(_dataResource.getPoint(param.asInteger()).x, false);
 		break;
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4718,6 +4708,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 	
@@ -4761,9 +4752,9 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -4787,6 +4778,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -4884,11 +4876,10 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 		gotoNextStateExt();
 		break;		
 	case 0x481B:
-		if (param.asPoint().y != 0) {
-			sub41CC40(param.asPoint().y, param.asPoint().x);
-		} else {
-			sub41CCE0(param.asPoint().x);
-		}
+		if (param.asPoint().y != 0)
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
+		else
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0)
@@ -4933,6 +4924,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 	
@@ -4972,9 +4964,9 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x4827:
 		GotoState(&Klaymen::stReleaseLever);
@@ -4995,6 +4987,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5032,9 +5025,9 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0)
@@ -5113,6 +5106,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam &param
 
 KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5165,6 +5159,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam &param) {
   
 KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 	
@@ -5192,9 +5187,9 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 1)
@@ -5243,6 +5238,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5283,9 +5279,9 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0)
@@ -5311,6 +5307,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5344,9 +5341,9 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0)
@@ -5396,7 +5393,6 @@ KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	: Klaymen(vm, parentScene, x, y) {
 	
 	_surface->setClipRects(clipRects, clipRectsCount);
-	
 }
 
 uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5433,9 +5429,9 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -5485,6 +5481,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam &param) {
 	
 KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 	
@@ -5536,6 +5533,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 	
@@ -5553,6 +5551,7 @@ uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5574,9 +5573,9 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;		
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;						
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
@@ -5623,7 +5622,6 @@ KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	: Klaymen(vm, parentScene, x, y) {
 	
 	_surface->setClipRects(clipRects, clipRectsCount);
-	
 	_dataResource.load(0x00900849);
 }
 
@@ -5737,6 +5735,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam &para
 
 KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5793,10 +5792,10 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-	bool flag, NRect *clipRects, uint clipRectsCount)
+	bool needsLargeSurface, NRect *clipRects, uint clipRectsCount)
 	: Klaymen(vm, parentScene, x, y) {
 
-	if (flag) {
+	if (needsLargeSurface) {
 		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
 		delete _surface;
 		createSurface(1000, dimensions.width, dimensions.height);
@@ -5809,7 +5808,6 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	
 	_dataResource.load(0x98182003);
 	_surface->setClipRects(clipRects, clipRectsCount);
-
 }
 
 uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5852,10 +5850,10 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam &param) {
 }
 
 KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-	bool flag, NRect *clipRects, uint clipRectsCount)
+	bool needsLargeSurface, NRect *clipRects, uint clipRectsCount)
 	: Klaymen(vm, parentScene, x, y) {
 
-	if (flag) {
+	if (needsLargeSurface) {
 		NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010);
 		delete _surface;
 		createSurface(1000, dimensions.width, dimensions.height);
@@ -5868,7 +5866,6 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 
 	_dataResource.load(0x1830009A);
 	_surface->setClipRects(clipRects, clipRectsCount);
-	
 }
 
 uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5912,6 +5909,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) 
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -5962,7 +5960,6 @@ KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16
 	: Klaymen(vm, parentScene, x, y) {
 
 	_surface->setClipRects(clipRects, clipRectsCount);
-	
 }
 		
 uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
@@ -5994,9 +5991,9 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481F:
 		if (param.asInteger() == 0)
@@ -6053,6 +6050,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam &param) {
 
 KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
+
 	// Empty
 }
 
@@ -6086,9 +6084,9 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam &param) {
 		break;
 	case 0x481B:
 		if (param.asPoint().y != 0)
-			sub41CC40(param.asPoint().y, param.asPoint().x);
+			startWalkToXDistance(param.asPoint().y, param.asPoint().x);
 		else
-			sub41CCE0(param.asPoint().x);
+			startWalkToAttachedSpriteXDistance(param.asPoint().x);
 		break;
 	case 0x481D:
 		GotoState(&Klaymen::stTurnToUse);
diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h
index 31f8e5a..4cf9e72 100644
--- a/engines/neverhood/klaymen.h
+++ b/engines/neverhood/klaymen.h
@@ -399,12 +399,12 @@ protected:
 	int16 _blinkCounter, _blinkCounterMax;
 	int16 _countdown1;
 	int16 _tapesToInsert, _keysToInsert;
-	bool _flagF6;
+	bool _doYHitIncr;
 	bool _isLeverDown;
 	bool _isWalkingOpenDoorNotified;
-	int _status2;
-	bool _flagFA;
-	int _status3;
+	int _busyStatus;
+	bool _actionStatusChanged;
+	int _actionStatus;
 	const KlaymenIdleTableItem *_idleTable;
 	int _idleTableCount;
 	int _idleTableMaxValue;
@@ -436,17 +436,17 @@ protected:
 	// TODO Check if this can be turned into a void result
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
-	void startWalkToX(int16 x, bool flag);
+	void startWalkToX(int16 x, bool walkExt);
 	void startWalkToXExt(int16 x);
 	void startWalkToXSmall(int16 x);
 	void startSpecialWalkLeft(int16 x);
 	void startSpecialWalkRight(int16 x);
-	void sub41CC40(int16 x1, int16 x2);
-	void sub41CCE0(int16 x);
+	void startWalkToXDistance(int16 destX, int16 distance);
+	void startWalkToAttachedSpriteXDistance(int16 distance);
 
 	void gotoNextStateExt();
-	void sub41C770();
-	void sub41C790();
+	void beginAction();
+	void endAction();
 
 	void stStartWalkingSmall();
 	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
@@ -724,7 +724,7 @@ protected:
 class KmScene2806 : public Klaymen {
 public:
 	KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-		bool flag, NRect *clipRects, uint clipRectsCount);
+		bool needsLargeSurface, NRect *clipRects, uint clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };
@@ -732,7 +732,7 @@ protected:
 class KmScene2809 : public Klaymen {
 public:
 	KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y,
-		bool flag, NRect *clipRects, uint clipRectsCount);
+		bool needsLargeSurface, NRect *clipRects, uint clipRectsCount);
 protected:
 	uint32 xHandleMessage(int messageNum, const MessageParam &param);
 };


Commit: 9ae1888593ae25680a53819a038e9123db30b038
    https://github.com/scummvm/scummvm/commit/9ae1888593ae25680a53819a038e9123db30b038
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Change Klaymen idle callbacks from method pointers to integers and evaluate these in a new method enterIdleAnimation

Changed paths:
    engines/neverhood/klaymen.cpp
    engines/neverhood/klaymen.h



diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
index 484d7aa..2563ce0 100644
--- a/engines/neverhood/klaymen.cpp
+++ b/engines/neverhood/klaymen.cpp
@@ -27,35 +27,35 @@
 
 namespace Neverhood {
 
-static const KlaymenIdleTableItem klaymenTable1[] = {
-	{1, &Klaymen::stDoIdlePickEar},
-	{1, &Klaymen::stDoIdleSpinHead},
-	{1, &Klaymen::stDoIdleArms},
-	{1, &Klaymen::stDoIdleChest},
-	{1, &Klaymen::stDoIdleHeadOff}
+static const KlaymenIdleTableItem klaymenIdleTable1[] = {
+	{1, kIdlePickEar},
+	{1, kIdleSpinHead},
+	{1, kIdleArms},
+	{1, kIdleChest},
+	{1, kIdleHeadOff}
 }; 
 
-static const KlaymenIdleTableItem klaymenTable2[] = {
-	{1, &Klaymen::stDoIdlePickEar},
-	{1, &Klaymen::stDoIdleSpinHead},
-	{1, &Klaymen::stDoIdleChest},
-	{1, &Klaymen::stDoIdleHeadOff}
+static const KlaymenIdleTableItem klaymenIdleTable2[] = {
+	{1, kIdlePickEar},
+	{1, kIdleSpinHead},
+	{1, kIdleChest},
+	{1, kIdleHeadOff}
 }; 
 
-static const KlaymenIdleTableItem klaymenTable3[] = {
-	{1, &Klaymen::stDoIdleTeleporterHands},
-	{1, &Klaymen::stDoIdleTeleporterHands2}
+static const KlaymenIdleTableItem klaymenIdleTable3[] = {
+	{1, kIdleTeleporterHands},
+	{1, kIdleTeleporterHands2}
 }; 
 
-static const KlaymenIdleTableItem klaymenTable4[] = {
-	{1, &Klaymen::stDoIdleSpinHead},
-	{1, &Klaymen::stDoIdleChest},
-	{1, &Klaymen::stDoIdleHeadOff},
+static const KlaymenIdleTableItem klaymenIdleTable4[] = {
+	{1, kIdleSpinHead},
+	{1, kIdleChest},
+	{1, kIdleHeadOff},
 };
 
 static const KlaymenIdleTableItem klaymenIdleTable1002[] = {
-	{1, &Klaymen::stDoIdlePickEar},
-	{2, &Klaymen::stIdleWonderAbout}
+	{1, kIdlePickEar},
+	{2, kIdleWonderAbout}
 }; 
 
 // Klaymen
@@ -103,28 +103,24 @@ void Klaymen::update() {
 	xUpdate();
 }
 
-void Klaymen::setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount) {
+void Klaymen::setKlaymenIdleTable(const KlaymenIdleTableItem *table, uint tableCount) {
 	_idleTable = table;
 	_idleTableCount = tableCount;
-	_idleTableMaxValue = 0;
-	for (int i = 0; i < tableCount; i++)
-		_idleTableMaxValue += table[i].value;
+	_idleTableTotalWeight = 0;
+	for (uint i = 0; i < tableCount; i++)
+		_idleTableTotalWeight += table[i].weight;
 }
 
 void Klaymen::setKlaymenIdleTable1() {
-	setKlaymenIdleTable(klaymenTable1, ARRAYSIZE(klaymenTable1));
+	setKlaymenIdleTable(klaymenIdleTable1, ARRAYSIZE(klaymenIdleTable1));
 }
 
 void Klaymen::setKlaymenIdleTable2() {
-	setKlaymenIdleTable(klaymenTable2, ARRAYSIZE(klaymenTable2));
+	setKlaymenIdleTable(klaymenIdleTable2, ARRAYSIZE(klaymenIdleTable2));
 }
 
 void Klaymen::setKlaymenIdleTable3() {
-	setKlaymenIdleTable(klaymenTable3, ARRAYSIZE(klaymenTable3));
-}
-
-void Klaymen::stDoIdlePickEar() {
-	startIdleAnimation(0x5B20C814, AnimationCallback(&Klaymen::stIdlePickEar));
+	setKlaymenIdleTable(klaymenIdleTable3, ARRAYSIZE(klaymenIdleTable3));
 }
 
 void Klaymen::stIdlePickEar() {
@@ -154,10 +150,6 @@ void Klaymen::evIdlePickEarDone() {
 	stopSound(0);
 }
 
-void Klaymen::stDoIdleSpinHead() {
-	startIdleAnimation(0xD122C137, AnimationCallback(&Klaymen::stIdleSpinHead));
-}
-
 void Klaymen::stIdleSpinHead() {
 	_busyStatus = 1;
 	_acceptInput = true;
@@ -180,10 +172,6 @@ uint32 Klaymen::hmIdleSpinHead(int messageNum, const MessageParam &param, Entity
 	return messageResult;
 }
 
-void Klaymen::stDoIdleArms() {
-	startIdleAnimation(0x543CD054, AnimationCallback(&Klaymen::stIdleArms));
-}
-
 void Klaymen::stIdleArms() {
 	_busyStatus = 1;
 	_acceptInput = true;
@@ -215,10 +203,6 @@ uint32 Klaymen::hmIdleArms(int messageNum, const MessageParam &param, Entity *se
 	return messageResult;
 }
 
-void Klaymen::stDoIdleChest() {
-	startIdleAnimation(0x40A0C034, AnimationCallback(&Klaymen::stIdleChest));
-}
-
 void Klaymen::stIdleChest() {
 	_busyStatus = 1;
 	_acceptInput = true;
@@ -241,10 +225,6 @@ uint32 Klaymen::hmIdleChest(int messageNum, const MessageParam &param, Entity *s
 	return messageResult;
 }
 
-void Klaymen::stDoIdleHeadOff() {
-	startIdleAnimation(0x5120E137, AnimationCallback(&Klaymen::stIdleHeadOff));
-}
-
 void Klaymen::stIdleHeadOff() {
 	_busyStatus = 1;
 	_acceptInput = true;
@@ -298,18 +278,17 @@ void Klaymen::stSitIdleTeleporter() {
 
 void Klaymen::upSitIdleTeleporter() {
 	update();
-	_idleCounter++;
-	if (_idleCounter >= _idleCounterMax) {
+	if (++_idleCounter >= _idleCounterMax) {
 		_idleCounter = 0;
 		if (_idleTable) {
-			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue);
-			for (int i = 0; i < _idleTableCount; i++) {
-				if (randomValue < _idleTable[i].value) {
-					(this->*(_idleTable[i].callback))();
+			int idleWeight = _vm->_rnd->getRandomNumber(_idleTableTotalWeight - 1);
+			for (uint i = 0; i < _idleTableCount; i++) {
+				if (idleWeight < _idleTable[i].weight) {
+					enterIdleAnimation(_idleTable[i].idleAnimation);
 					_idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24;
 					break;
 				}
-				randomValue -= _idleTable[i].value;
+				idleWeight -= _idleTable[i].weight;
 			}
 		}
 	} else if (++_blinkCounter >= _blinkCounterMax) {
@@ -524,13 +503,13 @@ void Klaymen::upStandIdle() {
 	if (++_idleCounter >= 720) {
 		_idleCounter = 0;
 		if (_idleTable) {
-			int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1);
-			for (int i = 0; i < _idleTableCount; i++) {
-				if (randomValue < _idleTable[i].value) {
-					(this->*(_idleTable[i].callback))();
+			int idleWeight = _vm->_rnd->getRandomNumber(_idleTableTotalWeight - 1);
+			for (uint i = 0; i < _idleTableCount; i++) {
+				if (idleWeight < _idleTable[i].weight) {
+					enterIdleAnimation(_idleTable[i].idleAnimation);
 					break;
 				}
-				randomValue -= _idleTable[i].value;
+				idleWeight -= _idleTable[i].weight;
 			}
 		}
 	} else if (++_blinkCounter >= _blinkCounterMax) {
@@ -2177,6 +2156,35 @@ void Klaymen::walkAlongPathPoints() {
 	}
 }
 
+void Klaymen::enterIdleAnimation(uint idleAnimation) {
+	switch (idleAnimation) {
+	case kIdlePickEar:
+		startIdleAnimation(0x5B20C814, AnimationCallback(&Klaymen::stIdlePickEar));
+		break;
+	case kIdleSpinHead:
+		startIdleAnimation(0xD122C137, AnimationCallback(&Klaymen::stIdleSpinHead));
+		break;
+	case kIdleArms:
+		startIdleAnimation(0x543CD054, AnimationCallback(&Klaymen::stIdleArms));
+		break;
+	case kIdleChest:
+		startIdleAnimation(0x40A0C034, AnimationCallback(&Klaymen::stIdleChest));
+		break;
+	case kIdleHeadOff:
+		startIdleAnimation(0x5120E137, AnimationCallback(&Klaymen::stIdleHeadOff));
+		break;
+	case kIdleTeleporterHands:
+		startIdleAnimation(0x90EF8D38, AnimationCallback(&Klaymen::stIdleTeleporterHands));
+		break;
+	case kIdleTeleporterHands2:
+		startIdleAnimation(0x900F0930, AnimationCallback(&Klaymen::stIdleTeleporterHands2));
+		break;
+	case kIdleWonderAbout:
+		stIdleWonderAbout();
+		break;
+	}
+}
+
 void Klaymen::stJumpToGrab() {
 	_busyStatus = 0;
 	_acceptInput = false;
@@ -2276,10 +2284,6 @@ uint32 Klaymen::hmJumpToGrabRelease(int messageNum, const MessageParam &param, E
 	return messageResult;
 }
 
-void Klaymen::stDoIdleTeleporterHands() {
-	startIdleAnimation(0x90EF8D38, AnimationCallback(&Klaymen::stIdleTeleporterHands));
-}
-
 void Klaymen::stIdleTeleporterHands() {
 	_busyStatus = 0;
 	_acceptInput = true;
@@ -2290,10 +2294,6 @@ void Klaymen::stIdleTeleporterHands() {
 	NextState(&Klaymen::stSitIdleTeleporterBlinkSecond);
 }
 
-void Klaymen::stDoIdleTeleporterHands2() {
-	startIdleAnimation(0x900F0930, AnimationCallback(&Klaymen::stIdleTeleporterHands2));
-}
-
 void Klaymen::stIdleTeleporterHands2() {
 	_busyStatus = 0;
 	_acceptInput = true;
@@ -3674,7 +3674,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
 	
-	setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4));
+	setKlaymenIdleTable(klaymenIdleTable4, ARRAYSIZE(klaymenIdleTable4));
 	_doYHitIncr = true;
 }
 
@@ -4145,7 +4145,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam &param) {
 KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
 	: Klaymen(vm, parentScene, x, y) {
 
-	setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4));
+	setKlaymenIdleTable(klaymenIdleTable4, ARRAYSIZE(klaymenIdleTable4));
 }
 
 uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam &param) {
diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h
index 4cf9e72..d1b0b59 100644
--- a/engines/neverhood/klaymen.h
+++ b/engines/neverhood/klaymen.h
@@ -41,12 +41,23 @@ const uint32 kKlaymenSpeedUpHash = 0x004A2148;
 #include "common/pack-start.h"	// START STRUCT PACKING
 
 struct KlaymenIdleTableItem {
-	int value;
-	void (Klaymen::*callback)();
+	int weight;
+	uint idleAnimation;
 };
 
 #include "common/pack-end.h"	// END STRUCT PACKING
 
+enum {
+	kIdlePickEar,
+	kIdleSpinHead,
+	kIdleArms,
+	kIdleChest,
+	kIdleHeadOff,
+	kIdleTeleporterHands,
+	kIdleTeleporterHands2,
+	kIdleWonderAbout
+};
+
 class Klaymen : public AnimatedSprite {
 public:
 	Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects = NULL);
@@ -56,34 +67,27 @@ public:
 	void startIdleAnimation(uint32 fileHash, AnimationCb callback);
 	void upIdleAnimation();
 
-	void stDoIdlePickEar();
 	void stIdlePickEar();
 	void evIdlePickEarDone();
 	uint32 hmIdlePickEar(int messageNum, const MessageParam &param, Entity *sender);
 
-	void stDoIdleSpinHead();
 	void stIdleSpinHead();
 	uint32 hmIdleSpinHead(int messageNum, const MessageParam &param, Entity *sender);
 
-	void stDoIdleArms();
 	void stIdleArms();
 	void evIdleArmsDone();
 	uint32 hmIdleArms(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void stDoIdleChest();
 	void stIdleChest();
 	uint32 hmIdleChest(int messageNum, const MessageParam &param, Entity *sender);
 	
-	void stDoIdleHeadOff();
 	void stIdleHeadOff();
 	uint32 hmIdleHeadOff(int messageNum, const MessageParam &param, Entity *sender);
 
 	void stIdleWonderAbout();
 
-	void stDoIdleTeleporterHands();
 	void stIdleTeleporterHands();
 	
-	void stDoIdleTeleporterHands2();
 	void stIdleTeleporterHands2();
 
 	void stTryStandIdle();
@@ -367,7 +371,7 @@ public:
 	uint32 hmLowLevel(int messageNum, const MessageParam &param, Entity *sender);
 	uint32 hmLowLevelAnimation(int messageNum, const MessageParam &param, Entity *sender);
 
-	void setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount);
+	void setKlaymenIdleTable(const KlaymenIdleTableItem *table, uint tableCount);
 	void setKlaymenIdleTable1();
 	void setKlaymenIdleTable2();
 	void setKlaymenIdleTable3();
@@ -406,8 +410,8 @@ protected:
 	bool _actionStatusChanged;
 	int _actionStatus;
 	const KlaymenIdleTableItem *_idleTable;
-	int _idleTableCount;
-	int _idleTableMaxValue;
+	uint _idleTableCount;
+	int _idleTableTotalWeight;
 	NPointArray *_pathPoints;
 	bool _soundFlag;
 	
@@ -451,6 +455,7 @@ protected:
 	void stStartWalkingSmall();
 	uint32 hmWalkingSmall(int messageNum, const MessageParam &param, Entity *sender);
 	
+	void enterIdleAnimation(uint idleAnimation);
 	void walkAlongPathPoints();
 	
 };


Commit: 65c6984635849f451d2137a37407813a3ada105e
    https://github.com/scummvm/scummvm/commit/65c6984635849f451d2137a37407813a3ada105e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Implement game-internal savegame overwrite query screen

- Rename and reorder fields in the Klaymen class

Changed paths:
    engines/neverhood/klaymen.cpp
    engines/neverhood/klaymen.h
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp
index 2563ce0..06d606e 100644
--- a/engines/neverhood/klaymen.cpp
+++ b/engines/neverhood/klaymen.cpp
@@ -62,7 +62,7 @@ static const KlaymenIdleTableItem klaymenIdleTable1002[] = {
 
 Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects)
 	: AnimatedSprite(vm, 1000), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0),
-	_isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _busyStatus(0), _acceptInput(true),
+	_isWalkingOpenDoorNotified(false), _spitOutCountdown(0), _tapesToInsert(0), _keysToInsert(0), _busyStatus(0), _acceptInput(true),
 	_attachedSprite(NULL), _isWalking(false), _actionStatus(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false),
 	_doYHitIncr(false), _isLeverDown(false), _isSittingInTeleporter(false), _actionStatusChanged(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false),
 	_idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) {
@@ -2718,7 +2718,7 @@ void Klaymen::stCrashDownFinished() {
 
 void Klaymen::upSpitOutFall() {
 	Klaymen::update();
-	if (_countdown1 != 0 && (--_countdown1 == 0)) {
+	if (_spitOutCountdown != 0 && (--_spitOutCountdown == 0)) {
 		_surface->setVisible(true);
 		SetUpdateHandler(&Klaymen::update);
 	}
@@ -2902,7 +2902,7 @@ void Klaymen::stStandIdleSpecial() {
 }
 
 void Klaymen::stSpitOutFall0() {
-	_countdown1 = 1;
+	_spitOutCountdown = 1;
 	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x000BAB02, 0, -1);
@@ -2914,7 +2914,7 @@ void Klaymen::stSpitOutFall0() {
 }
 
 void Klaymen::stSpitOutFall2() {
-	_countdown1 = 1;
+	_spitOutCountdown = 1;
 	_busyStatus = 0;
 	_acceptInput = false;
 	startAnimation(0x9308C132, 0, -1);
diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h
index d1b0b59..25443b5 100644
--- a/engines/neverhood/klaymen.h
+++ b/engines/neverhood/klaymen.h
@@ -401,7 +401,6 @@ protected:
 	int16 _destX, _destY;
 	int16 _idleCounter, _idleCounterMax;
 	int16 _blinkCounter, _blinkCounterMax;
-	int16 _countdown1;
 	int16 _tapesToInsert, _keysToInsert;
 	bool _doYHitIncr;
 	bool _isLeverDown;
@@ -409,12 +408,17 @@ protected:
 	int _busyStatus;
 	bool _actionStatusChanged;
 	int _actionStatus;
+
 	const KlaymenIdleTableItem *_idleTable;
 	uint _idleTableCount;
 	int _idleTableTotalWeight;
+	int _idleTableNum;
+
 	NPointArray *_pathPoints;
 	bool _soundFlag;
 	
+	int16 _spitOutCountdown;
+
 	bool _isSittingInTeleporter;
 
 	bool _potionFlag1;
@@ -423,7 +427,6 @@ protected:
 	int16 _platformDeltaY;
 
 	Sprite *_otherSprite;
-	int _idleTableNum;
 
 	int16 _walkResumeFrameIncr;
 
@@ -437,7 +440,6 @@ protected:
 	uint32 _spitContDestPipeIndex;
 
 	virtual void xUpdate();
-	// TODO Check if this can be turned into a void result
 	virtual uint32 xHandleMessage(int messageNum, const MessageParam &param);
 
 	void startWalkToX(int16 x, bool walkExt);
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 396d8cf..f1669a6 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -32,7 +32,8 @@ enum {
 	CREDITS_SCENE	= 1,
 	MAKING_OF		= 2,
 	LOAD_GAME_MENU	= 3,
-	SAVE_GAME_MENU	= 4
+	SAVE_GAME_MENU	= 4,
+	QUERY_OVR_MENU	= 5
 };
 
 enum {
@@ -109,6 +110,9 @@ void MenuModule::createScene(int sceneNum, int which) {
 	case SAVE_GAME_MENU:
 		createSaveGameMenu();
 		break;
+	case QUERY_OVR_MENU:
+		_childObject = new QueryOverwriteMenu(_vm, this, _savegameDescription);
+		break;
 	}
 	SetUpdateHandler(&MenuModule::updateScene);
 	_childObject->handleUpdate();
@@ -162,7 +166,10 @@ void MenuModule::updateScene() {
 			handleLoadGameMenuAction(_moduleResult != 1);
 			break;
 		case SAVE_GAME_MENU:
-			handleSaveGameMenuAction(_moduleResult != 1);
+			handleSaveGameMenuAction(_moduleResult != 1, true);
+			break;
+		case QUERY_OVR_MENU:
+			handleSaveGameMenuAction(_moduleResult != 1, false);
 			break;
 		default:
 			break;
@@ -199,16 +206,19 @@ void MenuModule::handleLoadGameMenuAction(bool doLoad) {
 	_savegameList = NULL;
 }
 
-void MenuModule::handleSaveGameMenuAction(bool doSave) {
-	createScene(MAIN_MENU, -1);
-	if (doSave && _savegameSlot >= 0) {
+void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) {
+	if (doSave && doQuery && _savegameSlot >= 0 && _savegameSlot < (int)_savegameList->size()) {
+		createScene(QUERY_OVR_MENU, -1);
+	} else if (doSave && _savegameSlot >= 0) {
 		// Restore the scene palette and background so that the correct thumbnail is saved
 		byte *menuPaletteData = _vm->_screen->getPaletteData();
 		_vm->_screen->setPaletteData(_savedPaletteData);
 		_vm->_gameModule->redrawPrevChildObject();
 		_vm->saveGameState(_savegameSlot, _savegameDescription);
 		_vm->_screen->setPaletteData(menuPaletteData);
-		leaveModule(0);
+		createScene(MAIN_MENU, -1);
+	} else {
+		createScene(MAIN_MENU, -1);
 	}
 	delete _savegameList;
 	_savegameList = NULL;
@@ -1010,22 +1020,13 @@ void LoadGameMenu::handleEvent(int16 itemID, int eventType) {
 uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
-#if 0	
-	case 0x000A:
-		sendMessage(_textEditWidget, 0x000A, param.asInteger());
-		setCurrWidget(_textEditWidget);
-		break;
-#endif		
 	case 0x000B:
 		if (param.asInteger() == Common::KEYCODE_RETURN) {
 			((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
 			leaveScene(0);
 		} else if (param.asInteger() == Common::KEYCODE_ESCAPE) {
 			leaveScene(1);
-		}/* else {
-			sendMessage(_textEditWidget, 0x000B, param.asInteger());
-			setCurrWidget(_textEditWidget);
-		}*/
+		}
 		break;
 	case 0x2000:
 		// Handle menu button click
@@ -1056,4 +1057,55 @@ uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
+QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description)
+	: Scene(vm, parentModule) {
+
+	static const uint32 kQueryOverwriteMenuButtonFileHashes[] = {
+		0x90312400,
+		0x94C22A22
+	};
+
+	static const NRect kQueryOverwriteMenuCollisionBounds[] = {
+		NRect(145, 334, 260, 385),
+		NRect(365, 340, 477, 388)
+	};
+	
+	setBackground(0x043692C4);
+	setPalette(0x043692C4);
+	insertScreenMouse(0x692C004B);
+	insertStaticSprite(0x08C0AC24, 200);
+
+	for (uint buttonIndex = 0; buttonIndex < 2; ++buttonIndex) {
+		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
+			kQueryOverwriteMenuButtonFileHashes[buttonIndex], kQueryOverwriteMenuCollisionBounds[buttonIndex]);
+		addCollisionSprite(menuButton);
+	}
+
+	// Draw the query text to the background, each text line is centered
+	// NOTE The original had this in its own class
+	FontSurface *fontSurface = new FontSurface(_vm, calcHash("bgQueryTinyAlphabet"), 32, 7, 32, 11, 17);
+	Common::StringArray textLines;
+	textLines.push_back(description);
+	textLines.push_back("Game exists.");
+	textLines.push_back("Overwrite it?");
+	for (uint i = 0; i < textLines.size(); ++i)
+		fontSurface->drawString(_background->getSurface(), 106 + (423 - textLines[i].size() * 11) / 2,
+			127 + 31 + i * 17, (const byte*)textLines[i].c_str());
+	delete fontSurface;
+	
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&QueryOverwriteMenu::handleMessage);
+}
+
+uint32 QueryOverwriteMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x2000:
+		// Handle menu button click
+		leaveScene(param.asInteger());
+		break;
+	}
+	return 0;
+}
+
 } // End of namespace Neverhood
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 0836795..de25b69 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -49,7 +49,7 @@ protected:
 	void createLoadGameMenu();
 	void createSaveGameMenu();
 	void handleLoadGameMenuAction(bool doLoad);
-	void handleSaveGameMenuAction(bool doSave);
+	void handleSaveGameMenuAction(bool doSave, bool doQuery);
 	void loadSavegameList();
 };
 
@@ -235,6 +235,13 @@ protected:
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;
 	Common::String _savegameDescription;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+};
+
+class QueryOverwriteMenu : public Scene {
+public:
+	QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description);
+protected:
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 };


Commit: 53a81d11b8e5e34478e75a8797b094ec53976c68
    https://github.com/scummvm/scummvm/commit/53a81d11b8e5e34478e75a8797b094ec53976c68
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Don't allow main menu until _canRequestMainMenu is set

- Clean up GameModule

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 48462a2..493d16d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -75,7 +75,8 @@ enum {
 
 GameModule::GameModule(NeverhoodEngine *vm)
 	: Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1),
-	_restoreGameRequested(false), _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) {
+	_restoreGameRequested(false), _restartGameRequested(false), _canRequestMainMenu(true),
+	_mainMenuRequested(false) {
 	
 	// Other initializations moved to actual engine class
 	_vm->_soundMan->playSoundThree(0x002D0031, 0x8861079);
@@ -147,7 +148,7 @@ void GameModule::handleKeyDown(Common::KeyCode keyCode) {
 void GameModule::handleEscapeKey() {
 	if (_vm->isDemo())
 		_vm->quitGame();
-	else if (!_prevChildObject /* && _canRequestMainMenu TODO?*/)
+	else if (!_prevChildObject && _canRequestMainMenu)
 		_mainMenuRequested = true;
 	else if (_childObject)
 		sendMessage(_childObject, 0x000C, 0);
@@ -334,7 +335,7 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 	uint32 messageResult = Module::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x0800:
-		_someFlag1 = true;
+		_canRequestMainMenu = true;
 		break;		
 	case 0x1009:
 		_moduleResult = param.asInteger();
@@ -344,15 +345,12 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 	case 0x1023:
 		// Unused resource preloading messages
 		break;		
-	case 0x101F:
-		_field2C = true;		
-		break;		
 	}
 	return messageResult;
 }
 
 void GameModule::startup() {
-#if 0
+#if 1
 	createModule(1500, 0); // Logos and intro video // Real game start
 #else
 	// DEBUG>>>
@@ -524,7 +522,7 @@ void GameModule::createModule(int moduleNum, int which) {
 		_childObject = new Module1400(_vm, this, which);
 		break;
 	case 1500:
-		_someFlag1 = false;
+		_canRequestMainMenu = false;
 		setGlobalVar(V_MODULE_NAME, 0x00F10114);
 		_childObject = new Module1500(_vm, this, which);
 		break;
@@ -876,21 +874,10 @@ void GameModule::updateMenuModule() {
 		// TODO Restore FPS?
 		_childObject = _prevChildObject;
 		// TODO Restore Smacker handle, screen offsets
-		sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed?
+		sendMessage(_childObject, 0x101E, 0);
 		_prevChildObject = NULL;
 		_moduleNum = _prevModuleNum;
 		SetUpdateHandler(&GameModule::updateModule);
-	} else if (_gameWasLoaded) {
-#if 0 // TODO Handle this in some other way...
-		_gameWasLoaded = false;
-		delete _childObject;
-		delete _prevChildObject;
-		_childObject = NULL;
-		_prevChildObject = NULL;
-		_prevModuleNum = 0;
-		// TODO Create module from savegame values...
-		 // TODO createModuleByHash(...);
-#endif
 	}
 }
 
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index 04fc780..df8f015 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -58,13 +58,10 @@ public:
 protected:
 	Entity *_prevChildObject;
 	int _prevModuleNum;
-	bool _gameWasLoaded;
 	bool _restoreGameRequested;
 	bool _restartGameRequested;
+	bool _canRequestMainMenu;
 	bool _mainMenuRequested;
-	bool _someFlag1;
-	bool _field2C;
-	uint32 _counter;
 	int _moduleNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createModule(int moduleNum, int which);


Commit: c96d2475b100610271c974043a8a9c4322b8e60b
    https://github.com/scummvm/scummvm/commit/c96d2475b100610271c974043a8a9c4322b8e60b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:42-07:00

Commit Message:
NEVERHOOD: Add Screen::saveParams and Screen::restoreParams, called when etnering/leaving the menu

Changed paths:
    engines/neverhood/gamemodule.cpp
    engines/neverhood/gamemodule.h
    engines/neverhood/screen.cpp
    engines/neverhood/screen.h



diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 493d16d..5eaa7e2 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -286,8 +286,7 @@ void GameModule::initCubeSymbolsPuzzle() {
 }
 
 void GameModule::initCrystalColorsPuzzle() {
-	// TODO Maybe move this into the GameModule so all puzzle init code is together
-	if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) {
+	if (!getGlobalVar(V_CRYSTAL_COLORS_INIT)) {
 		TextResource textResource(_vm);
 		const char *textStart, *textEnd;
 		textResource.load(0x46691611);
@@ -341,10 +340,6 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 		_moduleResult = param.asInteger();
 		_done = true;
 		break;		
-	case 0x100A:
-	case 0x1023:
-		// Unused resource preloading messages
-		break;		
 	}
 	return messageResult;
 }
@@ -829,7 +824,7 @@ void GameModule::updateModule() {
 			break;
 		case 3000:
 			// NOTE _moduleResult 2 never used
-			// TODO Check if _moduleResult 4 is used
+			// NOTE Check if _moduleResult 4 is used
 			if (_moduleResult == 1)
 				createModule(1900, 0);
 			else if (_moduleResult == 3)
@@ -854,7 +849,7 @@ void GameModule::openMainMenu() {
 		// If there's no module, create one so there's something to return to
 		createModule(1000, 0);
 	}
-	// TODO Save FPS, Smacker handle, screen offsets
+	_vm->_screen->saveParams();
 	_mainMenuRequested = false;
 	createMenuModule();
 }
@@ -871,9 +866,8 @@ void GameModule::createMenuModule() {
 
 void GameModule::updateMenuModule() {
 	if (!updateChild()) {
-		// TODO Restore FPS?
+		_vm->_screen->restoreParams();
 		_childObject = _prevChildObject;
-		// TODO Restore Smacker handle, screen offsets
 		sendMessage(_childObject, 0x101E, 0);
 		_prevChildObject = NULL;
 		_moduleNum = _prevModuleNum;
diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h
index df8f015..8101d38 100644
--- a/engines/neverhood/gamemodule.h
+++ b/engines/neverhood/gamemodule.h
@@ -56,13 +56,13 @@ public:
 	void initCrystalColorsPuzzle();
 	uint32 getCurrRadioMusicFileHash();
 protected:
+	int _moduleNum;
 	Entity *_prevChildObject;
 	int _prevModuleNum;
 	bool _restoreGameRequested;
 	bool _restartGameRequested;
 	bool _canRequestMainMenu;
 	bool _mainMenuRequested;
-	int _moduleNum;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createModule(int moduleNum, int which);
 	void createModuleByHash(uint32 nameHash);
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 352e59e..3e57422 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -114,6 +114,18 @@ uint32 Screen::getNextFrameTime() {
 	return _vm->_system->getMillis() + waitTicks;
 }
 
+void Screen::saveParams() {
+	_savedSmackerDecoder = _smackerDecoder;
+	_savedFrameDelay = _frameDelay;
+	_savedYOffset = _yOffset;
+}
+
+void Screen::restoreParams() {
+	_smackerDecoder = _savedSmackerDecoder;
+	_frameDelay = _savedFrameDelay;
+	_yOffset = _savedYOffset;
+}
+
 void Screen::setFps(int fps) {
 	_frameDelay = 1000 / fps;
 }
@@ -270,16 +282,14 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra
 	NDrawRect newDrawRect;
 
 	x = sysRect.x;
-	if (sysRect.width <= x || -sysRect.width >= x) {
+	if (sysRect.width <= x || -sysRect.width >= x)
 		x = x % sysRect.width;
-	}
 	if (x < 0)
 		x += sysRect.width;
 
 	y = sysRect.y;
-	if (y >= sysRect.height || -sysRect.height >= y) {
+	if (y >= sysRect.height || -sysRect.height >= y)
 		y = y % sysRect.height;
-	}
 	if (y < 0)
 		y += sysRect.height;
 	
diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h
index 33de141..c778066 100644
--- a/engines/neverhood/screen.h
+++ b/engines/neverhood/screen.h
@@ -63,6 +63,8 @@ public:
 	~Screen();
 	void update();
 	uint32 getNextFrameTime();
+	void saveParams();
+	void restoreParams();
 	void setFps(int fps);
 	int getFps();
 	void setYOffset(int16 yOffset);
@@ -89,12 +91,12 @@ protected:
 	NeverhoodEngine *_vm;
 	MicroTileArray *_microTiles;
 	Graphics::Surface *_backScreen;
-	Video::SmackerDecoder *_smackerDecoder;
+	Video::SmackerDecoder *_smackerDecoder, *_savedSmackerDecoder;
 	int32 _ticks;
-	int32 _frameDelay;
+	int32 _frameDelay, _savedFrameDelay;
 	byte *_paletteData;
 	bool _paletteChanged;
-	int16 _yOffset;
+	int16 _yOffset, _savedYOffset;
 	bool _fullRefresh;
 	RenderQueue *_renderQueue, *_prevRenderQueue;
 };


Commit: 70fdfd9d572b4c395dfa4d3fbff791e064d4079d
    https://github.com/scummvm/scummvm/commit/70fdfd9d572b4c395dfa4d3fbff791e064d4079d
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Delete all sound/music items on exit

- Minor cleanup

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/sound.cpp



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index f1669a6..f752ce6 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -178,7 +178,6 @@ void MenuModule::updateScene() {
 }
 
 uint32 MenuModule::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	// TODO CHECKME Handles 0x101F, possibly just a debug/cache message which can be ignored?
 	return Module::handleMessage(messageNum, param, sender);;
 }
 
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index 9e0e572..a479bf2 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -233,21 +233,18 @@ void SoundItem::setVolume(int volume) {
 
 void SoundItem::update() {
 	if (_playOnceAfterCountdown) {
-		if (_currCountdown == 0) {
+		if (_currCountdown == 0)
 			_currCountdown = _initialCountdown;
-		} else if (--_currCountdown == 0) {
+		else if (--_currCountdown == 0)
 			_soundResource->play();
-		}
 	} else if (_playOnceAfterRandomCountdown) {
 		if (_currCountdown == 0) {
 			if (_minCountdown > 0 && _maxCountdown > 0 && _minCountdown < _maxCountdown)
 				_currCountdown = _vm->_rnd->getRandomNumberRng(_minCountdown, _maxCountdown);
-		} else if (--_currCountdown == 0) {
+		} else if (--_currCountdown == 0)
 			_soundResource->play();
-		}
-	} else if (_playLooping && !_soundResource->isPlaying()) {
-		_soundResource->play(); // TODO Looping parameter?
-	}
+	} else if (_playLooping && !_soundResource->isPlaying())
+		_soundResource->play();
 }
 
 // SoundMan
@@ -257,7 +254,10 @@ SoundMan::SoundMan(NeverhoodEngine *vm)
 }
 
 SoundMan::~SoundMan() {
-	// TODO Clean up
+	for (uint i = 0; i < _soundItems.size(); ++i)
+		delete _soundItems[i];
+	for (uint i = 0; i < _musicItems.size(); ++i)
+		delete _musicItems[i];
 }
 
 void SoundMan::addMusic(uint32 groupNameHash, uint32 musicFileHash) {
@@ -709,6 +709,10 @@ AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm)
 }
 
 AudioResourceMan::~AudioResourceMan() {
+	for (uint i = 0; i < _soundItems.size(); ++i)
+		delete _soundItems[i];
+	for (uint i = 0; i < _musicItems.size(); ++i)
+		delete _musicItems[i];
 }
 
 int16 AudioResourceMan::addSound(uint32 fileHash) {


Commit: bdac28929f7ebcab6ae758e57c24c32493e46f76
    https://github.com/scummvm/scummvm/commit/bdac28929f7ebcab6ae758e57c24c32493e46f76
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Add Y-flipping to unpackSpriteNormal

Changed paths:
    engines/neverhood/graphics.cpp



diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp
index 9139545..5099c7a 100644
--- a/engines/neverhood/graphics.cpp
+++ b/engines/neverhood/graphics.cpp
@@ -315,9 +315,12 @@ void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int
 
 void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) {
 
-	// TODO: Flip Y
-
-	int sourcePitch = (width + 3) & 0xFFFC;
+	const int sourcePitch = (width + 3) & 0xFFFC;
+	
+	if (flipY) {
+		dest += destPitch * (height - 1);
+		destPitch = -destPitch;
+	}
 
 	if (!flipX) {
 		while (height-- > 0) {


Commit: dc459b5f673207a932ae07546ab29efd5b64727a
    https://github.com/scummvm/scummvm/commit/dc459b5f673207a932ae07546ab29efd5b64727a
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Merge some code in the save/load menus

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index f752ce6..3093c43 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -542,11 +542,6 @@ void TextLabelWidget::clear() {
 	updateBounds();
 }
 
-void TextLabelWidget::onClick() {
-	Widget::onClick();
-	// TODO? Click handler
-}
-
 void TextLabelWidget::setString(const byte *string, int stringLen) {
 	_string = string;
 	_stringLen = stringLen;
@@ -909,13 +904,11 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 		setCurrWidget(_textEditWidget);
 		break;
 	case 0x000B:
-		if (param.asInteger() == Common::KEYCODE_RETURN) {
-			((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
-				_listBox->getCurrIndex(), _textEditWidget->isModified());
-			leaveScene(0);
-		} else if (param.asInteger() == Common::KEYCODE_ESCAPE) {
+		if (param.asInteger() == Common::KEYCODE_RETURN)
+			performSaveGame();
+		else if (param.asInteger() == Common::KEYCODE_ESCAPE)
 			leaveScene(1);
-		} else {
+		else {
 			sendMessage(_textEditWidget, 0x000B, param.asInteger());
 			setCurrWidget(_textEditWidget);
 		}
@@ -924,10 +917,7 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 		// Handle menu button click
 		switch (param.asInteger()) {
 		case 0:
-			// TODO Same handling as Return, merge
-			((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
-				_listBox->getCurrIndex(), _textEditWidget->isModified());
-			leaveScene(0);
+			performSaveGame();
 			break;
 		case 1:
 			leaveScene(1);
@@ -950,6 +940,12 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
+void SaveGameMenu::performSaveGame() {
+	((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
+		_listBox->getCurrIndex(), _textEditWidget->isModified());
+	leaveScene(0);
+}
+
 LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList)
 	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
 
@@ -1020,20 +1016,16 @@ uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x000B:
-		if (param.asInteger() == Common::KEYCODE_RETURN) {
-			((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
-			leaveScene(0);
-		} else if (param.asInteger() == Common::KEYCODE_ESCAPE) {
+		if (param.asInteger() == Common::KEYCODE_RETURN)
+			performLoadGame();
+		else if (param.asInteger() == Common::KEYCODE_ESCAPE)
 			leaveScene(1);
-		}
 		break;
 	case 0x2000:
 		// Handle menu button click
 		switch (param.asInteger()) {
 		case 0:
-			// TODO Same handling as Return, merge
-			((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
-			leaveScene(0);
+			performLoadGame();
 			break;
 		case 1:
 			leaveScene(1);
@@ -1056,6 +1048,11 @@ uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
+void LoadGameMenu::performLoadGame() {
+	((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
+	leaveScene(0);
+}
+
 QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description)
 	: Scene(vm, parentModule) {
 
@@ -1081,7 +1078,7 @@ QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule
 	}
 
 	// Draw the query text to the background, each text line is centered
-	// NOTE The original had this in its own class
+	// NOTE The original had this text in its own class
 	FontSurface *fontSurface = new FontSurface(_vm, calcHash("bgQueryTinyAlphabet"), 32, 7, 32, 11, 17);
 	Common::StringArray textLines;
 	textLines.push_back(description);
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index de25b69..1b39982 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -126,7 +126,6 @@ public:
 	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 		int baseObjectPriority, int baseSurfacePriority, 
 		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface);	
-	virtual void onClick();
 	virtual void addSprite();
 	virtual int16 getWidth();
 	virtual int16 getHeight();
@@ -222,6 +221,7 @@ protected:
 	Common::String _savegameDescription;
 	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void performSaveGame();
 };
 
 class LoadGameMenu : public WidgetScene {
@@ -236,6 +236,7 @@ protected:
 	TextEditWidget *_textEditWidget;
 	Common::String _savegameDescription;
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void performLoadGame();
 };
 
 class QueryOverwriteMenu : public Scene {


Commit: a80bafeb2eb67756fc5765468c4c7ac3e1c024d4
    https://github.com/scummvm/scummvm/commit/a80bafeb2eb67756fc5765468c4c7ac3e1c024d4
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Support game loading from launcher/command line

Changed paths:
    engines/neverhood/detection.cpp
    engines/neverhood/neverhood.cpp



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index 043cf02..1c88c34 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -137,7 +137,7 @@ bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const {
 	return
 		(f == kSupportsListSaves) ||
 		(f == kSupportsLoadingDuringStartup) ||
-//		(f == kSupportsDeleteSave) ||
+		(f == kSupportsDeleteSave) ||
 	   	(f == kSavesSupportMetaInfo) ||
 		(f == kSavesSupportThumbnail) ||
 		(f == kSavesSupportCreationDate) ||
diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp
index 7b068bd..475a459 100644
--- a/engines/neverhood/neverhood.cpp
+++ b/engines/neverhood/neverhood.cpp
@@ -108,7 +108,10 @@ Common::Error NeverhoodEngine::run() {
 		(*navigationList)[5].middleFlag = 1;
 	}
 	
-	_gameModule->startup();
+	if (ConfMan.hasKey("save_slot"))
+		loadGameState(ConfMan.getInt("save_slot"));
+	else
+		_gameModule->startup();
 	
 	mainLoop();
 	


Commit: 2a571d71b054b5dc90c7cee669f25766206fbb36
    https://github.com/scummvm/scummvm/commit/2a571d71b054b5dc90c7cee669f25766206fbb36
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Fix GUI options and game copyright

Changed paths:
    engines/neverhood/detection.cpp



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index 1c88c34..4224e08 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -113,6 +113,7 @@ class NeverhoodMetaEngine : public AdvancedMetaEngine {
 public:
 	NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) {
 		_singleid = "neverhood";
+		_guioptions = GUIO2(GUIO_NOSUBTITLES, GUIO_NOMIDI);
 	}
 
 	virtual const char *getName() const {
@@ -120,7 +121,7 @@ public:
 	}
 
 	virtual const char *getOriginalCopyright() const {
-		return "Neverhood Engine (C) Infogrames";
+		return "Neverhood (C) The Neverhood, Inc.";
 	}
 
 	virtual bool hasFeature(MetaEngineFeature f) const;
@@ -257,3 +258,4 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target,
 #else
 	REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
 #endif
+


Commit: a03879963f2e8adebd1f4bb90975ff0c43f286dc
    https://github.com/scummvm/scummvm/commit/a03879963f2e8adebd1f4bb90975ff0c43f286dc
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Changed the save/load menu to allow gaps in saved games to simplify game deletion

Changed paths:
    engines/neverhood/detection.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index 4224e08..e5bfd29 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -174,7 +174,6 @@ SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const {
 	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) {
 		// Obtain the last 3 digits of the filename, since they correspond to the save slot
 		int slotNum = atoi(file->c_str() + file->size() - 3);
-
 		if (slotNum >= 0 && slotNum <= 999) {
 			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
 			if (in) {
@@ -194,31 +193,9 @@ int NeverhoodMetaEngine::getMaximumSaveSlot() const {
 }
 
 void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const {
-
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
 	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot);
-
 	saveFileMan->removeSavefile(filename.c_str());
-
-	Common::StringArray filenames;
-	Common::String pattern = target;
-	pattern += ".???";
-	filenames = saveFileMan->listSavefiles(pattern.c_str());
-	Common::sort(filenames.begin(), filenames.end());	// Sort (hopefully ensuring we are sorted numerically..)
-
-	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
-		// Obtain the last 3 digits of the filename, since they correspond to the save slot
-		int slotNum = atoi(file->c_str() + file->size() - 3);
-
-		// Rename every slot greater than the deleted slot,
-		// Also do not rename quicksaves.
-		if (slotNum > slot && slotNum < 990) {
-			saveFileMan->renameSavefile(file->c_str(), filename.c_str());
-
-			filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot);
-		}
-	}
-
 }
 
 SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 5eaa7e2..1246a5b 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -345,7 +345,7 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 }
 
 void GameModule::startup() {
-#if 1
+#if 0
 	createModule(1500, 0); // Logos and intro video // Real game start
 #else
 	// DEBUG>>>
@@ -394,8 +394,8 @@ void GameModule::startup() {
 
 #if 1
 	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 8;
-	createModule(1800, -1);
+	_vm->gameState().sceneNum = 0;
+	createModule(1000, -1);
 #endif
 #if 0
 	_vm->gameState().sceneNum = 5;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 3093c43..0ba9bc0 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -81,15 +81,13 @@ MenuModule::~MenuModule() {
 	_vm->_screen->setPaletteData(_savedPaletteData);
 }
 
-void MenuModule::setLoadgameInfo(uint slot) {
-	_savegameSlot = slot;
-	debug("LOADGAME: slot = %d", slot);
+void MenuModule::setLoadgameInfo(uint index) {
+	_savegameSlot = (*_savegameList)[index].slotNum;
 }
 
-void MenuModule::setSavegameInfo(const Common::String &description, uint slot, bool newSavegame) {
+void MenuModule::setSavegameInfo(const Common::String &description, uint index, bool newSavegame) {
 	_savegameDescription = description;
-	_savegameSlot = newSavegame ? _savegameList->size() : slot;
-	debug("SAVEGAME: description = [%s]; slot = %d; new = %d", description.c_str(), slot, newSavegame);
+	_savegameSlot = newSavegame ? -1 : (*_savegameList)[index].slotNum;
 }
 
 void MenuModule::createScene(int sceneNum, int which) {
@@ -183,14 +181,14 @@ uint32 MenuModule::handleMessage(int messageNum, const MessageParam &param, Enti
 
 void MenuModule::createLoadGameMenu() {
 	_savegameSlot = -1;
-	_savegameList = new Common::StringArray();
+	_savegameList = new SavegameList();
 	loadSavegameList();
 	_childObject = new LoadGameMenu(_vm, this, _savegameList);
 }
 
 void MenuModule::createSaveGameMenu() {
 	_savegameSlot = -1;
-	_savegameList = new Common::StringArray();
+	_savegameList = new SavegameList();
 	loadSavegameList();
 	_childObject = new SaveGameMenu(_vm, this, _savegameList);
 }
@@ -206,9 +204,12 @@ void MenuModule::handleLoadGameMenuAction(bool doLoad) {
 }
 
 void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) {
-	if (doSave && doQuery && _savegameSlot >= 0 && _savegameSlot < (int)_savegameList->size()) {
+	if (doSave && doQuery && _savegameSlot >= 0) {
 		createScene(QUERY_OVR_MENU, -1);
-	} else if (doSave && _savegameSlot >= 0) {
+	} else if (doSave) {
+		// Get a new slot number if it's a new savegame
+		if (_savegameSlot < 0)
+			_savegameSlot = _savegameList->size() > 0 ? _savegameList->back().slotNum + 1 : 0;
 		// Restore the scene palette and background so that the correct thumbnail is saved
 		byte *menuPaletteData = _vm->_screen->getPaletteData();
 		_vm->_screen->setPaletteData(_savedPaletteData);
@@ -240,8 +241,12 @@ void MenuModule::loadSavegameList() {
 		if (slotNum >= 0 && slotNum <= 999) {
 			Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str());
 			if (in) {
-				if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError)
-					_savegameList->push_back(header.description);
+				if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) {
+					SavegameItem savegameItem;
+					savegameItem.slotNum = slotNum;
+					savegameItem.description = header.description;
+					_savegameList->push_back(savegameItem);
+				}
 				delete in;
 			}
 		}
@@ -548,9 +553,8 @@ void TextLabelWidget::setString(const byte *string, int stringLen) {
 }
 
 TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface,
-	uint32 fileHash, const NRect &rect)
-	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
+	int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect)
+	: Widget(vm, x, y, itemID, parentScene,	1000, 1000),
 	_maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect),
 	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0),
 	_modified(false), _readOnly(false) {
@@ -728,9 +732,8 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam &param,
 }
 
 SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-	int baseObjectPriority, int baseSurfacePriority,
-	Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect)
-	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
+	SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect)
+	: Widget(vm, x, y, itemID, parentScene,	1000, 1000),
 	_savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect),
 	_maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) {
 
@@ -768,11 +771,11 @@ void SavegameListBox::addSprite() {
 }
 
 void SavegameListBox::buildItems() {
-	Common::StringArray &savegameList = *_savegameList;
+	SavegameList &savegameList = *_savegameList;
 	int16 itemX = _rect.x1, itemY = 0;
 	for (uint i = 0; i < savegameList.size(); ++i) {
-		const byte *string = (const byte*)savegameList[i].c_str();
-		int stringLen = (int)savegameList[i].size();
+		const byte *string = (const byte*)savegameList[i].description.c_str();
+		int stringLen = (int)savegameList[i].description.size();
 		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
 			_baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface);
 		label->addSprite();
@@ -831,7 +834,7 @@ void SavegameListBox::pageDown() {
 	}
 }
 
-SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList)
+SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
 	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
 
 	static const uint32 kSaveGameMenuButtonFileHashes[] = {
@@ -864,11 +867,11 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::St
 	insertStaticSprite(0x1340A5C2, 200);
 	insertStaticSprite(0x1301A7EA, 200);
 
-	_listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, 1000, 1000,
+	_listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this,
 		_savegameList, _fontSurface, 0x1115A223, kListBoxRect);
 	_listBox->addSprite();
 
-	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, 29,
+	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 29,
 		_fontSurface, 0x3510A868, kTextEditRect);
 	_textEditWidget->setCursor(0x8290AC20, 2, 13);
 	_textEditWidget->addSprite();
@@ -891,7 +894,7 @@ SaveGameMenu::~SaveGameMenu() {
 void SaveGameMenu::handleEvent(int16 itemID, int eventType) {
 	if (itemID == 69 && eventType == 5) {
 		uint currIndex = _listBox->getCurrIndex();
-		_textEditWidget->setString((*_savegameList)[currIndex]);
+		_textEditWidget->setString((*_savegameList)[currIndex].description);
 		setCurrWidget(_textEditWidget);
 	}
 }
@@ -946,7 +949,7 @@ void SaveGameMenu::performSaveGame() {
 	leaveScene(0);
 }
 
-LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList)
+LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
 	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
 
 	static const uint32 kLoadGameMenuButtonFileHashes[] = {
@@ -979,11 +982,11 @@ LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::St
 	insertStaticSprite(0x0BC600A3, 200);
 	insertStaticSprite(0x0F960021, 200);
 
-	_listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, 1000, 1000,
+	_listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this,
 		_savegameList, _fontSurface, 0x04040409, kListBoxRect);
 	_listBox->addSprite();
 
-	_textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 1000, 1000, 29,
+	_textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 29,
 		_fontSurface, 0x10924C03, kTextEditRect);
 	_textEditWidget->setCursor(0x18032303, 2, 13);
 	_textEditWidget->setReadOnly(true);
@@ -1007,7 +1010,7 @@ LoadGameMenu::~LoadGameMenu() {
 void LoadGameMenu::handleEvent(int16 itemID, int eventType) {
 	if (itemID == 69 && eventType == 5) {
 		uint currIndex = _listBox->getCurrIndex();
-		_textEditWidget->setString((*_savegameList)[currIndex]);
+		_textEditWidget->setString((*_savegameList)[currIndex].description);
 		setCurrWidget(_textEditWidget);
 	}
 }
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 1b39982..2f91bdb 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -31,16 +31,23 @@
 
 namespace Neverhood {
 
+struct SavegameItem {
+	int slotNum;
+	Common::String description;
+};
+
+typedef Common::Array<SavegameItem> SavegameList;
+
 class MenuModule : public Module {
 public:
 	MenuModule(NeverhoodEngine *vm, Module *parentModule, int which);
 	virtual ~MenuModule();
-	void setLoadgameInfo(uint slot);
-	void setSavegameInfo(const Common::String &description, uint slot, bool newSavegame);
+	void setLoadgameInfo(uint index);
+	void setSavegameInfo(const Common::String &description, uint index, bool newSavegame);
 protected:
 	int _sceneNum;
 	byte *_savedPaletteData;
-	Common::StringArray *_savegameList;
+	SavegameList *_savegameList;
 	Common::String _savegameDescription;
 	int _savegameSlot;
 	void createScene(int sceneNum, int which);
@@ -144,8 +151,7 @@ protected:
 class TextEditWidget : public Widget {
 public:
 	TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface,
-		uint32 fileHash, const NRect &rect);
+		int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect);
 	~TextEditWidget();
 	virtual void onClick();
 	virtual void addSprite();
@@ -183,8 +189,7 @@ protected:
 class SavegameListBox : public Widget {
 public:
 	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
-		int baseObjectPriority, int baseSurfacePriority,
-		Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
+		SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
 	virtual void onClick();
 	virtual void addSprite();
 	void buildItems();
@@ -202,7 +207,7 @@ protected:
 	Common::Array<TextLabelWidget*> _textLabelItems;
 	int _firstVisibleItem;
 	int _lastVisibleItem;
-	Common::StringArray *_savegameList;
+	SavegameList *_savegameList;
 	FontSurface *_fontSurface;
 	uint _currIndex;
 	int _maxVisibleItemsCount;
@@ -210,11 +215,11 @@ protected:
 
 class SaveGameMenu : public WidgetScene {
 public:
-	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList);
+	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
 	~SaveGameMenu();
 	virtual void handleEvent(int16 itemID, int eventType);
 protected:
-	Common::StringArray *_savegameList;
+	SavegameList *_savegameList;
 	FontSurface *_fontSurface;
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;
@@ -226,11 +231,11 @@ protected:
 
 class LoadGameMenu : public WidgetScene {
 public:
-	LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList);
+	LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
 	~LoadGameMenu();
 	virtual void handleEvent(int16 itemID, int eventType);
 protected:
-	Common::StringArray *_savegameList;
+	SavegameList *_savegameList;
 	FontSurface *_fontSurface;
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;


Commit: 8749efdea821433cf355ae4fa543ef412f33c2fe
    https://github.com/scummvm/scummvm/commit/8749efdea821433cf355ae4fa543ef412f33c2fe
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Add game-internal savegame delete menu

- Rename Widget::addSprite to Widget::initialize

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h
    engines/neverhood/neverhood.h
    engines/neverhood/saveload.cpp



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 0ba9bc0..8b03532 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -28,12 +28,13 @@
 namespace Neverhood {
 
 enum {
-	MAIN_MENU		= 0,
-	CREDITS_SCENE	= 1,
-	MAKING_OF		= 2,
-	LOAD_GAME_MENU	= 3,
-	SAVE_GAME_MENU	= 4,
-	QUERY_OVR_MENU	= 5
+	MAIN_MENU			= 0,
+	CREDITS_SCENE		= 1,
+	MAKING_OF			= 2,
+	LOAD_GAME_MENU		= 3,
+	SAVE_GAME_MENU		= 4,
+	DELETE_GAME_MENU	= 5,
+	QUERY_OVR_MENU		= 6
 };
 
 enum {
@@ -90,6 +91,10 @@ void MenuModule::setSavegameInfo(const Common::String &description, uint index,
 	_savegameSlot = newSavegame ? -1 : (*_savegameList)[index].slotNum;
 }
 
+void MenuModule::setDeletegameInfo(uint index) {
+	_savegameSlot = (*_savegameList)[index].slotNum;
+}
+
 void MenuModule::createScene(int sceneNum, int which) {
 	_sceneNum = sceneNum;
 	switch (_sceneNum) {
@@ -108,6 +113,9 @@ void MenuModule::createScene(int sceneNum, int which) {
 	case SAVE_GAME_MENU:
 		createSaveGameMenu();
 		break;
+	case DELETE_GAME_MENU:
+		createDeleteGameMenu();
+		break;
 	case QUERY_OVR_MENU:
 		_childObject = new QueryOverwriteMenu(_vm, this, _savegameDescription);
 		break;
@@ -149,7 +157,7 @@ void MenuModule::updateScene() {
 				createScene(MAIN_MENU, -1);
 				break;
 			case kMainMenuDeleteGame:
-				// TODO createDeleteGameMenu();
+				createScene(DELETE_GAME_MENU, -1);
 				break;
 			default:
 				createScene(MAIN_MENU, -1);
@@ -166,6 +174,9 @@ void MenuModule::updateScene() {
 		case SAVE_GAME_MENU:
 			handleSaveGameMenuAction(_moduleResult != 1, true);
 			break;
+		case DELETE_GAME_MENU:
+			handleDeleteGameMenuAction(_moduleResult != 1);
+			break;
 		case QUERY_OVR_MENU:
 			handleSaveGameMenuAction(_moduleResult != 1, false);
 			break;
@@ -193,6 +204,13 @@ void MenuModule::createSaveGameMenu() {
 	_childObject = new SaveGameMenu(_vm, this, _savegameList);
 }
 
+void MenuModule::createDeleteGameMenu() {
+	_savegameSlot = -1;
+	_savegameList = new SavegameList();
+	loadSavegameList();
+	_childObject = new DeleteGameMenu(_vm, this, _savegameList);
+}
+
 void MenuModule::handleLoadGameMenuAction(bool doLoad) {
 	createScene(MAIN_MENU, -1);
 	if (doLoad && _savegameSlot >= 0) {
@@ -224,6 +242,15 @@ void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) {
 	_savegameList = NULL;
 }
 
+void MenuModule::handleDeleteGameMenuAction(bool doDelete) {
+	if (doDelete && _savegameSlot >= 0) {
+		_vm->removeGameState(_savegameSlot);
+		createScene(MAIN_MENU, -1);
+	}
+	delete _savegameList;
+	_savegameList = NULL;
+}
+
 void MenuModule::loadSavegameList() {
 
 	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
@@ -479,7 +506,7 @@ void Widget::refreshPosition() {
 	updateBounds();
 }
 
-void Widget::addSprite() {
+void Widget::initialize() {
 	// Empty
 }
 
@@ -523,7 +550,7 @@ TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 it
 	
 }
 
-void TextLabelWidget::addSprite() {
+void TextLabelWidget::initialize() {
 	_parentScene->addSprite(this);
 	_parentScene->addCollisionSprite(this);
 }
@@ -590,7 +617,7 @@ void TextEditWidget::onClick() {
 	Widget::onClick();
 }
 
-void TextEditWidget::addSprite() {
+void TextEditWidget::initialize() {
 	SpriteResource cursorSpriteResource(_vm);
 
 	_spriteResource.load(_fileHash, true);
@@ -602,7 +629,7 @@ void TextEditWidget::addSprite() {
 	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _fontSurface->getCharHeight()) / 2,
 		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
 		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface);
-	_textLabelWidget->addSprite();
+	_textLabelWidget->initialize();
 	cursorSpriteResource.load(_cursorFileHash, true);
 	_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
 	_cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
@@ -757,7 +784,7 @@ void SavegameListBox::onClick() {
 	}
 }
 
-void SavegameListBox::addSprite() {
+void SavegameListBox::initialize() {
 	_spriteResource.load(_bgFileHash, true);
 	createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
 	refreshPosition();
@@ -778,7 +805,7 @@ void SavegameListBox::buildItems() {
 		int stringLen = (int)savegameList[i].description.size();
 		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
 			_baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface);
-		label->addSprite();
+		label->initialize();
 		_textLabelItems.push_back(label);
 	}
 }
@@ -869,12 +896,12 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameLi
 
 	_listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this,
 		_savegameList, _fontSurface, 0x1115A223, kListBoxRect);
-	_listBox->addSprite();
+	_listBox->initialize();
 
 	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 29,
 		_fontSurface, 0x3510A868, kTextEditRect);
 	_textEditWidget->setCursor(0x8290AC20, 2, 13);
-	_textEditWidget->addSprite();
+	_textEditWidget->initialize();
 	setCurrWidget(_textEditWidget);
 	
 	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
@@ -984,13 +1011,12 @@ LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameLi
 
 	_listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this,
 		_savegameList, _fontSurface, 0x04040409, kListBoxRect);
-	_listBox->addSprite();
+	_listBox->initialize();
 
 	_textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 29,
 		_fontSurface, 0x10924C03, kTextEditRect);
-	_textEditWidget->setCursor(0x18032303, 2, 13);
 	_textEditWidget->setReadOnly(true);
-	_textEditWidget->addSprite();
+	_textEditWidget->initialize();
 	setCurrWidget(_textEditWidget);
 	
 	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
@@ -1056,6 +1082,111 @@ void LoadGameMenu::performLoadGame() {
 	leaveScene(0);
 }
 
+DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
+	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
+
+	static const uint32 kDeleteGameMenuButtonFileHashes[] = {
+		0x8198E268,
+		0xDD0C4620,
+		0x81296520,
+		0x8D284211,
+		0x8C004621,
+		0x07294020
+	};
+	
+	static const NRect kDeleteGameMenuButtonCollisionBounds[] = {
+		NRect(518,  46, 595,  91),
+		NRect(524, 322, 599, 369),
+		NRect(395,  40, 462, 127),
+		NRect(405, 126, 460, 185),
+		NRect(397, 205, 456, 273),
+		NRect(395, 278, 452, 372)
+	};
+
+	static const NRect kListBoxRect(0, 0, 320, 271);
+	static const NRect kTextEditRect(0, 0, 320, 17);
+
+	_fontSurface = new FontSurface(_vm, calcHash("bgDeleteTinyAlphabet"), 32, 7, 32, 11, 17);
+	
+	setBackground(0x4080E01C);
+	setPalette(0x4080E01C);
+	insertScreenMouse(0x0E018400);
+	insertStaticSprite(0x80083C01, 200);
+	insertStaticSprite(0x84181E81, 200);
+
+	_listBox = new SavegameListBox(_vm, 61, 64, 69/*ItemID*/, this,
+		_savegameList, _fontSurface, calcHash("mxDeleteListBox"), kListBoxRect);
+	_listBox->initialize();
+
+	_textEditWidget = new TextEditWidget(_vm, 49, 414, 70/*ItemID*/, this, 29,
+		_fontSurface, 0x250A3060, kTextEditRect);
+	_textEditWidget->setReadOnly(true);
+	_textEditWidget->initialize();
+	setCurrWidget(_textEditWidget);
+	
+	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
+		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
+			kDeleteGameMenuButtonFileHashes[buttonIndex], kDeleteGameMenuButtonCollisionBounds[buttonIndex]);
+		addCollisionSprite(menuButton);
+	}
+
+	SetUpdateHandler(&Scene::update);
+	SetMessageHandler(&DeleteGameMenu::handleMessage);
+}
+
+DeleteGameMenu::~DeleteGameMenu() {
+	delete _fontSurface;
+}
+
+void DeleteGameMenu::handleEvent(int16 itemID, int eventType) {
+	if (itemID == 69 && eventType == 5) {
+		uint currIndex = _listBox->getCurrIndex();
+		_textEditWidget->setString((*_savegameList)[currIndex].description);
+		setCurrWidget(_textEditWidget);
+	}
+}
+
+uint32 DeleteGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+	Scene::handleMessage(messageNum, param, sender);
+	switch (messageNum) {
+	case 0x000B:
+		if (param.asInteger() == Common::KEYCODE_RETURN)
+			performDeleteGame();
+		else if (param.asInteger() == Common::KEYCODE_ESCAPE)
+			leaveScene(1);
+		break;
+	case 0x2000:
+		// Handle menu button click
+		switch (param.asInteger()) {
+		case 0:
+			performDeleteGame();
+			break;
+		case 1:
+			leaveScene(1);
+			break;
+		case 2:
+			_listBox->pageUp();
+			break;
+		case 3:
+			_listBox->scrollUp();
+			break;
+		case 4:
+			_listBox->scrollDown();
+			break;
+		case 5:
+			_listBox->pageDown();
+			break;
+		}
+		break;
+	}
+	return 0;
+}
+
+void DeleteGameMenu::performDeleteGame() {
+	((MenuModule*)_parentModule)->setDeletegameInfo(_listBox->getCurrIndex());
+	leaveScene(0);
+}
+
 QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description)
 	: Scene(vm, parentModule) {
 
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 2f91bdb..39cd36a 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -44,6 +44,7 @@ public:
 	virtual ~MenuModule();
 	void setLoadgameInfo(uint index);
 	void setSavegameInfo(const Common::String &description, uint index, bool newSavegame);
+	void setDeletegameInfo(uint index);
 protected:
 	int _sceneNum;
 	byte *_savedPaletteData;
@@ -55,8 +56,10 @@ protected:
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
 	void createLoadGameMenu();
 	void createSaveGameMenu();
+	void createDeleteGameMenu();
 	void handleLoadGameMenuAction(bool doLoad);
 	void handleSaveGameMenuAction(bool doSave, bool doQuery);
+	void handleDeleteGameMenuAction(bool doDelete);
 	void loadSavegameList();
 };
 
@@ -114,7 +117,7 @@ public:
 	virtual void onClick();
 	virtual void setPosition(int16 x, int16 y);
 	virtual void refreshPosition();
-	virtual void addSprite();
+	virtual void initialize();
 	virtual int16 getWidth();
 	virtual int16 getHeight();
 	virtual void enterWidget();
@@ -133,7 +136,7 @@ public:
 	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 		int baseObjectPriority, int baseSurfacePriority, 
 		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface);	
-	virtual void addSprite();
+	virtual void initialize();
 	virtual int16 getWidth();
 	virtual int16 getHeight();
 	void drawString(int maxStringLength);
@@ -154,7 +157,7 @@ public:
 		int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect);
 	~TextEditWidget();
 	virtual void onClick();
-	virtual void addSprite();
+	virtual void initialize();
 	virtual void enterWidget();
 	virtual void exitWidget();
 	void setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight);
@@ -191,7 +194,7 @@ public:
 	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
 		SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
 	virtual void onClick();
-	virtual void addSprite();
+	virtual void initialize();
 	void buildItems();
 	void drawItems();
 	void refresh();
@@ -244,6 +247,21 @@ protected:
 	void performLoadGame();
 };
 
+class DeleteGameMenu : public WidgetScene {
+public:
+	DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
+	~DeleteGameMenu();
+	virtual void handleEvent(int16 itemID, int eventType);
+protected:
+	SavegameList *_savegameList;
+	FontSurface *_fontSurface;
+	SavegameListBox *_listBox;
+	TextEditWidget *_textEditWidget;
+	Common::String _savegameDescription;
+	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+	void performDeleteGame();
+};
+
 class QueryOverwriteMenu : public Scene {
 public:
 	QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description);
diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h
index 14c283b..577fbd7 100644
--- a/engines/neverhood/neverhood.h
+++ b/engines/neverhood/neverhood.h
@@ -119,6 +119,7 @@ public:
 	
 	Common::Error loadGameState(int slot);
 	Common::Error saveGameState(int slot, const Common::String &description);
+	Common::Error removeGameState(int slot);
 	void savegame(const char *filename, const char *description);
 	void loadgame(const char *filename);
 	const char *getSavegameFilename(int num);
diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp
index 2f97ade..578d985 100644
--- a/engines/neverhood/saveload.cpp
+++ b/engines/neverhood/saveload.cpp
@@ -143,6 +143,13 @@ Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &des
 	return Common::kNoError;
 }
 
+Common::Error NeverhoodEngine::removeGameState(int slot) {
+	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(_targetName, slot);
+	saveFileMan->removeSavefile(filename.c_str());
+	return Common::kNoError;
+}
+
 const char *NeverhoodEngine::getSavegameFilename(int num) {
 	static Common::String filename;
 	filename = getSavegameFilename(_targetName, num);


Commit: 9ca3973e6fe6c191a504a2c9fb402f03fda738e7
    https://github.com/scummvm/scummvm/commit/9ca3973e6fe6c191a504a2c9fb402f03fda738e7
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Work on the save/load/delete menus

- Rename WidgetScene to GameStateMenu
- Merge common code from the save/load/delete into GameStateMenu

Changed paths:
    engines/neverhood/menumodule.cpp
    engines/neverhood/menumodule.h



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 8b03532..619acad 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -243,9 +243,9 @@ void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) {
 }
 
 void MenuModule::handleDeleteGameMenuAction(bool doDelete) {
+	createScene(MAIN_MENU, -1);
 	if (doDelete && _savegameSlot >= 0) {
 		_vm->removeGameState(_savegameSlot);
-		createScene(MAIN_MENU, -1);
 	}
 	delete _savegameList;
 	_savegameList = NULL;
@@ -453,33 +453,9 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
-WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule), _currWidget(NULL) {
-}
-
-NPoint WidgetScene::getMousePos() {
-	NPoint pt;
-	pt.x = _mouseCursor->getX();
-	pt.y = _mouseCursor->getY();
-	return pt;
-}
-
-void WidgetScene::setCurrWidget(Widget *newWidget) {
-	if (newWidget && newWidget != _currWidget) {
-		if (_currWidget)
-			_currWidget->exitWidget();
-		newWidget->enterWidget();
-		_currWidget = newWidget;
-	}
-}
-
-void WidgetScene::handleEvent(int16 itemID, int eventType) {
-	// Empty
-}
-
-Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 	int baseObjectPriority, int baseSurfacePriority)
-	: StaticSprite(vm, baseObjectPriority), _itemID(itemID), _parentScene(parentScene),
+	: StaticSprite(vm, baseObjectPriority), _parentScene(parentScene),
 	_baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority) {
 
 	SetUpdateHandler(&Widget::update);
@@ -542,10 +518,10 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam &param, Entity *
 	return messageResult;
 }
 
-TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 	int baseObjectPriority, int baseSurfacePriority,
 	const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface)
-	: Widget(vm, x, y, itemID, parentScene,	baseObjectPriority, baseSurfacePriority),
+	: Widget(vm, x, y, parentScene,	baseObjectPriority, baseSurfacePriority),
 	_string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _fontSurface(fontSurface) {
 	
 }
@@ -579,9 +555,9 @@ void TextLabelWidget::setString(const byte *string, int stringLen) {
 	_stringLen = stringLen;
 }
 
-TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 	int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect)
-	: Widget(vm, x, y, itemID, parentScene,	1000, 1000),
+	: Widget(vm, x, y, parentScene,	1000, 1000),
 	_maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect),
 	_cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0),
 	_modified(false), _readOnly(false) {
@@ -627,7 +603,7 @@ void TextEditWidget::initialize() {
 	_parentScene->addCollisionSprite(this);
 	_surface->setVisible(true);
 	_textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _fontSurface->getCharHeight()) / 2,
-		0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
+		_parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
 		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface);
 	_textLabelWidget->initialize();
 	cursorSpriteResource.load(_cursorFileHash, true);
@@ -758,9 +734,9 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam &param,
 	return messageResult;
 }
 
-SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 	SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect)
-	: Widget(vm, x, y, itemID, parentScene,	1000, 1000),
+	: Widget(vm, x, y, parentScene,	1000, 1000),
 	_savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect),
 	_maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) {
 
@@ -779,7 +755,7 @@ void SavegameListBox::onClick() {
 			_currIndex = newIndex;
 			refresh();
 			_parentScene->setCurrWidget(this);
-			_parentScene->handleEvent(_itemID, 5);
+			_parentScene->refreshDescriptionEdit();
 		}
 	}
 }
@@ -803,7 +779,7 @@ void SavegameListBox::buildItems() {
 	for (uint i = 0; i < savegameList.size(); ++i) {
 		const byte *string = (const byte*)savegameList[i].description.c_str();
 		int stringLen = (int)savegameList[i].description.size();
-		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1,
+		TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, _parentScene, _baseObjectPriority + 1,
 			_baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface);
 		label->initialize();
 		_textLabelItems.push_back(label);
@@ -861,84 +837,92 @@ void SavegameListBox::pageDown() {
 	}
 }
 
-SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
-	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
-
-	static const uint32 kSaveGameMenuButtonFileHashes[] = {
-		0x8359A824,
-		0x0690E260,
-		0x0352B050,
-		0x1392A223,
-		0x13802260,
-		0x0B32B200
-	};
+GameStateMenu::GameStateMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList,
+	const uint32 *buttonFileHashes, const NRect *buttonCollisionBounds,
+	uint32 backgroundFileHash, uint32 fontFileHash,
+	uint32 mouseFileHash, const NRect *mouseRect,  
+	uint32 listBoxBackgroundFileHash, int16 listBoxX, int16 listBoxY, const NRect &listBoxRect,
+	uint32 textEditBackgroundFileHash, uint32 textEditCursorFileHash, int16 textEditX, int16 textEditY, const NRect &textEditRect,
+	uint32 textFileHash1, uint32 textFileHash2) 
+	: Scene(vm, parentModule), _currWidget(NULL), _savegameList(savegameList) {
 	
-	static const NRect kSaveGameMenuButtonCollisionBounds[] = {
-		NRect(518, 106, 602, 160),
-		NRect(516, 378, 596, 434),
-		NRect(394, 108, 458, 206),
-		NRect(400, 204, 458, 276),
-		NRect(398, 292, 456, 352),
-		NRect(396, 352, 460, 444)
-	};
-
-	static const NRect kListBoxRect(0, 0, 320, 272);
-	static const NRect kTextEditRect(0, 0, 377, 17);
-	static const NRect kMouseRect(50, 47, 427, 64);
-
-	_fontSurface = new FontSurface(_vm, 0x2328121A, 32, 7, 32, 11, 17);
+	_fontSurface = new FontSurface(_vm, fontFileHash, 32, 7, 32, 11, 17);
 	
-	setBackground(0x30084E25);
-	setPalette(0x30084E25);
-	insertScreenMouse(0x84E21308, &kMouseRect);
-	insertStaticSprite(0x1340A5C2, 200);
-	insertStaticSprite(0x1301A7EA, 200);
-
-	_listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this,
-		_savegameList, _fontSurface, 0x1115A223, kListBoxRect);
+	setBackground(backgroundFileHash);
+	setPalette(backgroundFileHash);
+	insertScreenMouse(mouseFileHash, mouseRect);
+	insertStaticSprite(textFileHash1, 200);
+	insertStaticSprite(textFileHash2, 200);
+
+	_listBox = new SavegameListBox(_vm, listBoxX, listBoxY, this,
+		_savegameList, _fontSurface, listBoxBackgroundFileHash, listBoxRect);
 	_listBox->initialize();
 
-	_textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 29,
-		_fontSurface, 0x3510A868, kTextEditRect);
-	_textEditWidget->setCursor(0x8290AC20, 2, 13);
+	_textEditWidget = new TextEditWidget(_vm, textEditX, textEditY, this, 29,
+		_fontSurface, textEditBackgroundFileHash, textEditRect);
+	if (textEditCursorFileHash != 0)
+		_textEditWidget->setCursor(textEditCursorFileHash, 2, 13);
+	else
+		_textEditWidget->setReadOnly(true);
 	_textEditWidget->initialize();
 	setCurrWidget(_textEditWidget);
 	
 	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
 		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
-			kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]);
+			buttonFileHashes[buttonIndex], buttonCollisionBounds[buttonIndex]);
 		addCollisionSprite(menuButton);
 	}
 
 	SetUpdateHandler(&Scene::update);
-	SetMessageHandler(&SaveGameMenu::handleMessage);
+	SetMessageHandler(&GameStateMenu::handleMessage);
+	
 }
 
-SaveGameMenu::~SaveGameMenu() {
+GameStateMenu::~GameStateMenu() {
 	delete _fontSurface;
 }
 
-void SaveGameMenu::handleEvent(int16 itemID, int eventType) {
-	if (itemID == 69 && eventType == 5) {
-		uint currIndex = _listBox->getCurrIndex();
-		_textEditWidget->setString((*_savegameList)[currIndex].description);
-		setCurrWidget(_textEditWidget);
+NPoint GameStateMenu::getMousePos() {
+	NPoint pt;
+	pt.x = _mouseCursor->getX();
+	pt.y = _mouseCursor->getY();
+	return pt;
+}
+
+void GameStateMenu::setCurrWidget(Widget *newWidget) {
+	if (newWidget && newWidget != _currWidget) {
+		if (_currWidget)
+			_currWidget->exitWidget();
+		newWidget->enterWidget();
+		_currWidget = newWidget;
 	}
 }
 
-uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+void GameStateMenu::refreshDescriptionEdit() {
+	uint currIndex = _listBox->getCurrIndex();
+	_textEditWidget->setString((*_savegameList)[currIndex].description);
+	setCurrWidget(_textEditWidget);
+}
+
+void GameStateMenu::performAction() {
+	// Empty
+}
+
+uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
 	Scene::handleMessage(messageNum, param, sender);
 	switch (messageNum) {
 	case 0x000A:
-		sendMessage(_textEditWidget, 0x000A, param.asInteger());
-		setCurrWidget(_textEditWidget);
+		if (!_textEditWidget->isReadOnly()) {
+			sendMessage(_textEditWidget, 0x000A, param.asInteger());
+			setCurrWidget(_textEditWidget);
+		}
 		break;
 	case 0x000B:
 		if (param.asInteger() == Common::KEYCODE_RETURN)
-			performSaveGame();
+			performAction();
 		else if (param.asInteger() == Common::KEYCODE_ESCAPE)
 			leaveScene(1);
-		else {
+		else if (!_textEditWidget->isReadOnly()) {
 			sendMessage(_textEditWidget, 0x000B, param.asInteger());
 			setCurrWidget(_textEditWidget);
 		}
@@ -947,7 +931,7 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 		// Handle menu button click
 		switch (param.asInteger()) {
 		case 0:
-			performSaveGame();
+			performAction();
 			break;
 		case 1:
 			leaveScene(1);
@@ -970,219 +954,101 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam &param, En
 	return 0;
 }
 
-void SaveGameMenu::performSaveGame() {
-	((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
-		_listBox->getCurrIndex(), _textEditWidget->isModified());
-	leaveScene(0);
-}
-
-LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
-	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
-
-	static const uint32 kLoadGameMenuButtonFileHashes[] = {
-		0x100B2091,
-		0x84822B03,
-		0x20E22087,
-		0x04040107,
-		0x04820122,
-		0x24423047
-	};
-	
-	static const NRect kLoadGameMenuButtonCollisionBounds[] = {
-		NRect( 44, 115, 108, 147),
-		NRect( 52, 396, 112, 426),
-		NRect(188, 116, 245, 196),
-		NRect(189, 209, 239, 269),
-		NRect(187, 301, 233, 349),
-		NRect(182, 358, 241, 433)
-	};
+static const uint32 kSaveGameMenuButtonFileHashes[] = {
+	0x8359A824, 0x0690E260, 0x0352B050,
+	0x1392A223, 0x13802260, 0x0B32B200
+};
 
-	static const NRect kListBoxRect(0, 0, 320, 271);
-	static const NRect kTextEditRect(0, 0, 320, 17);
-	static const NRect kMouseRect(263, 48, 583, 65);
+static const NRect kSaveGameMenuButtonCollisionBounds[] = {
+	NRect(518, 106, 602, 160),
+	NRect(516, 378, 596, 434),
+	NRect(394, 108, 458, 206),
+	NRect(400, 204, 458, 276),
+	NRect(398, 292, 456, 352),
+	NRect(396, 352, 460, 444)
+};
 
-	_fontSurface = new FontSurface(_vm, calcHash("bgLoadTinyAlphabet"), 32, 7, 32, 11, 17);
-	
-	setBackground(0x98620234);
-	setPalette(0x98620234);
-	insertScreenMouse(0x2023098E, &kMouseRect);
-	insertStaticSprite(0x0BC600A3, 200);
-	insertStaticSprite(0x0F960021, 200);
-
-	_listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this,
-		_savegameList, _fontSurface, 0x04040409, kListBoxRect);
-	_listBox->initialize();
+static const NRect kSaveGameMenuListBoxRect(0, 0, 320, 272);
+static const NRect kSaveGameMenuTextEditRect(0, 0, 377, 17);
+static const NRect kSaveGameMenuMouseRect(50, 47, 427, 64);
 
-	_textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 29,
-		_fontSurface, 0x10924C03, kTextEditRect);
-	_textEditWidget->setReadOnly(true);
-	_textEditWidget->initialize();
-	setCurrWidget(_textEditWidget);
-	
-	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
-		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
-			kLoadGameMenuButtonFileHashes[buttonIndex], kLoadGameMenuButtonCollisionBounds[buttonIndex]);
-		addCollisionSprite(menuButton);
-	}
+SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
+	:  GameStateMenu(vm, parentModule, savegameList, kSaveGameMenuButtonFileHashes, kSaveGameMenuButtonCollisionBounds,
+		0x30084E25, 0x2328121A,
+		0x84E21308, &kSaveGameMenuMouseRect,
+		0x1115A223, 60, 142, kSaveGameMenuListBoxRect,
+		0x3510A868, 0x8290AC20, 50, 47, kSaveGameMenuTextEditRect,
+		0x1340A5C2, 0x1301A7EA) {
 
-	SetUpdateHandler(&Scene::update);
-	SetMessageHandler(&LoadGameMenu::handleMessage);
 }
 
-LoadGameMenu::~LoadGameMenu() {
-	delete _fontSurface;
+void SaveGameMenu::performAction() {
+	((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(),
+		_listBox->getCurrIndex(), _textEditWidget->isModified());
+	leaveScene(0);
 }
 
-void LoadGameMenu::handleEvent(int16 itemID, int eventType) {
-	if (itemID == 69 && eventType == 5) {
-		uint currIndex = _listBox->getCurrIndex();
-		_textEditWidget->setString((*_savegameList)[currIndex].description);
-		setCurrWidget(_textEditWidget);
-	}
-}
+static const uint32 kLoadGameMenuButtonFileHashes[] = {
+	0x100B2091, 0x84822B03, 0x20E22087,
+	0x04040107, 0x04820122, 0x24423047
+};
+
+static const NRect kLoadGameMenuButtonCollisionBounds[] = {
+	NRect( 44, 115, 108, 147),
+	NRect( 52, 396, 112, 426),
+	NRect(188, 116, 245, 196),
+	NRect(189, 209, 239, 269),
+	NRect(187, 301, 233, 349),
+	NRect(182, 358, 241, 433)
+};
+
+static const NRect kLoadGameMenuListBoxRect(0, 0, 320, 271);
+static const NRect kLoadGameMenuTextEditRect(0, 0, 320, 17);
+static const NRect kLoadGameMenuMouseRect(263, 48, 583, 65);
+
+LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
+	: GameStateMenu(vm, parentModule, savegameList, kLoadGameMenuButtonFileHashes, kLoadGameMenuButtonCollisionBounds,
+		0x98620234, 0x201C2474,
+		0x2023098E, &kLoadGameMenuMouseRect,
+		0x04040409, 263, 142, kLoadGameMenuListBoxRect,
+		0x10924C03, 0, 263, 48, kLoadGameMenuTextEditRect,
+		0x0BC600A3, 0x0F960021) {
 
-uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x000B:
-		if (param.asInteger() == Common::KEYCODE_RETURN)
-			performLoadGame();
-		else if (param.asInteger() == Common::KEYCODE_ESCAPE)
-			leaveScene(1);
-		break;
-	case 0x2000:
-		// Handle menu button click
-		switch (param.asInteger()) {
-		case 0:
-			performLoadGame();
-			break;
-		case 1:
-			leaveScene(1);
-			break;
-		case 2:
-			_listBox->pageUp();
-			break;
-		case 3:
-			_listBox->scrollUp();
-			break;
-		case 4:
-			_listBox->scrollDown();
-			break;
-		case 5:
-			_listBox->pageDown();
-			break;
-		}
-		break;
-	}
-	return 0;
 }
 
-void LoadGameMenu::performLoadGame() {
+void LoadGameMenu::performAction() {
 	((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex());
 	leaveScene(0);
 }
 
-DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
-	: WidgetScene(vm, parentModule), _savegameList(savegameList) {
-
-	static const uint32 kDeleteGameMenuButtonFileHashes[] = {
-		0x8198E268,
-		0xDD0C4620,
-		0x81296520,
-		0x8D284211,
-		0x8C004621,
-		0x07294020
-	};
-	
-	static const NRect kDeleteGameMenuButtonCollisionBounds[] = {
-		NRect(518,  46, 595,  91),
-		NRect(524, 322, 599, 369),
-		NRect(395,  40, 462, 127),
-		NRect(405, 126, 460, 185),
-		NRect(397, 205, 456, 273),
-		NRect(395, 278, 452, 372)
-	};
-
-	static const NRect kListBoxRect(0, 0, 320, 271);
-	static const NRect kTextEditRect(0, 0, 320, 17);
-
-	_fontSurface = new FontSurface(_vm, calcHash("bgDeleteTinyAlphabet"), 32, 7, 32, 11, 17);
-	
-	setBackground(0x4080E01C);
-	setPalette(0x4080E01C);
-	insertScreenMouse(0x0E018400);
-	insertStaticSprite(0x80083C01, 200);
-	insertStaticSprite(0x84181E81, 200);
-
-	_listBox = new SavegameListBox(_vm, 61, 64, 69/*ItemID*/, this,
-		_savegameList, _fontSurface, calcHash("mxDeleteListBox"), kListBoxRect);
-	_listBox->initialize();
-
-	_textEditWidget = new TextEditWidget(_vm, 49, 414, 70/*ItemID*/, this, 29,
-		_fontSurface, 0x250A3060, kTextEditRect);
-	_textEditWidget->setReadOnly(true);
-	_textEditWidget->initialize();
-	setCurrWidget(_textEditWidget);
-	
-	for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) {
-		Sprite *menuButton = insertSprite<MenuButton>(this, buttonIndex,
-			kDeleteGameMenuButtonFileHashes[buttonIndex], kDeleteGameMenuButtonCollisionBounds[buttonIndex]);
-		addCollisionSprite(menuButton);
-	}
+static const uint32 kDeleteGameMenuButtonFileHashes[] = {
+	0x8198E268, 0xDD0C4620, 0x81296520,
+	0x8D284211, 0x8C004621, 0x07294020
+};
 
-	SetUpdateHandler(&Scene::update);
-	SetMessageHandler(&DeleteGameMenu::handleMessage);
-}
+static const NRect kDeleteGameMenuButtonCollisionBounds[] = {
+	NRect(518,  46, 595,  91),
+	NRect(524, 322, 599, 369),
+	NRect(395,  40, 462, 127),
+	NRect(405, 126, 460, 185),
+	NRect(397, 205, 456, 273),
+	NRect(395, 278, 452, 372)
+};
 
-DeleteGameMenu::~DeleteGameMenu() {
-	delete _fontSurface;
-}
+static const NRect kDeleteGameMenuListBoxRect(0, 0, 320, 271);
+static const NRect kDeleteGameMenuTextEditRect(0, 0, 320, 17);
 
-void DeleteGameMenu::handleEvent(int16 itemID, int eventType) {
-	if (itemID == 69 && eventType == 5) {
-		uint currIndex = _listBox->getCurrIndex();
-		_textEditWidget->setString((*_savegameList)[currIndex].description);
-		setCurrWidget(_textEditWidget);
-	}
-}
+DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList)
+	: GameStateMenu(vm, parentModule, savegameList, kDeleteGameMenuButtonFileHashes, kDeleteGameMenuButtonCollisionBounds,
+		0x4080E01C, 0x728523ED,
+		0x0E018400, NULL,  
+		0xA5584211, 61, 64, kDeleteGameMenuListBoxRect,
+		0x250A3060, 0, 49, 414, kDeleteGameMenuTextEditRect,
+		0x80083C01, 0x84181E81) {
 
-uint32 DeleteGameMenu::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x000B:
-		if (param.asInteger() == Common::KEYCODE_RETURN)
-			performDeleteGame();
-		else if (param.asInteger() == Common::KEYCODE_ESCAPE)
-			leaveScene(1);
-		break;
-	case 0x2000:
-		// Handle menu button click
-		switch (param.asInteger()) {
-		case 0:
-			performDeleteGame();
-			break;
-		case 1:
-			leaveScene(1);
-			break;
-		case 2:
-			_listBox->pageUp();
-			break;
-		case 3:
-			_listBox->scrollUp();
-			break;
-		case 4:
-			_listBox->scrollDown();
-			break;
-		case 5:
-			_listBox->pageDown();
-			break;
-		}
-		break;
-	}
-	return 0;
 }
 
-void DeleteGameMenu::performDeleteGame() {
+void DeleteGameMenu::performAction() {
 	((MenuModule*)_parentModule)->setDeletegameInfo(_listBox->getCurrIndex());
 	leaveScene(0);
 }
@@ -1213,7 +1079,7 @@ QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule
 
 	// Draw the query text to the background, each text line is centered
 	// NOTE The original had this text in its own class
-	FontSurface *fontSurface = new FontSurface(_vm, calcHash("bgQueryTinyAlphabet"), 32, 7, 32, 11, 17);
+	FontSurface *fontSurface = new FontSurface(_vm, 0x94188D4D, 32, 7, 32, 11, 17);
 	Common::StringArray textLines;
 	textLines.push_back(description);
 	textLines.push_back("Game exists.");
diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h
index 39cd36a..08858ad 100644
--- a/engines/neverhood/menumodule.h
+++ b/engines/neverhood/menumodule.h
@@ -98,21 +98,11 @@ protected:
 };
 
 class Widget;
-
-class WidgetScene : public Scene {
-public:
-	WidgetScene(NeverhoodEngine *vm, Module *parentModule);
-	NPoint getMousePos();
-	virtual void setCurrWidget(Widget *newWidget);
-	virtual Widget *getCurrWidget() { return _currWidget; }
-	virtual void handleEvent(int16 itemID, int eventType);
-protected:
-	Widget *_currWidget;
-};
+class GameStateMenu;
 
 class Widget : public StaticSprite {
 public:
-	Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	Widget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 		int baseObjectPriority, int baseSurfacePriority);
 	virtual void onClick();
 	virtual void setPosition(int16 x, int16 y);
@@ -123,8 +113,7 @@ public:
 	virtual void enterWidget();
 	virtual void exitWidget();
 protected:
-	int16 _itemID;
-	WidgetScene *_parentScene;
+	GameStateMenu *_parentScene;
 	int _baseObjectPriority;
 	int _baseSurfacePriority;
 	void update();
@@ -133,7 +122,7 @@ protected:
 
 class TextLabelWidget : public Widget {
 public:
-	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 		int baseObjectPriority, int baseSurfacePriority, 
 		const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface);	
 	virtual void initialize();
@@ -153,7 +142,7 @@ protected:
 
 class TextEditWidget : public Widget {
 public:
-	TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 		int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect);
 	~TextEditWidget();
 	virtual void onClick();
@@ -169,6 +158,7 @@ public:
 	void handleKeyDown(Common::KeyCode keyCode);
 	void refresh();
 	void setReadOnly(bool value) { _readOnly = value; }
+	bool isReadOnly() const { return _readOnly; }
 	bool isModified() const { return _modified; }
 protected:
 	NRect _rect;
@@ -191,7 +181,7 @@ protected:
 
 class SavegameListBox : public Widget {
 public:
-	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene,
+	SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene,
 		SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect);
 	virtual void onClick();
 	virtual void initialize();
@@ -215,51 +205,51 @@ protected:
 	uint _currIndex;
 	int _maxVisibleItemsCount;
 };
-
-class SaveGameMenu : public WidgetScene {
+      
+class GameStateMenu : public Scene {
 public:
-	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
-	~SaveGameMenu();
-	virtual void handleEvent(int16 itemID, int eventType);
+	GameStateMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList,
+		const uint32 *buttonFileHashes, const NRect *buttonCollisionBounds,
+		uint32 backgroundFileHash, uint32 fontFileHash,
+		uint32 mouseFileHash, const NRect *mouseRect,  
+		uint32 listBoxBackgroundFileHash, int16 listBoxX, int16 listBoxY, const NRect &listBoxRect,
+		uint32 textEditBackgroundFileHash, uint32 textEditCursorFileHash, int16 textEditX, int16 textEditY, const NRect &textEditRect,
+		uint32 textFileHash1, uint32 textFileHash2);
+	virtual ~GameStateMenu();
+	NPoint getMousePos();
+	virtual void setCurrWidget(Widget *newWidget);
+	virtual Widget *getCurrWidget() { return _currWidget; }
+	virtual void refreshDescriptionEdit();
 protected:
+	Widget *_currWidget;
 	SavegameList *_savegameList;
 	FontSurface *_fontSurface;
 	SavegameListBox *_listBox;
 	TextEditWidget *_textEditWidget;
 	Common::String _savegameDescription;
-	void update();
 	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void performSaveGame();
+	virtual void performAction();
+};
+
+class SaveGameMenu : public GameStateMenu {
+public:
+	SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
+protected:
+	virtual void performAction();
 };
 
-class LoadGameMenu : public WidgetScene {
+class LoadGameMenu : public GameStateMenu {
 public:
 	LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
-	~LoadGameMenu();
-	virtual void handleEvent(int16 itemID, int eventType);
 protected:
-	SavegameList *_savegameList;
-	FontSurface *_fontSurface;
-	SavegameListBox *_listBox;
-	TextEditWidget *_textEditWidget;
-	Common::String _savegameDescription;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void performLoadGame();
+	virtual void performAction();
 };
 
-class DeleteGameMenu : public WidgetScene {
+class DeleteGameMenu : public GameStateMenu {
 public:
 	DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList);
-	~DeleteGameMenu();
-	virtual void handleEvent(int16 itemID, int eventType);
 protected:
-	SavegameList *_savegameList;
-	FontSurface *_fontSurface;
-	SavegameListBox *_listBox;
-	TextEditWidget *_textEditWidget;
-	Common::String _savegameDescription;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void performDeleteGame();
+	virtual void performAction();
 };
 
 class QueryOverwriteMenu : public Scene {


Commit: 9b6d813d412a636b1c02511065ab1466e0f6c5e0
    https://github.com/scummvm/scummvm/commit/9b6d813d412a636b1c02511065ab1466e0f6c5e0
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Update todo.txt

Changed paths:
    engines/neverhood/todo.txt



diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt
index c13d3f1..9d781e0 100644
--- a/engines/neverhood/todo.txt
+++ b/engines/neverhood/todo.txt
@@ -13,13 +13,13 @@ TODOs which can be done any time:
 
 TODOs which should be done only after the game logic is finished:
 -------------------------------------------------------------------
-- Implement game menus
 - Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes)
 	- This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included
 	- The move special scenes (SmackerScene) into the scenes file
 
 DONE:
 -------
+- Implement game menus
 - Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors)
 	- Should be just a handle object which initializes itself
 	- Play routine should fill the handle so it can be stopped/queried later


Commit: 583f9abaf98f64895546b75573e9442ca47426e3
    https://github.com/scummvm/scummvm/commit/583f9abaf98f64895546b75573e9442ca47426e3
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:47:43-07:00

Commit Message:
NEVERHOOD: Fix some logic bugs and minor changes

- Fix video speed in the very last scene (Scene1317)
- Fix back door not opening in Scene1401
- Fix projector not moving in Scene1402
- Fix projector not appearing in Scene1403
- Fix wrong Klaymen walking in Scene2205
- Fix wrong scene change in Module2300
- Fix symbols not appearing in Scene3011
- Define out some remaining logic debug code
- Remove some obsolete comments
- Reduce debug output
- Use a List instead of an Array when building the microtiles rectangles

Changed paths:
    engines/neverhood/blbarchive.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/microtiles.cpp
    engines/neverhood/microtiles.h
    engines/neverhood/module1300.cpp
    engines/neverhood/module1400.cpp
    engines/neverhood/module2200.cpp
    engines/neverhood/module2300.cpp
    engines/neverhood/module2800.cpp
    engines/neverhood/module3000.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resourceman.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/smackerplayer.cpp
    engines/neverhood/smackerscene.cpp
    engines/neverhood/sound.h



diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp
index 748d04c..9f5f464 100644
--- a/engines/neverhood/blbarchive.cpp
+++ b/engines/neverhood/blbarchive.cpp
@@ -153,7 +153,7 @@ Common::SeekableReadStream *BlbArchive::createStream(uint index) {
 
 Common::SeekableReadStream *BlbArchive::createStream(BlbArchiveEntry *entry) {
 	return new SafeMutexedSeekableSubReadStream(&_fd, entry->offset, entry->offset + entry->diskSize,
-		DisposeAfterUse::NO,_mutex);
+		DisposeAfterUse::NO, _mutex);
 }
 
 } // End of namespace Neverhood
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 1246a5b..99aea5d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -84,7 +84,6 @@ GameModule::GameModule(NeverhoodEngine *vm)
 }
 
 GameModule::~GameModule() {
-
 	_vm->_soundMan->deleteSoundGroup(0x002D0031);
 	delete _childObject;
 	_childObject = NULL;
@@ -196,7 +195,8 @@ void GameModule::initMemoryPuzzle() {
 		}
 		setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1);
 
-		// DEBUG>>> Some debug code: Leave two matching tiles open
+		// DEBUG Enable to autosolve all tiles and leave only two matching tiles open
+#if 0		
 		for (int i = 0; i < 48; i++)
 			setSubVar(VA_IS_TILE_MATCH, i, 1);
 		int debugIndex = 0;
@@ -207,7 +207,7 @@ void GameModule::initMemoryPuzzle() {
 				break;
 			}
 		}
-		// <<<DEBUG
+#endif		
 
 	}
 }
@@ -345,8 +345,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam &param, Enti
 }
 
 void GameModule::startup() {
-#if 0
-	createModule(1500, 0); // Logos and intro video // Real game start
+#if 1
+	// Logos and intro video // Real game start
+	createModule(1500, 0);
 #else
 	// DEBUG>>>
 	/*
@@ -395,63 +396,7 @@ void GameModule::startup() {
 #if 1
 	_vm->gameState().which = 0;
 	_vm->gameState().sceneNum = 0;
-	createModule(1000, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 5;
-	_vm->gameState().which = 0;
-	createModule(2800, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 0;
-	createModule(2000, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 5;
-	createModule(2200, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 7;
-	createModule(2200, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 1;
-	createModule(1000, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 8;
-	_vm->gameState().which = 1;
-	createModule(1600, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 6;
-	createModule(1900, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 0;
-	createModule(2100, 3);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 8;
-	createModule(2600, -1);
-#endif
-#if 0
-	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 1;
-	createModule(2700, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 1;
-	createModule(2800, -1);
-#endif
-#if 0
-	_vm->gameState().which = 0;
-	_vm->gameState().sceneNum = 0;
-	createModule(2500, -1);
-#endif
-#if 0
-	_vm->gameState().sceneNum = 1;
-	createModule(2300, -1);
+	createModule(2400, 0);
 #endif
 
 #endif
@@ -739,6 +684,7 @@ void GameModule::updateModule() {
 			createModule(2300, 1);
 			break;
 		case 2300:
+		debug("module 23000 _moduleResult : %d", _moduleResult);
 			if (_moduleResult == 2)
 				createModule(1200, 0);
 			else if (_moduleResult == 0)
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 619acad..d4882c3 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -583,7 +583,7 @@ void TextEditWidget::onClick() {
 			_cursorPos = 0;
 		else {
 			int newCursorPos = mousePos.x / _fontSurface->getCharWidth();
-			if (mousePos.x % _fontSurface->getCharWidth() > _fontSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//###
+			if (mousePos.x % _fontSurface->getCharWidth() > _fontSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())
 				++newCursorPos;
 			_cursorPos = MIN((int)_entryString.size(), newCursorPos);
 		}
diff --git a/engines/neverhood/microtiles.cpp b/engines/neverhood/microtiles.cpp
index ee64fda..e19be52 100644
--- a/engines/neverhood/microtiles.cpp
+++ b/engines/neverhood/microtiles.cpp
@@ -108,9 +108,9 @@ void MicroTileArray::updateBoundingBox(BoundingBox &boundingBox, byte x0, byte y
 	setBoundingBox(boundingBox, x0, y0, x1, y1);
 }
 
-RectArray *MicroTileArray::getRectangles() {
+RectangleList *MicroTileArray::getRectangles() {
 
-	RectArray *rects = new RectArray();
+	RectangleList *rects = new RectangleList();
 
 	int x, y;
 	int x0, y0, x1, y1;
diff --git a/engines/neverhood/microtiles.h b/engines/neverhood/microtiles.h
index 2ad6796..29af3d9 100644
--- a/engines/neverhood/microtiles.h
+++ b/engines/neverhood/microtiles.h
@@ -25,7 +25,7 @@
 #define NEVERHOOD_MICROTILES_H
 
 #include "common/scummsys.h"
-#include "common/array.h"
+#include "common/list.h"
 #include "common/util.h"
 #include "common/rect.h"
 
@@ -37,7 +37,7 @@ const BoundingBox FullBoundingBox  = 0x00001F1F;
 const BoundingBox EmptyBoundingBox = 0x00000000;
 const int TileSize = 32;
 
-typedef Common::Array<Common::Rect> RectArray;
+typedef Common::List<Common::Rect> RectangleList;
 
 class MicroTileArray {
 public:
@@ -45,7 +45,7 @@ public:
 	~MicroTileArray();
 	void addRect(Common::Rect r);
 	void clear();
-	RectArray *getRectangles();
+	RectangleList *getRectangles();
 protected:
 	BoundingBox *_tiles;
 	int16 _tilesW, _tilesH;
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index 94937c4..162d710 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -1701,6 +1701,7 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule)
 	
 	SetMessageHandler(&Scene1317::handleMessage);
 	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
+	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
 	insertScreenMouse(0x08284011);
 	showMouse(false);
 	_smackerFileHash = 0;
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index d96703b..8aa0632 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -339,7 +339,7 @@ uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam &pa
 		break;
 	case 0x4808:
 		_countdown = 168;
-		if (_isOpen)
+		if (!_isOpen)
 			stOpenDoor();
 		break;						
 	}
@@ -743,7 +743,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entit
 			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504)
 				sendMessage(_asProjector , 0x4839, 0);
 		} else if (sender == _ssButton)
-			sendMessage(_ssButton, 0x4808, 0);
+			sendMessage(_asBackDoor, 0x4808, 0);
 		break;
 	case 0x4826:
 		if (sender == _asProjector) {
@@ -968,7 +968,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entit
 		break;
 	case 0x4826:
 		if (sender == _asProjector) {
-			if (sendMessage(_asProjector, 0x408C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) {
+			if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) {
 				sendEntityMessage(_klaymen, 0x1014, _asProjector);
 				setMessageList2(0x004B0BB8);
 			} else
@@ -1309,7 +1309,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
 	}
 	_klaymen->setRepl(64, 0);
 
-	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
+	if (getGlobalVar(V_PROJECTOR_LOCATION) == 0) {
 		_asProjector = insertSprite<AsCommonProjector>(this, _klaymen, (Sprite*)NULL);
 		addCollisionSprite(_asProjector);
 		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 2e6549a..ddcfb36 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -47,6 +47,7 @@ Module2200::~Module2200() {
 }
 
 void Module2200::createScene(int sceneNum, int which) {
+	debug("Module2200::createScene(%d, %d)", sceneNum, which);
 	_sceneNum = sceneNum;
 	switch (_sceneNum) {
 	case 0:
@@ -1221,7 +1222,6 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetUpdateHandler(&Scene2205::update);
 	
 	setHitRects(0x004B0620);
-	loadDataResource(0x00144822);
 	if (getGlobalVar(V_LIGHTS_ON)) {
 		_isLightOn = true;
 		setBackground(0x0008028D);
@@ -1263,6 +1263,9 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which)
 
 	_klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480);
 	_klaymen->setSoundFlag(true);
+	
+	loadDataResource(0x00144822);
+	
 }
 	
 void Scene2205::update() {
diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp
index 937ba9a..bf0e866 100644
--- a/engines/neverhood/module2300.cpp
+++ b/engines/neverhood/module2300.cpp
@@ -140,7 +140,7 @@ void Module2300::updateScene() {
 			break;
 		case 2:
 			if (_moduleResult == 1)
-				leaveModule(3);
+				leaveModule(1);
 			else
 				createScene(1, 5);
 			break;
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 5fececd..d81445c 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -284,7 +284,6 @@ void Module2800::updateScene() {
 				createScene(9, 4);
 			break;
 		case 9:
-			debug("scene 9 _moduleResult = %d", _moduleResult);
 			if (_moduleResult == 1)
 				createScene(11, 0);
 			else if (_moduleResult == 2)
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index 6bf95e3..d08ff9d 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -756,7 +756,6 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	_isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) {
 
 	_cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS);
-	debug("_cannonTargetStatus = %d", _cannonTargetStatus);
 	
 	_vm->gameModule()->initCannonSymbolsPuzzle();
 	
@@ -809,11 +808,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which)
 	SetMessageHandler(&Scene3009::handleMessage);
 	SetUpdateHandler(&Scene3009::update);
 
-	// DEBUG: Set the correct code
+	// DEBUG Enable to set the correct code
+#if 0	
 	for (int i = 0; i < 6; i++)
 		setSubVar(VA_CURR_CANNON_SYMBOLS, i, _correctSymbols[i]);
 	sendMessage(this, 0x2003, 0);
-	//setGlobalVar(V_ROBOT_TARGET, 1);   
+#endif   
 
 }
 
@@ -1224,10 +1224,12 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which)
 	
 	int initCountdown = 0;
 
-	// DEBUG: Enable all buttons
+	// DEBUG Enable to activate all buttons
+#if 0	
 	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[0], 1);
 	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1);
 	setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1);
+#endif	
 
 	setBackground(0x80802626);
 	setPalette(0x80802626);
@@ -1448,7 +1450,7 @@ void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) {
 }
 
 Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) {
+	: Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0), _countdown(0) {
 
 	_vm->gameModule()->initCodeSymbolsPuzzle();
 	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 2fce4ba..22a8028 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -355,7 +355,6 @@ DataResource::~DataResource() {
 void DataResource::load(uint32 fileHash) {
 	if (_resourceHandle.fileHash() == fileHash)
 		return;
-	debug("DataResource::load(%08X)", fileHash);
 	const byte *data = NULL;
 	uint32 dataSize = 0;
 	unload();
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index 9e5f9ae..f662130 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -58,7 +58,6 @@ void ResourceMan::addArchive(const Common::String &filename) {
 			_entries[archiveEntry->fileHash] = newEntry;
 		}
 	}
-	debug("_entries.size() = %d", _entries.size());
 }
 
 ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) {
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 3e57422..25b4109 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -86,18 +86,18 @@ void Screen::update() {
 		renderItem._refresh = true;
 	}
 
-	RectArray *updateRects = _microTiles->getRectangles();
+	RectangleList *updateRects = _microTiles->getRectangles();
 
 	for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) {
 		RenderItem &renderItem = (*it);
-		for (RectArray::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri)
+		for (RectangleList::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri)
 			blitRenderItem(renderItem, *ri);
 	}
 	
 	SWAP(_renderQueue, _prevRenderQueue);
 	_renderQueue->clear();
 
-	for (Common::Array<Common::Rect>::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) {
+	for (RectangleList::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) {
 		Common::Rect &r = *ri;
 		_vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr(r.left, r.top), _backScreen->pitch, r.left, r.top, r.width(), r.height());
 	}
diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp
index 7c14edf..b67c8db 100644
--- a/engines/neverhood/smackerplayer.cpp
+++ b/engines/neverhood/smackerplayer.cpp
@@ -100,7 +100,7 @@ SmackerPlayer::~SmackerPlayer() {
 }
 
 void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) {
-	debug("SmackerPlayer::open(%08X)", fileHash);
+	debug(0, "SmackerPlayer::open(%08X)", fileHash);
 	
 	_fileHash = fileHash;
 	_keepLastFrame = keepLastFrame;
diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp
index 20eebe2..115aafe 100644
--- a/engines/neverhood/smackerscene.cpp
+++ b/engines/neverhood/smackerscene.cpp
@@ -28,7 +28,7 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl
 	: Scene(vm, parentModule), _doubleSurface(doubleSurface), _canSkip(canSkip), _canAbort(canAbort), _videoPlayedBefore(false),
 	_fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) {
 
-	debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort);
+	debug(0, "SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort);
 
 	// NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags)
 	
@@ -53,18 +53,18 @@ SmackerScene::~SmackerScene() {
 }
 
 void SmackerScene::setFileHash(uint32 fileHash) {
-	debug("SmackerScene::setFileHash(%08X)", fileHash);
+	debug(0, "SmackerScene::setFileHash(%08X)", fileHash);
 	_fileHash[0] = fileHash;
 	_fileHashList = _fileHash;
 }
 
 void SmackerScene::setFileHashList(const uint32 *fileHashList) {
-	debug("SmackerScene::setFileHashList(...)");
+	debug(0, "SmackerScene::setFileHashList(...)");
 	_fileHashList = fileHashList;
 }
 
 void SmackerScene::nextVideo() {
-	debug("SmackerScene::nextVideo()");
+	debug(0, "SmackerScene::nextVideo()");
 
 	_fileHashListIndex++;
 	
diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h
index e0e45e9..d331899 100644
--- a/engines/neverhood/sound.h
+++ b/engines/neverhood/sound.h
@@ -124,14 +124,6 @@ protected:
 	SoundResource *_soundResource;
 };
 
-// TODO Give this a better name
-
-/*
-template<class T>
-class SoundManItems : public Common::Array<T> {
-};
-*/
-
 class SoundMan {
 public:
 	SoundMan(NeverhoodEngine *vm);


Commit: 102299630901d08a44ef3aec367fcbcae065b9fe
    https://github.com/scummvm/scummvm/commit/102299630901d08a44ef3aec367fcbcae065b9fe
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-05-08T11:47:44-07:00

Commit Message:
Merge branch 'master'

Changed paths:
  A audio/midiparser_qt.cpp
  A audio/midiparser_qt.h
  A audio/softsynth/mt32/BReverbModel.cpp
  A audio/softsynth/mt32/BReverbModel.h
  A audio/softsynth/mt32/LA32WaveGenerator.cpp
  A audio/softsynth/mt32/LA32WaveGenerator.h
  A audio/softsynth/mt32/LegacyWaveGenerator.cpp
  A audio/softsynth/mt32/LegacyWaveGenerator.h
  A audio/softsynth/mt32/ROMInfo.cpp
  A audio/softsynth/mt32/ROMInfo.h
  A backends/platform/android/org/scummvm/scummvm/MouseHelper.java
  A backends/platform/symbian/mmp/scummvm_cge.mmp.in
  A backends/platform/symbian/mmp/scummvm_composer.mmp.in
  A backends/platform/symbian/mmp/scummvm_hopkins.mmp.in
  A backends/platform/symbian/mmp/scummvm_pegasus.mmp.in
  A backends/platform/symbian/mmp/scummvm_toltecs.mmp.in
  A backends/platform/symbian/mmp/scummvm_tony.mmp.in
  A backends/platform/symbian/mmp/scummvm_wintermute.mmp.in
  A common/c++11-compat.h
  A devtools/create_teenagent/static_tables.h
  A devtools/create_teenagent/util.cpp
  A dists/engine-data/wintermute.zip
  A engines/groovie/stuffit.cpp
  A engines/groovie/stuffit.h
  A engines/hopkins/anim.cpp
  A engines/hopkins/anim.h
  A engines/hopkins/computer.cpp
  A engines/hopkins/computer.h
  A engines/hopkins/debugger.cpp
  A engines/hopkins/debugger.h
  A engines/hopkins/detection.cpp
  A engines/hopkins/detection_tables.h
  A engines/hopkins/dialogs.cpp
  A engines/hopkins/dialogs.h
  A engines/hopkins/events.cpp
  A engines/hopkins/events.h
  A engines/hopkins/files.cpp
  A engines/hopkins/files.h
  A engines/hopkins/font.cpp
  A engines/hopkins/font.h
  A engines/hopkins/globals.cpp
  A engines/hopkins/globals.h
  A engines/hopkins/graphics.cpp
  A engines/hopkins/graphics.h
  A engines/hopkins/hopkins.cpp
  A engines/hopkins/hopkins.h
  A engines/hopkins/lines.cpp
  A engines/hopkins/lines.h
  A engines/hopkins/menu.cpp
  A engines/hopkins/menu.h
  A engines/hopkins/module.mk
  A engines/hopkins/objects.cpp
  A engines/hopkins/objects.h
  A engines/hopkins/saveload.cpp
  A engines/hopkins/saveload.h
  A engines/hopkins/script.cpp
  A engines/hopkins/script.h
  A engines/hopkins/sound.cpp
  A engines/hopkins/sound.h
  A engines/hopkins/talk.cpp
  A engines/hopkins/talk.h
  A engines/kyra/sequences_hof.h
  A engines/kyra/sound_digital.h
  A engines/scumm/player_mac.cpp
  A engines/scumm/player_mac.h
  A engines/scumm/player_v3m.cpp
  A engines/scumm/player_v3m.h
  A engines/scumm/player_v5m.cpp
  A engines/scumm/player_v5m.h
  A engines/toltecs/console.cpp
  A engines/toltecs/console.h
  A engines/wintermute/base/base_game_music.cpp
  A engines/wintermute/base/base_game_music.h
  A engines/wintermute/base/base_game_settings.cpp
  A engines/wintermute/base/base_game_settings.h
  A engines/wintermute/base/gfx/osystem/render_ticket.cpp
  A engines/wintermute/base/gfx/osystem/render_ticket.h
  A engines/wintermute/base/save_thumb_helper.cpp
  A engines/wintermute/base/save_thumb_helper.h
  A engines/wintermute/base/timer.cpp
  A engines/wintermute/base/timer.h
  A engines/wintermute/debugger.cpp
  A engines/wintermute/debugger.h
  A graphics/decoders/iff.cpp
  A graphics/decoders/iff.h
  A gui/fluidsynth-dialog.cpp
  A gui/fluidsynth-dialog.h
  A po/be_BY.po
  A po/fi_FI.po
  A test/common/bitstream.h
  R devtools/create_teenagent/md5.cpp
  R engines/parallaction/disk.cpp
  R devtools/create_teenagent/md5.h
  R engines/wintermute/base/file/base_resources.cpp
  R engines/wintermute/base/base_save_thumb_helper.cpp
  R engines/wintermute/base/base_save_thumb_helper.h
  R engines/wintermute/base/file/base_resources.h
  R graphics/iff.cpp
  R graphics/iff.h
    AUTHORS
    COPYRIGHT
    Makefile.common
    NEWS
    README
    audio/decoders/adpcm.cpp
    audio/decoders/adpcm_intern.h
    audio/decoders/aiff.h
    audio/decoders/qdm2.cpp
    audio/decoders/quicktime.cpp
    audio/decoders/quicktime_intern.h
    audio/fmopl.h
    audio/mididrv.h
    audio/midiparser.h
    audio/mods/maxtrax.cpp
    audio/mods/maxtrax.h
    audio/mods/protracker.cpp
    audio/mods/protracker.h
    audio/mods/tfmx.cpp
    audio/mods/tfmx.h
    audio/module.mk
    audio/softsynth/adlib.cpp
    audio/softsynth/fluidsynth.cpp
    audio/softsynth/fmtowns_pc98/towns_midi.cpp
    audio/softsynth/mt32.cpp
    audio/softsynth/mt32/AReverbModel.cpp
    audio/softsynth/mt32/AReverbModel.h
    audio/softsynth/mt32/DelayReverb.cpp
    audio/softsynth/mt32/DelayReverb.h
    audio/softsynth/mt32/FreeverbModel.cpp
    audio/softsynth/mt32/FreeverbModel.h
    audio/softsynth/mt32/LA32Ramp.cpp
    audio/softsynth/mt32/LA32Ramp.h
    audio/softsynth/mt32/Part.cpp
    audio/softsynth/mt32/Part.h
    audio/softsynth/mt32/Partial.cpp
    audio/softsynth/mt32/Partial.h
    audio/softsynth/mt32/PartialManager.cpp
    audio/softsynth/mt32/PartialManager.h
    audio/softsynth/mt32/Poly.cpp
    audio/softsynth/mt32/Poly.h
    audio/softsynth/mt32/Structures.h
    audio/softsynth/mt32/Synth.cpp
    audio/softsynth/mt32/Synth.h
    audio/softsynth/mt32/TVA.cpp
    audio/softsynth/mt32/TVA.h
    audio/softsynth/mt32/TVF.cpp
    audio/softsynth/mt32/TVF.h
    audio/softsynth/mt32/TVP.cpp
    audio/softsynth/mt32/TVP.h
    audio/softsynth/mt32/Tables.cpp
    audio/softsynth/mt32/Tables.h
    audio/softsynth/mt32/mmath.h
    audio/softsynth/mt32/module.mk
    audio/softsynth/mt32/mt32emu.h
    audio/softsynth/opl/dosbox.cpp
    audio/softsynth/opl/mame.cpp
    audio/softsynth/sid.cpp
    backends/fs/ds/ds-fs.h
    backends/graphics/opengl/gltexture.cpp
    backends/graphics/openglsdl/openglsdl-graphics.cpp
    backends/graphics/surfacesdl/surfacesdl-graphics.cpp
    backends/midi/coreaudio.cpp
    backends/midi/seq.cpp
    backends/mixer/sdl/sdl-mixer.cpp
    backends/platform/android/android.h
    backends/platform/android/android.mk
    backends/platform/android/events.cpp
    backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
    backends/platform/android/org/scummvm/scummvm/ScummVMEvents.java
    backends/platform/ds/arm9/source/blitters.cpp
    backends/platform/ds/arm9/source/blitters.h
    backends/platform/ds/arm9/source/cdaudio.cpp
    backends/platform/ds/arm9/source/cdaudio.h
    backends/platform/ds/arm9/source/dsmain.cpp
    backends/platform/ds/arm9/source/dsmain.h
    backends/platform/ds/arm9/source/dsoptions.cpp
    backends/platform/ds/arm9/source/dsoptions.h
    backends/platform/ds/arm9/source/keys.cpp
    backends/platform/ds/arm9/source/keys.h
    backends/platform/ds/arm9/source/scummhelp.cpp
    backends/platform/ds/arm9/source/scummhelp.h
    backends/platform/ds/arm9/source/touchkeyboard.cpp
    backends/platform/ds/arm9/source/touchkeyboard.h
    backends/platform/ds/arm9/source/wordcompletion.cpp
    backends/platform/ds/arm9/source/wordcompletion.h
    backends/platform/iphone/iphone_video.mm
    backends/platform/iphone/osys_main.cpp
    backends/platform/iphone/osys_video.mm
    backends/platform/n64/osys_n64.h
    backends/platform/n64/osys_n64_base.cpp
    backends/platform/ps2/Gs2dScreen.cpp
    backends/platform/ps2/Gs2dScreen.h
    backends/platform/ps2/ps2pad.cpp
    backends/platform/sdl/macosx/appmenu_osx.mm
    backends/platform/sdl/macosx/macosx.cpp
    backends/platform/symbian/AdaptAllMMPs.pl
    backends/platform/symbian/BuildPackageUpload_LocalSettings.pl
    backends/platform/symbian/README
    backends/platform/symbian/S60/ScummVM_S60.mmp.in
    backends/platform/symbian/S60/ScummVM_S60_App.mmp
    backends/platform/symbian/S60v3/ScummVM_A0000658_S60v3.mmp.in
    backends/platform/symbian/S60v3/ScummVM_S60v3.mmp.in
    backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg
    backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg
    backends/platform/symbian/S80/ScummVM_S80.mmp.in
    backends/platform/symbian/S80/ScummVM_S80_App.mmp
    backends/platform/symbian/S90/Scummvm_S90.mmp.in
    backends/platform/symbian/S90/Scummvm_S90_App.mmp
    backends/platform/symbian/UIQ2/ScummVM.rss
    backends/platform/symbian/UIQ3/ScummVM.rss
    backends/platform/symbian/UIQ3/ScummVM_A0000658.rss
    backends/platform/symbian/UIQ3/ScummVM_A0000658_UIQ3.mmp.in
    backends/platform/symbian/UIQ3/ScummVM_UIQ3.mmp.in
    backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg
    backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3_split.pkg
    backends/platform/symbian/UIQ3/scummvm_A0000658_loc.rss
    backends/platform/symbian/mmp/scummvm_agi.mmp.in
    backends/platform/symbian/mmp/scummvm_agos.mmp.in
    backends/platform/symbian/mmp/scummvm_base.mmp.in
    backends/platform/symbian/mmp/scummvm_cine.mmp.in
    backends/platform/symbian/mmp/scummvm_cruise.mmp.in
    backends/platform/symbian/mmp/scummvm_draci.mmp.in
    backends/platform/symbian/mmp/scummvm_drascula.mmp.in
    backends/platform/symbian/mmp/scummvm_gob.mmp.in
    backends/platform/symbian/mmp/scummvm_groovie.mmp.in
    backends/platform/symbian/mmp/scummvm_hugo.mmp.in
    backends/platform/symbian/mmp/scummvm_kyra.mmp.in
    backends/platform/symbian/mmp/scummvm_lastexpress.mmp.in
    backends/platform/symbian/mmp/scummvm_lure.mmp.in
    backends/platform/symbian/mmp/scummvm_m4.mmp.in
    backends/platform/symbian/mmp/scummvm_made.mmp.in
    backends/platform/symbian/mmp/scummvm_mohawk.mmp.in
    backends/platform/symbian/mmp/scummvm_parallaction.mmp.in
    backends/platform/symbian/mmp/scummvm_queen.mmp.in
    backends/platform/symbian/mmp/scummvm_saga.mmp.in
    backends/platform/symbian/mmp/scummvm_sci.mmp.in
    backends/platform/symbian/mmp/scummvm_scumm.mmp.in
    backends/platform/symbian/mmp/scummvm_sky.mmp.in
    backends/platform/symbian/mmp/scummvm_sword1.mmp.in
    backends/platform/symbian/mmp/scummvm_sword2.mmp.in
    backends/platform/symbian/mmp/scummvm_teenagent.mmp.in
    backends/platform/symbian/mmp/scummvm_tinsel.mmp.in
    backends/platform/symbian/mmp/scummvm_toon.mmp.in
    backends/platform/symbian/mmp/scummvm_touche.mmp.in
    backends/platform/symbian/mmp/scummvm_tsage.mmp.in
    backends/platform/symbian/mmp/scummvm_tucker.mmp.in
    backends/platform/symbian/res/ScummVmAif.rss
    backends/platform/symbian/res/scummvm.rss
    backends/platform/symbian/res/scummvm_A0000658.rss
    backends/platform/symbian/src/ScummVm.hrh
    backends/platform/wii/osystem_gfx.cpp
    backends/platform/wince/CEgui/GUIElement.cpp
    backends/platform/wince/CEgui/GUIElement.h
    backends/platform/wince/CEgui/ToolbarHandler.cpp
    backends/updates/macosx/macosx-updates.mm
    base/commandLine.cpp
    common/bufferedstream.h
    common/config-file.cpp
    common/config-file.h
    common/config-manager.h
    common/debug-channels.h
    common/debug.cpp
    common/fft.h
    common/file.cpp
    common/forbidden.h
    common/fs.cpp
    common/func.h
    common/hash-str.h
    common/hashmap.cpp
    common/hashmap.h
    common/iff_container.cpp
    common/iff_container.h
    common/language.h
    common/macresman.cpp
    common/memorypool.h
    common/memstream.h
    common/mutex.cpp
    common/platform.cpp
    common/platform.h
    common/quicktime.cpp
    common/quicktime.h
    common/random.cpp
    common/random.h
    common/rect.h
    common/scummsys.h
    common/singleton.h
    common/str.cpp
    common/stream.cpp
    common/stream.h
    common/taskbar.h
    common/textconsole.cpp
    common/textconsole.h
    common/unzip.cpp
    common/unzip.h
    common/updates.h
    common/util.cpp
    common/util.h
    common/xmlparser.cpp
    common/zlib.cpp
    common/zlib.h
    configure
    devtools/create_kyradat/create_kyradat.cpp
    devtools/create_kyradat/create_kyradat.h
    devtools/create_kyradat/extract.cpp
    devtools/create_kyradat/games.cpp
    devtools/create_kyradat/tables.cpp
    devtools/create_teenagent/create_teenagent.cpp
    devtools/create_teenagent/module.mk
    devtools/create_teenagent/util.h
    devtools/credits.pl
    devtools/scumm-md5.txt
    dists/bada/Res/scummmobile/scummmobile_layout.stx
    dists/debian/copyright
    dists/engine-data/kyra.dat
    dists/macosx/Info.plist
    dists/macosx/Info.plist.in
    dists/scummvm.rc
    dists/scummvm.rc.in
    dists/win32/ScummVM.iss
    dists/win32/migration.bat
    dists/win32/scummvm.nsi
    dists/win32/scummvm.nsi.in
    doc/cz/PrectiMe
    engines/agi/console.cpp
    engines/agi/console.h
    engines/agi/logic.h
    engines/agi/lzw.h
    engines/agi/op_cmd.cpp
    engines/agi/op_test.cpp
    engines/agi/opcodes.cpp
    engines/agi/preagi_winnie.h
    engines/cge/bitmap.cpp
    engines/cge/events.cpp
    engines/cge/snail.cpp
    engines/cge/text.cpp
    engines/cge/vga13h.cpp
    engines/composer/composer.cpp
    engines/composer/composer.h
    engines/composer/detection.cpp
    engines/composer/graphics.cpp
    engines/composer/resource.cpp
    engines/configure.engines
    engines/cruise/linker.h
    engines/cruise/staticres.cpp
    engines/cruise/volume.cpp
    engines/drascula/animation.cpp
    engines/drascula/console.cpp
    engines/drascula/converse.cpp
    engines/drascula/detection.cpp
    engines/drascula/drascula.cpp
    engines/drascula/drascula.h
    engines/drascula/graphics.cpp
    engines/drascula/interface.cpp
    engines/drascula/objects.cpp
    engines/drascula/rooms.cpp
    engines/drascula/saveload.cpp
    engines/dreamweb/backdrop.cpp
    engines/dreamweb/dreamweb.cpp
    engines/dreamweb/dreamweb.h
    engines/dreamweb/keypad.cpp
    engines/dreamweb/monitor.cpp
    engines/dreamweb/newplace.cpp
    engines/dreamweb/object.cpp
    engines/dreamweb/pathfind.cpp
    engines/dreamweb/people.cpp
    engines/dreamweb/print.cpp
    engines/dreamweb/rain.cpp
    engines/dreamweb/saveload.cpp
    engines/dreamweb/sprite.cpp
    engines/dreamweb/stubs.cpp
    engines/dreamweb/titles.cpp
    engines/dreamweb/use.cpp
    engines/dreamweb/vgafades.cpp
    engines/dreamweb/vgagrafx.cpp
    engines/engine.cpp
    engines/engines.mk
    engines/gob/anifile.cpp
    engines/gob/cmpfile.cpp
    engines/gob/detection/tables_geisha.h
    engines/gob/draw.cpp
    engines/gob/expression.cpp
    engines/gob/hotspots.cpp
    engines/gob/inter.h
    engines/gob/inter_v7.cpp
    engines/gob/map_v1.cpp
    engines/gob/mult_v2.cpp
    engines/gob/save/saveconverter.cpp
    engines/gob/save/saveload.h
    engines/gob/sound/adlib.cpp
    engines/gob/sound/sound.cpp
    engines/gob/sound/soundblaster.cpp
    engines/gob/surface.cpp
    engines/gob/surface.h
    engines/groovie/detection.cpp
    engines/groovie/groovie.cpp
    engines/groovie/groovie.h
    engines/groovie/module.mk
    engines/groovie/music.cpp
    engines/groovie/music.h
    engines/groovie/vdx.cpp
    engines/hugo/mouse.cpp
    engines/hugo/parser.cpp
    engines/kyra/chargen.cpp
    engines/kyra/darkmoon.cpp
    engines/kyra/darkmoon.h
    engines/kyra/debugger.cpp
    engines/kyra/debugger.h
    engines/kyra/detection.cpp
    engines/kyra/detection_tables.h
    engines/kyra/eob.cpp
    engines/kyra/eob.h
    engines/kyra/eobcommon.cpp
    engines/kyra/eobcommon.h
    engines/kyra/gui_eob.cpp
    engines/kyra/gui_eob.h
    engines/kyra/gui_hof.cpp
    engines/kyra/gui_lol.cpp
    engines/kyra/gui_lol.h
    engines/kyra/gui_mr.cpp
    engines/kyra/gui_rpg.cpp
    engines/kyra/items_eob.cpp
    engines/kyra/items_hof.cpp
    engines/kyra/items_lok.cpp
    engines/kyra/items_lol.cpp
    engines/kyra/kyra_hof.cpp
    engines/kyra/kyra_hof.h
    engines/kyra/kyra_lok.cpp
    engines/kyra/kyra_lok.h
    engines/kyra/kyra_mr.cpp
    engines/kyra/kyra_mr.h
    engines/kyra/kyra_rpg.cpp
    engines/kyra/kyra_rpg.h
    engines/kyra/kyra_v1.cpp
    engines/kyra/kyra_v1.h
    engines/kyra/lol.cpp
    engines/kyra/lol.h
    engines/kyra/magic_eob.cpp
    engines/kyra/resource.cpp
    engines/kyra/resource.h
    engines/kyra/resource_intern.cpp
    engines/kyra/resource_intern.h
    engines/kyra/saveload.cpp
    engines/kyra/saveload_eob.cpp
    engines/kyra/saveload_lok.cpp
    engines/kyra/saveload_lol.cpp
    engines/kyra/scene_eob.cpp
    engines/kyra/scene_lol.cpp
    engines/kyra/scene_mr.cpp
    engines/kyra/scene_rpg.cpp
    engines/kyra/screen.cpp
    engines/kyra/screen.h
    engines/kyra/screen_eob.cpp
    engines/kyra/screen_eob.h
    engines/kyra/screen_hof.cpp
    engines/kyra/screen_hof.h
    engines/kyra/screen_lol.cpp
    engines/kyra/screen_lol.h
    engines/kyra/screen_v2.cpp
    engines/kyra/screen_v2.h
    engines/kyra/script_eob.cpp
    engines/kyra/script_eob.h
    engines/kyra/script_hof.cpp
    engines/kyra/script_lok.cpp
    engines/kyra/script_lol.cpp
    engines/kyra/script_mr.cpp
    engines/kyra/script_tim.cpp
    engines/kyra/sequences_darkmoon.cpp
    engines/kyra/sequences_eob.cpp
    engines/kyra/sequences_hof.cpp
    engines/kyra/sequences_lok.cpp
    engines/kyra/sequences_lol.cpp
    engines/kyra/sound.cpp
    engines/kyra/sound.h
    engines/kyra/sound_adlib.cpp
    engines/kyra/sound_adlib.h
    engines/kyra/sound_amiga.cpp
    engines/kyra/sound_digital.cpp
    engines/kyra/sound_intern.h
    engines/kyra/sound_lol.cpp
    engines/kyra/sound_midi.cpp
    engines/kyra/sound_towns.cpp
    engines/kyra/sprites_eob.cpp
    engines/kyra/sprites_lol.cpp
    engines/kyra/sprites_rpg.cpp
    engines/kyra/staticres.cpp
    engines/kyra/staticres_eob.cpp
    engines/kyra/staticres_lol.cpp
    engines/kyra/text_hof.cpp
    engines/kyra/text_lol.cpp
    engines/kyra/text_rpg.cpp
    engines/kyra/text_rpg.h
    engines/kyra/timer_eob.cpp
    engines/kyra/timer_lol.cpp
    engines/kyra/vqa.cpp
    engines/lure/hotspots.cpp
    engines/lure/menu.cpp
    engines/lure/room.cpp
    engines/mohawk/console.cpp
    engines/mohawk/cursors.cpp
    engines/mohawk/detection.cpp
    engines/mohawk/detection_tables.h
    engines/mohawk/dialogs.cpp
    engines/mohawk/installer_archive.cpp
    engines/mohawk/livingbooks.cpp
    engines/mohawk/myst.cpp
    engines/mohawk/myst.h
    engines/mohawk/myst_areas.cpp
    engines/mohawk/myst_graphics.cpp
    engines/mohawk/myst_graphics.h
    engines/mohawk/myst_scripts.cpp
    engines/mohawk/myst_scripts.h
    engines/mohawk/myst_stacks/channelwood.cpp
    engines/mohawk/myst_stacks/demo.cpp
    engines/mohawk/myst_stacks/intro.cpp
    engines/mohawk/myst_stacks/mechanical.cpp
    engines/mohawk/myst_stacks/mechanical.h
    engines/mohawk/myst_stacks/myst.cpp
    engines/mohawk/myst_stacks/myst.h
    engines/mohawk/myst_stacks/preview.cpp
    engines/mohawk/myst_stacks/preview.h
    engines/mohawk/myst_stacks/selenitic.cpp
    engines/mohawk/myst_stacks/slides.cpp
    engines/mohawk/myst_stacks/stoneship.cpp
    engines/mohawk/resource.cpp
    engines/mohawk/riven.cpp
    engines/mohawk/riven_external.cpp
    engines/mohawk/video.cpp
    engines/mohawk/video.h
    engines/parallaction/dialogue.cpp
    engines/parallaction/disk.h
    engines/parallaction/disk_br.cpp
    engines/parallaction/disk_ns.cpp
    engines/parallaction/input.cpp
    engines/parallaction/module.mk
    engines/parallaction/parallaction.cpp
    engines/parallaction/parser_br.cpp
    engines/parallaction/parser_ns.cpp
    engines/parallaction/sound_br.cpp
    engines/pegasus/cursor.cpp
    engines/pegasus/detection.cpp
    engines/pegasus/elements.cpp
    engines/pegasus/energymonitor.cpp
    engines/pegasus/interface.cpp
    engines/pegasus/interface.h
    engines/pegasus/items/inventorypicture.h
    engines/pegasus/menu.cpp
    engines/pegasus/movie.cpp
    engines/pegasus/neighborhood/caldoria/caldoria.cpp
    engines/pegasus/neighborhood/mars/mars.cpp
    engines/pegasus/neighborhood/mars/reactor.cpp
    engines/pegasus/neighborhood/neighborhood.cpp
    engines/pegasus/neighborhood/norad/pressuredoor.cpp
    engines/pegasus/neighborhood/prehistoric/prehistoric.cpp
    engines/pegasus/neighborhood/tsa/fulltsa.cpp
    engines/pegasus/neighborhood/wsc/wsc.cpp
    engines/pegasus/pegasus.cpp
    engines/pegasus/pegasus.h
    engines/pegasus/sound.cpp
    engines/pegasus/surface.cpp
    engines/pegasus/surface.h
    engines/pegasus/timers.cpp
    engines/pegasus/timers.h
    engines/plugins_table.h
    engines/queen/display.cpp
    engines/queen/display.h
    engines/queen/journal.cpp
    engines/queen/sound.cpp
    engines/queen/sound.h
    engines/queen/talk.cpp
    engines/saga/detection.cpp
    engines/saga/events.cpp
    engines/saga/music.cpp
    engines/saga/music.h
    engines/saga/resource.cpp
    engines/saga/saga.cpp
    engines/saga/saga.h
    engines/saga/saveload.cpp
    engines/saga/scene.cpp
    engines/saga/sfuncs_ihnm.cpp
    engines/sci/console.cpp
    engines/sci/console.h
    engines/sci/decompressor.cpp
    engines/sci/detection.cpp
    engines/sci/detection_tables.h
    engines/sci/engine/features.cpp
    engines/sci/engine/kernel.h
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kfile.cpp
    engines/sci/engine/kgraphics.cpp
    engines/sci/engine/kgraphics32.cpp
    engines/sci/engine/kmath.cpp
    engines/sci/engine/kpathing.cpp
    engines/sci/engine/ksound.cpp
    engines/sci/engine/kstring.cpp
    engines/sci/engine/message.cpp
    engines/sci/engine/savegame.cpp
    engines/sci/engine/script_patches.cpp
    engines/sci/engine/scriptdebug.cpp
    engines/sci/engine/workarounds.cpp
    engines/sci/event.cpp
    engines/sci/graphics/animate.h
    engines/sci/graphics/cursor.cpp
    engines/sci/graphics/cursor.h
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/menu.cpp
    engines/sci/graphics/palette.cpp
    engines/sci/graphics/portrait.cpp
    engines/sci/graphics/ports.cpp
    engines/sci/parser/vocabulary.cpp
    engines/sci/resource.cpp
    engines/sci/sci.cpp
    engines/sci/sci.h
    engines/sci/sound/drivers/midi.cpp
    engines/sci/sound/midiparser_sci.cpp
    engines/sci/sound/music.cpp
    engines/sci/sound/soundcmd.cpp
    engines/scumm/debugger.cpp
    engines/scumm/detection_tables.h
    engines/scumm/gfx.cpp
    engines/scumm/he/sound_he.cpp
    engines/scumm/imuse/imuse.cpp
    engines/scumm/imuse/imuse.h
    engines/scumm/imuse/imuse_internal.h
    engines/scumm/imuse/imuse_part.cpp
    engines/scumm/insane/insane_ben.cpp
    engines/scumm/insane/insane_enemy.cpp
    engines/scumm/module.mk
    engines/scumm/music.h
    engines/scumm/object.cpp
    engines/scumm/saveload.cpp
    engines/scumm/saveload.h
    engines/scumm/script.cpp
    engines/scumm/scumm-md5.h
    engines/scumm/scumm.cpp
    engines/scumm/sound.cpp
    engines/sky/compact.cpp
    engines/sword1/detection.cpp
    engines/sword2/sword2.cpp
    engines/sword25/gfx/graphicengine.cpp
    engines/sword25/util/lua/ldo.cpp
    engines/sword25/util/lua/llex.cpp
    engines/sword25/util/lua/lua.h
    engines/sword25/util/lua/luaconf.h
    engines/teenagent/actor.cpp
    engines/teenagent/actor.h
    engines/teenagent/animation.cpp
    engines/teenagent/animation.h
    engines/teenagent/callbacks.cpp
    engines/teenagent/detection.cpp
    engines/teenagent/dialog.cpp
    engines/teenagent/dialog.h
    engines/teenagent/font.cpp
    engines/teenagent/font.h
    engines/teenagent/inventory.cpp
    engines/teenagent/inventory.h
    engines/teenagent/music.cpp
    engines/teenagent/music.h
    engines/teenagent/objects.cpp
    engines/teenagent/objects.h
    engines/teenagent/pack.cpp
    engines/teenagent/resources.cpp
    engines/teenagent/resources.h
    engines/teenagent/scene.cpp
    engines/teenagent/scene.h
    engines/teenagent/segment.h
    engines/teenagent/surface.cpp
    engines/teenagent/surface.h
    engines/teenagent/surface_list.cpp
    engines/teenagent/surface_list.h
    engines/teenagent/teenagent.cpp
    engines/teenagent/teenagent.h
    engines/testbed/config-params.cpp
    engines/testbed/config.cpp
    engines/testbed/sound.cpp
    engines/tinsel/actors.cpp
    engines/tinsel/anim.cpp
    engines/tinsel/bg.cpp
    engines/tinsel/bmv.cpp
    engines/tinsel/cursor.cpp
    engines/tinsel/detection_tables.h
    engines/tinsel/dialogs.cpp
    engines/tinsel/dw.h
    engines/tinsel/events.cpp
    engines/tinsel/events.h
    engines/tinsel/faders.cpp
    engines/tinsel/faders.h
    engines/tinsel/font.cpp
    engines/tinsel/graphics.cpp
    engines/tinsel/handle.cpp
    engines/tinsel/multiobj.cpp
    engines/tinsel/music.cpp
    engines/tinsel/object.cpp
    engines/tinsel/palette.cpp
    engines/tinsel/palette.h
    engines/tinsel/pcode.cpp
    engines/tinsel/play.cpp
    engines/tinsel/polygons.cpp
    engines/tinsel/rince.cpp
    engines/tinsel/saveload.cpp
    engines/tinsel/savescn.cpp
    engines/tinsel/scene.cpp
    engines/tinsel/sched.cpp
    engines/tinsel/sound.cpp
    engines/tinsel/sound.h
    engines/tinsel/strres.cpp
    engines/tinsel/text.cpp
    engines/tinsel/timers.cpp
    engines/tinsel/tinlib.cpp
    engines/tinsel/tinsel.cpp
    engines/tinsel/tinsel.h
    engines/toltecs/detection.cpp
    engines/toltecs/menu.cpp
    engines/toltecs/menu.h
    engines/toltecs/microtiles.cpp
    engines/toltecs/module.mk
    engines/toltecs/movie.cpp
    engines/toltecs/movie.h
    engines/toltecs/palette.cpp
    engines/toltecs/palette.h
    engines/toltecs/resource.cpp
    engines/toltecs/resource.h
    engines/toltecs/screen.cpp
    engines/toltecs/screen.h
    engines/toltecs/script.cpp
    engines/toltecs/script.h
    engines/toltecs/sound.cpp
    engines/toltecs/toltecs.cpp
    engines/toltecs/toltecs.h
    engines/tony/custom.cpp
    engines/tony/debugger.cpp
    engines/tony/detection.cpp
    engines/tony/detection_tables.h
    engines/tony/font.cpp
    engines/tony/font.h
    engines/tony/game.cpp
    engines/tony/game.h
    engines/tony/gfxcore.cpp
    engines/tony/gfxcore.h
    engines/tony/gfxengine.cpp
    engines/tony/globals.h
    engines/tony/input.cpp
    engines/tony/input.h
    engines/tony/inventory.cpp
    engines/tony/inventory.h
    engines/tony/loc.cpp
    engines/tony/loc.h
    engines/tony/mpal/expr.cpp
    engines/tony/mpal/expr.h
    engines/tony/mpal/loadmpc.cpp
    engines/tony/mpal/lzo.cpp
    engines/tony/mpal/memory.cpp
    engines/tony/mpal/mpal.cpp
    engines/tony/mpal/mpal.h
    engines/tony/mpal/mpaldll.h
    engines/tony/mpal/mpalutils.h
    engines/tony/resid.h
    engines/tony/sound.cpp
    engines/tony/tony.cpp
    engines/tony/tony.h
    engines/tony/tonychar.cpp
    engines/tony/window.cpp
    engines/tony/window.h
    engines/toon/toon.h
    engines/touche/console.cpp
    engines/touche/console.h
    engines/touche/menu.cpp
    engines/touche/resource.cpp
    engines/touche/touche.cpp
    engines/touche/touche.h
    engines/tsage/events.h
    engines/tsage/ringworld2/ringworld2_scenes0.cpp
    engines/tsage/ringworld2/ringworld2_scenes1.cpp
    engines/wintermute/ad/ad_actor.cpp
    engines/wintermute/ad/ad_actor.h
    engines/wintermute/ad/ad_entity.cpp
    engines/wintermute/ad/ad_entity.h
    engines/wintermute/ad/ad_game.cpp
    engines/wintermute/ad/ad_game.h
    engines/wintermute/ad/ad_inventory.cpp
    engines/wintermute/ad/ad_inventory.h
    engines/wintermute/ad/ad_inventory_box.cpp
    engines/wintermute/ad/ad_inventory_box.h
    engines/wintermute/ad/ad_item.cpp
    engines/wintermute/ad/ad_item.h
    engines/wintermute/ad/ad_layer.cpp
    engines/wintermute/ad/ad_layer.h
    engines/wintermute/ad/ad_node_state.cpp
    engines/wintermute/ad/ad_object.cpp
    engines/wintermute/ad/ad_object.h
    engines/wintermute/ad/ad_path.cpp
    engines/wintermute/ad/ad_path.h
    engines/wintermute/ad/ad_path_point.cpp
    engines/wintermute/ad/ad_path_point.h
    engines/wintermute/ad/ad_region.cpp
    engines/wintermute/ad/ad_region.h
    engines/wintermute/ad/ad_response.cpp
    engines/wintermute/ad/ad_response.h
    engines/wintermute/ad/ad_response_box.cpp
    engines/wintermute/ad/ad_response_box.h
    engines/wintermute/ad/ad_response_context.cpp
    engines/wintermute/ad/ad_response_context.h
    engines/wintermute/ad/ad_rot_level.cpp
    engines/wintermute/ad/ad_rot_level.h
    engines/wintermute/ad/ad_scale_level.cpp
    engines/wintermute/ad/ad_scale_level.h
    engines/wintermute/ad/ad_scene.cpp
    engines/wintermute/ad/ad_scene.h
    engines/wintermute/ad/ad_scene_node.cpp
    engines/wintermute/ad/ad_scene_state.cpp
    engines/wintermute/ad/ad_scene_state.h
    engines/wintermute/ad/ad_sentence.cpp
    engines/wintermute/ad/ad_sentence.h
    engines/wintermute/ad/ad_sprite_set.cpp
    engines/wintermute/ad/ad_sprite_set.h
    engines/wintermute/ad/ad_talk_def.cpp
    engines/wintermute/ad/ad_talk_def.h
    engines/wintermute/ad/ad_talk_holder.cpp
    engines/wintermute/ad/ad_talk_holder.h
    engines/wintermute/ad/ad_talk_node.cpp
    engines/wintermute/ad/ad_talk_node.h
    engines/wintermute/ad/ad_waypoint_group.cpp
    engines/wintermute/ad/ad_waypoint_group.h
    engines/wintermute/base/base.cpp
    engines/wintermute/base/base.h
    engines/wintermute/base/base_active_rect.cpp
    engines/wintermute/base/base_active_rect.h
    engines/wintermute/base/base_dynamic_buffer.cpp
    engines/wintermute/base/base_dynamic_buffer.h
    engines/wintermute/base/base_engine.cpp
    engines/wintermute/base/base_engine.h
    engines/wintermute/base/base_fader.cpp
    engines/wintermute/base/base_fader.h
    engines/wintermute/base/base_file_manager.cpp
    engines/wintermute/base/base_file_manager.h
    engines/wintermute/base/base_frame.cpp
    engines/wintermute/base/base_frame.h
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h
    engines/wintermute/base/base_keyboard_state.cpp
    engines/wintermute/base/base_keyboard_state.h
    engines/wintermute/base/base_named_object.cpp
    engines/wintermute/base/base_named_object.h
    engines/wintermute/base/base_object.cpp
    engines/wintermute/base/base_object.h
    engines/wintermute/base/base_parser.cpp
    engines/wintermute/base/base_parser.h
    engines/wintermute/base/base_persistence_manager.cpp
    engines/wintermute/base/base_persistence_manager.h
    engines/wintermute/base/base_point.h
    engines/wintermute/base/base_quick_msg.cpp
    engines/wintermute/base/base_quick_msg.h
    engines/wintermute/base/base_region.cpp
    engines/wintermute/base/base_region.h
    engines/wintermute/base/base_script_holder.cpp
    engines/wintermute/base/base_script_holder.h
    engines/wintermute/base/base_scriptable.cpp
    engines/wintermute/base/base_scriptable.h
    engines/wintermute/base/base_sprite.cpp
    engines/wintermute/base/base_sprite.h
    engines/wintermute/base/base_string_table.cpp
    engines/wintermute/base/base_sub_frame.cpp
    engines/wintermute/base/base_sub_frame.h
    engines/wintermute/base/base_surface_storage.cpp
    engines/wintermute/base/base_surface_storage.h
    engines/wintermute/base/base_transition_manager.cpp
    engines/wintermute/base/base_transition_manager.h
    engines/wintermute/base/base_viewport.cpp
    engines/wintermute/base/base_viewport.h
    engines/wintermute/base/file/base_disk_file.cpp
    engines/wintermute/base/file/base_file.h
    engines/wintermute/base/file/base_file_entry.cpp
    engines/wintermute/base/file/base_package.cpp
    engines/wintermute/base/file/base_package.h
    engines/wintermute/base/file/base_save_thumb_file.cpp
    engines/wintermute/base/font/base_font.cpp
    engines/wintermute/base/font/base_font.h
    engines/wintermute/base/font/base_font_bitmap.cpp
    engines/wintermute/base/font/base_font_bitmap.h
    engines/wintermute/base/font/base_font_storage.cpp
    engines/wintermute/base/font/base_font_truetype.cpp
    engines/wintermute/base/font/base_font_truetype.h
    engines/wintermute/base/gfx/base_image.cpp
    engines/wintermute/base/gfx/base_image.h
    engines/wintermute/base/gfx/base_renderer.cpp
    engines/wintermute/base/gfx/base_renderer.h
    engines/wintermute/base/gfx/base_surface.cpp
    engines/wintermute/base/gfx/base_surface.h
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_surface_osystem.h
    engines/wintermute/base/particles/part_emitter.cpp
    engines/wintermute/base/particles/part_emitter.h
    engines/wintermute/base/particles/part_particle.cpp
    engines/wintermute/base/particles/part_particle.h
    engines/wintermute/base/saveload.cpp
    engines/wintermute/base/scriptables/script.cpp
    engines/wintermute/base/scriptables/script.h
    engines/wintermute/base/scriptables/script_engine.cpp
    engines/wintermute/base/scriptables/script_engine.h
    engines/wintermute/base/scriptables/script_ext_array.cpp
    engines/wintermute/base/scriptables/script_ext_array.h
    engines/wintermute/base/scriptables/script_ext_date.cpp
    engines/wintermute/base/scriptables/script_ext_file.cpp
    engines/wintermute/base/scriptables/script_ext_file.h
    engines/wintermute/base/scriptables/script_ext_mem_buffer.cpp
    engines/wintermute/base/scriptables/script_ext_mem_buffer.h
    engines/wintermute/base/scriptables/script_ext_string.cpp
    engines/wintermute/base/scriptables/script_ext_string.h
    engines/wintermute/base/scriptables/script_stack.cpp
    engines/wintermute/base/scriptables/script_stack.h
    engines/wintermute/base/scriptables/script_value.cpp
    engines/wintermute/base/scriptables/script_value.h
    engines/wintermute/base/sound/base_sound.cpp
    engines/wintermute/base/sound/base_sound.h
    engines/wintermute/base/sound/base_sound_buffer.cpp
    engines/wintermute/base/sound/base_sound_buffer.h
    engines/wintermute/base/sound/base_sound_manager.cpp
    engines/wintermute/base/sound/base_sound_manager.h
    engines/wintermute/dcgf.h
    engines/wintermute/detection.cpp
    engines/wintermute/detection_tables.h
    engines/wintermute/graphics/transparent_surface.cpp
    engines/wintermute/graphics/transparent_surface.h
    engines/wintermute/module.mk
    engines/wintermute/persistent.h
    engines/wintermute/platform_osystem.cpp
    engines/wintermute/platform_osystem.h
    engines/wintermute/system/sys_class.cpp
    engines/wintermute/system/sys_class_registry.cpp
    engines/wintermute/ui/ui_button.cpp
    engines/wintermute/ui/ui_button.h
    engines/wintermute/ui/ui_edit.cpp
    engines/wintermute/ui/ui_edit.h
    engines/wintermute/ui/ui_entity.cpp
    engines/wintermute/ui/ui_entity.h
    engines/wintermute/ui/ui_object.cpp
    engines/wintermute/ui/ui_object.h
    engines/wintermute/ui/ui_text.cpp
    engines/wintermute/ui/ui_text.h
    engines/wintermute/ui/ui_tiled_image.cpp
    engines/wintermute/ui/ui_tiled_image.h
    engines/wintermute/ui/ui_window.cpp
    engines/wintermute/ui/ui_window.h
    engines/wintermute/utils/string_util.cpp
    engines/wintermute/utils/utils.cpp
    engines/wintermute/video/video_player.cpp
    engines/wintermute/video/video_player.h
    engines/wintermute/video/video_theora_player.cpp
    engines/wintermute/video/video_theora_player.h
    engines/wintermute/wintermute.cpp
    engines/wintermute/wintermute.h
    graphics/decoders/bmp.h
    graphics/decoders/jpeg.cpp
    graphics/decoders/jpeg.h
    graphics/decoders/pict.cpp
    graphics/decoders/png.cpp
    graphics/decoders/png.h
    graphics/decoders/tga.h
    graphics/module.mk
    graphics/primitives.cpp
    graphics/primitives.h
    graphics/scaler.cpp
    graphics/scaler/aspect.cpp
    graphics/thumbnail.cpp
    graphics/thumbnail.h
    gui/ThemeEngine.h
    gui/about.cpp
    gui/browser.cpp
    gui/browser.h
    gui/browser_osx.mm
    gui/credits.h
    gui/debugger.cpp
    gui/debugger.h
    gui/launcher.cpp
    gui/module.mk
    gui/options.cpp
    gui/options.h
    gui/saveload-dialog.cpp
    gui/themes/default.inc
    gui/themes/scummclassic.zip
    gui/themes/scummclassic/THEMERC
    gui/themes/scummclassic/classic_layout.stx
    gui/themes/scummclassic/classic_layout_lowres.stx
    gui/themes/scummmodern.zip
    gui/themes/scummmodern/THEMERC
    gui/themes/scummmodern/scummmodern_layout.stx
    gui/themes/scummmodern/scummmodern_layout_lowres.stx
    gui/themes/translations.dat
    gui/widget.cpp
    gui/widgets/list.cpp
    gui/widgets/list.h
    gui/widgets/popup.cpp
    po/POTFILES
    po/ca_ES.po
    po/cs_CZ.po
    po/da_DA.po
    po/de_DE.po
    po/es_ES.po
    po/eu.po
    po/fr_FR.po
    po/gl_ES.po
    po/hu_HU.po
    po/it_IT.po
    po/nb_NO.po
    po/nn_NO.po
    po/pl_PL.po
    po/pt_BR.po
    po/ru_RU.po
    po/scummvm.pot
    po/se_SE.po
    po/uk_UA.po
    ports.mk
    test/common/bufferedseekablereadstream.h
    video/avi_decoder.cpp
    video/avi_decoder.h
    video/bink_decoder.cpp
    video/bink_decoder.h
    video/codecs/cdtoons.h
    video/codecs/cinepak.cpp
    video/codecs/cinepak.h
    video/codecs/codec.h
    video/codecs/indeo3.h
    video/codecs/mjpeg.h
    video/codecs/msrle.h
    video/codecs/msvideo1.h
    video/codecs/qtrle.h
    video/codecs/rpza.cpp
    video/codecs/rpza.h
    video/codecs/smc.h
    video/codecs/svq1.cpp
    video/codecs/svq1.h
    video/codecs/truemotion1.h
    video/coktel_decoder.cpp
    video/flic_decoder.cpp
    video/flic_decoder.h
    video/psx_decoder.cpp
    video/qt_decoder.cpp
    video/qt_decoder.h
    video/smk_decoder.cpp
    video/theora_decoder.h
    video/video_decoder.cpp
    video/video_decoder.h



diff --cc engines/configure.engines
index c7f142b,db01777..cdacb60
--- a/engines/configure.engines
+++ b/engines/configure.engines
@@@ -27,9 -28,8 +28,9 @@@ add_engine mohawk "Mohawk" yes "cstime 
  add_engine cstime "Where in Time is Carmen Sandiego?" no
  add_engine riven "Riven: The Sequel to Myst" no "" "" "16bit"
  add_engine myst "Myst" no "" "" "16bit"
 +add_engine neverhood "Neverhood" no
  add_engine parallaction "Parallaction" yes
- add_engine pegasus "The Journeyman Project: Pegasus Prime" no "" "" "16bit"
+ add_engine pegasus "The Journeyman Project: Pegasus Prime" yes "" "" "16bit"
  add_engine queen "Flight of the Amazon Queen" yes
  add_engine saga "SAGA" yes "ihnm saga2" "ITE"
  add_engine ihnm "IHNM" yes


Commit: 78e0d6a3f1bd0ee050e5cd0ca3599f86dcf25813
    https://github.com/scummvm/scummvm/commit/78e0d6a3f1bd0ee050e5cd0ca3599f86dcf25813
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T11:49:19-07:00

Commit Message:
NEVERHOOD: Move module files to own subdirectory

Changed paths:
  A engines/neverhood/modules/module1000.cpp
  A engines/neverhood/modules/module1000.h
  A engines/neverhood/modules/module1100.cpp
  A engines/neverhood/modules/module1100.h
  A engines/neverhood/modules/module1200.cpp
  A engines/neverhood/modules/module1200.h
  A engines/neverhood/modules/module1300.cpp
  A engines/neverhood/modules/module1300.h
  A engines/neverhood/modules/module1400.cpp
  A engines/neverhood/modules/module1400.h
  A engines/neverhood/modules/module1500.cpp
  A engines/neverhood/modules/module1500.h
  A engines/neverhood/modules/module1600.cpp
  A engines/neverhood/modules/module1600.h
  A engines/neverhood/modules/module1700.cpp
  A engines/neverhood/modules/module1700.h
  A engines/neverhood/modules/module1800.cpp
  A engines/neverhood/modules/module1800.h
  A engines/neverhood/modules/module1900.cpp
  A engines/neverhood/modules/module1900.h
  A engines/neverhood/modules/module2000.cpp
  A engines/neverhood/modules/module2000.h
  A engines/neverhood/modules/module2100.cpp
  A engines/neverhood/modules/module2100.h
  A engines/neverhood/modules/module2200.cpp
  A engines/neverhood/modules/module2200.h
  A engines/neverhood/modules/module2300.cpp
  A engines/neverhood/modules/module2300.h
  A engines/neverhood/modules/module2400.cpp
  A engines/neverhood/modules/module2400.h
  A engines/neverhood/modules/module2500.cpp
  A engines/neverhood/modules/module2500.h
  A engines/neverhood/modules/module2600.cpp
  A engines/neverhood/modules/module2600.h
  A engines/neverhood/modules/module2700.cpp
  A engines/neverhood/modules/module2700.h
  A engines/neverhood/modules/module2800.cpp
  A engines/neverhood/modules/module2800.h
  A engines/neverhood/modules/module2900.cpp
  A engines/neverhood/modules/module2900.h
  A engines/neverhood/modules/module3000.cpp
  A engines/neverhood/modules/module3000.h
  R engines/neverhood/module1000.cpp
  R engines/neverhood/module1000.h
  R engines/neverhood/module1100.cpp
  R engines/neverhood/module1100.h
  R engines/neverhood/module1200.cpp
  R engines/neverhood/module1200.h
  R engines/neverhood/module1300.cpp
  R engines/neverhood/module1300.h
  R engines/neverhood/module1400.cpp
  R engines/neverhood/module1400.h
  R engines/neverhood/module1500.cpp
  R engines/neverhood/module1500.h
  R engines/neverhood/module1600.cpp
  R engines/neverhood/module1600.h
  R engines/neverhood/module1700.cpp
  R engines/neverhood/module1700.h
  R engines/neverhood/module1800.cpp
  R engines/neverhood/module1800.h
  R engines/neverhood/module1900.cpp
  R engines/neverhood/module1900.h
  R engines/neverhood/module2000.cpp
  R engines/neverhood/module2000.h
  R engines/neverhood/module2100.cpp
  R engines/neverhood/module2100.h
  R engines/neverhood/module2200.cpp
  R engines/neverhood/module2200.h
  R engines/neverhood/module2300.cpp
  R engines/neverhood/module2300.h
  R engines/neverhood/module2400.cpp
  R engines/neverhood/module2400.h
  R engines/neverhood/module2500.cpp
  R engines/neverhood/module2500.h
  R engines/neverhood/module2600.cpp
  R engines/neverhood/module2600.h
  R engines/neverhood/module2700.cpp
  R engines/neverhood/module2700.h
  R engines/neverhood/module2800.cpp
  R engines/neverhood/module2800.h
  R engines/neverhood/module2900.cpp
  R engines/neverhood/module2900.h
  R engines/neverhood/module3000.cpp
  R engines/neverhood/module3000.h
    engines/neverhood/detection.cpp
    engines/neverhood/gamemodule.cpp
    engines/neverhood/module.cpp
    engines/neverhood/module.mk



diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp
index e5bfd29..4f70c63 100644
--- a/engines/neverhood/detection.cpp
+++ b/engines/neverhood/detection.cpp
@@ -235,4 +235,3 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target,
 #else
 	REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine);
 #endif
-
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 99aea5d..49682b0 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -24,27 +24,27 @@
 
 #include "neverhood/graphics.h"
 #include "neverhood/menumodule.h"
-#include "neverhood/module1000.h"
-#include "neverhood/module1100.h"
-#include "neverhood/module1200.h"
-#include "neverhood/module1300.h"
-#include "neverhood/module1400.h"
-#include "neverhood/module1500.h"
-#include "neverhood/module1600.h"
-#include "neverhood/module1700.h"
-#include "neverhood/module1800.h"
-#include "neverhood/module1900.h"
-#include "neverhood/module2000.h"
-#include "neverhood/module2100.h"
-#include "neverhood/module2200.h"
-#include "neverhood/module2300.h"
-#include "neverhood/module2400.h"
-#include "neverhood/module2500.h"
-#include "neverhood/module2600.h"
-#include "neverhood/module2700.h"
-#include "neverhood/module2800.h"
-#include "neverhood/module2900.h"
-#include "neverhood/module3000.h"
+#include "neverhood/modules/module1000.h"
+#include "neverhood/modules/module1100.h"
+#include "neverhood/modules/module1200.h"
+#include "neverhood/modules/module1300.h"
+#include "neverhood/modules/module1400.h"
+#include "neverhood/modules/module1500.h"
+#include "neverhood/modules/module1600.h"
+#include "neverhood/modules/module1700.h"
+#include "neverhood/modules/module1800.h"
+#include "neverhood/modules/module1900.h"
+#include "neverhood/modules/module2000.h"
+#include "neverhood/modules/module2100.h"
+#include "neverhood/modules/module2200.h"
+#include "neverhood/modules/module2300.h"
+#include "neverhood/modules/module2400.h"
+#include "neverhood/modules/module2500.h"
+#include "neverhood/modules/module2600.h"
+#include "neverhood/modules/module2700.h"
+#include "neverhood/modules/module2800.h"
+#include "neverhood/modules/module2900.h"
+#include "neverhood/modules/module3000.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp
index 93b4134..e384b5a 100644
--- a/engines/neverhood/module.cpp
+++ b/engines/neverhood/module.cpp
@@ -23,8 +23,8 @@
 #include "neverhood/module.h"
 #include "neverhood/navigationscene.h"
 #include "neverhood/smackerscene.h"
-#include "neverhood/module1000.h"
-#include "neverhood/module1500.h"
+#include "neverhood/modules/module1000.h"
+#include "neverhood/modules/module1500.h"
 
 namespace Neverhood {
 
diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk
index 59effb5..c7bfbb6 100644
--- a/engines/neverhood/module.mk
+++ b/engines/neverhood/module.mk
@@ -13,27 +13,27 @@ MODULE_OBJS = \
 	menumodule.o \
 	microtiles.o \
 	module.o \
-	module1000.o \
-	module1100.o \
-	module1200.o \
-	module1300.o \
-	module1400.o \
-	module1500.o \
-	module1600.o \
-	module1700.o \
-	module1800.o \
-	module1900.o \
-	module2000.o \
-	module2100.o \
-	module2200.o \
-	module2300.o \
-	module2400.o \
-	module2500.o \
-	module2600.o \
-	module2700.o \
-	module2800.o \
-	module2900.o \
-	module3000.o \
+	modules/module1000.o \
+	modules/module1100.o \
+	modules/module1200.o \
+	modules/module1300.o \
+	modules/module1400.o \
+	modules/module1500.o \
+	modules/module1600.o \
+	modules/module1700.o \
+	modules/module1800.o \
+	modules/module1900.o \
+	modules/module2000.o \
+	modules/module2100.o \
+	modules/module2200.o \
+	modules/module2300.o \
+	modules/module2400.o \
+	modules/module2500.o \
+	modules/module2600.o \
+	modules/module2700.o \
+	modules/module2800.o \
+	modules/module2900.o \
+	modules/module3000.o \
 	mouse.o \
 	navigationscene.o \
 	neverhood.o \
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
deleted file mode 100644
index 096072b..0000000
--- a/engines/neverhood/module1000.cpp
+++ /dev/null
@@ -1,1699 +0,0 @@
-/* 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/module1000.h"
-
-namespace Neverhood {
-
-Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	debug("Create Module1000(%d)", which);
-
-	_musicFileHash = getGlobalVar(V_ENTRANCE_OPEN) ? 0x81106480 : 0x00103144;		
-
-	_vm->_soundMan->addMusic(0x03294419, 0x061880C6);
-	_vm->_soundMan->addMusic(0x03294419, _musicFileHash);
-
-	if (which < 0)
-		createScene(_vm->gameState().sceneNum, -1);
-	else if (which == 0)
-		createScene(0, 0);
-	else if (which == 1)
-		createScene(1, 1);
-
-}
-
-Module1000::~Module1000() {
-	_vm->_soundMan->deleteMusicGroup(0x03294419);
-}
-
-void Module1000::createScene(int sceneNum, int which) {
-	debug("Module1000::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 0:
-		_vm->gameState().sceneNum = 0;
-		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
-		_childObject = new Scene1001(_vm, this, which);
-		break;
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
-		_childObject = new Scene1002(_vm, this, which);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		_vm->_soundMan->startMusic(0x061880C6, 0, 0);
-		createStaticScene(0xC084110C, 0x41108C00);
-		break;
-	case 3:
-		_vm->gameState().sceneNum = 3;
-		_vm->_soundMan->stopMusic(0x061880C6, 0, 2);
-		_childObject = new Scene1004(_vm, this, which);
-		break;
-	case 4:
-		_vm->gameState().sceneNum = 4;
-		_vm->_soundMan->stopMusic(0x061880C6, 0, 0);
-		_vm->_soundMan->startMusic(_musicFileHash, 0, 0);
-		_childObject = new Scene1005(_vm, this, which);
-		break;
-	}
-	SetUpdateHandler(&Module1000::updateScene);
-	_childObject->handleUpdate();
-}
-
-void Module1000::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 0:
-			if (_moduleResult == 2)
-				createScene(2, 0);
-			else
-				createScene(1, 0);
-			break;
-		case 1:
-			if (_moduleResult == 1)
-				leaveModule(0);
-			else if (_moduleResult == 2) {
-				if (_vm->isDemo())
-					// Demo version returns to the same scene
-					createScene(1, 2);
-				else
-					createScene(3, 0);
-			} else
-				createScene(0, 1);
-			break;
-		case 2:
-			createScene(0, 2);
-			break;
-		case 3:
-			if (_moduleResult == 1)
-				createScene(4, 0);
-			else
-				createScene(1, 2);
-			break;
-		case 4:
-			_vm->_soundMan->stopMusic(_musicFileHash, 0, 1);
-			createScene(3, 1);
-			break;
-		}
-	}
-}
-
-// Scene1001			
-
-AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100) {
-	
-	createSurface(800, 137, 242);
-	_x = 726;
-	_y = 440;
-	stShowIdleDoor();
-	loadSound(1, 0xED403E03);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1001Door::handleMessage);
-}
-
-uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2000:
-		hammerHitsDoor();
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return 0;
-}
-
-void AsScene1001Door::hammerHitsDoor() {
-	switch (getGlobalVar(V_DOOR_STATUS)) {
-	case 0:
-	case 1:
-		playSound(0, 0x65482F03);
-		startAnimation(0x624C0498, 1, 3);
-		NextState(&AsScene1001Door::stShowIdleDoor);		
-		break;
-	case 2:
-		playSound(1);
-		startAnimation(0x624C0498, 6, 6);
-		NextState(&AsScene1001Door::stBustedDoorMove);		
-		break;
-	default:
-		// Nothing
-		break;		
-	}
-	incGlobalVar(V_DOOR_STATUS, 1);
-}
-
-void AsScene1001Door::stShowIdleDoor() {
-	switch (getGlobalVar(V_DOOR_STATUS)) {
-	case 1:
-		startAnimation(0x624C0498, 4, -1);
-		_newStickFrameIndex = 4;
-		break;
-	case 2:
-		startAnimation(0x624C0498, 1, -1);
-		_newStickFrameIndex = 1;
-		break;
-	case 3:
-		stopAnimation();
-		setVisible(false);
-		break;
-	default:
-		startAnimation(0x624C0498, 0, -1);
-		_newStickFrameIndex = 0;
-		break;
-	}
-}
-
-void AsScene1001Door::stBustedDoorMove() {
-	setGlobalVar(V_DOOR_BUSTED, 1);
-	startAnimation(0x624C0498, 6, 6);
-	NextState(&AsScene1001Door::stBustedDoorGone);
-	_x = 30;
-}
-
-void AsScene1001Door::stBustedDoorGone() {
-	playSound(0);
-	stopAnimation();
-	setVisible(false);	
-}
-	
-AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor)
-	: AnimatedSprite(vm, 1100), _asDoor(asDoor) {
-
-	_x = 547;
-	_y = 206;
-	createSurface(900, 177, 192);
-	startAnimation(0x022C90D4, -1, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1001Hammer::handleMessage);
-}
-
-uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x00352100)
-			sendMessage(_asDoor, 0x2000, 0);
-		else if (param.asInteger() == 0x0A1A0109)
-			playSound(0, 0x66410886);
-		break;
-	case 0x2000:
-		startAnimation(0x022C90D4, 1, -1);
-		playSound(0, 0xE741020A);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-		break;
-	}
-	return 0;
-}
-
-AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200) {
-
-	_x = 320;
-	_y = 240;
-	createSurface(100, 66, 129);
-	startAnimation(0xC68C2299, 0, -1);
-	_newStickFrameIndex = 0;
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1001Window::handleMessage);
-}
-
-uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x0E0A1410)
-			playSound(0, 0x60803F10);
-		break;
-	case 0x2001:
-		startAnimation(0xC68C2299, 0, -1);
-		break;
-	case 0x3002:
-		SetMessageHandler(NULL);
-		setGlobalVar(V_WINDOW_OPEN, 1);
-		setVisible(false);
-		break;
-	}
-	return 0;
-}
-
-AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
-	
-	createSurface(1010, 71, 73);
-	setDoDeltaX(deltaXType);
-	startAnimation(0x04A98C36, 0, -1);
-	_newStickFrameIndex = 0;
-	_x = x;
-	_y = y;
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1001Lever::handleMessage);
-}
-
-uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x00C0C444)
-			sendMessage(_parentScene, 0x480F, 0);
-		else if (param.asInteger() == 0xC41A02C0)
-			playSound(0, 0x40581882);
-		break;
-	case 0x1011:
-		sendMessage(_parentScene, 0x4826, 0);
-		messageResult = 1;
-		break;
-	case 0x3002:
-		startAnimation(0x04A98C36, 0, -1);
-		_newStickFrameIndex = 0;
-		break;
-	case 0x480F:
-		startAnimation(0x04A98C36, 0, -1);
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-	
-SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash)
-	: StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _countdown(0) {
-
-	_priority = 1100;
-	_soundFileHash = soundFileHash ? soundFileHash : 0x44141000; 
-	setVisible(false);
-	SetUpdateHandler(&SsCommonButtonSprite::update);
-	SetMessageHandler(&SsCommonButtonSprite::handleMessage);
-}
-	
-void SsCommonButtonSprite::update() {
-	if (_countdown != 0 && (--_countdown) == 0)
-		setVisible(false);
-}
-	
-uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x480B:
-		sendMessage(_parentScene, 0x480B, 0);
-		setVisible(true);
-		_countdown = 8;
-		playSound(0, _soundFileHash);
-		break;
-	}
-	return messageResult;
-}
-		
-Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _asDoor(NULL), _asWindow(NULL) {
-
-	Sprite *tempSprite;
-
-	SetMessageHandler(&Scene1001::handleMessage);
-	
-	setHitRects(0x004B4860);
-	setBackground(0x4086520E);
-	setPalette(0x4086520E);
-	insertScreenMouse(0x6520A400);
-	
-	if (which < 0) {
-		// Restoring game
-		setRectList(0x004B49F0);
-		insertKlaymen<KmScene1001>(200, 433);
-		setMessageList(0x004B4888);
-	} else if (which == 1) {
-		// Klaymen entering from the right
-		setRectList(0x004B49F0);
-		insertKlaymen<KmScene1001>(640, 433);
-		setMessageList(0x004B4898);
-	} else if (which == 2) {
-		// Klaymen returning from looking through the window
-		setRectList(0x004B49F0);
-		if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) {
-			insertKlaymen<KmScene1001>(390, 433);
-			_klaymen->setDoDeltaX(1);
-		} else {
-			insertKlaymen<KmScene1001>(300, 433);
-		}
-		setMessageList(0x004B4970);
-	} else {
-		// Klaymen sleeping
-		setRectList(0x004B4A00);
-		insertKlaymen<KmScene1001>(200, 433);
-		setMessageList(0x004B4890);
-	}
-
-	tempSprite = insertStaticSprite(0x2080A3A8, 1300);
-
-	_klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
-	
-	if (!getGlobalVar(V_DOOR_BUSTED)) {
-		_asDoor = insertSprite<AsScene1001Door>();
-		_asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
-	}
-
-	_asLever = insertSprite<AsScene1001Lever>(this, 150, 433, 1);
-
-	insertStaticSprite(0x809861A6, 950);
-	insertStaticSprite(0x89C03848, 1100);
-
-	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
-
-	if (!getGlobalVar(V_WINDOW_OPEN)) {
-		tempSprite = insertStaticSprite(0x8C066150, 200);
-		_asWindow = insertSprite<AsScene1001Window>();
-		_asWindow->setClipRect(tempSprite->getDrawRect());
-	}
-
-	_asHammer = insertSprite<AsScene1001Hammer>(_asDoor);
-
-}
-
-Scene1001::~Scene1001() {
-	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX());
-}
-
-uint32 Scene1001::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x00342624) {
-			sendEntityMessage(_klaymen, 0x1014, _asLever);
-			setMessageList2(0x004B4910);
-			messageResult = 1;
-		} else if (param.asInteger() == 0x21E64A00) {
-			if (getGlobalVar(V_DOOR_BUSTED)) {
-				setMessageList(0x004B48A8);
-			} else {
-				setMessageList(0x004B48C8);
-			}
-			messageResult = 1;
-		} else if (param.asInteger() == 0x040424D0) {
-			sendEntityMessage(_klaymen, 0x1014, _ssButton);
-		} else if (param.asInteger() == 0x80006358) {
-			if (getGlobalVar(V_WINDOW_OPEN)) {
-				setMessageList(0x004B4938);
-			} else {
-				setMessageList(0x004B4960);
-			}
-		}
-		break;
-	case 0x2002:
-		setRectList(0x004B49F0);
-		break;
-	case 0x480B:
-		sendMessage(_asWindow, 0x2001, 0);
-		break;
-	case 0x480F:
-		sendMessage(_asHammer, 0x2000, 0);
-		break;
-	}
-	return messageResult;
-}
-
-// Scene1002
-
-AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _isSpecial(isSpecial) {
-
-	SetUpdateHandler(&AsScene1002Ring::update);
-	
-	if (_isSpecial) {
-		createSurface(990, 68, 314);
-		if (isRingLow) {
-			startAnimation(0x04103090, 0, -1);
-			SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
-		} else {
-			startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
-			SetMessageHandler(&AsScene1002Ring::hmRingIdle);
-		}
-	} else {
-		createSurface(990, 68, 138);
-		startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1);
-		SetMessageHandler(&AsScene1002Ring::hmRingIdle);
-	}
-
-	setClipRect(0, clipY1, 640, 480);
-
-	_x = x;
-	_y = y;
-
-	setDoDeltaX(_vm->_rnd->getRandomNumber(1));
-
-}
-
-void AsScene1002Ring::update() {
-	updateAnim();
-	updatePosition();
-}
-
-uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4806:
-		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
-		sendMessage(_parentScene, 0x4806, 0);
-		SetMessageHandler(&AsScene1002Ring::hmRingPulled1);
-		startAnimation(_isSpecial ? 0x87502558 : 0x80DD4010, 0, -1);
-		break;
-	case 0x480F:
-		setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0);
-		sendMessage(_parentScene, 0x480F, 0);
-		SetMessageHandler(&AsScene1002Ring::hmRingPulled2);
-		startAnimation(0x861A2020, 0, -1);
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		startAnimation(_isSpecial ? 0x78D0A812 : 0xB85D2A10, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
-		break;
-	case 0x4807:
-		sendMessage(_parentScene, 0x4807, 0);
-		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
-		startAnimation(0x8258A030, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::hmRingReleased);
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		startAnimation(0x04103090, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::hmRingHangingLow);
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4807:
-		sendMessage(_parentScene, 0x4807, 0);
-		setDoDeltaX(_vm->_rnd->getRandomNumber(1));
-		startAnimation(0x8258A030, 0, -1);
-		SetMessageHandler(&AsScene1002Ring::hmRingReleased);
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = hmRingIdle(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x05410F72)
-			playSound(0, 0x21EE40A9);
-		break;
-	case 0x3002:
-		startAnimation(0xA85C4011, 0, -1);
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 990);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1010);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
-	: StaticSprite(vm, 1200) {
-	
-	loadSprite(0x1052370F, kSLFDefDrawOffset | kSLFSetPosition, 800, 526, getGlobalVar(V_FLYTRAP_RING_DOOR) ? 49 : 239);
-	setClipRect(clipRect);
-	SetUpdateHandler(&AsScene1002Door::update);
-	SetMessageHandler(&AsScene1002Door::handleMessage);
-	SetSpriteUpdate(NULL);
-}
-
-void AsScene1002Door::update() {
-	handleSpriteUpdate();
-	updatePosition();
-}
-
-uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4808:
-		setGlobalVar(V_FLYTRAP_RING_DOOR, 1);
-		SetSpriteUpdate(&AsScene1002Door::suOpenDoor);
-		break;
-	case 0x4809:
-		setGlobalVar(V_FLYTRAP_RING_DOOR, 0);
-		SetSpriteUpdate(&AsScene1002Door::suCloseDoor);
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1002Door::suOpenDoor() {
-	if (_y > 49) {
-		_y -= 8;
-		if (_y < 49) {
-			SetSpriteUpdate(NULL);
-			_y = 49;
-		}
-		_needRefresh = true;
-	}
-}
-
-void AsScene1002Door::suCloseDoor() {
-	if (_y < 239) {
-		_y += 8;
-		if (_y > 239) {
-			SetSpriteUpdate(NULL);
-			_y = 239;
-		}
-		_needRefresh = true;
-	}
-}
-
-AsScene1002BoxingGloveHitEffect::AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1400) {
-
-	createSurface(1025, 88, 165);
-	setVisible(false);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1002BoxingGloveHitEffect::handleMessage);	
-}
-
-uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2004:
-		_x = ((Sprite*)sender)->getX() - 98;
-		_y = ((Sprite*)sender)->getY() - 111;
-		startAnimation(0x0422255A, 0, -1);
-		setVisible(true);
-		break;
-	case 0x3002:
-		stopAnimation();
-		setVisible(false);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect)
-	: AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) {
-
-	createSurface(800, 136, 147);
-	setClipRect(clipRect);
-	suDoorSpy();
-	loadSound(0, 0xC0C40298);
-	startAnimation(0x586C1D48, 0, 0);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
-	SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy);
-}
-
-uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0xA61CA1C2)
-			sendMessage(_asBoxingGloveHitEffect, 0x2004, 0);
-		else if (param.asInteger() == 0x14CE0620)
-			playSound(0);
-		break;
-	case 0x2003:
-		stDoorSpyBoxingGlove();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002DoorSpy::hmDoorSpyAnimation(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1002DoorSpy::suDoorSpy() {
-	_x = _asDoor->getX() + 34;
-	_y = _asDoor->getY() + 175;
-}
-
-void AsScene1002DoorSpy::stDoorSpyIdle() {
-	setClipRect(_clipRect);
-	_parentScene->setSurfacePriority(getSurface(), 800);
-	startAnimation(0x586C1D48, 0, 0);
-	SetMessageHandler(&AsScene1002DoorSpy::handleMessage);
-}
-
-void AsScene1002DoorSpy::stDoorSpyBoxingGlove() {
-	setClipRect(0, 0, 640, 480);
-	_parentScene->setSurfacePriority(getSurface(), 1200);
-	startAnimation(0x586C1D48, 1, -1);
-	SetMessageHandler(&AsScene1002DoorSpy::hmDoorSpyAnimation);
-	NextState(&AsScene1002DoorSpy::stDoorSpyIdle);
-}
-
-SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) 
-	: StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) {
-
-	_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000;
-	_fileHashes[0] = fileHash1;
-	_fileHashes[1] = fileHash2;
-	createSurface(surfacePriority, 40, 40);
-	loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
-	setVisible(false);
-	SetUpdateHandler(&SsCommonPressButton::update);
-	SetMessageHandler(&SsCommonPressButton::handleMessage);
-}
-
-void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
-	_fileHashes[0] = fileHash1;
-	_fileHashes[1] = fileHash2;
-	loadSprite(_status == 2 ? fileHash2 : fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
-}
-
-void SsCommonPressButton::update() {
-	if (_countdown != 0 && (--_countdown) == 0) {
-		if (_status == 1) {
-			_status = 2;
-			loadSprite(_fileHashes[1], kSLFDefDrawOffset | kSLFDefPosition);
-			_countdown = 4;
-		} else if (_status == 2) {
-			_status = 3;
-			loadSprite(_fileHashes[0], kSLFDefDrawOffset | kSLFDefPosition);
-			_countdown = 4;
-		} else if (_status == 3) {
-			_status = 0;
-			setVisible(false);
-		}
-	}
-}
-
-uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x480B:
-		sendMessage(_parentScene, 0x480B, 0);
-		_status = 1;
-		_countdown = 4;
-		setVisible(true);
-		playSound(0, _soundFileHash);
-		break;
-	}
-	return messageResult;
-}
-
-AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _isSecond(isSecond), _countdown(0) {
-
-	createSurface(995, 175, 195);
-	if (!_isSecond) {
-		if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
-			setDoDeltaX(1);
-			_x = 366;
-			_y = 435;
-			stRingGrabbed();
-		} else {
-			_x = 174 + getGlobalVar(V_FLYTRAP_POSITION_1) * 32;
-			_y = 435;
-			stIdle();
-		}
-	} else {
-		_x = 186 + getGlobalVar(V_FLYTRAP_POSITION_2) * 32;
-		_y = 364;
-		if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) {
-			stRingGrabbed();
-		} else {
-			stIdle();
-		} 
-	}
-	_flags = 4;
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
-	SetSpriteUpdate(&AnimatedSprite::updateDeltaXY);
-}
-
-void AsScene1002VenusFlyTrap::update() {
-	if (_countdown != 0 && (--_countdown == 0))
-		gotoNextState();
-	AnimatedSprite::update();
-}
-
-void AsScene1002VenusFlyTrap::upIdle() {
-	if (_countdown == 0 && _klaymen->getX() - 20 > _x)
-		setDoDeltaX(1);
-	else if (_klaymen->getX() + 20 < _x)
-		setDoDeltaX(0);
-	update();
-}
-
-uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x000890C4)
-			playSound(0, 0xC21190D8);
-		else if (param.asInteger() == 0x522200A0)
-			playSound(0, 0x931080C8);
-		break;
-	case 0x1011:
-		if (_isSecond) {
-			if (_x >= 154 && _x <= 346) {
-				sendMessage(_parentScene, 0x2000, 0);
-				messageResult = 1;
-			}
-		} else {
-			if (_x >= 174 && _x <= 430) {
-				sendMessage(_parentScene, 0x2000, 0);
-				messageResult = 1;
-			}
-		}
-		break;
-	case 0x480B:
-		setDoDeltaX(param.asInteger() != 0 ? 1 : 0);
-		if (!_isSecond) {
-			if (getGlobalVar(V_FLYTRAP_RING_DOOR))
-				stRelease();
-			else
-				stWalk();
-		} else {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE))
-				stRelease();
-			else
-				stWalk();
-		}
-		break;
-	case 0x480C:
-		if (_isSecond) {
-			if (_x >= 154 && _x <= 346)
-				messageResult = 1;
-			else				
-				messageResult = 0;
-		} else {
-			if (_x >= 174 && _x <= 430)
-				messageResult = 1;
-			else				
-				messageResult = 0;
-		}
-		break;
-	case 0x480E:
-		if (param.asInteger() == 1)
-			stGrabRing();
-		break;
-	case 0x4810:
-		swallowKlaymen();
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 995);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1015);
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x000890C4)
-			playSound(0, 0xC21190D8);
-		else if (param.asInteger() == 0x41881801) {
-			if (_isSecond) {
-				if (_x > 330)
-					sendMessage(_klaymen, 0x4811, 2);
-				else
-					sendMessage(_klaymen, 0x4811, 0);
-			} else {
-				sendMessage(_klaymen, 0x4811, 0);
-			}
-		} else if (param.asInteger() == 0x522200A0)
-			playSound(0, 0x931080C8);
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	case 0x482A:
-		sendMessage(_parentScene, 0x1022, 995);
-		break;
-	case 0x482B:
-		sendMessage(_parentScene, 0x1022, 1015);
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1002VenusFlyTrap::stWalkBack() {
-	setDoDeltaX(2);
-	startAnimation(0xC4080034, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
-	NextState(&AsScene1002VenusFlyTrap::stIdle);
-}
-
-void AsScene1002VenusFlyTrap::stWalk() {
-	startAnimation(0xC4080034, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
-	NextState(&AsScene1002VenusFlyTrap::stIdle);
-}
-
-void AsScene1002VenusFlyTrap::stRelease() {
-	sendMessage(_parentScene, 0x4807, 0);
-	startAnimation(0x82292851, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
-	NextState(&AsScene1002VenusFlyTrap::stIdle);
-}
-
-void AsScene1002VenusFlyTrap::stGrabRing() {
-	setDoDeltaX(1);
-	startAnimation(0x86A82A11, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple);
-	NextState(&AsScene1002VenusFlyTrap::stRingGrabbed);
-}
-
-void AsScene1002VenusFlyTrap::stRingGrabbed() {
-	startAnimation(0xB5A86034, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
-}
-
-void AsScene1002VenusFlyTrap::stKlaymenInside() {
-	startAnimation(0x31303094, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(NULL);
-	NextState(&AsScene1002VenusFlyTrap::stKlaymenInsideMoving);
-	_countdown = 24;
-}
-
-void AsScene1002VenusFlyTrap::stIdle() {
-	startAnimation(0xC8204250, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage);
-	if (_isSecond) {
-		if (_x >= 154 && _x <= 346)
-			setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32);
-		else {
-			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
-			_countdown = 12;
-		}
-	} else {
-		if (_x >= 174 && _x <= 430)
-			setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32);
-		else {
-			NextState(&AsScene1002VenusFlyTrap::stWalkBack);
-			_countdown = 12;
-		}
-	}
-}
-
-void AsScene1002VenusFlyTrap::stKlaymenInsideMoving() {
-	startAnimation(0x152920C4, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
-	NextState(&AsScene1002VenusFlyTrap::stSpitOutKlaymen);
-}
-
-void AsScene1002VenusFlyTrap::stSpitOutKlaymen() {
-	startAnimation(0x84001117, 0, -1);
-	SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-	SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
-	NextState(&AsScene1002VenusFlyTrap::stIdle);
-}
-
-void AsScene1002VenusFlyTrap::swallowKlaymen() {
-	if (_x - 15 < _klaymen->getX() && _x + 15 > _klaymen->getX()) {
-		if (_isSecond)
-			setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0);
-		else
-			setDoDeltaX(_x > 320 ? 1 : 0);
-		sendMessage(_klaymen, 0x2001, 0);
-		startAnimation(0x8C2C80D4, 0, -1);
-		SetUpdateHandler(&AsScene1002VenusFlyTrap::update);
-		SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt);
-		NextState(&AsScene1002VenusFlyTrap::stKlaymenInside);
-	}
-}
-
-AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1200), _countdown(0) {
-
-	createSurface(850, 186, 212);
-	_x = 320;
-	_y = 240;
-	if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
-		startAnimation(0x004A4495, -1, -1);
-		_newStickFrameIndex = STICK_LAST_FRAME;
-	} else
-		setVisible(false);
-	SetUpdateHandler(&AsScene1002OutsideDoorBackground::update);
-	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);	
-}
-
-void AsScene1002OutsideDoorBackground::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
-		if (_isDoorClosed)
-			stCloseDoor();
-		else
-			stOpenDoor();
-	}
-	AnimatedSprite::update();
-}
-
-uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageResult) {
-	case 0x4808:
-		_isDoorClosed = false;
-		_countdown = 2;
-		break;
-	case 0x4809:
-		_isDoorClosed = true;
-		_countdown = 2;
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = handleMessage(messageNum, param, sender);
-	switch (messageResult) {
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1002OutsideDoorBackground::stOpenDoor() {
-	startAnimation(0x004A4495, 0, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	setVisible(true);
-	SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage);
-}
-
-void AsScene1002OutsideDoorBackground::stCloseDoor() {
-	startAnimation(0x004A4495, -1, -1);
-	_playBackwards = true;
-	setVisible(true);
-	SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation);
-	NextState(&AsScene1002OutsideDoorBackground::stDoorClosed);
-}
-
-void AsScene1002OutsideDoorBackground::stDoorClosed() {
-	setVisible(false);
-	stopAnimation();
-}
-
-AsScene1002KlaymenLadderHands::AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen)
-	: AnimatedSprite(vm, 1200), _klaymen(klaymen) {
-	
-	createSurface(1200, 40, 163);
-	setVisible(false);
-	SetUpdateHandler(&AsScene1002KlaymenLadderHands::update);
-	SetMessageHandler(&Sprite::handleMessage);
-}
-
-void AsScene1002KlaymenLadderHands::update() {
-	if (_klaymen->getCurrAnimFileHash() == 0x3A292504) {
-		startAnimation(0xBA280522, _klaymen->getFrameIndex(), -1);
-		_newStickFrameIndex = _klaymen->getFrameIndex();
-		setVisible(true);
-		_x = _klaymen->getX(); 
-		_y = _klaymen->getY(); 
-		setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0);
-	} else if (_klaymen->getCurrAnimFileHash() == 0x122D1505) {
-		startAnimation(0x1319150C, _klaymen->getFrameIndex(), -1);
-		_newStickFrameIndex = _klaymen->getFrameIndex();
-		setVisible(true);
-		_x = _klaymen->getX(); 
-		_y = _klaymen->getY(); 
-		setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0);
-	} else
-		setVisible(false);
-	AnimatedSprite::update();
-}
-
-AsScene1002KlaymenPeekHand::AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen)
-	: AnimatedSprite(vm, 1200), _parentScene(parentScene), _klaymen(klaymen),
-	_isClipRectSaved(false) {
-	
-	createSurface(1000, 33, 41);
-	setVisible(false);
-	SetUpdateHandler(&AsScene1002KlaymenPeekHand::update);
-	SetMessageHandler(&AsScene1002KlaymenPeekHand::handleMessage);
-}
-
-void AsScene1002KlaymenPeekHand::update() {
-	if (_klaymen->getCurrAnimFileHash() == 0xAC20C012 && _klaymen->getFrameIndex() < 50) {
-		startAnimation(0x9820C913, _klaymen->getFrameIndex(), -1);
-		_newStickFrameIndex = _klaymen->getFrameIndex();
-		setVisible(true);
-		_x = _klaymen->getX();
-		_y = _klaymen->getY();
-		setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0);
-	} else
-		setVisible(false);
-	AnimatedSprite::update();
-}
-
-uint32 AsScene1002KlaymenPeekHand::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4AB28209) {
-			sendMessage(_parentScene, 0x1022, 1200);
-			_isClipRectSaved = true;
-			_savedClipRect = _surface->getClipRect();
-			setClipRect(0, 0, 640, 480);
-		} else if (param.asInteger() == 0x88001184) {
-			sendMessage(_parentScene, 0x1022, 1000);
-			if (_isClipRectSaved)
-				setClipRect(_savedClipRect);
-		}
-		break;
-	}
-	return messageResult;
-}
-
-Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _isKlaymenFloor(false), _isClimbingLadder(false) {
-
-	NRect tempClipRect;
-	Sprite *tempSprite;
-
-	SetUpdateHandler(&Scene1002::update);
-	SetMessageHandler(&Scene1002::handleMessage);
-
-	setHitRects(0x004B4138);
-	setBackground(0x12C23307);
-	setPalette(0x12C23307);
-
-	insertStaticSprite(0x06149428, 1100);
-	insertStaticSprite(0x312C8774, 1100);
-
-	_ssLadderArch = insertStaticSprite(0x152C1313, 1015);
-	_ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200);
-	_ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100);
-	_ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100);
-
-	_ssCeiling = insertStaticSprite(0x316C4BB4, 1015);
-
-	if (which < 0) {
-		// Restoring game
-		if (_vm->_gameState.which == 0) {
-			// Klaymen on top
-			insertKlaymen<KmScene1002>(90, 226);
-			_asKlaymenLadderHands = insertSprite<AsScene1002KlaymenLadderHands>(_klaymen);
-			setMessageList(0x004B4270);
-			_klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
-			_asKlaymenLadderHands->getSurface()->getClipRect() = _klaymen->getSurface()->getClipRect();
-			_klaymen->setRepl(64, 0);
-		} else {
-			// Klaymen on the floor
-			insertKlaymen<KmScene1002>(379, 435);
-			_asKlaymenLadderHands = insertSprite<AsScene1002KlaymenLadderHands>(_klaymen);
-			setMessageList(0x004B4270);
-			_klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-			_asKlaymenLadderHands->setClipRect(_klaymen->getClipRect());
-		}
-	} else if (which == 1) {
-		// Klaymen entering from the right
-		insertKlaymen<KmScene1002>(650, 435);
-		_asKlaymenLadderHands = insertSprite<AsScene1002KlaymenLadderHands>(_klaymen);
-		setMessageList(0x004B4478);
-		_klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-		_asKlaymenLadderHands->setClipRect(_klaymen->getClipRect());
-		_vm->_gameState.which = 1;
-	} else if (which == 2) {
-		// Klaymen coming up the ladder
-		insertKlaymen<KmScene1002>(68, 645);
-		_asKlaymenLadderHands = insertSprite<AsScene1002KlaymenLadderHands>(_klaymen);
-		setMessageList(0x004B4298);
-		_klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-		_asKlaymenLadderHands->setClipRect(_klaymen->getClipRect());
-		_vm->_gameState.which = 1;
-		sendMessage(_klaymen, 0x4820, 0);
-	} else {
-		// Klaymen entering from the left, peeking
-		insertKlaymen<KmScene1002>(90, 226);
-		_asKlaymenLadderHands = insertSprite<AsScene1002KlaymenLadderHands>(_klaymen);
-		setMessageList(0x004B4470);
-		_klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2());
-		_asKlaymenLadderHands->setClipRect(_klaymen->getClipRect());
-		_asKlaymenPeekHand = insertSprite<AsScene1002KlaymenPeekHand>(this, _klaymen);
-		_asKlaymenPeekHand->setClipRect(_klaymen->getClipRect());
-		_klaymen->setRepl(64, 0);
-		_vm->_gameState.which = 0;
-	}
-
-	insertScreenMouse(0x23303124);
-
-	tempSprite = insertStaticSprite(0xB3242310, 825);
-	tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y,
-		_ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2());
-
-	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 258, 191, _ssCeiling->getDrawRect().y, false);
-	_asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _ssCeiling->getDrawRect().y, false);
-	_asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _ssCeiling->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR));
-	_asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _ssCeiling->getDrawRect().y, false);
-	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _ssCeiling->getDrawRect().y, false);
-
-	_asDoor = insertSprite<AsScene1002Door>(tempClipRect);
-	tempSprite = insertSprite<AsScene1002BoxingGloveHitEffect>();
-	_asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
-	_ssPressButton = insertSprite<SsCommonPressButton>(this, 0x00412692, 0x140B60BE, 800, 0);
-	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klaymen, false);
-	addCollisionSprite(_asVenusFlyTrap);
-
-	sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap);
-
-	_asOutsideDoorBackground = insertSprite<AsScene1002OutsideDoorBackground>();
-								  
-	setRectList(0x004B43A0);
-
-	loadSound(1, 0x60755842);
-	loadSound(2, 0x616D5821);
-
-}
-
-Scene1002::~Scene1002() {
-}
-
-void Scene1002::update() {
-	Scene::update();
-	if (!_isKlaymenFloor && _klaymen->getY() > 230) {
-		_klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2());
-		_asKlaymenLadderHands->setClipRect(_klaymen->getClipRect());
-		deleteSprite(&_ssLadderArchPart3);
-		_klaymen->clearRepl();
-		_isKlaymenFloor = true;
-		_vm->_gameState.which = 1;
-	}
-}
-
-uint32 Scene1002::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0xE6EE60E1) {
-			if (getGlobalVar(V_FLYTRAP_RING_DOOR))
-				setMessageList(0x004B4428);
-			else
-				setMessageList(0x004B4448);
-			messageResult = 1;
-		} else if (param.asInteger() == 0x4A845A00)
-			sendEntityMessage(_klaymen, 0x1014, _asRing1);
-		else if (param.asInteger() == 0x43807801)
-			sendEntityMessage(_klaymen, 0x1014, _asRing2);
-		else if (param.asInteger() == 0x46C26A01) {
-			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
-				setMessageList(0x004B44B8);
-			} else {
-				sendEntityMessage(_klaymen, 0x1014, _asRing3);
-				if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) {
-					setGlobalVar(V_FLYTRAP_RING_EATEN, 1);
-					setMessageList(0x004B44A8);
-				} else {
-					setMessageList(0x004B44A0);
-				}
-			}
-			messageResult = 1;
-		} else if (param.asInteger() == 0x468C7B11)
-			sendEntityMessage(_klaymen, 0x1014, _asRing4);
-		else if (param.asInteger() == 0x42845B19)
-			sendEntityMessage(_klaymen, 0x1014, _asRing5);
-		else if (param.asInteger() == 0xC0A07458)
-			sendEntityMessage(_klaymen, 0x1014, _ssPressButton);
-		break;
-	case 0x1024:
-		sendMessage(_parentModule, 0x1024, param.asInteger());
-		break;
-	case 0x2000:
-		if (_isClimbingLadder) {
-			setMessageList2(0x004B43D0);
-		} else {
-			if (_klaymen->getY() > 420) {
-				sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap);
-				setMessageList2(0x004B4480);
-			} else if (_klaymen->getY() > 227) {
-				setMessageList2(0x004B41E0);
-			} else {
-				setMessageList2(0x004B4148);
-			}
-		}
-		break;
-	case 0x2002:
-		_messageList = NULL;
-		break;										
-	case 0x2005:
-		_isClimbingLadder = true;
-		setRectList(0x004B4418);
-		break;										
-	case 0x2006:
-		_isClimbingLadder = false;
-		setRectList(0x004B43A0);
-		break;
-	case 0x4806:
-		if (sender == _asRing1) {
-			setGlobalVar(V_RADIO_ENABLED, 0);
-			playSound(0, 0x665198C0);
-		} else if (sender == _asRing2) {
-			setGlobalVar(V_RADIO_ENABLED, 0);
-			playSound(0, 0xE2D389C0);
-		} else if (sender == _asRing3) {
-			setGlobalVar(V_RADIO_ENABLED, 0);
-			playSound(1);
-			sendMessage(_asDoor, 0x4808, 0);
-			sendMessage(_asOutsideDoorBackground, 0x4808, 0);
-		} else if (sender == _asRing4) {
-			setGlobalVar(V_RADIO_ENABLED, 0);
-			playSound(0, 0xE0558848);
-		} else if (sender == _asRing5) {
-			setGlobalVar(V_RADIO_ENABLED, 1);
-			playSound(0, 0x44014282);
-		}
-		break;
-	case 0x4807:
-		if (sender == _asRing3) {
-			playSound(2);
-			sendMessage(_asDoor, 0x4809, 0);
-			sendMessage(_asOutsideDoorBackground, 0x4809, 0);
-		} else if (sender == _asVenusFlyTrap) {
-			if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
-				sendMessage(_asRing3, 0x4807, 0);
-			}
-		}	
-		break;
-	case 0x480B:
-		sendEntityMessage(_klaymen, 0x1014, _asDoorSpy);
-		break;				
-	case 0x480F:
-		setGlobalVar(V_RADIO_ENABLED, 0);
-		playSound(1);
-		sendMessage(_asDoor, 0x4808, 0);
-		sendMessage(_asOutsideDoorBackground, 0x4808, 0);
-		break;
-	case 0x8000:
-		setSpriteSurfacePriority(_ssCeiling, 995);
-		setSpriteSurfacePriority(_ssLadderArch, 995);
-		break;
-	case 0x8001:
-		setSpriteSurfacePriority(_ssCeiling, 1015);
-		setSpriteSurfacePriority(_ssLadderArch, 1015);
-		break;
-	}	
-	return messageResult;
-}
-
-// StaticScene
-
-StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash)
-	: Scene(vm, parentModule) {
-
-	SetMessageHandler(&StaticScene::handleMessage);
-	
-	setBackground(backgroundFileHash);
-	setPalette(backgroundFileHash);
-	insertPuzzleMouse(cursorFileHash, 20, 620);
-}
-
-uint32 StaticScene::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
-			leaveScene(0);
-		break;
-	}
-	return 0;
-}
-
-// Scene1004
-
-AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm)
-	: AnimatedSprite(vm, 1100) {
-
-	_x = 330;
-	_y = 327;
-	createSurface(800, 56, 50);
-	setVisible(false);
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1004TrashCan::handleMessage);
-}
-
-uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x225A8587)
-			playSound(0, 0x109AFC4C);
-		break;
-	case 0x2002:
-		startAnimation(0xEB312C11, 0, -1);
-		setVisible(true);
-		break;
-	case 0x3002:
-		stopAnimation();
-		setVisible(false);
-		break;
-	}
-	return 0;
-}
-
-Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _paletteAreaStatus(-1) {
-
-	Sprite *tempSprite;
-	
-	SetUpdateHandler(&Scene1004::update);
-	SetMessageHandler(&Scene1004::handleMessage);
-
-	setBackground(0x50C03005);
-
-	if (getGlobalVar(V_ENTRANCE_OPEN)) {
-		setPalette(0xA30BA329);
-		_palette->addBasePalette(0xA30BA329, 0, 256, 0);
-	} else {
-		setPalette(0x50C03005);
-		_palette->addBasePalette(0x50C03005, 0, 256, 0);
-	}
-	addEntity(_palette);
-
-	insertScreenMouse(0x03001504);
-
-	if (which < 0) {
-		// Restoring game
-		setRectList(0x004B7C70);
-		insertKlaymen<KmScene1004>(330, 327);
-		setMessageList(0x004B7C18);
-	} else if (which == 1) {
-		// Klaymen returning from reading a note
-		setRectList(0x004B7C70);
-		insertKlaymen<KmScene1004>(330, 327);
-		setMessageList(0x004B7C08);
-	} else {
-		// Klaymen coming down the ladder
-		loadDataResource(0x01900A04);
-		insertKlaymen<KmScene1004>(_dataResource.getPoint(0x80052A29).x, 27);
-		setMessageList(0x004B7BF0);
-	}
-	
-	updatePaletteArea();
-	
-	_asKlaymenLadderHands = insertSprite<AsScene1002KlaymenLadderHands>(_klaymen);
-
-	insertStaticSprite(0x800034A0, 1100);
-	insertStaticSprite(0x64402020, 1100);
-	insertStaticSprite(0x3060222E, 1300);
-	tempSprite = insertStaticSprite(0x0E002004, 1300);
-	
-	_klaymen->setClipRect(0, tempSprite->getDrawRect().y, 640, 480);
-	_asKlaymenLadderHands->setClipRect(_klaymen->getClipRect());
-
-	_asTrashCan = insertSprite<AsScene1004TrashCan>();
-
-}
-
-void Scene1004::update() {
-	Scene::update();
-	updatePaletteArea();
-}
-
-uint32 Scene1004::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x926500A1) {
-			setMessageList(0x004B7C20);
-			messageResult = 1;
-		}
-		break;
-	case 0x2000:
-		loadDataResource(0x01900A04);
-		break;
-	case 0x2001:
-		setRectList(0x004B7C70);
-		break;
-	case 0x2002:
-		sendMessage(_asTrashCan, 0x2002, 0);
-		break;
-	}
-	return messageResult;
-} 
-
-void Scene1004::updatePaletteArea() {
-	if (_klaymen->getY() < 150) {
-		if (_paletteAreaStatus != 0) {
-			_paletteAreaStatus = 0;
-			_palette->addBasePalette(0x406B0D10, 0, 64, 0);
-			_palette->startFadeToPalette(12);
-		}
-	} else {
-		if (_paletteAreaStatus != 1) {
-			_paletteAreaStatus = 1;
-			_palette->addBasePalette(0x24332243, 0, 64, 0);
-			_palette->startFadeToPalette(12);
-		}
-	}
-}
-
-// Scene1005
-
-Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule) {
-
-	SetMessageHandler(&Scene1005::handleMessage);
-
-	if (getGlobalVar(V_ENTRANCE_OPEN)) {
-		setBackground(0x2800E011);
-		setPalette(0x2800E011);
-		insertStaticSprite(0x492D5AD7, 100);
-		insertPuzzleMouse(0x0E015288, 20, 620);
-	} else {
-		setBackground(0x8870A546);
-		setPalette(0x8870A546);
-		insertStaticSprite(0x40D1E0A9, 100);
-		insertStaticSprite(0x149C00A6, 100);
-		insertPuzzleMouse(0x0A54288F, 20, 620);
-	}
-
-	drawTextToBackground();
-	
-}
-
-uint32 Scene1005::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
-			leaveScene(0);			
-		break;
-	}
-	return 0;
-}
-
-void Scene1005::drawTextToBackground() {
-	TextResource textResource(_vm);
-	const char *textStart, *textEnd;
-	int16 y = 36;
-	uint32 textIndex = getTextIndex();
-	FontSurface *fontSurface = FontSurface::createFontSurface(_vm, getGlobalVar(V_ENTRANCE_OPEN) ? 0x283CE401 : 0xC6604282);
-	textResource.load(0x80283101);
-	textStart = textResource.getString(textIndex, textEnd);
-	while (textStart < textEnd) {
-		fontSurface->drawString(_background->getSurface(), 188, y, (const byte*)textStart);
-		y += 36;
-		textStart += strlen(textStart) + 1;
-	}
-	delete fontSurface;
-}
-
-uint32 Scene1005::getTextIndex() {
-	uint32 textIndex;
-	textIndex = getTextIndex1();
-	if (getGlobalVar(V_ENTRANCE_OPEN)) {
-		textIndex = getTextIndex2();
-	}
-	if (getGlobalVar(V_TEXT_FLAG1) && getGlobalVar(V_TEXT_INDEX) == textIndex) {
-		textIndex = getTextIndex3();
-	} else {
-		setGlobalVar(V_TEXT_FLAG1, 1);
-		setGlobalVar(V_TEXT_INDEX, textIndex);
-	}
-	return textIndex;
-}
-
-uint32 Scene1005::getTextIndex1() {
-	uint32 textIndex;
-	if (getGlobalVar(V_WORLDS_JOINED)) {
-		if (!getGlobalVar(V_DOOR_PASSED))
-			textIndex = 18;
-		else if (!getGlobalVar(V_ROBOT_TARGET))
-			textIndex = 19;
-		else if (getGlobalVar(V_ROBOT_HIT)) {
-			if (!getGlobalVar(V_ENTRANCE_OPEN))
-				textIndex = 23;
-			else if (!getSubVar(VA_HAS_KEY, 0) && !getSubVar(VA_IS_KEY_INSERTED, 0))
-				textIndex = 24;
-			else if (!getGlobalVar(V_HAS_FINAL_KEY))			
-				textIndex = 26;
-			else if (!getSubVar(VA_HAS_KEY, 1) && !getSubVar(VA_IS_KEY_INSERTED, 1))
-				textIndex = 27;
-			else if (!getGlobalVar(V_HAS_FINAL_KEY)) 
-				textIndex = 28;
-			else				
-				textIndex = 29;
-		} else if (!getGlobalVar(V_FELL_DOWN_HOLE))
-			textIndex = 20;
-		else if (!getGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT))
-			textIndex = 21;
-		else			
-			textIndex = 22;
-	} else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) {
-		if (!getGlobalVar(V_WALL_BROKEN))
-			textIndex = 12;
-		else if (!getGlobalVar(V_STAIRS_DOWN_ONCE))
-			textIndex = 13;
-		else if (!getGlobalVar(V_RADIO_ENABLED))
-			textIndex = 50;
-		else if (!getGlobalVar(V_UNUSED))
-			textIndex = 14;
-		else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM))
-			textIndex = 15;
-		else if (!getGlobalVar(V_BEEN_STATUE_ROOM))
-			textIndex = 16;
-		else 
-			textIndex = 17;
-	} else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) {
-		textIndex = 0;
-	} else if (getGlobalVar(V_CREATURE_EXPLODED)) {
-		if (!getGlobalVar(V_TILE_PUZZLE_SOLVED))
-			textIndex = 4;
-		else if (!getGlobalVar(V_HAS_TEST_TUBE))
-			textIndex = 5;
-		else if (!getSubVar(VA_LOCKS_DISABLED, 0x40119852))
-			textIndex = 6;
-		else if (!getGlobalVar(V_WATER_RUNNING))
-			textIndex = 7;
-		else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED))
-			textIndex = 8;
-		else if (!getSubVar(VA_LOCKS_DISABLED, 0x304008D2))
-			textIndex = 9;
-		else if (!getSubVar(VA_LOCKS_DISABLED, 0x01180951))
-			textIndex = 10;
-		else 
-			textIndex = 11;
-	} else if (!getGlobalVar(V_CREATURE_ANGRY)) {
-		textIndex = 1;
-	} else if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
-		textIndex = 3;
-	} else {
-		textIndex = 2;
-	}
-	return textIndex;
-}
-
-uint32 Scene1005::getTextIndex2() {
-	uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX1);
-	if (textIndex + 1 >= 10) {
-		setGlobalVar(V_TEXT_COUNTING_INDEX1, 0);
-		textIndex = 0;
-	} else {
-		setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1);
-	}
-	return textIndex + 40;
-}
-
-uint32 Scene1005::getTextIndex3() {
-	uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX2);
-	if (textIndex + 1 >= 10) {
-		setGlobalVar(V_TEXT_COUNTING_INDEX2, 0);
-		textIndex = 0;
-	} else {
-		setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1);
-	}
-	return textIndex + 30;
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
deleted file mode 100644
index 897d026..0000000
--- a/engines/neverhood/module1000.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/* 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_MODULE1000_H
-#define NEVERHOOD_MODULE1000_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/module.h"
-#include "neverhood/scene.h"
-
-namespace Neverhood {
-
-// Module1000
-
-class Module1000 : public Module {
-public:
-	Module1000(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Module1000();
-protected:
-	int _sceneNum;
-	uint32 _musicFileHash;
-	void createScene(int sceneNum, int which);
-	void updateScene();
-};
-
-// Scene1001
-
-class AsScene1001Door : public AnimatedSprite {
-public:
-	AsScene1001Door(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void hammerHitsDoor();
-	void stShowIdleDoor();
-	void stBustedDoorMove();
-	void stBustedDoorGone();
-};
-
-class AsScene1001Hammer : public AnimatedSprite {
-public:
-	AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor);
-protected:
-	Sprite *_asDoor;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1001Window : public AnimatedSprite {
-public:
-	AsScene1001Window(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1001Lever : public AnimatedSprite {
-public:
-	AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType);
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class SsCommonButtonSprite : public StaticSprite {
-public:
-	SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash);
-protected:
-	Scene *_parentScene;
-	uint32 _soundFileHash;
-	int16 _countdown;
-	void update();	
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Scene1001 : public Scene {
-public:
-	Scene1001(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Scene1001();
-protected:
-	Sprite *_asHammer;
-	Sprite *_asDoor;
-	Sprite *_asWindow;
-	Sprite *_asLever;
-	Sprite *_ssButton;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-// TODO: Move this to some common file since it's used several times
-
-class StaticScene : public Scene {
-public:
-	StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-// Scene1002
-
-class AsScene1002Ring : public AnimatedSprite {
-public:
-	AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow);
-protected:
-	Scene *_parentScene;
-	bool _isSpecial;
-	void update();
-	uint32 hmRingIdle(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmRingPulled1(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmRingPulled2(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmRingHangingLow(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmRingReleased(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1002Door : public StaticSprite {
-public:
-	AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect);
-protected:
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void suOpenDoor();
-	void suCloseDoor();
-};
-
-class AsScene1002BoxingGloveHitEffect : public AnimatedSprite {
-public:
-	AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1002DoorSpy : public AnimatedSprite {
-public:
-	AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect);
-protected:
-	Scene *_parentScene;
-	Sprite *_asDoor;
-	Sprite *_asBoxingGloveHitEffect;
-	NRect _clipRect;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmDoorSpyAnimation(int messageNum, const MessageParam &param, Entity *sender);
-	void suDoorSpy();
-	void stDoorSpyIdle();
-	void stDoorSpyBoxingGlove();
-};
-
-class SsCommonPressButton : public StaticSprite {
-public:
-	SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash);
-	void setFileHashes(uint32 fileHash1, uint32 fileHash2);
-protected:
-	Scene *_parentScene;
-	uint32 _soundFileHash;
-	uint32 _fileHashes[2];
-	int _status;
-	int _countdown;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class AsScene1002VenusFlyTrap : public AnimatedSprite {
-public:
-	AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond);
-protected:
-	Scene *_parentScene;
-	Sprite *_klaymen;
-	int _countdown;
-	bool _isSecond;
-	void update();
-	void upIdle();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmAnimationSimple(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmAnimationExt(int messageNum, const MessageParam &param, Entity *sender);
-	void stWalkBack();
-	void stWalk();
-	void stRelease();
-	void stGrabRing();
-	void stRingGrabbed();
-	void stKlaymenInside();
-	void stIdle();
-	void stKlaymenInsideMoving();
-	void stSpitOutKlaymen();
-	void swallowKlaymen();
-};
-
-class AsScene1002OutsideDoorBackground : public AnimatedSprite {
-public:
-	AsScene1002OutsideDoorBackground(NeverhoodEngine *vm);
-protected:
-	int _countdown;
-	bool _isDoorClosed;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmAnimation(int messageNum, const MessageParam &param, Entity *sender);
-	void stOpenDoor();
-	void stCloseDoor();
-	void stDoorClosed();
-};
-
-class AsScene1002KlaymenLadderHands : public AnimatedSprite {
-public:
-	AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen);
-protected:
-	Klaymen *_klaymen;
-	void update();
-};
-
-class AsScene1002KlaymenPeekHand : public AnimatedSprite {
-public:
-	AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen);
-protected:
-	Scene *_parentScene;
-	Klaymen *_klaymen;
-	bool _isClipRectSaved;
-	NRect _savedClipRect;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Scene1002 : public Scene {
-public:
-	Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Scene1002();
-protected:
-	Sprite *_asRing1;
-	Sprite *_asRing2;
-	Sprite *_asRing3;
-	Sprite *_asRing4;
-	Sprite *_asRing5;
-	Sprite *_asDoor;
-	Sprite *_asDoorSpy;
-	Sprite *_asVenusFlyTrap;
-	Sprite *_ssLadderArch;
-	Sprite *_ssLadderArchPart1;
-	Sprite *_ssLadderArchPart2;
-	Sprite *_ssLadderArchPart3;
-	Sprite *_ssCeiling;
-	Sprite *_asKlaymenLadderHands;
-	Sprite *_asKlaymenPeekHand;
-	Sprite *_asOutsideDoorBackground;
-	Sprite *_ssPressButton;
-	bool _isKlaymenFloor;
-	bool _isClimbingLadder;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-// Scene1004
-
-class AsScene1004TrashCan : public AnimatedSprite {
-public:
-	AsScene1004TrashCan(NeverhoodEngine *vm);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Scene1004 : public Scene {
-public:
-	Scene1004(NeverhoodEngine *vm, Module *parentModule, int which);
-protected:
-	Sprite *_asKlaymenLadderHands;
-	Sprite *_asTrashCan;
-	int _paletteAreaStatus;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void updatePaletteArea();
-};
-
-// Scene1005
-
-class Scene1005 : public Scene {
-public:
-	Scene1005(NeverhoodEngine *vm, Module *parentModule, int which);
-protected:
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void drawTextToBackground();
-	uint32 getTextIndex();
-	uint32 getTextIndex1();
-	uint32 getTextIndex2();
-	uint32 getTextIndex3();
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_MODULE1000_H */
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
deleted file mode 100644
index 067018d..0000000
--- a/engines/neverhood/module1100.cpp
+++ /dev/null
@@ -1,707 +0,0 @@
-/* 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/module1100.h"
-#include "neverhood/gamemodule.h"
-#include "neverhood/navigationscene.h"
-
-namespace Neverhood {
-
-static const uint32 kModule1100SoundList[] = {
-	0x90805C50,
-	0xB288D450,
-	0x98C05840,
-	0x98A01500,
-	0xB4005E50,
-	0x92025040,
-	0x90035066,
-	0x74E01054,
-	0
-};
-
-Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	if (which < 0) {
-		createScene(_vm->gameState().sceneNum, -1);
-	} else if (which == 1) {
-		createScene(8, 1);
-	} else {
-		createScene(8, 3);
-	}
-
-	_vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList);
-	_vm->_soundMan->setSoundListParams(kModule1100SoundList, true, 50, 600, 20, 250);
-	_vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20);
-	_vm->_soundMan->setSoundVolume(0x74E01054, 60);
-	_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
-
-}
-
-Module1100::~Module1100() {
-	_vm->_soundMan->deleteGroup(0x0002C818);
-}
-
-void Module1100::createScene(int sceneNum, int which) {
-	static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0};
-	static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0};
-	debug("Module1100::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 0:
-		_vm->gameState().sceneNum = 0;
-		_countdown = 65;
-		createNavigationScene(0x004B8430, which);
-		break;
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		_countdown = 50;
-		createNavigationScene(0x004B8460, which);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		if (getGlobalVar(V_ROBOT_TARGET)) {
-			createNavigationScene(0x004B84F0, which);
-		} else {
-			createNavigationScene(0x004B8490, which);
-		}
-		break;
-	case 3:
-		_vm->gameState().sceneNum = 3;
-		if (getGlobalVar(V_ROBOT_TARGET)) {
-			createNavigationScene(0x004B8580, which);
-		} else {
-			createNavigationScene(0x004B8550, which);
-		}
-		break;
-	case 4:
-		_vm->gameState().sceneNum = 4;
-		_childObject = new Scene1105(_vm, this);
-		break;
-	case 5:
-		_vm->gameState().sceneNum = 5;
-		if (getGlobalVar(V_ROBOT_TARGET))
-			createSmackerScene(0x04180001, true, false, false);
-		else
-			createSmackerScene(0x04180007, true, false, false);
-		break;
-	case 6:
-		_vm->gameState().sceneNum = 6;
-		_vm->_soundMan->deleteSoundGroup(0x0002C818);
-		createSmackerScene(kSmackerFileHashList06, true, true, false);
-		break;
-	case 7:
-		_vm->gameState().sceneNum = 7;
-		_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
-		createSmackerScene(kSmackerFileHashList07, true, true, false);
-		break;
-	case 8:
-		_vm->gameState().sceneNum = 8;
-		_childObject = new Scene1109(_vm, this, which);
-		break;
-	case 1002:
-		_vm->gameState().sceneNum = 2;
-		_countdown = 40;
-		_vm->_soundMan->setTwoSoundsPlayFlag(true);
-		createSmackerScene(0x00012211, true, true, false);
-		break;
-	}
-	SetUpdateHandler(&Module1100::updateScene);
-	_childObject->handleUpdate();
-}
-
-void Module1100::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 0:
-			_countdown = 0;
-			_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
-			_vm->_soundMan->setSoundVolume(0x48498E46, 65);
-			_vm->_soundMan->setSoundVolume(0x50399F64, 65);
-			if (_moduleResult == 0)
-				createScene(1, 0);
-			else if (_moduleResult == 1)
-				createScene(8, 0);
-			break;
-		case 1:
-			_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
-			if (getGlobalVar(V_ROBOT_HIT)) {
-				if (_moduleResult == 0)
-					createScene(6, -1);
-				else if (_moduleResult == 1)
-					createScene(0, 1);
-			} else {
-				if (_moduleResult == 0)
-					createScene(2, 0);
-				else if (_moduleResult == 1)
-					createScene(0, 1);
-			}
-			break;
-		case 2:
-			_vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0);
-			if (_navigationAreaType == 3)
-				createScene(7, -1);
-			else if (_moduleResult == 1)
-				createScene(3, 0);
-			else if (_moduleResult == 2)
-				createScene(1002, -1);
-			break;
-		case 3:
-			if (_moduleResult == 0)
-				createScene(4, 0);
-			else if (_moduleResult == 1)
-				createScene(2, 3);
-			break;
-		case 4:
-			if (_moduleResult == 0)
-				createScene(3, 0);
-			else if (_moduleResult == 1)
-				createScene(5, -1);
-			break;
-		case 5:
-			_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			if (getGlobalVar(V_ROBOT_TARGET))
-				createScene(3, 0);
-			else
-				createScene(4, 0);
-			break;
-		case 6:
-			_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			leaveModule(1);
-			break;
-		case 7:
-			_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			createScene(2, 2);
-			break;
-		case 8:
-			if (_moduleResult == 0)
-				createScene(0, 0);
-			else if (_moduleResult == 1)
-				leaveModule(0);
-			break;
-		case 1002:
-			_vm->_soundMan->setTwoSoundsPlayFlag(false);
-			_countdown = 0;
-			_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
-			createScene(1, 1);
-			break;
-		}
-	} else {
-		switch (_sceneNum) {
-		case 0:
-			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) {
-				_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
-				_vm->_soundMan->setSoundVolume(0x48498E46, 65);
-				_vm->_soundMan->setSoundVolume(0x50399F64, 65);
-			}
-			break;
-		case 1:
-			if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0))
-				_vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0);
-			break;
-		case 2:
-			_vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0);
-			break;
-		case 5:
-		case 6:
-		case 7:
-		case 1002:
-			if (_countdown != 0 && (--_countdown == 0)) {
-				_vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0);
-				_vm->_soundMan->setSoundVolume(0x48498E46, 65);
-				_vm->_soundMan->setSoundVolume(0x50399F64, 65);
-			}
-			break;
-		}
-	}
-}
-
-static const uint32 kScene1105FileHashes[] = {
-	0x00028006,
-	0x0100A425,
-	0x63090415,
-	0x082100C4,
-	0x0068C607,
-	0x00018344,
-	0x442090E4,
-	0x0400E004,
-	0x5020A054,
-	0xB14A891E
-};
-
-static const uint32 kScene1105BackgroundFileHashes[] = {
-	0x20018662,
-	0x20014202,
-	0x20012202,
-	0x20010002 // CHECKME: This used ??
-};
-
-static const uint32 kSsScene1105SymbolDieFileHashes[] = {
-	0,
-	0x90898414,
-	0x91098414,
-	0x92098414,
-	0x94098414,
-	0x98098414,
-	0x80098414,
-	0xB0098414,
-	0xD0098414,
-	0x10098414
-};
-
-SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds)
-	: StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) {
-	
-	_collisionBounds = collisionBounds;
-	SetMessageHandler(&SsScene1105Button::handleMessage);
-	SetUpdateHandler(&SsScene1105Button::update);
-	setVisible(false);
-}
-
-void SsScene1105Button::update() {
-	if (_countdown != 0 && (--_countdown == 0)) {
-		sendMessage(_parentScene, 0x4807, 0);
-		setVisible(false);
-	}
-}
-
-uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (_countdown == 0) {
-			sendMessage(_parentScene, 0x4826, 0);
-			messageResult = 1;
-		}
-		break;
-	case 0x480B:
-		_countdown = 8;
-		setVisible(true);
-		playSound(0, 0x44141000);
-		break;
-	}
-	return messageResult;
-}
-
-SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y)
-	: StaticSprite(vm, 0) {
-
-	loadSprite(fileHash, kSLFCenteredDrawOffset | kSLFSetPosition, 200, x, y);
-}
-
-void SsScene1105Symbol::hide() {
-	setVisible(false);
-	_needRefresh = true;
-	updatePosition();
-}
-
-SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y)
-	: StaticSprite(vm, 1100), _dieIndex(dieIndex) {
-
-	_x = x;
-	_y = y;
-	createSurface(200, 50, 50);
-	loadSymbolSprite();
-	SetMessageHandler(&SsScene1105SymbolDie::handleMessage);
-}
-
-uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2000:
-		loadSymbolSprite();
-		break;
-	}
-	return messageResult;
-}
-
-void SsScene1105SymbolDie::loadSymbolSprite() {
-	loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _dieIndex)], kSLFCenteredDrawOffset);
-}
-
-void SsScene1105SymbolDie::hide() {
-	setVisible(false);
-	_needRefresh = true;
-	updatePosition();
-}
-
-AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene)
-	: AnimatedSprite(vm, 1100), _parentScene(parentScene) {
-	
-	createSurface(100, 556, 328);
-	_x = 320;
-	_y = 240;
-	SetUpdateHandler(&AnimatedSprite::update);
-	SetMessageHandler(&AsScene1105TeddyBear::handleMessage);
-	startAnimation(0x65084002, 0, -1);
-	_newStickFrameIndex = 0;
-	setVisible(false);
-	_needRefresh = true;
-	updatePosition();
-	loadSound(0, 0xCE840261);
-	loadSound(1, 0xCCA41A62);
-}
-
-uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2002:
-		if (getGlobalVar(V_ROBOT_TARGET)) {
-			startAnimation(0x6B0C0432, 0, -1);
-			playSound(0);
-		} else {
-			startAnimation(0x65084002, 0, -1);
-			playSound(1);
-		}
-		break;
-	case 0x3002:
-		sendMessage(_parentScene, 0x2003, 0);
-		stopAnimation();
-		break;
-	}
-	return messageResult;
-}
-
-void AsScene1105TeddyBear::show() {
-	setVisible(true);
-	_needRefresh = true;
-	updatePosition();
-}
-
-void AsScene1105TeddyBear::hide() {
-	setVisible(false);
-	_needRefresh = true;
-	updatePosition();
-}
-
-SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene)
-	: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _isClicked(false) {
-	
-	loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
-	setVisible(false);
-	loadSound(0, 0x44045140);
-	SetUpdateHandler(&SsScene1105OpenButton::update);
-	SetMessageHandler(&SsScene1105OpenButton::handleMessage);
-}
-
-void SsScene1105OpenButton::update() {
-	updatePosition();
-	if (_countdown != 0 && (--_countdown == 0)) {
-		setVisible(false);
-		sendMessage(_parentScene, 0x2001, 0);
-	}
-}
-
-uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1011:
-		if (_countdown == 0 && !_isClicked) {
-			playSound(0);
-			setVisible(true);
-			_isClicked = true;
-			_countdown = 4;
-		}
-		messageResult = 1;
-		break;
-	}
-	return messageResult;
-}
-
-Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false),
-	_isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) {
-	
-	Sprite *ssOpenButton;
-	
-	_vm->gameModule()->initMemoryPuzzle();
-	
-	SetUpdateHandler(&Scene1105::update);
-	SetMessageHandler(&Scene1105::handleMessage);
-	
-	setBackground(0x20010002);
-	setPalette(0x20010002);
-	
-	_asTeddyBear = insertSprite<AsScene1105TeddyBear>(this);
-	ssOpenButton = insertSprite<SsScene1105OpenButton>(this);
-	addCollisionSprite(ssOpenButton);
-	insertPuzzleMouse(0x10006208, 20, 620);
-	
-	loadSound(0, 0x48442057);
-	loadSound(1, 0xC025014F);
-	loadSound(2, 0x68E25540);
-	
-}
-
-uint32 Scene1105::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-			if (!_isActionButtonClicked && _backgroundIndex == 0) {
-				if (_isPanelOpen) {
-					_isPanelOpen = false;
-					_backgroundIndex = 15;
-					SetUpdateHandler(&Scene1105::upClosePanel);
-				} else
-					_isPanelOpen = true;
-				_leaveResult = 0;
-			}
-		}
-		break;
-	case 0x2001:
-		showMouse(false);
-		_backgroundIndex = 24;
-		SetUpdateHandler(&Scene1105::upOpenPanel);
-		break;
-	case 0x2003:
-		_backgroundIndex = 24;
-		_leaveResult = 1;
-		SetUpdateHandler(&Scene1105::upClosePanel);
-		break;
-	case 0x4807:
-		if (sender == _ssActionButton) {
-			if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) &&
-				getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) &&
-				getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) {
-				setGlobalVar(V_ROBOT_TARGET, 1);
-				playSound(2);
-				_doMoveTeddy = true;
-			} else {
-				sendMessage(_asTeddyBear, 0x2002, 0);
-			}
-			showMouse(false);
-			_isActionButtonClicked = true;
-		}
-		break;
-	case 0x4826:
-		if (_isPanelOpen) {
-			if (sender == _ssActionButton) {
-				sendMessage(_ssActionButton, 0x480B, 0);
-				_isPanelOpen = false;
-			} else if (!getGlobalVar(V_ROBOT_TARGET)) {
-				if (sender == _ssSymbol1UpButton) {
-					if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) {
-						incSubVar(VA_CURR_DICE_NUMBERS, 0, +1);
-						sendMessage(_ssSymbol1UpButton, 0x480B, 0);
-						sendMessage(_ssSymbolDice[0], 0x2000, 0);
-					}
-				} else if (sender == _ssSymbol1DownButton) {
-					if (getSubVar(VA_CURR_DICE_NUMBERS, 0) > 1) {
-						incSubVar(VA_CURR_DICE_NUMBERS, 0, -1);
-						sendMessage(_ssSymbol1DownButton, 0x480B, 0);
-						sendMessage(_ssSymbolDice[0], 0x2000, 0);
-					}
-				} else if (sender == _ssSymbol2UpButton) {
-					if (getSubVar(VA_CURR_DICE_NUMBERS, 1) < 9) {
-						incSubVar(VA_CURR_DICE_NUMBERS, 1, +1);
-						sendMessage(_ssSymbol2UpButton, 0x480B, 0);
-						sendMessage(_ssSymbolDice[1], 0x2000, 0);
-					}
-				} else if (sender == _ssSymbol2DownButton) {
-					if (getSubVar(VA_CURR_DICE_NUMBERS, 1) > 1) {
-						incSubVar(VA_CURR_DICE_NUMBERS, 1, -1);
-						sendMessage(_ssSymbol2DownButton, 0x480B, 0);
-						sendMessage(_ssSymbolDice[1], 0x2000, 0);
-					}
-				} else if (sender == _ssSymbol3UpButton) {
-					if (getSubVar(VA_CURR_DICE_NUMBERS, 2) < 9) {
-						incSubVar(VA_CURR_DICE_NUMBERS, 2, +1);
-						sendMessage(_ssSymbol3UpButton, 0x480B, 0);
-						sendMessage(_ssSymbolDice[2], 0x2000, 0);
-					}
-				} else if (sender == _ssSymbol3DownButton) {
-					if (getSubVar(VA_CURR_DICE_NUMBERS, 2) > 1) {
-						incSubVar(VA_CURR_DICE_NUMBERS, 2, -1);
-						sendMessage(_ssSymbol3DownButton, 0x480B, 0);
-						sendMessage(_ssSymbolDice[2], 0x2000, 0);
-					}
-				}
-			}
-		}
-		break;
-	}
-	return messageResult;
-}
-
-void Scene1105::createObjects() {
-	_ssSymbols[0] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 0)], 161, 304);
-	_ssSymbols[1] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 1)], 294, 304);
-	_ssSymbols[2] = insertSprite<SsScene1105Symbol>(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 2)], 440, 304);
-
-	_ssSymbolDice[0] = insertSprite<SsScene1105SymbolDie>(0, 206, 304);
-	_ssSymbolDice[1] = insertSprite<SsScene1105SymbolDie>(1, 339, 304);
-	_ssSymbolDice[2] = insertSprite<SsScene1105SymbolDie>(2, 485, 304);
-
-	_ssSymbol1UpButton = insertSprite<SsScene1105Button>(this, 0x08002860, NRect(146, 362, 192, 403));
-	addCollisionSprite(_ssSymbol1UpButton);
-	_ssSymbol1DownButton = insertSprite<SsScene1105Button>(this, 0x42012460, NRect(147, 404, 191, 442));
-	addCollisionSprite(_ssSymbol1DownButton);
-	_ssSymbol2UpButton = insertSprite<SsScene1105Button>(this, 0x100030A0, NRect(308, 361, 355, 402));
-	addCollisionSprite(_ssSymbol2UpButton);
-	_ssSymbol2DownButton = insertSprite<SsScene1105Button>(this, 0x840228A0, NRect(306, 406, 352, 445));
-	addCollisionSprite(_ssSymbol2DownButton);
-	_ssSymbol3UpButton = insertSprite<SsScene1105Button>(this, 0x20000120, NRect(476, 358, 509, 394));
-	addCollisionSprite(_ssSymbol3UpButton);
-	_ssSymbol3DownButton = insertSprite<SsScene1105Button>(this, 0x08043121, NRect(463, 401, 508, 438));
-	addCollisionSprite(_ssSymbol3DownButton);
-	_ssActionButton = insertSprite<SsScene1105Button>(this, 0x8248AD35, NRect(280, 170, 354, 245));
-	addCollisionSprite(_ssActionButton);
-	
-	_isPanelOpen = true;
-	
-	_asTeddyBear->show();
-
-	insertPuzzleMouse(0x18666208, 20, 620);
-	
-}
-
-void Scene1105::upOpenPanel() {
-	Scene::update();
-	if (_backgroundIndex != 0) {
-		_backgroundIndex--;
-		if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) {
-			uint32 backgroundFileHash = kScene1105BackgroundFileHashes[_backgroundIndex / 2];
-			changeBackground(backgroundFileHash);
-			_palette->addPalette(backgroundFileHash, 0, 256, 0);
-		}
-		if (_backgroundIndex == 10)
-			playSound(0);
-		if (_backgroundIndex == 0) {
-			SetUpdateHandler(&Scene1105::update);
-			_countdown = 2;
-		}
-	}
-}
-
-void Scene1105::upClosePanel() {
-	Scene::update();
-	if (_backgroundIndex != 0) {
-		_backgroundIndex--;
-		if (_backgroundIndex == 14) {
-			showMouse(false);
-			_ssSymbols[0]->hide();
-			_ssSymbols[1]->hide();
-			_ssSymbols[2]->hide();
-			_ssSymbolDice[0]->hide();
-			_ssSymbolDice[1]->hide();
-			_ssSymbolDice[2]->hide();
-		}
-		if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) {
-			uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME
-			if (_backgroundIndex == 4) {
-				playSound(1);
-				_asTeddyBear->hide();
-			}
-			changeBackground(backgroundFileHash);
-			_palette->addPalette(backgroundFileHash, 0, 256, 0);
-		}
-		if (_backgroundIndex == 0) {
-			SetUpdateHandler(&Scene1105::update);
-			_isClosePanelDone = true;
-		}
-	}
-}
-
-void Scene1105::update() {
-
-	// DEBUG: Show the correct code
-	debug("(%d, %d) (%d, %d) (%d, %d)", 
-		getSubVar(VA_GOOD_DICE_NUMBERS, 0), getSubVar(VA_CURR_DICE_NUMBERS, 0),
-		getSubVar(VA_GOOD_DICE_NUMBERS, 1), getSubVar(VA_CURR_DICE_NUMBERS, 1),
-		getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2));
-
-	Scene::update();
-	if (_countdown != 0 && (--_countdown == 0))
-		createObjects();
-	if (_isClosePanelDone && !isSoundPlaying(1))
-		leaveScene(_leaveResult);
-	if (_doMoveTeddy && !isSoundPlaying(2)) {
-		sendMessage(_asTeddyBear, 0x2002, 0);
-		_doMoveTeddy = false;
-	}
-}
-
-Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule) {
-	
-	SetMessageHandler(&Scene1109::handleMessage);
-	
-	setBackground(0x8449E02F);
-	setPalette(0x8449E02F);
-	insertScreenMouse(0x9E02B84C);
-	
-	_sprite1 = insertStaticSprite(0x600CEF01, 1100);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1109>(140, 436);
-		setMessageList(0x004B6260);
-		sendMessage(this, 0x2000, 0);
-	} else if (which == 1) {
-		// Klaymen teleporting in
-		insertKlaymen<KmScene1109>(450, 436);
-		sendMessage(_klaymen, 0x2000, 1);
-		setMessageList(0x004B6268, false);
-		sendMessage(this, 0x2000, 1);
-	} else if (which == 2) {
-		// Klaymen teleporting out
-		insertKlaymen<KmScene1109>(450, 436);
-		sendMessage(_klaymen, 0x2000, 1);
-		setMessageList(0x004B6318, false);
-		sendMessage(this, 0x2000, 1);
-	} else if (which == 3) {
-		// Klaymen returning from teleporter console
-		insertKlaymen<KmScene1109>(450, 436);
-		sendMessage(_klaymen, 0x2000, 1);
-		setMessageList(0x004B6278, false);
-		sendMessage(this, 0x2000, 1);
-	} else {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1109>(0, 436);
-		setMessageList(0x004B6258);
-		sendMessage(this, 0x2000, 0);
-	}
-
-	_klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480);
-
-}
-
-uint32 Scene1109::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2000:
-		if (param.asInteger()) {
-			setRectList(0x004B63A8);
-			_klaymen->setKlaymenIdleTable3();
-		} else {
-			setRectList(0x004B6398);
-			_klaymen->setKlaymenIdleTable1();
-		}
-		break;
-	}
-	return 0;
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h
deleted file mode 100644
index e3fb7cb..0000000
--- a/engines/neverhood/module1100.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* 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_MODULE1100_H
-#define NEVERHOOD_MODULE1100_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/module.h"
-#include "neverhood/scene.h"
-
-namespace Neverhood {
-
-// Module1100
-
-class Module1100 : public Module {
-public:
-	Module1100(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Module1100();
-protected:
-	int _sceneNum;
-	int _countdown;
-	void createScene(int sceneNum, int which);
-	void updateScene();
-};
-
-class SsScene1105Button : public StaticSprite {
-public:
-	SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds);
-protected:
-	Scene *_parentScene;
-	int _countdown;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class SsScene1105Symbol : public StaticSprite {
-public:
-	SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y);
-	void hide();
-};
-
-class SsScene1105SymbolDie : public StaticSprite {
-public:
-	SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y);
-	void hide();
-protected:
-	uint _dieIndex;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void loadSymbolSprite();
-};
-
-class AsScene1105TeddyBear : public AnimatedSprite {
-public:
-	AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene);
-	void show();
-	void hide();
-protected:
-	Scene *_parentScene;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class SsScene1105OpenButton : public StaticSprite {
-public:
-	SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene);
-protected:
-	Scene *_parentScene;
-	int _countdown;
-	bool _isClicked;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Scene1105 : public Scene {
-public:
-	Scene1105(NeverhoodEngine *vm, Module *parentModule);
-protected:
-	int _countdown;
-	int _backgroundIndex;
-	bool _isPanelOpen;
-	bool _isActionButtonClicked;
-	bool _doMoveTeddy;
-	bool _isClosePanelDone;
-	int _leaveResult;
-	AsScene1105TeddyBear *_asTeddyBear;
-	SsScene1105Symbol *_ssSymbols[3];
-	SsScene1105SymbolDie *_ssSymbolDice[3];
-	Sprite *_ssSymbol1UpButton;
-	Sprite *_ssSymbol1DownButton;
-	Sprite *_ssSymbol2UpButton;
-	Sprite *_ssSymbol2DownButton;
-	Sprite *_ssSymbol3UpButton;
-	Sprite *_ssSymbol3DownButton;
-	Sprite *_ssActionButton;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void createObjects();
-	void upOpenPanel();
-	void upClosePanel();
-	void update();
-};
-
-class Scene1109 : public Scene {
-public:
-	Scene1109(NeverhoodEngine *vm, Module *parentModule, int which);
-protected:
-	Sprite *_sprite1;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_MODULE1100_H */
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
deleted file mode 100644
index 1536114..0000000
--- a/engines/neverhood/module1200.cpp
+++ /dev/null
@@ -1,1102 +0,0 @@
-/* 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/module1200.h"
-
-namespace Neverhood {
-
-Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	SetMessageHandler(&Module1200::handleMessage);
-
-	if (which < 0)
-		createScene(_vm->gameState().sceneNum, -1);
-	else if (which == 1)
-		createScene(0, 2);
-	else
-		createScene(0, 0);
-
-	_vm->_soundMan->addMusic(0x00478311, 0x62222CAE);
-	_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
-}
-
-Module1200::~Module1200() {
-	_vm->_soundMan->deleteMusicGroup(0x00478311);
-}
-
-void Module1200::createScene(int sceneNum, int which) {
-	debug("Module1200::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 0:
-		_vm->gameState().sceneNum = 0;
-		_childObject = new Scene1201(_vm, this, which);
-		break;
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		_childObject = new Scene1202(_vm, this);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		_vm->_soundMan->stopMusic(0x62222CAE, 0, 0);
-		createSmackerScene(0x31890001, true, true, false);
-		setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1);
-		break;
-	}
-	SetUpdateHandler(&Module1200::updateScene);
-	_childObject->handleUpdate();
-}
-
-void Module1200::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 0:
-			if (_moduleResult == 1)
-				createScene(1, 0);
-			else if (_moduleResult == 2) {
-				if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID))
-					createScene(2, -1);
-				else
-					leaveModule(1);
-			} else
-				leaveModule(0);
-			break;
-		case 1:
-			createScene(0, 1);
-			break;
-		case 2:
-			_vm->_soundMan->startMusic(0x62222CAE, 0, 0);
-			createScene(0, 3);
-			break;
-		}
-	}
-}
-
-// 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);
-	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) {
-
-	int16 topY1, topY2, topY3, topY4;
-	int16 x1, x2;
-	Sprite *tempSprite;
-
-	SetUpdateHandler(&Scene1201::update);
-	SetMessageHandler(&Scene1201::handleMessage);
-
-	setHitRects(0x004AEBD0);
-	
-	if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) {
-		setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1);
-		for (uint32 index = 0; index < 18; index++)
-			setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]);
-	}
-
-	insertScreenMouse(0x9A2C0409);
-	
-	_asTape = insertSprite<AsScene1201Tape>(this, 3, 1100, 243, 340, 0x9148A011);
-	addCollisionSprite(_asTape);
-	
-	tempSprite = insertStaticSprite(0x03C82530, 100);
-	topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; 
-
-	tempSprite = insertStaticSprite(0x88182069, 200);
-	topY2 = tempSprite->getY() + tempSprite->getDrawRect().height; 
-
-	tempSprite = insertStaticSprite(0x476014E0, 300);
-	topY3 = tempSprite->getY() + tempSprite->getDrawRect().height; 
-
-	tempSprite = insertStaticSprite(0x04063110, 500);
-	topY4 = tempSprite->getY() + 1; 
-
-	_asTntManRope = insertSprite<AsScene1201TntManRope>(getGlobalVar(V_TNT_DUMMY_BUILT) && which != 1);
-	_asTntManRope->setClipRect(0, topY4, 640, 480);
-	
-	insertStaticSprite(0x400B04B0, 1200);
-
-	tempSprite = insertStaticSprite(0x40295462, 1200);
-	x1 = tempSprite->getX();
-
-	tempSprite = insertStaticSprite(0xA29223FA, 1200);
-	x2 = tempSprite->getX() + tempSprite->getDrawRect().width;
-
-	_asKlaymenHead = insertSprite<AsScene1201KlaymenHead>();
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1201>(364, 333);
-		setMessageList(0x004AEC08);
-	} else if (which == 3) {
-		// Klaymen standing after the weasel exploded
-		insertKlaymen<KmScene1201>(400, 329);
-		setMessageList(0x004AEC08);
-	} else if (which == 2) {
-		// Klaymen entering from the right
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
-			insertKlaymen<KmScene1201>(374, 333);
-			setMessageList(0x004AEC08);
-		} else {
-			insertKlaymen<KmScene1201>(640, 329);
-			setMessageList(0x004AEC20);
-		}
-	} else if (which == 1) {
-		// Klaymen returning from the TNT console
-		if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) {
-			insertKlaymen<KmScene1201>(364, 333);
-			_klaymen->setDoDeltaX(1);
-		} else {
-			insertKlaymen<KmScene1201>(246, 333);
-		}
-		setMessageList(0x004AEC30);
-	} else {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1201>(0, 336);
-		setMessageList(0x004AEC10);
-	}
-
-	_klaymen->setClipRect(x1, 0, x2, 480);
-	_klaymen->setRepl(64, 0);
-	
-	if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
-		setBackground(0x4019A2C4);
-		setPalette(0x4019A2C4);
-		_asRightDoor = NULL;
-	} else {
-		setBackground(0x40206EC5);
-		setPalette(0x40206EC5);
-		_asRightDoor = insertSprite<AsScene1201RightDoor>(_klaymen, which == 2);
-	}
-
-	if (getGlobalVar(V_TNT_DUMMY_BUILT)) {
-		insertStaticSprite(0x10002ED8, 500);
-		if (!getGlobalVar(V_CREATURE_EXPLODED)) {
-			_asTntMan = insertSprite<AsScene1201TntMan>(this, _asTntManRope, which == 1);
-			_asTntMan->setClipRect(x1, 0, x2, 480);
-			_asTntMan->setRepl(64, 0);
-			addCollisionSprite(_asTntMan);
-			tempSprite = insertSprite<AsScene1201TntManFlame>(_asTntMan);
-			tempSprite->setClipRect(x1, 0, x2, 480);
-		}
-		
-		uint32 tntIndex = 1; 
-		while (tntIndex < 18) {
-			uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex);
-			int16 clipY2;
-			if (kScene1201PointArray[elemIndex].y < 175)
-				clipY2 = topY1;
-			else if (kScene1201PointArray[elemIndex].y < 230)
-				clipY2 = topY2;
-			else
-				clipY2 = topY3;
-			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2);
-			elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex + 1);
-			if (kScene1201PointArray[elemIndex].y < 175)
-				clipY2 = topY1;
-			else if (kScene1201PointArray[elemIndex].y < 230)
-				clipY2 = topY2;
-			else
-				clipY2 = topY3;
-			insertSprite<SsScene1201Tnt>(tntIndex + 1, getSubVar(VA_TNT_POSITIONS, tntIndex + 1), clipY2);
-			tntIndex += 3;
-		}
-
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) {
-			setRectList(0x004AEE58);
-		} else {
-			setRectList(0x004AEDC8);
-		} 
-		
-	} else {
-	
-		insertStaticSprite(0x8E8A1981, 900);
-
-		uint32 tntIndex = 0;
-		while (tntIndex < 18) {
-			uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex);
-			int16 clipY2;
-			if (kScene1201PointArray[elemIndex].x < 300) {
-				clipY2 = 480;
-			} else { 
-				if (kScene1201PointArray[elemIndex].y < 175)
-					clipY2 = topY1;
-				else if (kScene1201PointArray[elemIndex].y < 230)
-					clipY2 = topY2;
-				else
-					clipY2 = topY3;
-			}
-			insertSprite<SsScene1201Tnt>(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2);
-			tntIndex++;
-		}
-
-		if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED))
-			setRectList(0x004AEE18);
-		else
-			setRectList(0x004AED88);
-		 
-	}
-
-	tempSprite = insertStaticSprite(0x63D400BC, 900);
-
-	_asLeftDoor = insertSprite<AsScene1201LeftDoor>(_klaymen);
-	_asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480);
-
-	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0)
-		setGlobalVar(V_MATCH_STATUS, 1);
-
-	_asMatch = NULL;
-
-	if (getGlobalVar(V_MATCH_STATUS) < 3) {
-		_asMatch = insertSprite<AsScene1201Match>(this);
-		addCollisionSprite(_asMatch);
-	}
-
-	if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) {
-		_asCreature = insertSprite<AsScene1201Creature>(this, _klaymen);
-		_asCreature->setClipRect(x1, 0, x2, 480);
-	}
-
-}
-
-Scene1201::~Scene1201() {
-	if (_creatureExploded)
-		setGlobalVar(V_CREATURE_EXPLODED, 1);
-	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0);
-}
-
-void Scene1201::update() {
-	Scene::update();
-	if (_asMatch && getGlobalVar(V_MATCH_STATUS) == 3)
-		deleteSprite(&_asMatch);
-}
-
-uint32 Scene1201::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x07053000) {
-			_creatureExploded = true;
-			sendMessage(_asCreature, 0x2004, 0);
-		} else if (param.asInteger() == 0x140E5744)
-			sendMessage(_asCreature, 0x2005, 0);
-		else if (param.asInteger() == 0x40253C40) {
-			_canAcceptInput = false;
-			sendMessage(_asCreature, 0x2006, 0);
-		} else if (param.asInteger() == 0x090EB048) {
-			if (_klaymen->getX() < 572)
-				setMessageList2(0x004AEC90);
-			else
-				setMessageList2(0x004AEC20);
-		}
-		break;
-	case 0x2001:
-		if (getGlobalVar(V_MATCH_STATUS) == 0)
-			setMessageList2(0x004AECB0);
-		else {
-			sendEntityMessage(_klaymen, 0x1014, _asMatch);
-			setMessageList2(0x004AECC0);
-		}
-		break;
-	case 0x2002:		
-		if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) {
-			// Move the TNT dummy if the fuse is burning
-			sendEntityMessage(_klaymen, 0x1014, _asTntMan);
-			setMessageList2(0x004AECF0, false);
-		} else if (getGlobalVar(V_MATCH_STATUS) == 3) {
-			// Light the TNT dummy if we have the match
-			sendEntityMessage(_klaymen, 0x1014, _asTntMan);
-			if (_klaymen->getX() > _asTntMan->getX())
-				setMessageList(0x004AECD0);
-			else
-				setMessageList(0x004AECE0);
-		}
-		break;
-	case 0x4814:
-		cancelMessageList();
-		break;
-	case 0x4826:
-		if (sender == _asTape) {
-			sendEntityMessage(_klaymen, 0x1014, _asTape);
-			setMessageList(0x004AED38);
-		}
-		break;
-	case 0x4829:
-		sendMessage(_asRightDoor, 0x4829, 0);
-		break;
-	case 0x8000:
-		sendMessage(_asKlaymenHead, 0x2006, 0);
-		break;		
-	}
-	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) {
-
-	SetMessageHandler(&Scene1202::handleMessage);
-	SetUpdateHandler(&Scene1202::update);
-
-	setBackground(0x60210ED5);
-	setPalette(0x60210ED5);
-	addEntity(_palette);
-
-	_paletteResource.load(0x60250EB5);
-	_paletteResource.copyPalette(_paletteData);
-
-	insertPuzzleMouse(0x10ED160A, 20, 620);
-
-	for (int tntIndex = 0; tntIndex < 18; tntIndex++) {
-		_asTntItems[tntIndex] = insertSprite<AsScene1202TntItem>(this, tntIndex);
-		addCollisionSprite(_asTntItems[tntIndex]);
-	}
-
-	insertStaticSprite(0x8E8419C1, 1100);
-
-	if (getGlobalVar(V_TNT_DUMMY_BUILT))
-		SetMessageHandler(&Scene1202::hmSolved);
-
-	playSound(0, 0x40106542);
-	loadSound(1, 0x40005446);
-	loadSound(2, 0x40005446); // Same sound as slot 1
-	loadSound(3, 0x68E25540);
-
-}
-
-Scene1202::~Scene1202() {
-	if (isSolved())
-		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
-}
-
-void Scene1202::update() {
-	Scene::update();
-	if (_isPuzzleSolved) {
-		if (!isSoundPlaying(3))
-			leaveScene(0);
-	} else if (_counter == 0 && isSolved()) {
-		_clickedIndex = 0;
-		SetMessageHandler(&Scene1202::hmSolved);
-		setGlobalVar(V_TNT_DUMMY_BUILT, 1);
-		_palette->copyToBasePalette(_paletteData);
-		_palette->startFadeToPalette(24);
-		playSound(3);
-		_isPuzzleSolved = true;
-	} else if (_clickedIndex >= 0 && _counter == 0) {
-		// Swap TNT positions
-		int destIndex = kScene1202Table[_clickedIndex];
-		sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex));
-		sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex));
-		int temp = getSubVar(VA_TNT_POSITIONS, destIndex);
-		setSubVar(VA_TNT_POSITIONS, destIndex, getSubVar(VA_TNT_POSITIONS, _clickedIndex));
-		setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp);
-		_counter = 2;
-		_clickedIndex = -1;
-		playSound(_soundToggle ? 1 : 2);
-		_soundToggle = !_soundToggle;
-	}
-}
-
-uint32 Scene1202::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isPuzzleSolved)
-			leaveScene(0);
-		break;
-	case 0x2000:
-		_clickedIndex = (int)param.asInteger();
-		break;
-	case 0x2002:
-		_counter--;
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Scene1202::hmSolved(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
-			leaveScene(0);
-		break;
-	}
-	return 0;
-}
-
-bool Scene1202::isSolved() {
-	return 
-		getSubVar(VA_TNT_POSITIONS,  0) ==  0 && getSubVar(VA_TNT_POSITIONS,  3) ==  3 && 
-		getSubVar(VA_TNT_POSITIONS,  6) ==  6 && getSubVar(VA_TNT_POSITIONS,  9) ==  9 &&
-		getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15;
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h
deleted file mode 100644
index f6f97b4..0000000
--- a/engines/neverhood/module1200.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/* 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_MODULE1200_H
-#define NEVERHOOD_MODULE1200_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/module.h"
-#include "neverhood/scene.h"
-
-namespace Neverhood {
-
-// Module1200
-
-class Module1200 : public Module {
-public:
-	Module1200(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Module1200();
-protected:
-	int _sceneNum;
-	void createScene(int sceneNum, int which);
-	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);
-protected:
-	uint32 _elemIndex;
-};
-
-class Scene1201 : public Scene {
-public:
-	Scene1201(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Scene1201();
-protected:
-	Sprite *_asMatch;
-	AsScene1201TntMan *_asTntMan;
-	Sprite *_asCreature;
-	Sprite *_asTntManRope;
-	Sprite *_asLeftDoor;
-	Sprite *_asRightDoor;
-	Sprite *_asTape;
-	Sprite *_asKlaymenHead;
-	bool _creatureExploded;
-	void update();
-	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);
-	virtual ~Scene1202();
-protected:
-	PaletteResource _paletteResource;
-	Sprite *_asTntItems[18];
-	int _counter;
-	int _clickedIndex;
-	byte _paletteData[1024];
-	bool _isPuzzleSolved;
-	bool _soundToggle;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmSolved(int messageNum, const MessageParam &param, Entity *sender);
-	bool isSolved();
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_MODULE1200_H */
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
deleted file mode 100644
index 162d710..0000000
--- a/engines/neverhood/module1300.cpp
+++ /dev/null
@@ -1,1835 +0,0 @@
-/* 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/module1300.h"
-#include "neverhood/module1000.h"
-#include "neverhood/module1200.h"
-#include "neverhood/module1400.h"
-#include "neverhood/module2200.h"
-#include "neverhood/gamemodule.h"
-#include "neverhood/diskplayerscene.h"
-#include "neverhood/menumodule.h"
-#include "neverhood/navigationscene.h"
-#include "neverhood/smackerscene.h"
-
-namespace Neverhood {
-
-static const uint32 kModule1300SoundList[] = {
-	0x16805648,
-	0x16805C48,
-	0xB4964448,
-	0x96A05481,
-	0xD0E14441,
-	0x90815450,
-	0
-};
-
-Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	_vm->_soundMan->addMusic(0x61C090, 0x00203197);
-	_vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList);
-	_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150);
-	_vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0);
-	_vm->_soundMan->setSoundVolume(0x48498E46, 70);
-	_vm->_soundMan->setSoundVolume(0x50399F64, 70);
-
-	if (which < 0) {
-		if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17)
-			createScene(_vm->gameState().sceneNum, -1);
-		else			
-			createScene(11, 0);
-	} else {
-		switch (which) {
-		case 0:
-			createScene(11, 0);
-			break;
-		case 1:
-			createScene(13, 0);
-			break;
-		case 2:
-			createScene(14, 0);
-			break;
-		case 3:
-			createScene(15, 0);
-			break;
-		case 4:
-			createScene(7, 0);
-			break;
-		case 5:
-			createScene(5, 1);
-			break;
-		case 6:
-			createScene(5, 5);
-			break;
-		case 7:
-			createScene(3, 0);
-			break;
-		case 8:
-			createScene(1, 0);
-			break;
-		case 9:
-			createScene(2, 0);
-			break;
-		case 10:
-			createScene(6, 0);
-			break;
-		case 11:
-			createScene(4, 0);
-			break;
-		default:
-			createScene(12, 0);
-			break;
-		}
-	}
-	
-}
-
-Module1300::~Module1300() {
-	_vm->_soundMan->deleteGroup(0x61C090);
-}
-
-void Module1300::createScene(int sceneNum, int which) {
-	debug("Module1300::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x00203197, 0, 2);
-		_childObject = new Scene1302(_vm, this, which);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new Scene1303(_vm, this);
-		break;
-	case 3:
-		_vm->gameState().sceneNum = 3;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new Scene1304(_vm, this, which);
-		break;
-	case 4:
-		_vm->gameState().sceneNum = 4;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x00203197, 0, 2);
-		_childObject = new Scene1305(_vm, this, which);
-		break;
-	case 5:
-		_vm->gameState().sceneNum = 5;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x00203197, 0, 2);
-		_childObject = new Scene1306(_vm, this, which);
-		break;
-	case 6:
-		_vm->gameState().sceneNum = 6;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x00203197, 0, 2);
-		_childObject = new Scene1307(_vm, this);
-		break;
-	case 7:
-		_vm->gameState().sceneNum = 7;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->startMusic(0x00203197, 0, 2);
-		_childObject = new Scene1308(_vm, this, which);
-		break;
-	case 8:
-		_vm->gameState().sceneNum = 8;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new DiskplayerScene(_vm, this, 1);
-		break;
-	case 9:
-		_vm->gameState().sceneNum = 9;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createSmackerScene(0x20082818, true, true, false);
-		break;
-	case 10:
-		_vm->gameState().sceneNum = 10;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createSmackerScene(0x20082828, true, true, false);
-		break;
-	case 11:
-		_vm->gameState().sceneNum = 11;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createNavigationScene(0x004B27A8, which);
-		break;
-	case 12:
-		_vm->gameState().sceneNum = 12;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createNavigationScene(0x004B2718, which);
-		break;
-	case 13:
-		_vm->gameState().sceneNum = 13;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createNavigationScene(0x004B27D8, which);
-		break;
-	case 14:
-		_vm->gameState().sceneNum = 14;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createNavigationScene(0x004B2808, which);
-		break;
-	case 15:
-		_vm->gameState().sceneNum = 15;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		createNavigationScene(0x004B2838, which);
-		break;
-	case 16:
-		_vm->gameState().sceneNum = 16;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new Scene1317(_vm, this);
-		break;
-	case 17:
-		_vm->gameState().sceneNum = 17;
-		_vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0);
-		_vm->_soundMan->stopMusic(0x00203197, 0, 2);
-		_childObject = new CreditsScene(_vm, this, false);
-		break;
-	}
-	SetUpdateHandler(&Module1300::updateScene);
-	_childObject->handleUpdate();
-}
-			
-void Module1300::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 1:
-			if (_moduleResult == 1)
-				createScene(4, 0);
-			else
-				createScene(7, 1);
-			break;
-		case 2:
-			createScene(5, 3);
-			break;
-		case 3:
-			createScene(15, 0);
-			break;
-		case 4:
-			createScene(16, -1);
-			break;
-		case 5:
-			if (_moduleResult == 2)
-				createScene(8, 0);
-			else if (_moduleResult == 3)
-				createScene(2, 0);
-			else if (_moduleResult == 0)
-				leaveModule(0);
-			else if (_moduleResult == 1)
-				createScene(10, -1);
-			break;
-		case 6:
-			createScene(7, 2);
-			break;
-		case 7:
-			if (_moduleResult == 0)
-				createScene(13, 0);
-			else if (_moduleResult == 1)
-				createScene(1, 0);
-			else if (_moduleResult == 2)
-				createScene(6, 0);
-			break;
-		case 8:
-			createScene(5, 2);
-			break;
-		case 9:
-			createScene(5, 0);
-			break;
-		case 10:
-			createScene(14, 0);
-			break;
-		case 11:
-			if (_moduleResult == 0)
-				createScene(12, 0);
-			else if (_moduleResult == 1)
-				createScene(11, 1);
-			break;
-		case 12:
-			if (_moduleResult == 0) 
-				createScene(14, 1);
-			else if (_moduleResult == 1)
-				createScene(15, 1);
-			else if (_moduleResult == 3)
-				createScene(11, 1);
-			else if (_moduleResult == 5)
-				createScene(13, 1);
-			break;
-		case 13:
-			if (_moduleResult == 0)
-				createScene(12, 2);
-			else if (_moduleResult == 1)
-				createScene(7, 0);
-			break;
-		case 14:
-			if (_moduleResult == 0)
-				createScene(12, 3);
-			else if (_moduleResult == 1)
-				createScene(9, -1);
-			break;
-		case 15:
-			if (_moduleResult == 0)
-				createScene(12, 4);
-			else if (_moduleResult == 1)
-				createScene(3, 0);
-			break;
-		case 16:
-			createScene(17, -1);
-			break;
-		case 17:
-			leaveModule(1);
-			break;
-		}
-	}
-}
-
-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) {
-
-	SetMessageHandler(&Scene1302::handleMessage);
-
-	setHitRects(0x004B0858);
-	setRectList(0x004B0A38);
-	setBackground(0x420643C4);
-	setPalette(0x420643C4);
-	insertScreenMouse(0x643C0428);
-
-	_class595 = insertStaticSprite(0xB0420130, 1015);
-	_sprite1 = insertStaticSprite(0x942FC224, 300);
-	_sprite2 = insertStaticSprite(0x70430830, 1200);
-	_sprite2->setVisible(false);
-	_sprite3 = insertStaticSprite(0x16E01E20, 1100);
-	_asRing1 = insertSprite<AsScene1002Ring>(this, false, 218, 122, _class595->getDrawRect().y, false);
-	_asRing2 = insertSprite<AsScene1002Ring>(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE));
-	_asRing3 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false);
-	_asRing4 = insertSprite<AsScene1002Ring>(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE));
-	_asRing5 = insertSprite<AsScene1002Ring>(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false);
-	_asBridge = insertSprite<AsScene1302Bridge>(this);
-	_ssFence = insertSprite<SsScene1302Fence>();
-	_ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2());
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1002>(380, 364);
-		setMessageList(0x004B0868);
-	} else {
-		// Klaymen entering from back
-		insertKlaymen<KmScene1002>(293, 330);
-		setMessageList(0x004B0870);
-	}
-
-	_klaymen->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480);
-
-	_asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klaymen, true);
-	addCollisionSprite(_asVenusFlyTrap);
-
-	sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap);
-	
-}
-
-uint32 Scene1302::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x4A845A00)
-			sendEntityMessage(_klaymen, 0x1014, _asRing1);
-		else if (param.asInteger() == 0x43807801) {
-			if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) {
-				sendEntityMessage(_klaymen, 0x1014, _asRing2);
-				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32)
-					setMessageList(0x004B0940);
-				else
-					setMessageList(0x004B0938);
-			} else
-				setMessageList(0x004B0950);
-			messageResult = 1;
-		} else if (param.asInteger() == 0x46C26A01)
-			sendEntityMessage(_klaymen, 0x1014, _asRing3);
-		else if (param.asInteger() == 0x468C7B11) {
-			if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) {
-				sendEntityMessage(_klaymen, 0x1014, _asRing4);
-				if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32)
-					setMessageList(0x004B0940);
-				else
-					setMessageList(0x004B0938);
-			} else
-				setMessageList(0x004B0950);
-			messageResult = 1;
-		} else if (param.asInteger() == 0x42845B19)
-			sendEntityMessage(_klaymen, 0x1014, _asRing5);
-		else if (param.asInteger() == 0x430A6060) {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
-				setMessageList2(0x004B0910);
-			else
-				cancelMessageList();
-		} else if (param.asInteger() == 0x012E2070) {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
-				setMessageList2(0x004B0968);
-			else
-				cancelMessageList();
-		} else if (param.asInteger() == 0x11C40840) {
-			if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342)
-				setMessageList(0x004B0878);
-			else
-				setMessageList(0x004B0978);
-		}
-		break;
-	case 0x2000:
-		if (_klaymen->getY() > 360) {
-			sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap);
-			setMessageList2(0x004B08F0);	
-		} else
-			setMessageList2(0x004B0920);
-		break;
-	case 0x2002:
-		if (_klaymen->getX() > 545)
-			leaveScene(1);
-		break;
-	case 0x2032:
-		_sprite2->setVisible(true);
-		break;
-	case 0x4806:
-		sendMessage(_parentModule, 0x1024, 2);
-		if (sender == _asRing1)
-			playSound(0, 0x665198C0);
-		else if (sender == _asRing2) {
-			sendMessage(_asBridge, 0x4808, 0);
-			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
-		} else if (sender == _asRing3)
-			playSound(0, 0xE2D389C0);
-		else if (sender == _asRing4) {
-			sendMessage(_ssFence, 0x4808, 0);
-			setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
-		} else if (sender == _asRing5)
-			playSound(0, 0x40428A09);
-		break;
-	case 0x4807:
-		if (sender == _asRing2) {
-			sendMessage(_asBridge, 0x4809, 0);
-			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 0);
-			_sprite2->setVisible(false);
-		} else if (sender == _asRing4) {
-			sendMessage(_ssFence, 0x4809, 0);
-			setGlobalVar(V_FLYTRAP_RING_FENCE, 0);
-		} else if (sender == _asVenusFlyTrap) {
-			if (getGlobalVar(V_FLYTRAP_RING_BRIDGE))
-				sendMessage(_asRing2, 0x4807, 0);
-			else
-				sendMessage(_asRing4, 0x4807, 0);
-		}
-		break;
-	case 0x480F:
-		if (sender == _asRing2) {
-			playSound(0, 0x60755842);
-			sendMessage(_asBridge, 0x4808, 0);
-			setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1);
-		} else if (sender == _asRing4) {
-			playSound(0, 0x60755842);
-			sendMessage(_ssFence, 0x4808, 0);
-			setGlobalVar(V_FLYTRAP_RING_FENCE, 1);
-		}
-		break;
-	case 0x482A:
-		sendMessage(_asVenusFlyTrap, 0x482B, 0);
-		break;
-	case 0x482B:
-		sendMessage(_asVenusFlyTrap, 0x482A, 0);
-		break;
-	case 0x8000:
-		setSpriteSurfacePriority(_class595, 995);
-		break;
-	case 0x8001:
-		setSpriteSurfacePriority(_class595, 1015);
-		break;
-	}
-	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) {
-
-	SetMessageHandler(&Scene1303::handleMessage);
-
-	setRectList(0x004AF9E8);
-	setBackground(0x01581A9C);
-	setPalette(0x01581A9C);
-	insertScreenMouse(0x81A9801D);
-
-	if (!getGlobalVar(V_BALLOON_POPPED)) {
-		_asBalloon = insertSprite<AsScene1303Balloon>(this);
-		addCollisionSprite(_asBalloon);
-	}
-	
-	_sprite1 = insertStaticSprite(0xA014216B, 1100);
-
-	insertKlaymen<KmScene1303>(207, 332);
-	setMessageList(0x004AF9A0);
-
-	_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-
-}
-
-uint32 Scene1303::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2000:
-		setGlobalVar(V_BALLOON_POPPED, 1);
-		sendMessage(_asBalloon, 0x2000, 0);
-		break;
-	case 0x4826:
-		if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE))
-			setMessageList(0x004AF9B8);
-		break;
-	}
-	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) {
-	
-	SetMessageHandler(&Scene1304::handleMessage);
-
-	setRectList(0x004B91A8);
-	setBackground(0x062C0214);
-	setPalette(0x062C0214);
-	insertScreenMouse(0xC021006A);
-	
-	if (getGlobalVar(V_BALLOON_POPPED)) {
-		_asKey = insertSprite<AsCommonKey>(this, 0, 1100, 278, 347);
-		addCollisionSprite(_asKey);
-	} else {
-		_asKey = insertSprite<AnimatedSprite>(0x80106018, 100, 279, 48);
-	}
-
-	if (!getGlobalVar(V_HAS_NEEDLE)) {
-		_asNeedle = insertSprite<AsScene1304Needle>(this, 1100, 278, 347);
-		addCollisionSprite(_asNeedle);
-	}
-
-	_sprite1 = insertStaticSprite(0x0562E621, 1100);
-	insertStaticSprite(0x012AE033, 1100);
-	insertStaticSprite(0x090AF033, 1100);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1304>(217, 347);
-		setMessageList(0x004B90E8);
-	} else {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1304>(100, 347);
-		setMessageList(0x004B90F0);
-	}
-
-	_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-
-}
-
-uint32 Scene1304::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x415634A4) {
-			if (getGlobalVar(V_BALLOON_POPPED))
-				cancelMessageList();
-			else
-				setMessageList(0x004B9158);
-		}
-		break;
-	case 0x4826:
-		if (sender == _asNeedle) {
-			sendEntityMessage(_klaymen, 0x1014, _asNeedle);
-			setMessageList(0x004B9130);
-		} else if (sender == _asKey) {
-			sendEntityMessage(_klaymen, 0x1014, _asKey);
-			setMessageList(0x004B9140);
-		}
-		break;
-	}
-	return 0;
-}
-
-Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule) {
-
-	SetMessageHandler(&Scene1305::handleMessage);
-
-	setRectList(0x004B6E98);
-	setBackground(0x28801B64);
-	setPalette(0x28801B64);
-	insertScreenMouse(0x01B60280);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1305>(212, 441);
-		setMessageList(0x004B6E40);
-	} else {
-		// Klaymen enters falling
-		insertKlaymen<KmScene1305>(212, 441);
-		setMessageList(0x004B6E48);
-	}
-	
-}
-
-uint32 Scene1305::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	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) {
-		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) {
-	
-	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
-		setGlobalVar(V_KEY3_LOCATION, 4);
-	
-	SetMessageHandler(&Scene1306::handleMessage);
-
-	setBackground(0x05303114);
-	setPalette(0x05303114);
-	insertScreenMouse(0x0311005B);
-
-	if (getGlobalVar(V_KEY3_LOCATION) == 4) {
-		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 435, 445);
-		addCollisionSprite(_asKey);
-	}
-
-	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0x404A36A0, 100, 0x440C1000);
-	_asTape = insertSprite<AsScene1201Tape>(this, 19, 1100, 359, 445, 0x9148A011);
-	_asElevatorDoor = insertSprite<AnimatedSprite>(0x043B0270, 90, 320, 240);
-	_asElevatorDoor->startAnimation(0x043B0270, 6, -1);
-	_asElevatorDoor->setNewHashListIndex(6);
-	_asElevator = insertSprite<AsScene1306Elevator>(this, _asElevatorDoor);
-	_sprite1 = insertStaticSprite(0x036A1EE0, 80);
-	insertStaticSprite(0x00042313, 1100);
-
-	if (which < 0) {
-		// Resoring game
-		insertKlaymen<KmScene1306>(380, 440);
-		setMessageList(0x004AFAD0);
-		sendMessage(this, 0x2000, 0);
-		addCollisionSprite(_asTape);
-	} else if (which == 1) {
-		// Klaymen teleporting in
-		insertKlaymen<KmScene1306>(136, 440);
-		sendMessage(_klaymen, 0x2000, 1);
-		setMessageList(0x004AFAF0);
-		sendMessage(this, 0x2000, 1);
-		addCollisionSprite(_asTape);
-	} else if (which == 2) {
-		// Klaymen returning from diskplayer
-		if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) {
-			insertKlaymen<KmScene1306>(515, 440);
-			_klaymen->setDoDeltaX(1);
-		} else {
-			insertKlaymen<KmScene1306>(355, 440);
-		}
-		setMessageList(0x004AFBC8);
-		sendMessage(this, 0x2000, 0);
-		addCollisionSprite(_asTape);
-	} else if (which == 3) {
-		// Klaymen returning from window
-		insertKlaymen<KmScene1306>(534, 440);
-		setMessageList(0x004AFC30);
-		sendMessage(this, 0x2000, 0);
-		addCollisionSprite(_asTape);
-	} else if (which == 4) {
-		// Klaymen teleporting out
-		insertKlaymen<KmScene1306>(136, 440);
-		sendMessage(_klaymen, 0x2000, 1);
-		setMessageList(0x004AFC38);
-		sendMessage(this, 0x2000, 1);
-		addCollisionSprite(_asTape);
-	} else if (which == 5) {
-		// Klaymen returning from teleporter
-		insertKlaymen<KmScene1306>(136, 440);
-		sendMessage(_klaymen, 0x2000, 1);
-		setMessageList(0x004AFB00);
-		sendMessage(this, 0x2000, 1);
-		addCollisionSprite(_asTape);
-	} else {
-		// Klaymen coming up in elevator
-		insertKlaymen<KmScene1306>(286, 408);
-		setSurfacePriority(_asElevator->getSurface(), 1100);
-		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
-		setSurfacePriority(_sprite1->getSurface(), 1080);
-		sendMessage(this, 0x2000, 0);
-		SetMessageHandler(&Scene1306::handleMessage416EB0);
-		clearRectList();
-		sendMessage(_asElevator, 0x4808, 0);
-	}
-
-}
-	
-Scene1306::~Scene1306() {
-	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0);
-}
-
-uint32 Scene1306::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x402064D8)
-			sendEntityMessage(_klaymen, 0x1014, _ssButton);
-		else if (param.asInteger() == 0x01C66840) {
-			if (sendMessage(_asElevator, 0x2001, 0) != 0)
-				setMessageList(0x004AFBD8);
-			else
-				setMessageList(0x004AFAE0);
-		} else if (param.asInteger() == 0x8E646E00) {
-			setMessageList(0x004AFAD8);
-			clearRectList();
-			SetMessageHandler(&Scene1306::handleMessage416EB0);
-		}
-		break;
-	case 0x2000:
-		if (param.asInteger() != 0) {
-			setRectList(0x004AFD28);
-			_klaymen->setKlaymenIdleTable3();
-		} else {
-			setRectList(0x004AFD18);
-			_klaymen->setKlaymenIdleTable1();
-		}
-		break;
-	case 0x480B:
-		if (sender == _ssButton)
-			sendMessage(_asElevator, 0x4808, 0);
-		break;
-	case 0x4826:
-		if (sender == _asKey) {
-			if (_klaymen->getX() >= 249) {
-				sendEntityMessage(_klaymen, 0x1014, _asKey);
-				setMessageList(0x004AFC58);
-			}
-		} else if (sender == _asTape) {
-			if (_klaymen->getX() >= 249) {
-				sendEntityMessage(_klaymen, 0x1014, _asTape);
-				setMessageList(0x004AFC68);
-			}
-		}
-		break;
-	case 0x482A:
-		setSurfacePriority(_asElevator->getSurface(), 1100);
-		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
-		setSurfacePriority(_sprite1->getSurface(), 1080);
-		break;
-	case 0x482B:
-		setSurfacePriority(_asElevator->getSurface(), 100);
-		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
-		setSurfacePriority(_sprite1->getSurface(), 80);
-		sendMessage(this, 0x2000, 0);
-		addCollisionSprite(_asTape);
-		break;
-	}
-	return 0;
-}
-
-uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x4808:
-		setMessageList(0x004AFBD0);
-		SetMessageHandler(&Scene1306::handleMessage);
-		break;
-	case 0x4809:
-		leaveScene(1);
-		break;
-	case 0x482A:
-		setSurfacePriority(_asElevator->getSurface(), 1100);
-		setSurfacePriority(_asElevatorDoor->getSurface(), 1090);
-		setSurfacePriority(_sprite1->getSurface(), 1080);
-		break;
-	case 0x482B:
-		setSurfacePriority(_asElevator->getSurface(), 100);
-		setSurfacePriority(_asElevatorDoor->getSurface(), 90);
-		setSurfacePriority(_sprite1->getSurface(), 80);
-		sendMessage(this, 0x2000, 0);
-		addCollisionSprite(_asTape);
-		break;
-	}
-	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) {
-
-	Sprite *tempSprite;
-	
-	_vm->gameModule()->initKeySlotsPuzzle();
-	
-	_dataResource.load(0x22102142);
-	_keyHolePoints = _dataResource.getPointArray(0xAC849240);
-
-	for (uint i = 0; i < 16; i++) {
-		NPoint pt = (*_keyHolePoints)[i];
-		_keyHoleRects[i].x1 = pt.x - 15;
-		_keyHoleRects[i].y1 = pt.y - 15;
-		_keyHoleRects[i].x2 = pt.x + 15;
-		_keyHoleRects[i].y2 = pt.y + 15;
-	}
-
-	SetMessageHandler(&Scene1307::handleMessage);
-	SetUpdateHandler(&Scene1307::update);
-
-	setBackground(0xA8006200);
-	setPalette(0xA8006200);
-	addEntity(_palette);
-	insertPuzzleMouse(0x06204A88, 20, 620);
-
-	tempSprite = insertStaticSprite(0x00A3621C, 800);
-	_clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480);
-	tempSprite = insertStaticSprite(0x00A3641C, 600);
-	_clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480);
-	tempSprite = insertStaticSprite(0x00A3681C, 400);
-	_clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480);
-	tempSprite = insertStaticSprite(0x00A3701C, 200);
-	_clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480);
-
-	for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
-		if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) {
-			_asKeys[keyIndex] = insertSprite<AsScene1307Key>(this, keyIndex, _clipRects);
-			addCollisionSprite(_asKeys[keyIndex]);
-		} else {
-			_asKeys[keyIndex] = NULL;
-		}
-	}
-
-	loadSound(0, 0x68E25540);
-
-}
-
-void Scene1307::update() {
-	Scene::update();
-	if (_countdown && (--_countdown == 0))
-		_doLeaveScene = true;
-	else if (_countdown == 20)
-		_palette->startFadeToWhite(40);
-	if (_doLeaveScene && !isSoundPlaying(0)) {
-		leaveScene(1);
-		setGlobalVar(V_KEYDOOR_UNLOCKED, 1);
-	} 
-}
-
-uint32 Scene1307::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = 0;
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (!_isPuzzleSolved) {
-			if (param.asPoint().x > 20 && param.asPoint().x < 620) {
-				if (_asCurrKey && !_isInsertingKey) {
-					int16 mouseX = param.asPoint().x;
-					int16 mouseY = param.asPoint().y;
-					uint clickedKeyHoleIndex;
-					for (clickedKeyHoleIndex = 0; clickedKeyHoleIndex < 16; clickedKeyHoleIndex++) {
-						if (mouseX >= _keyHoleRects[clickedKeyHoleIndex].x1 && mouseX <= _keyHoleRects[clickedKeyHoleIndex].x2 && 
-							mouseY >= _keyHoleRects[clickedKeyHoleIndex].y1 && mouseY <= _keyHoleRects[clickedKeyHoleIndex].y2)
-							break;
-					}
-					if (clickedKeyHoleIndex < 16) {
-						// Check if the clicked keyhole is already occupied with a key
-						bool occupied = false;
-						for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) {
-							if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex] != _asCurrKey) {
-								if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, keyIndex) == clickedKeyHoleIndex)
-									occupied = true;
-							}
-						}
-						if (!occupied) {
-							// If the keyhole is free, insert the current key
-							sendMessage(_asCurrKey, 0x2001, clickedKeyHoleIndex);
-							_isInsertingKey = true;
-							_mouseClicked = false;
-						}
-					}
-				}
-			} else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey)
-				leaveScene(0);
-		}
-		break;
-	case 0x2002:
-		// Check if all keys are in the correct keyholes
-		if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) &&
-			getSubVar(VA_IS_KEY_INSERTED, 1) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 1) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1) &&
-			getSubVar(VA_IS_KEY_INSERTED, 2) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 2) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)) {
-			// Play unlock animations for all keys
-			for (uint keyIndex = 0; keyIndex < 3; keyIndex++) {
-				if (_asKeys[keyIndex])
-					sendMessage(_asKeys[keyIndex], 0x2003, 1);
-			}
-			playSound(0);
-			_isPuzzleSolved = true;
-			_countdown = 47;
-		} else {
-			for (uint keyIndex = 0; keyIndex < 3; keyIndex++)
-				if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex])
-					sendMessage(_asKeys[keyIndex], 0x2000, 1);
-			sendMessage(_asCurrKey, 0x2004, 1);
-		}
-		_asCurrKey = NULL;
-		_isInsertingKey = false;
-		break;
-	case 0x4826:
-		_asCurrKey = (Sprite*)sender;
-		for (uint keyIndex = 0; keyIndex < 3; keyIndex++)
-			if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex])
-				sendMessage(_asKeys[keyIndex], 0x2000, 0);
-		break;
-	}
-	return messageResult;
-}
-
-static const uint32 kScene1308NumberFileHashes[] = {
-	0x08006320, 0x10006320, 0x20006320,
-	0x40006320, 0x80006320, 0x00006321,
-	0x00006322, 0x00006324, 0x00006328,
-	0x08306320, 0x10306320, 0x20306320,
-	0x40306320, 0x80306320, 0x00306321,
-	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) {
-	
-	_vm->gameModule()->initKeySlotsPuzzle();
-
-	SetMessageHandler(&Scene1308::handleMessage);
-	
-	setBackground(0x41024202);
-	setPalette(0x41024202);
-	insertScreenMouse(0x24206418);
-
-	_asTape = insertSprite<AsScene1201Tape>(this, 17, 1100, 502, 445, 0x9148A011);
-	addCollisionSprite(_asTape);
-
-	if (getGlobalVar(V_MOUSE_SUCKED_IN)) {
-		insertSprite<AsScene1308Mouse>();
-		insertSprite<AnimatedSprite>(0x461A1490, 200, 235, 429);
-	}
-	
-	_sprite1 = insertStaticSprite(0x0A042060, 1100);
-	_asJaggyDoor = insertSprite<AsScene1308JaggyDoor>(this);
-	_asLightWallSymbols = insertSprite<AsScene1308LightWallSymbols>(this);
-	_ssNumber1 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0);
-	_ssNumber2 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1);
-	_ssNumber3 = insertSprite<SsScene1308Number>(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2);
-	_sprite2 = insertStaticSprite(0x40043120, 995);
-	_sprite3 = insertStaticSprite(0x43003100, 995);
-	_sprite4 = NULL;
-	
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1308>(380, 440);
-		setMessageList(0x004B57C0);
-		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
-			_sprite4 = insertStaticSprite(0x0101A624, 1100);
-			setRectList(0x004B5990);
-		} else {
-			_sprite5 = insertStaticSprite(0x080811A0, 100);
-			setRectList(0x004B5980);
-		}
-	} else if (which == 1) {
-		// Klaymen entering from the right
-		insertKlaymen<KmScene1308>(640, 440);
-		setMessageList(0x004B57C8);
-		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
-			_sprite4 = insertStaticSprite(0x0101A624, 1100);
-			setRectList(0x004B5990);
-		} else {
-			_sprite5 = insertStaticSprite(0x080811A0, 100);
-			setRectList(0x004B5980);
-		}
-	} else if (which == 2) {
-		// Klaymen returning from keyslots panel
-		insertKlaymen<KmScene1308>(475, 440);
-		setMessageList(0x004B58B0);
-		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
-			_sprite5 = insertSprite<AsScene1308KeyboardDoor>(this);
-			_sprite4 = insertStaticSprite(0x0101A624, 1100);
-			_sprite4->setVisible(false);
-		} else {
-			_sprite5 = insertStaticSprite(0x080811A0, 100);
-			setRectList(0x004B5980);
-		}
-	} else {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1308>(41, 440);
-		setMessageList(0x004B57D0);
-		sendMessage(_asJaggyDoor, 0x4808, 0);
-		_sprite1->setVisible(false);
-		if (getGlobalVar(V_KEYDOOR_UNLOCKED)) {
-			_sprite4 = insertStaticSprite(0x0101A624, 1100);
-			_klaymen->setVisible(false);
-		} else {
-			_sprite5 = insertStaticSprite(0x080811A0, 100);
-			_klaymen->setVisible(false);
-		}
-	}
-
-	if (_sprite4)
-		_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480);
-	else
-		_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-
-	if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) {
-		_asProjector = insertSprite<AsCommonProjector>(this, _klaymen, (Sprite*)NULL);
-		addCollisionSprite(_asProjector);
-		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
-		_asProjector->setRepl(64, 0);
-	}
-
-}
-
-uint32 Scene1308::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x88C11390) {
-			setRectList(0x004B59A0);
-			_isProjecting = true;
-		} else if (param.asInteger() == 0x08821382) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			if (getGlobalVar(V_KEYDOOR_UNLOCKED))
-				setRectList(0x004B5990);
-			else
-				setRectList(0x004B5980);
-			_isProjecting = false;
-		} else if (param.asInteger() == 0x4AC68808) {
-			clearRectList();
-			sendMessage(_asJaggyDoor, 0x4809, 0);
-			_sprite1->setVisible(false);
-			_klaymen->setVisible(false);
-		}
-		break;
-	case 0x1022:
-		if (sender == _asProjector) {
-			if (param.asInteger() >= 1000)
-				setSurfacePriority(_sprite3->getSurface(), 1100);
-			else
-				setSurfacePriority(_sprite3->getSurface(), 995);
-		}
-		break;
-	case 0x2000:
-		if (getGlobalVar(V_KEYDOOR_UNLOCKED))
-			setRectList(0x004B5990);
-		else
-			setRectList(0x004B5980);
-		setMessageList(0x004B57E8, false);
-		_sprite1->setVisible(true);
-		_klaymen->setVisible(true);
-		break;
-	case 0x2001:
-		leaveScene(0);
-		break;
-	case 0x2003:
-		_ssNumber1->setVisible(false);
-		_ssNumber2->setVisible(false);
-		_ssNumber3->setVisible(false);
-		break;
-	case 0x2004:
-		_sprite4->setVisible(true);
-		setRectList(0x004B5990);
-		break;
-	case 0x4807:
-		sendMessage(_asLightWallSymbols, 0x2003, 0);
-		break;
-	case 0x480F:
-		sendMessage(_asLightWallSymbols, 0x2002, 0);
-		_ssNumber1->setVisible(true);
-		_ssNumber2->setVisible(true);
-		_ssNumber3->setVisible(true);
-		break;
-	case 0x4826:
-		if (sender == _asProjector) {
-			if (_isProjecting)
-				setMessageList2(0x004B5868);
-			else {
-				if (param.asInteger() == 1) {
-					sendEntityMessage(_klaymen, 0x1014, _asProjector);
-					setMessageList2(0x004B5848);
-				} else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() <= _asProjector->getX() ? 0 : 1) != 0) {
-					sendEntityMessage(_klaymen, 0x1014, _asProjector);
-					setMessageList2(0x004B5830);
-				} else
-					setMessageList2(0x004B5800);
-			}
-		} else if (sender == _asTape) {
-			if (_isProjecting)
-				setMessageList2(0x004B5868);
-			else if (_messageListStatus != 2) {
-				sendEntityMessage(_klaymen, 0x1014, _asTape);
-				setMessageList2(0x004B58E0);
-			}
-		}
-		break;
-	}
-	return 0;
-}
-
-Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule) {
-	
-	SetMessageHandler(&Scene1317::handleMessage);
-	_smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false));
-	_vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder());
-	insertScreenMouse(0x08284011);
-	showMouse(false);
-	_smackerFileHash = 0;
-	_keepLastSmackerFrame = false;
-}
-
-void Scene1317::update() {
-	if (_smackerFileHash) {
-		_smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame);
-		_smackerFileHash = 0;
-	}
-	Scene::update();
-}
-
-void Scene1317::upChooseKing() {
-	if (!_klaymenBlinks && _klaymenBlinkCountdown != 0 && (--_klaymenBlinkCountdown == 0))
-		_klaymenBlinks = true;
-		
-	if (!_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) {
-		_smackerPlayer->rewind();
-	} else if (_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) {
-		_smackerPlayer->rewind();
-		_klaymenBlinks = false;
-		_klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
-	}
-
-	if (!_klaymenBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0))
-		stNoDecisionYet();
-			
-	if (_smackerFileHash) {
-		_smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame);
-		_smackerFileHash = 0;
-	}
-
-	Scene::update();
-	
-}
-
-uint32 Scene1317::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		stChooseKing();
-		break;
-	}
-	return messageResult;
-}
-	
-uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x >= 21 && param.asPoint().y >= 24 &&
-			param.asPoint().x <= 261 && param.asPoint().y <= 280) {
-			stHoborgAsKing();
-		} else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 &&
-			param.asPoint().x <= 399 && param.asPoint().y <= 379) {
-			stKlaymenAsKing();
-		} else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 &&
-			param.asPoint().x <= 418 && param.asPoint().y <= 474) {
-			stKlaymenAsKing();
-		}
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		stEndMovie();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x3002:
-		leaveScene(0);
-		break;
-	}
-	return messageResult;
-}
-
-void Scene1317::stChooseKing() {
-	showMouse(true);
-	_smackerFileHash = 0x10982841;
-	_keepLastSmackerFrame = true;
-	_decisionCountdown = 450;
-	_klaymenBlinks = false;
-	_klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15;
-	SetMessageHandler(&Scene1317::hmChooseKing);
-	SetUpdateHandler(&Scene1317::upChooseKing);
-}
-
-void Scene1317::stNoDecisionYet() {
-	showMouse(false);
-	_smackerFileHash = 0x20982841;
-	_keepLastSmackerFrame = false;
-	SetMessageHandler(&Scene1317::handleMessage);
-	SetUpdateHandler(&Scene1317::update);
-}
-
-void Scene1317::stHoborgAsKing() {
-	showMouse(false);
-	_smackerFileHash = 0x40982841;
-	_keepLastSmackerFrame = false;
-	SetMessageHandler(&Scene1317::hmHoborgAsKing);
-	SetUpdateHandler(&Scene1317::update);
-}
-
-void Scene1317::stKlaymenAsKing() {
-	showMouse(false);
-	_smackerFileHash = 0x80982841;
-	_keepLastSmackerFrame = false;
-	SetMessageHandler(&Scene1317::hmEndMovie);
-	SetUpdateHandler(&Scene1317::update);
-}
-
-void Scene1317::stEndMovie() {
-	showMouse(false);
-	_smackerFileHash = 0x40800711;
-	_keepLastSmackerFrame = false;
-	SetMessageHandler(&Scene1317::hmEndMovie);
-	SetUpdateHandler(&Scene1317::update);
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h
deleted file mode 100644
index 147bfd0..0000000
--- a/engines/neverhood/module1300.h
+++ /dev/null
@@ -1,295 +0,0 @@
-/* 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_MODULE1300_H
-#define NEVERHOOD_MODULE1300_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/module.h"
-#include "neverhood/scene.h"
-#include "neverhood/smackerplayer.h"
-
-namespace Neverhood {
-
-// Module1300
-
-class Module1300 : public Module {
-public:
-	Module1300(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Module1300();
-protected:
-	int _sceneNum;
-	uint32 _musicFileHash;
-	void createScene(int sceneNum, int which);
-	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);
-protected:
-	Sprite *_asVenusFlyTrap;
-	Sprite *_asBridge;
-	Sprite *_ssFence;
-	Sprite *_asRing1;
-	Sprite *_asRing2;
-	Sprite *_asRing3;
-	Sprite *_asRing4;
-	Sprite *_asRing5;
-	Sprite *_class595;
-	Sprite *_sprite1;
-	Sprite *_sprite2;
-	Sprite *_sprite3;
-	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);
-protected:
-	Sprite *_sprite1;
-	Sprite *_asBalloon;
-	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);
-protected:
-	Sprite *_sprite1;
-	Sprite *_asKey;
-	Sprite *_asNeedle;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Scene1305 : public Scene {
-public:
-	Scene1305(NeverhoodEngine *vm, Module *parentModule, int which);
-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);
-	~Scene1306();
-protected:
-	Sprite *_ssButton;
-	Sprite *_asTape;
-	AnimatedSprite *_asElevatorDoor;
-	Sprite *_asElevator;
-	Sprite *_sprite1;
-	Sprite *_asKey;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	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);
-protected:
-	NPointArray *_keyHolePoints;
-	NRect _keyHoleRects[16];
-	NRect _clipRects[4];
-	Sprite *_asKeys[3];
-	int _countdown;
-	Sprite *_asCurrKey;
-	bool _isInsertingKey;
-	bool _doLeaveScene;
-	bool _isPuzzleSolved;
-	void update();
-	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);
-protected:
-	Sprite *_asTape;
-	Sprite *_asJaggyDoor;
-	Sprite *_asLightWallSymbols;
-	Sprite *_ssNumber1;
-	Sprite *_ssNumber2;
-	Sprite *_ssNumber3;
-	AnimatedSprite *_asProjector;
-	Sprite *_sprite1;
-	Sprite *_sprite2;
-	Sprite *_sprite3;
-	Sprite *_sprite4;
-	Sprite *_sprite5;
-	bool _isProjecting;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-class Scene1317 : public Scene {
-public:
-	Scene1317(NeverhoodEngine *vm, Module *parentModule);
-protected:
-	SmackerPlayer *_smackerPlayer;
-	bool _klaymenBlinks;
-	int _klaymenBlinkCountdown;
-	int _decisionCountdown;
-	uint32 _smackerFileHash;
-	bool _keepLastSmackerFrame;
-	void update();
-	void upChooseKing();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmChooseKing(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmHoborgAsKing(int messageNum, const MessageParam &param, Entity *sender);
-	uint32 hmEndMovie(int messageNum, const MessageParam &param, Entity *sender);
-	void stChooseKing();
-	void stNoDecisionYet();
-	void stHoborgAsKing();
-	void stKlaymenAsKing();
-	void stEndMovie();
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_MODULE1300_H */
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
deleted file mode 100644
index 8aa0632..0000000
--- a/engines/neverhood/module1400.cpp
+++ /dev/null
@@ -1,1621 +0,0 @@
-/* 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/module1400.h"
-#include "neverhood/module1000.h"
-#include "neverhood/module2100.h"
-#include "neverhood/module2200.h"
-#include "neverhood/diskplayerscene.h"
-#include "neverhood/gamemodule.h"
-
-namespace Neverhood {
-
-Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	_vm->_soundMan->addMusic(0x00AD0012, 0x06333232);
-	_vm->_soundMan->addMusic(0x00AD0012, 0x624A220E);
-
-	if (which < 0)
-		createScene(_vm->gameState().sceneNum, -1);
-	else
-		createScene(0, 0);
-
-}
-
-Module1400::~Module1400() {
-	_vm->_soundMan->deleteMusicGroup(0x00AD0012);
-}
-
-void Module1400::createScene(int sceneNum, int which) {
-	debug("Module1400::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 0:
-		_vm->gameState().sceneNum = 0;
-		_vm->_soundMan->startMusic(0x06333232, 0, 2);
-		_childObject = new Scene1401(_vm, this, which);
-		break;
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
-		_vm->_soundMan->stopMusic(0x624A220E, 0, 2);
-		_childObject = new Scene1402(_vm, this, which);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
-		_vm->_soundMan->startMusic(0x624A220E, 0, 2);
-		_childObject = new Scene1403(_vm, this, which);
-		break;
-	case 3:
-		_vm->gameState().sceneNum = 3;
-		_vm->_soundMan->startMusic(0x06333232, 0, 2);
-		_childObject = new Scene1404(_vm, this, which);
-		break;
-	case 4:
-		_vm->gameState().sceneNum = 4;
-		_vm->_soundMan->startMusic(0x06333232, 0, 2);
-		_childObject = new Scene1405(_vm, this);
-		break;
-	case 5:
-		_vm->gameState().sceneNum = 5;
-		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
-		_childObject = new DiskplayerScene(_vm, this, 2);
-		break;
-	case 6:
-		_vm->gameState().sceneNum = 6;
-		_vm->_soundMan->stopMusic(0x06333232, 0, 2);
-		_childObject = new Scene1407(_vm, this);
-		break;
-	}
-	SetUpdateHandler(&Module1400::updateScene);
-	_childObject->handleUpdate();
-}
-
-void Module1400::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 0:
-			if (_moduleResult == 1)
-				createScene(1, 0);
-			else if (_moduleResult == 2)
-				createScene(3, 0);
-			else
-				leaveModule(0);
-			break;
-		case 1:
-			if (_moduleResult == 1)
-				createScene(2, 0);
-			else if (_moduleResult == 2)
-				createScene(6, -1);
-			else
-				createScene(0, 1);
-			break;
-		case 2:
-			createScene(1, 1);
-			break;
-		case 3:
-			if (_moduleResult == 1)
-				createScene(4, 0);
-			else if (_moduleResult == 2)
-				createScene(5, -1);
-			else
-				createScene(0, 2);
-			break;
-		case 4:
-			createScene(3, 1);
-			break;
-		case 5:
-			createScene(3, 2);
-			break;
-		case 6:
-			createScene(1, 2);
-			break;
-		}
-	}
-}
-
-// 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), 
-	_sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) {
-
-	SetMessageHandler(&Scene1401::handleMessage);
-	SetUpdateHandler(&Scene1401::update);
-
-	setRectList(0x004B6758);
-	setBackground(0x08221FA5);
-	setPalette(0x08221FA5);
-	insertScreenMouse(0x21FA108A);
-	
-	_ssFloorButton = insertSprite<SsCommonFloorButton>(this, 0x980F3124, 0x12192892, 100, 0);
-	_asPipe = insertSprite<AsScene1401Pipe>();
-
-	if (!getGlobalVar(V_MOUSE_SUCKED_IN)) {
-		_asMouse = insertSprite<AsScene1401Mouse>();
-		_asCheese = insertSprite<AsScene1401Cheese>();
-	}
-
-	_sprite3 = insertStaticSprite(0xA82BA811, 1100);
-	insertStaticSprite(0x0A116C60, 1100);
-	_ssButton = insertSprite<SsCommonButtonSprite>(this, 0xB84B1100, 100, 0);
-	_sprite1 = insertStaticSprite(0x38EA100C, 1005);
-	_sprite2 = insertStaticSprite(0x98D0223C, 1200);
-	_sprite2->setVisible(false);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1401>(380, 447);
-		setMessageList(0x004B65C8);
-		_sprite1->setVisible(false);
-	} else if (which == 1) {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1401>(0, 447);
-		setMessageList(0x004B65D0);
-		_sprite1->setVisible(false);
-	} else if (which == 2) {
-		// Klaymen entering from the right
-		insertKlaymen<KmScene1401>(660, 447);
-		setMessageList(0x004B65D8);
-		_sprite1->setVisible(false);
-	} else {
-		// Klaymen entering from the back
-		insertKlaymen<KmScene1401>(290, 413);
-		setMessageList(0x004B65E8);
-		_sprite1->setVisible(false);
-	}
-
-	if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) {
-		_asProjector = insertSprite<AsCommonProjector>(this, _klaymen, _asPipe);
-		addCollisionSprite(_asProjector);
-		if (getGlobalVar(V_PROJECTOR_SLOT) == 6) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			_klaymen->setX(_asProjector->getX() + 100);
-			_klaymen->updateBounds();
-			setMessageList(0x004B6670);
-		} else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			_klaymen->setX(_asProjector->getX() - 100);
-			_klaymen->updateBounds();
-			setMessageList(0x004B6670);
-		}
-		_asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480);
-	}
-	
-	_klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480);
-
-	if (which == 0 && _asProjector)
-		sendMessage(_asProjector, 0x482B, 0);
-
-	_asBackDoor = insertSprite<AsScene1401BackDoor>(_klaymen, which == 0);
-
-}
-
-void Scene1401::update() {
-	Scene::update();
-	if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) {
-		_sprite2->setVisible(true);
-		_projectorBorderFlag = true;
-	} else
-		_sprite2->setVisible(false);
-}
-
-uint32 Scene1401::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x02144CB1)
-			sendEntityMessage(_klaymen, 0x1014, _ssFloorButton);
-		else if (param.asInteger() == 0x402064D8)
-			sendEntityMessage(_klaymen, 0x1014, _ssButton);
-		else if (param.asInteger() == 0x01C66840) {
-			if (sendMessage(_asBackDoor, 0x2001, 0) != 0)
-				setMessageList(0x004B6690);
-			else
-				setMessageList(0x004B66B0);
-		}
-		break;
-	case 0x1019:
-		if (param.asInteger() != 0)
-			leaveScene(2);
-		else
-			leaveScene(1);
-		break;
-	case 0x480B:
-		if (sender == _ssFloorButton) {
-			sendMessage(_asPipe, 0x2000, 0);
-			if (!getGlobalVar(V_MOUSE_SUCKED_IN)) {
-				sendMessage(_asMouse, 0x4839, 0);
-				sendMessage(_asCheese, 0x4839, 0);
-				setGlobalVar(V_MOUSE_SUCKED_IN, 1);
-			}
-			if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504)
-				sendMessage(_asProjector , 0x4839, 0);
-		} else if (sender == _ssButton)
-			sendMessage(_asBackDoor, 0x4808, 0);
-		break;
-	case 0x4826:
-		if (sender == _asProjector) {
-			if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klaymen, 0x1014, _asProjector);
-				setMessageList2(0x004B6658);
-			} else
-				setMessageList2(0x004B65F0);
-		}						
-		break;
-	case 0x482A:
-		_sprite1->setVisible(true);
-		if (_asProjector)
-			sendMessage(_asProjector, 0x482B, 0);
-		break;
-	case 0x482B:
-		_sprite1->setVisible(false);
-		if (_asProjector)
-			sendMessage(_asProjector, 0x482A, 0);
-		break;
-	}
-	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) {
-
-	SetMessageHandler(&Scene1402::handleMessage);
-
-	_vm->_screen->setYOffset(0);
-
-	setBackground(0x231482F0);
-	setBackgroundY(-10);
-	setPalette(0x231482F0);
-	_palette->addPalette(0x91D3A391, 0, 64, 0);
-	insertScreenMouse(0x482F4239);
-
-	_ssBridgePart1 = insertSprite<SsScene1402BridgePart>(0x15402D64, 1100);
-	_ssBridgePart2 = insertSprite<SsScene1402BridgePart>(0x10A02120, 1100);
-	_ssBridgePart3 = insertSprite<SsScene1402BridgePart>(0x60882BE0, 1100);
-
-	if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
-		setRectList(0x004B0C48);
-	else
-		setRectList(0x004B0C98);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1402>(377, 391);
-		setMessageList(0x004B0B48);
-		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
-			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
-	} else if (which == 1) {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1402>(42, 391);
-		setMessageList(0x004B0B50);
-	} else if (which == 2) {
-		// Klaymen returning from the puzzle box
-		insertKlaymen<KmScene1402>(377, 391);
-		setMessageList(0x004B0B60);
-		_klaymen->setDoDeltaX(1);
-		if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
-			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 1);
-			clearRectList();
-			showMouse(false);
-			startShaking();
-		} else
-			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 0);
-	} else {
-		// Klaymen entering from the right
-		insertKlaymen<KmScene1402>(513, 391);
-		setMessageList(0x004B0B58);
-		if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) {
-			_asPuzzleBox = insertSprite<AsScene1402PuzzleBox>(this, 2);
-			startShaking();
-		}
-	}
-	
-	if (_asPuzzleBox)
-		_asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2());
-
-	if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) {
-		_asProjector = insertSprite<AsCommonProjector>(this, _klaymen, (Sprite*)NULL);
-		addCollisionSprite(_asProjector);
-		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			_klaymen->setX(_asProjector->getX() + 100);
-			_klaymen->updateBounds();
-			setMessageList(0x004B0BD0);
-		} else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			_klaymen->setX(_asProjector->getX() - 100);
-			_klaymen->updateBounds();
-			setMessageList(0x004B0BD0);
-		}
-		_asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2());
-	}
-
-	_klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2());
-	
-}
-
-void Scene1402::upShaking() {
-	if (_isShaking) {
-		setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10);
-		_vm->_screen->setYOffset(-10 - getBackgroundY());
-	} else {
-		setBackgroundY(-10);
-		_vm->_screen->setYOffset(0);
-		SetUpdateHandler(&Scene::update);
-	}
-	Scene::update();
-	if (_asPuzzleBox)
-		_asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2());
-	_klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2());
-}
-
-uint32 Scene1402::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x00F43389) {
-			if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED))
-				leaveScene(0);
-			else {
-				clearRectList();
-				_klaymen->setVisible(false);
-				showMouse(false);
-				sendMessage(_asPuzzleBox, 0x2002, 0);
-				startShaking();
-			}
-		}
-		break;
-	case 0x1019:
-		if (param.asInteger())
-			leaveScene(0);
-		else
-			leaveScene(1);
-		break;
-	case 0x2000:
-		stopShaking();
-		showMouse(true);
-		setRectList(0x004B0C48);
-		break;
-	case 0x2001:
-		stopShaking();
-		leaveScene(0);
-		break;
-	case 0x2003:
-		stopShaking();
-		break;
-	case 0x4826:
-		if (sender == _asProjector) {
-			if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klaymen, 0x1014, _asProjector);
-				setMessageList2(0x004B0BB8);
-			} else
-				setMessageList2(0x004B0B68);
-		}
-		break;
-	}
-	return 0;
-}
-
-void Scene1402::startShaking() {
-	_isShaking = true;
-	SetUpdateHandler(&Scene1402::upShaking);
-}
-
-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) {
-
-	SetMessageHandler(&Scene1407::handleMessage);
-	SetUpdateHandler(&Scene1407::update);
-
-	setBackground(0x00442225);
-	setPalette(0x00442225);
-	insertPuzzleMouse(0x4222100C, 20, 620);
-
-	_asMouse = insertSprite<AsScene1407Mouse>(this);
-	_ssResetButton = insertStaticSprite(0x12006600, 100);
-	_ssResetButton->setVisible(false); 
-
-}
-
-void Scene1407::update() {
-	Scene::update();
-	if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0))
-		leaveScene(1);
-	else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0))
-		_ssResetButton->setVisible(false);
-}
-
-uint32 Scene1407::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (_puzzleSolvedCountdown == 0) {
-			if (param.asPoint().x <= 20 || param.asPoint().x >= 620) {
-				// Exit scene
-				leaveScene(0);
-			} else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 &&
-				param.asPoint().y >= 62 && param.asPoint().y <= 90) {
-				// The reset button was clicked
-				sendMessage(_asMouse, 0x2001, 0);
-				_ssResetButton->setVisible(true);
-				playSound(0, 0x44045000);
-				_resetButtonCountdown = 12;
-			} else {
-				// Handle the mouse
-				sendMessage(_asMouse, messageNum, param);
-			}
-		}
-		break;
-	case 0x2000:
-		// The mouse got the cheese (nomnom)
-		setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1);
-		playSound(0, 0x68E25540);
-		showMouse(false);
-		_puzzleSolvedCountdown = 72;
-		break;
-	}
-	return 0;
-}
-
-// Scene1403
-
-Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _asProjector(NULL), _isProjecting(false) {
-	
-	SetMessageHandler(&Scene1403::handleMessage);
-	
-	setRectList(0x004B1FF8);
-	setBackground(0x2110A234);
-	setPalette(0x2110A234);
-	insertScreenMouse(0x0A230219);
-
-	_sprite1 = insertStaticSprite(0x01102A33, 100);
-	_sprite1->setVisible(false);
-	_sprite2 = insertStaticSprite(0x04442520, 995);
-	_sprite3 = insertStaticSprite(0x08742271, 995);
-	_asTape1 = insertSprite<AsScene1201Tape>(this, 12, 1100, 201, 468, 0x9148A011);
-	addCollisionSprite(_asTape1);
-	_asTape1->setRepl(64, 0);
-	_asTape2 = insertSprite<AsScene1201Tape>(this, 16, 1100, 498, 468, 0x9048A093);
-	addCollisionSprite(_asTape2);
-	_asTape2->setRepl(64, 0);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1403>(380, 463);
-		setMessageList(0x004B1F18);
-	} else {
-		// Klaymen entering from the right
-		insertKlaymen<KmScene1403>(640, 463);
-		setMessageList(0x004B1F20);
-	}
-	_klaymen->setRepl(64, 0);
-
-	if (getGlobalVar(V_PROJECTOR_LOCATION) == 0) {
-		_asProjector = insertSprite<AsCommonProjector>(this, _klaymen, (Sprite*)NULL);
-		addCollisionSprite(_asProjector);
-		if (getGlobalVar(V_PROJECTOR_SLOT) == 4) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			_klaymen->setX(_asProjector->getX() + 100);
-			_klaymen->updateBounds();
-			setMessageList(0x004B1F70);
-		}
-		_asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2());
-		_asProjector->setRepl(64, 0);
-	}
-
-}
-
-uint32 Scene1403::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x88C11390) {
-			setRectList(0x004B2008);
-			_isProjecting = true;
-		} else if (param.asInteger() == 0x08821382) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			setRectList(0x004B1FF8);
-			_isProjecting = false;
-		}
-		break;
-	case 0x1019:
-		leaveScene(0);
-		break;
-	case 0x1022:
-		if (sender == _asProjector) {
-			if (param.asInteger() >= 1000)
-				setSurfacePriority(_sprite3->getSurface(), 1100);
-			else
-				setSurfacePriority(_sprite3->getSurface(), 995);
-		}
-		break;
-	case 0x4807:
-		_sprite1->setVisible(false);
-		break;
-	case 0x480F:
-		_sprite1->setVisible(true);
-		break;
-	case 0x4826:
-		if (sender == _asProjector) {
-			if (_isProjecting)
-				setMessageList2(0x004B1FA8);
-			else if (param.asInteger() == 1) {
-				sendEntityMessage(_klaymen, 0x1014, _asProjector);
-				setMessageList2(0x004B1F88);
-			} else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klaymen, 0x1014, _asProjector);
-				setMessageList2(0x004B1F58);
-			} else
-				setMessageList2(0x004B1F28);
-		} else if (sender == _asTape1 || sender == _asTape2) {
-			if (_isProjecting)
-				setMessageList2(0x004B1FA8);
-			else if (_messageListStatus != 2) {
-				sendEntityMessage(_klaymen, 0x1014, sender);
-				setMessageList2(0x004B1FB8);
-			}
-		}
-		break;
-	}
-	return 0;
-}
-
-// Scene1404
-
-Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _asProjector(NULL), _asKey(NULL) {
-	
-	if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0)
-		setGlobalVar(V_KEY3_LOCATION, 5);
-	
-	SetMessageHandler(&Scene1404::handleMessage);
-
-	setRectList(0x004B8D80);
-	setBackground(0xAC0B006F);
-	setPalette(0xAC0B006F);
-	_palette->addPalette(0x00801510, 0, 65, 0);
-	insertScreenMouse(0xB006BAC8);
-
-	if (getGlobalVar(V_KEY3_LOCATION) == 5) {
-		_asKey = insertSprite<AsCommonKey>(this, 2, 1100, 267, 411);
-		addCollisionSprite(_asKey);
-	}
-
-	_sprite1 = insertStaticSprite(0x1900A1F8, 1100);
-	_asTape = insertSprite<AsScene1201Tape>(this, 14, 1100, 281, 411, 0x9148A011);
-	addCollisionSprite(_asTape);
-
-	if (which < 0) {
-		// Restoring game
-		insertKlaymen<KmScene1404>(376, 406);
-		setMessageList(0x004B8C28);
-	} else if (which == 1) {
-		// Klaymen returning from the tiles puzzle
-		insertKlaymen<KmScene1404>(376, 406);
-		setMessageList(0x004B8C30);
-	} else if (which == 2) {
-		// Klaymen returning from the diskplayer
-		if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) {
-			insertKlaymen<KmScene1404>(347, 406);
-			_klaymen->setDoDeltaX(1);
-		} else {
-			insertKlaymen<KmScene1404>(187, 406);
-		}
-		setMessageList(0x004B8D28);
-	} else {
-		// Klaymen entering from the left
-		insertKlaymen<KmScene1404>(30, 406);
-		setMessageList(0x004B8C38);
-	}
-
-	if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) {
-		_asProjector = insertSprite<AsCommonProjector>(this, _klaymen, (Sprite*)NULL);
-		addCollisionSprite(_asProjector);
-		if (getGlobalVar(V_PROJECTOR_SLOT) == 0) {
-			sendEntityMessage(_klaymen, 0x1014, _asProjector);
-			_klaymen->setX(_asProjector->getX() - 100);
-			_klaymen->updateBounds();
-			setMessageList(0x004B8CB8);
-		}
-		_asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-	}
-
-	_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-
-}
-
-Scene1404::~Scene1404() {
-	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0);
-}
-
-uint32 Scene1404::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x410650C2) {
-			if (_asProjector && _asProjector->getX() == 220)
-				setMessageList(0x004B8C40);
-			else
-				setMessageList(0x004B8CE8);
-		}
-		break;
-	case 0x1019:
-		leaveScene(0);
-		break;
-	case 0x4826:
-		if (sender == _asProjector) {
-			if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) {
-				sendEntityMessage(_klaymen, 0x1014, _asProjector);
-				setMessageList2(0x004B8CA0);
-			} else
-				setMessageList2(0x004B8C40);
-		} else if (sender == _asTape && _messageListStatus != 2) {
-			sendEntityMessage(_klaymen, 0x1014, _asTape);
-			setMessageList(0x004B8CD0);
-		} else if (sender == _asKey && _messageListStatus != 2) {
-			sendEntityMessage(_klaymen, 0x1014, _asKey);
-			setMessageList(0x004B8D18);
-		}
-		break;
-	}
-	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) {
-
-	_vm->gameModule()->initMemoryPuzzle();
-	
-	SetUpdateHandler(&Scene1405::update);
-	SetMessageHandler(&Scene1405::handleMessage);
-
-	setBackground(0x0C0C007D);
-	setPalette(0x0C0C007D);
-	insertPuzzleMouse(0xC00790C8, 20, 620);
-	
-	for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) {
-		_tiles[tileIndex] = insertSprite<AsScene1405Tile>(this, tileIndex);
-		addCollisionSprite(_tiles[tileIndex]);
-		if (getSubVar(VA_IS_TILE_MATCH, tileIndex))
-			_tilesLeft--;
-	}
-
-	loadSound(0, 0x68E25540);
-}
-
-void Scene1405::update() {
-	Scene::update();
-	if (_countdown != 0 && (--_countdown == 0)) {
-		_tilesLeft = 48;
-		_tiles[_firstTileIndex]->hide();
-		_tiles[_secondTileIndex]->hide();
-		for (uint32 i = 0; i < 48; i++) {
-			if (getSubVar(VA_IS_TILE_MATCH, i)) {
-				_tiles[i]->hide();
-				setSubVar(VA_IS_TILE_MATCH, i, 0);
-			}
-		}
-	}
-}
-
-uint32 Scene1405::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
-			leaveScene(0);
-		break;
-	case 0x2000:
-		if (_selectFirstTile) {
-			_firstTileIndex = param.asInteger();
-			_selectFirstTile = false;
-		} else {
-			_secondTileIndex = param.asInteger();
-			if (_firstTileIndex != _secondTileIndex) {
-				_selectFirstTile = true;
-				if (getSubVar(VA_TILE_SYMBOLS, _secondTileIndex) == getSubVar(VA_TILE_SYMBOLS, _firstTileIndex)) {
-					setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1);
-					setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1);
-					_tilesLeft -= 2;
-					if (_tilesLeft == 0)
-						playSound(0);
-				} else
-					_countdown = 10;
-			}
-		}
-		break;
-	}
-	return 0;
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h
deleted file mode 100644
index 1485706..0000000
--- a/engines/neverhood/module1400.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/* 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_MODULE1400_H
-#define NEVERHOOD_MODULE1400_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/module.h"
-#include "neverhood/scene.h"
-#include "neverhood/module1200.h"
-
-namespace Neverhood {
-
-class Module1400 : public Module {
-public:
-	Module1400(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Module1400();
-protected:
-	int _sceneNum;
-	void createScene(int sceneNum, int which);
-	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 Scene1401 : public Scene {
-public:
-	Scene1401(NeverhoodEngine *vm, Module *parentModule, int which);
-protected:
-	bool _projectorBorderFlag;
-	Sprite *_ssFloorButton;
-	AsCommonProjector *_asProjector;
-	Sprite *_asPipe;
-	Sprite *_asMouse;
-	Sprite *_asCheese;
-	Sprite *_asBackDoor;
-	Sprite *_sprite1;
-	Sprite *_sprite2;
-	Sprite *_sprite3;
-	Sprite *_ssButton;
-	void update();
-	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);
-protected:
-	Sprite *_ssBridgePart1;
-	Sprite *_ssBridgePart2;
-	Sprite *_ssBridgePart3;
-	Sprite *_asPuzzleBox;
-	AsCommonProjector *_asProjector;
-	bool _isShaking;
-	void upShaking();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-	void startShaking();
-	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);
-protected:
-	Sprite *_asMouse;
-	Sprite *_ssResetButton;
-	int _puzzleSolvedCountdown;
-	int _resetButtonCountdown;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-// Scene1403
-
-class Scene1403 : public Scene {
-public:
-	Scene1403(NeverhoodEngine *vm, Module *parentModule, int which);
-protected:
-	Sprite *_sprite1;
-	Sprite *_sprite2;
-	Sprite *_sprite3;
-	AsScene1201Tape *_asTape1;
-	AsScene1201Tape *_asTape2;
-	AsCommonProjector *_asProjector;
-	bool _isProjecting;
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-// Scene1404
-
-class Scene1404 : public Scene {
-public:
-	Scene1404(NeverhoodEngine *vm, Module *parentModule, int which);
-	virtual ~Scene1404();
-protected:
-	Sprite *_sprite1;
-	Sprite *_asTape;
-	AsCommonProjector *_asProjector;
-	Sprite *_asKey;
-	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);
-	int getCountdown() const { return _countdown; }
-protected:
-	bool _selectFirstTile;
-	int _firstTileIndex;
-	int _secondTileIndex;
-	int _tilesLeft;
-	int _countdown;
-	AsScene1405Tile *_tiles[48];
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_MODULE1400_H */
diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp
deleted file mode 100644
index c49e968..0000000
--- a/engines/neverhood/module1500.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/* 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/module1500.h"
-
-namespace Neverhood {
-
-Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	if (which < 0)
-		createScene(_vm->gameState().sceneNum, -1);
-	else
-		createScene(3, -1);
-
-}
-
-void Module1500::createScene(int sceneNum, int which) {
-	debug("Module1500::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 0:
-		_vm->gameState().sceneNum = 0;
-		_childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48);
-		break;
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		_childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		sendMessage(_parentModule, 0x0800, 0);
-		createSmackerScene(0x001A0005, true, true, true);
-		break;
-	case 3:
-		_vm->gameState().sceneNum = 3;
-		_childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48);
-		break;
-	}
-	SetUpdateHandler(&Module1500::updateScene);
-	_childObject->handleUpdate();
-}
-
-void Module1500::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 0:
-			createScene(1, -1);
-			break;
-		case 1:
-			createScene(2, -1);
-			break;
-		case 3:
-			createScene(0, -1);
-			break;
-		default:
-			leaveModule(0);
-			break;
-		}
-	}
-}
-
-// Scene1501
-
-Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3)
-	: Scene(vm, parentModule), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) {
-
-	SetUpdateHandler(&Scene1501::update);
-	SetMessageHandler(&Scene1501::handleMessage);
-	
-	setBackground(backgroundFileHash);
-	setPalette();
-	addEntity(_palette);
-	_palette->addBasePalette(backgroundFileHash, 0, 256, 0);
-	_palette->startFadeToPalette(12);
-
-	if (soundFileHash != 0)
-		playSound(0, soundFileHash);
-
-}
-
-void Scene1501::update() {
-	Scene::update();
-	if (_countdown1 != 0) {
-		_countdown1--;
-		if (_countdown1 == 0) {
-			_vm->_screen->clear();
-			leaveScene(0);
-		}
-	} else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0))) {
-		_countdown1 = 12;
-		_palette->startFadeToBlack(11);
-	}
-
-	if (_countdown3 != 0)
-		_countdown3--;
-
-	if (_countdown3 == 0 && _skip && _countdown1 == 0) {
-		_countdown1 = 12;
-		_palette->startFadeToBlack(11);
-	}
-	
-}
-
-uint32 Scene1501::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0009:
-		_skip = true;
-		break;
-	}
-	return messageResult;
-}
-
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h
deleted file mode 100644
index c17cb45..0000000
--- a/engines/neverhood/module1500.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* 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.
- *
- */
-
-// TODO: I couldn't come up with a better name than 'Module' so far
-
-#ifndef NEVERHOOD_MODULE1500_H
-#define NEVERHOOD_MODULE1500_H
-
-#include "neverhood/neverhood.h"
-#include "neverhood/module.h"
-#include "neverhood/scene.h"
-#include "neverhood/smackerscene.h"
-
-namespace Neverhood {
-
-class Module1500 : public Module {
-public:
-	Module1500(NeverhoodEngine *vm, Module *parentModule, int which);
-protected:
-	int _sceneNum;
-	void createScene(int sceneNum, int which);
-	void updateScene();
-};
-
-class Scene1501 : public Scene {
-public:
-	Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3);
-protected:
-	int _countdown1;
-	int _countdown2;
-	int _countdown3;
-	bool _skip;
-	void update();
-	uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
-};
-
-} // End of namespace Neverhood
-
-#endif /* NEVERHOOD_MODULE1500_H */
diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp
deleted file mode 100644
index cc1aa2c..0000000
--- a/engines/neverhood/module1600.cpp
+++ /dev/null
@@ -1,1412 +0,0 @@
-/* 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/module1600.h"
-#include "neverhood/gamemodule.h"
-#include "neverhood/module1200.h"
-#include "neverhood/module2200.h"
-
-namespace Neverhood {
-
-static const uint32 kModule1600SoundList[] = {
-	0x90805C50, 0x90804450, 0xB4005E60,
-	0x91835066, 0x90E14440, 0
-};
-
-Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Module(vm, parentModule) {
-	
-	if (which < 0)
-		createScene(_vm->gameState().sceneNum, -1);
-	else if (which == 1)
-		createScene(4, 1);
-	else if (which == 2)
-		createScene(5, 0);
-	else if (which == 3)
-		createScene(6, 1);
-	else if (which == 4)
-		createScene(1, 0);
-	else
-		createScene(0, 0);
-
-	_vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList);
-	_vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150);
-	_vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0);
-
-}
-
-Module1600::~Module1600() {
-	_vm->_soundMan->deleteGroup(0x1A008D8);
-}
-
-void Module1600::createScene(int sceneNum, int which) {
-	debug("Module1600::createScene(%d, %d)", sceneNum, which);
-	_sceneNum = sceneNum;
-	switch (_sceneNum) {
-	case 0:
-		_vm->gameState().sceneNum = 0;
-		createNavigationScene(0x004B39D0, which);
-		break;
-	case 1:
-		_vm->gameState().sceneNum = 1;
-		createNavigationScene(0x004B3A30, which);
-		break;
-	case 2:
-		_vm->gameState().sceneNum = 2;
-		createNavigationScene(0x004B3A60, which);
-		break;
-	case 3:
-		_vm->gameState().sceneNum = 3;
-		createNavigationScene(0x004B3A90, which);
-		break;
-	case 4:
-		_vm->gameState().sceneNum = 4;
-		createNavigationScene(0x004B3B20, which);
-		break;
-	case 5:
-		_vm->gameState().sceneNum = 5;
-		createNavigationScene(0x004B3B50, which);
-		break;
-	case 6:
-		_vm->gameState().sceneNum = 6;
-		createNavigationScene(0x004B3B80, which);
-		break;
-	case 7:
-		_vm->gameState().sceneNum = 7;
-		_childObject = new Scene1608(_vm, this, which);
-		break;
-	case 8:
-		_vm->gameState().sceneNum = 8;
-		_childObject = new Scene1609(_vm, this);
-		break;
-	case 1001:
-		_vm->gameState().sceneNum = 1;
-		if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1)
-			createSmackerScene(0x80050200, true, true, false);
-		else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2)
-			createSmackerScene(0x80090200, true, true, false);
-		else
-			createSmackerScene(0x80000200, true, true, false);
-		if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2)
-			setGlobalVar(V_TALK_COUNTING_INDEX, 0);
-		else
-			incGlobalVar(V_TALK_COUNTING_INDEX, +1);			
-		break;
-	}
-	SetUpdateHandler(&Module1600::updateScene);
-	_childObject->handleUpdate();
-}
-
-void Module1600::updateScene() {
-	if (!updateChild()) {
-		switch (_sceneNum) {
-		case 0:
-			if (_moduleResult == 0)
-				createScene(2, 0);
-			else if (_moduleResult == 1)
-				createScene(1, 0);
-			else if (_moduleResult == 2)
-				leaveModule(4);
-			break;
-		case 1:
-			if (_moduleResult == 0)
-				createScene(1001, -1);
-			else if (_moduleResult == 1)
-				createScene(0, 3);
-			break;
-		case 2:
-			if (_moduleResult == 0)
-				createScene(3, 0);
-			else if (_moduleResult == 1)
-				createScene(0, 2);
-			break;
-		case 3:
-			if (_moduleResult == 0)
-				createScene(5, 0);
-			else if (_moduleResult == 2)
-				createScene(6, 0);
-			else if (_moduleResult == 3)
-				createScene(2, 1);
-			else if (_moduleResult == 4)
-				createScene(4, 0);
-			break;
-		case 4:
-			if (_moduleResult == 0)
-				leaveModule(1);
-			else if (_moduleResult == 1)
-				createScene(3, 1);
-			break;
-		case 5:
-			if (_moduleResult == 0)
-				leaveModule(2);
-			else if (_moduleResult == 1)
-				createScene(3, 3);
-			break;
-		case 6:
-			if (_moduleResult == 0)
-				createScene(8, -1);
-			else if (_moduleResult == 1)
-				createScene(3, 5);
-			break;
-		case 7:
-			createScene(6, 1);
-			break;
-		case 8:
-			if (_moduleResult == 0)
-				createScene(6, 0);
-			else
-				createScene(7, 0);
-			break;
-		case 1001:
-			createScene(1, 0);
-			break;
-		}
-	}
-}
-
-AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y)
-	: AnimatedSprite(vm, 1000), _parentScene(parentScene) {
-	
-	createSurface(200, 556, 328);
-	_x = x;
-	_y = y;
-	
-	_inMainArea = false;
-	_exitDirection = 0;
-	_currPointIndex = 0;
-	_hasAgainDestPoint = false;
-	_stepError = 0;
-	_hasAgainDestPointIndex = false;
-	_steps = 0;
-	_isBraking = false;
-	_yMoveTotalSteps = 0;
-	_isBusy = false;
-	_isIdle = false;
-	_isMoving = true;
-	_rectFlag = false;
-	_newDeltaXType = -1;
-	_soundCounter = 0;
-	_pathPoints = NULL;
-	_currMoveDirection = 0;
-	
-	startAnimation(0xD4220027, 0, -1);
-	setDoDeltaX(getGlobalVar(V_CAR_DELTA_X));
-
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::handleMessage);
-	SetSpriteUpdate(NULL);
-}
-
-AsCommonCar::~AsCommonCar() {
-	if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone))
-		setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X));
-}
-
-void AsCommonCar::setPathPoints(NPointArray *pathPoints) {
-	_pathPoints = pathPoints;
-}
-
-void AsCommonCar::update() {
-	if (_newDeltaXType >= 0) {
-		setDoDeltaX(_newDeltaXType);
-		_newDeltaXType = -1;
-	}
-	AnimatedSprite::update();
-	if (_hasAgainDestPoint && _yMoveTotalSteps == 0 && !_isBusy) {
-		_hasAgainDestPoint = false;
-		_hasAgainDestPointIndex = false;
-		sendPointMessage(this, 0x2004, _againDestPoint);
-	} else if (_hasAgainDestPointIndex && _yMoveTotalSteps == 0 && !_isBusy) {
-		_hasAgainDestPointIndex = false;
-		sendMessage(this, 0x2003, _againDestPointIndex);
-	}
-	updateMovement();
-	updateSound();
-}
-
-void AsCommonCar::upIdle() {
-	update();
-	if (++_idleCounter >= _idleCounterMax)
-		stIdleBlink();
-	updateSound();
-}
-
-uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x1019:
-		SetSpriteUpdate(NULL);
-		break;
-	case 0x2002:
-		// Set the current position without moving
-		_currPointIndex = param.asInteger();
-		_stepError = 0;
-		_x = pathPoint(_currPointIndex).x;
-		_y = pathPoint(_currPointIndex).y;
-		break;
-	case 0x2003:
-		// Move to a point by its index
-		{
-			int newPointIndex = param.asInteger();
-			if (_yMoveTotalSteps <= 0 && !_isBusy) {
-				_destX = pathPoint(newPointIndex).x;
-				_destY = pathPoint(newPointIndex).y;
-				if (_currPointIndex < newPointIndex) {
-					moveToNextPoint();
-				} else if (_currPointIndex == newPointIndex && _stepError == 0) {
-					if (_currPointIndex == 0) {
-						_yMoveTotalSteps = 0;
-						sendMessage(_parentScene, 0x2005, 0);
-					} else if (_currPointIndex == (int)_pathPoints->size()) {
-						_yMoveTotalSteps = 0;
-						sendMessage(_parentScene, 0x2006, 0);
-					}
-				} else {
-					moveToPrevPoint();
-				}
-			} else {
-				_hasAgainDestPointIndex = true;
-				_againDestPointIndex = newPointIndex;
-			}
-		}
-		break;
-	case 0x2004:
-		// Move to the point closest to the parameter point
-		{
-			int minMatchIndex = -1;
-			int minMatchDistance, distance;
-			NPoint pt = param.asPoint();
-			if (_yMoveTotalSteps <= 0 && !_isBusy) {
-				// Check if we're already exiting (or something)
-				if ((pt.x <= 20 && _exitDirection == 1) ||
-					(pt.x >= 620 && _exitDirection == 3) ||
-					(pt.y <= 20 && _exitDirection == 2) ||
-					(pt.y >= 460 && _exitDirection == 4))
-					break;
-				_destX = pt.x;
-				_destY = pt.y;
-				minMatchDistance = calcDistance(_destX, _destY, _x, _y) + 1;
-				for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) {
-					distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y);
-					if (distance >= minMatchDistance)
-						break;
-					minMatchDistance = distance;
-					minMatchIndex = i;
-				}
-				for (int i = _currPointIndex; i >= 0; i--) {
-					distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y);
-					if (distance >= minMatchDistance)
-						break;
-					minMatchDistance = distance;
-					minMatchIndex = i;
-				}
-				if (minMatchIndex == -1) {
-					if (_currPointIndex == 0)
-						moveToPrevPoint();
-					else
-						SetSpriteUpdate(NULL);
-				} else {
-					if (minMatchIndex > _currPointIndex)
-						moveToNextPoint();
-					else
-						moveToPrevPoint();
-				}
-			} else {
-				_hasAgainDestPoint = true;
-				_againDestPoint = pt;
-			}
-		}
-		break;
-	case 0x2007:
-		_yMoveTotalSteps = param.asInteger();
-		_steps = 0;
-		_isBraking = false;
-		_lastDistance = 640;
-		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
-		break;
-	case 0x2008:
-		_yMoveTotalSteps = param.asInteger();
-		_steps = 0;
-		_isBraking = false;
-		_lastDistance = 640;
-		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
-		break;
-	case 0x2009:
-		stEnterCar();
-		break;
-	case 0x200A:
-		stLeaveCar();
-		break;
-	case 0x200E:
-		stTurnCar();
-		break;
-	case 0x200F:
-		stCarAtHome();
-		_newDeltaXType = param.asInteger();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam &param, Entity *sender) {
-	uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (_isBusy && param.asInteger() == 0x025424A2)
-			gotoNextState();
-		break;
-	case 0x3002:
-		gotoNextState();
-		break;
-	}
-	return messageResult;
-}
-
-uint32 AsCommonCar::hmLeaveCar(int messageNum, const MessageParam &param, Entity *sender) {
-	switch (messageNum) {
-	case 0x2009:
-		stEnterCar();
-		break;
-	case 0x3002:
-		sendMessage(_parentScene, 0x200A, 0);
-		SetMessageHandler(&AsCommonCar::handleMessage);
-		break;
-	}
-	return 0;
-}
-
-void AsCommonCar::stCarAtHome() {
-	bool doDeltaX = _doDeltaX;
-	SetSpriteUpdate(NULL);
-	_hasAgainDestPoint = false;
-	_hasAgainDestPointIndex = false;
-	_isBraking = false;
-	_isBusy = false;
-	_isIdle = false;
-	_isMoving = false;
-	_rectFlag = false;
-	NextState(&AsCommonCar::stLeanForwardIdle);
-	startAnimation(0x35698F78, 0, -1);
-	setDoDeltaX(doDeltaX ? 1 : 0);
-	_currMoveDirection = 0;
-	_newMoveDirection = 0;
-	_steps = 0;
-	_idleCounter = 0;
-	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-	SetUpdateHandler(&AsCommonCar::upIdle);
-	SetMessageHandler(&AsCommonCar::handleMessage);
-	FinalizeState(&AsCommonCar::evIdleDone);
-}
-
-void AsCommonCar::updateTurnMovement() {
-	if (_turnMoveStatus == 1) {
-		_lastDistance = 640;
-		_isIdle = false;
-		_isBraking = false;
-		SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
-	} else if (_turnMoveStatus == 2) {
-		_lastDistance = 640;
-		_isIdle = false;
-		_isBraking = false;
-		SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
-	}
-}
-
-void AsCommonCar::updateMovement() {
-	if (_isBraking && !_isIdle && !_isBusy) {
-		gotoNextState();
-		_isMoving = false;
-		_isIdle = true;
-		startAnimation(0x192ADD30, 0, -1);
-		SetUpdateHandler(&AsCommonCar::update);
-		SetMessageHandler(&AsCommonCar::hmAnimation);
-		NextState(&AsCommonCar::stLeanForwardIdle);
-	} else if (!_isBraking && _steps && _isIdle) {
-		gotoNextState();
-		_isIdle = false;
-		startAnimation(0x9966B138, 0, -1);
-		SetUpdateHandler(&AsCommonCar::update);
-		SetMessageHandler(&AsCommonCar::hmAnimation);
-		NextState(&AsCommonCar::stUpdateMoveDirection);
-	} else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) {
-		gotoNextState();
-		_currMoveDirection = _newMoveDirection;
-		stUpdateMoveDirection();
-	}
-}
-
-void AsCommonCar::stEnterCar() {
-	startAnimation(0xA86A9538, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	NextState(&AsCommonCar::stLeanForwardIdle);
-}
-
-void AsCommonCar::stLeaveCar() {
-	startAnimation(0xA86A9538, -1, -1);
-	_playBackwards = true;
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmLeaveCar);
-}
-
-void AsCommonCar::stLeanForwardIdle() {
-	startAnimation(0x35698F78, 0, -1);
-	_currMoveDirection = 0;
-	_newMoveDirection = 0;
-	_steps = 0;
-	_idleCounter = 0;
-	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-	SetUpdateHandler(&AsCommonCar::upIdle);
-	SetMessageHandler(&AsCommonCar::handleMessage);
-	FinalizeState(&AsCommonCar::evIdleDone);
-}
-
-void AsCommonCar::evIdleDone() {
-	SetUpdateHandler(&AsCommonCar::update);
-}
-
-void AsCommonCar::stIdleBlink() {
-	startAnimation(0xB579A77C, 0, -1);
-	_idleCounter = 0;
-	_idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24;
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	NextState(&AsCommonCar::stLeanForwardIdle);
-}
-
-void AsCommonCar::stUpdateMoveDirection() {
-	_isMoving = true;
-	if (_currMoveDirection == 1)
-		startAnimation(0xD4AA03A4, 0, -1);
-	else if (_currMoveDirection == 3)
-		startAnimation(0xD00A1364, 0, -1);
-	else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX))
-		stTurnCar();
-	else
-		startAnimation(0xD4220027, 0, -1);
-	setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0);
-}
-
-void AsCommonCar::moveToNextPoint() {
-	if (_currPointIndex >= (int)_pathPoints->size() - 1) {
-		_yMoveTotalSteps = 0;
-		sendMessage(this, 0x1019, 0);
-		sendMessage(_parentScene, 0x2006, 0);
-	} else {
-		NPoint nextPt = pathPoint(_currPointIndex + 1);
-		NPoint currPt = pathPoint(_currPointIndex);
-		if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) &&
-			((_currMoveDirection == 2 && nextPt.x < currPt.x) ||
-			(_currMoveDirection == 4 && nextPt.x >= currPt.x))) {
-			if (_currMoveDirection == 2) 
-				_currMoveDirection = 4;
-			else if (_currMoveDirection == 4)
-				_currMoveDirection = 2;
-			if (_isIdle)
-				stTurnCarMoveToNextPoint();
-			else
-				stBrakeMoveToNextPoint();
-		} else {
-			if (_steps == 0) {
-				gotoNextState();
-				_isIdle = false;
-				startAnimation(0x9966B138, 0, -1);
-				SetMessageHandler(&AsCommonCar::hmAnimation);
-				SetUpdateHandler(&AsCommonCar::update);
-				NextState(&AsCommonCar::stUpdateMoveDirection);
-			}
-			_isBraking = false;
-			SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint);
-			_lastDistance = 640;
-		}
-	}
-}
-
-void AsCommonCar::stBrakeMoveToNextPoint() {
-	gotoNextState();
-	_isBusy = true;
-	_isBraking = true;
-	startAnimation(0x192ADD30, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	NextState(&AsCommonCar::stTurnCarMoveToNextPoint);
-}
-
-void AsCommonCar::stTurnCar() {
-	// Turn to left/right #1
-	gotoNextState();
-	_isBusy = true;
-	startAnimation(0xF46A0324, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	FinalizeState(&AsCommonCar::evTurnCarDone);
-	_turnMoveStatus = 0;
-	updateTurnMovement();
-}
-
-void AsCommonCar::stTurnCarMoveToNextPoint() {
-	// Turn to left/right #2
-	gotoNextState();
-	_isBusy = true;
-	startAnimation(0xF46A0324, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	FinalizeState(&AsCommonCar::evTurnCarDone);
-	_turnMoveStatus = 1;
-	updateTurnMovement();
-}
-
-void AsCommonCar::stTurnCarMoveToPrevPoint() {
-	// Turn to left/right #3
-	FinalizeState(NULL);
-	_isBusy = true;
-	startAnimation(0xF46A0324, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	FinalizeState(&AsCommonCar::evTurnCarDone);
-	_turnMoveStatus = 2;
-	updateTurnMovement();
-}
-
-void AsCommonCar::moveToPrevPoint() {
-	if (_currPointIndex == 0 && _stepError == 0) {
-		_yMoveTotalSteps = 0;
-		sendMessage(this, 0x1019, 0);
-		sendMessage(_parentScene, 0x2005, 0);
-	} else {
-		NPoint prevPt;
-		NPoint currPt;
-		if (_stepError == 0) {
-			prevPt = pathPoint(_currPointIndex - 1);
-			currPt = pathPoint(_currPointIndex);
-		} else {
-			prevPt = pathPoint(_currPointIndex);
-			currPt = pathPoint(_currPointIndex + 1);
-		}
-		if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) &&
-			((_currMoveDirection == 2 && prevPt.x < currPt.x) ||
-			(_currMoveDirection == 4 && prevPt.x >= currPt.x))) {
-			if (_currMoveDirection == 2) 
-				_currMoveDirection = 4;
-			else if (_currMoveDirection == 4)
-				_currMoveDirection = 2;
-			if (_isIdle)
-				stTurnCarMoveToPrevPoint();
-			else
-				stBrakeMoveToPrevPoint();
-		} else {
-			if (_steps == 0) {
-				gotoNextState();
-				_isIdle = false;
-				startAnimation(0x9966B138, 0, -1);
-				SetMessageHandler(&AsCommonCar::hmAnimation);
-				SetUpdateHandler(&AsCommonCar::update);
-				NextState(&AsCommonCar::stUpdateMoveDirection);
-			}
-			_isBraking = false;
-			SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint);
-			_lastDistance = 640;
-		}
-	}
-}
-
-void AsCommonCar::stBrakeMoveToPrevPoint() {
-	FinalizeState(NULL);
-	_isBusy = true;
-	_isBraking = true;
-	startAnimation(0x192ADD30, 0, -1);
-	SetUpdateHandler(&AsCommonCar::update);
-	SetMessageHandler(&AsCommonCar::hmAnimation);
-	NextState(&AsCommonCar::stTurnCarMoveToPrevPoint);
-}
-
-void AsCommonCar::evTurnCarDone() {
-	_isBusy = false;
-	setDoDeltaX(2);
-	_newMoveDirection = 0;
-	stUpdateMoveDirection();
-}
-
-void AsCommonCar::suMoveToNextPoint() {
-	int16 newX = _x, newY = _y;
-
-	if (_currPointIndex >= (int)_pathPoints->size()) {
-		_yMoveTotalSteps = 0;
-		sendMessage(this, 0x1019, 0);
-		sendMessage(_parentScene, 0x2006, 0);
-		return;
-	}
-
-	if (_isBraking) {
-		if (_steps <= 0) {
-			sendMessage(this, 0x1019, 0);
-			return;
-		} else
-			_steps--;
-	} else if (_steps < 11)
-		_steps++;
-
-	bool firstTime = true;
-	_ySteps = _steps;
-	int stepsCtr = _steps;
-	
-	while (stepsCtr > 0) {
-		NPoint pt1;
-		NPoint pt2 = pathPoint(_currPointIndex);
-		if (_currPointIndex + 1 >= (int)_pathPoints->size())
-			pt1 = pathPoint(0);
-		else
-			pt1 = pathPoint(_currPointIndex + 1);
-		int16 deltaX = ABS(pt1.x - pt2.x);
-		int16 deltaY = ABS(pt1.y - pt2.y);
-		if (deltaX >= deltaY) {
-			_newMoveDirection = 2;
-			if (pt1.x < pt2.x)
-				_newMoveDirection = 4;
-			if (stepsCtr + _stepError >= deltaX) {
-				stepsCtr -= deltaX;
-				stepsCtr += _stepError;
-				_stepError = 0;
-				_currPointIndex++;
-				if (_currPointIndex == (int)_pathPoints->size() - 1)
-					stepsCtr = 0;
-				newX = pathPoint(_currPointIndex).x;
-				newY = pathPoint(_currPointIndex).y;
-			} else {
-				_stepError += stepsCtr;
-				if (pt1.x >= pt2.x)
-					newX += stepsCtr;
-				else
-					newX -= stepsCtr;
-				if (pt1.y >= pt2.y)
-					newY = pt2.y + (deltaY * _stepError) / deltaX;
-				else
-					newY = pt2.y - (deltaY * _stepError) / deltaX;
-				stepsCtr = 0;
-			}
-		} else {
-			_newMoveDirection = 3;
-			if (pt1.y < pt2.y)
-				_newMoveDirection = 1;
-			if (firstTime) {
-				if (pt1.y >= pt2.y)
-					stepsCtr += 7;
-				else {
-					stepsCtr -= 4;
-					if (stepsCtr < 0)
-						stepsCtr = 0;
-				}
-				_ySteps = stepsCtr;
-			}
-			if (stepsCtr + _stepError >= deltaY) {
-				stepsCtr -= deltaY;
-				stepsCtr += _stepError;
-				_stepError = 0;
-				_currPointIndex++;
-				if (_currPointIndex == (int)_pathPoints->size() - 1)
-					stepsCtr = 0;
-				newX = pathPoint(_currPointIndex).x;
-				newY = pathPoint(_currPointIndex).y;
-			} else {
-				_stepError += stepsCtr;
-				if (pt1.x >= pt2.x)
-					newX = pt2.x + (deltaX * _stepError) / deltaY;
-				else
-					newX = pt2.x - (deltaX * _stepError) / deltaY;
-				if (pt1.y >= pt2.y)
-					newY += stepsCtr;
-				else
-					newY -= stepsCtr;
-				stepsCtr = 0;
-			}
-		}
-		firstTime = false;		
-	}
-
-	if (_yMoveTotalSteps != 0) {
-		_x = newX;
-		_y = newY;
-		_yMoveTotalSteps -= _ySteps;
-		if (_yMoveTotalSteps <= 0) {
-			_isBraking = true;
-			_yMoveTotalSteps = 0;
-		}
-	} else {
-		int distance = calcDistance(_destX, _destY, _x, _y);
-		_x = newX;
-		_y = newY;
-		if (newX > 20 && newX < 620 && newY > 20 && newY < 460) {
-			_exitDirection = 0;
-			_inMainArea = true;
-		} else if (_inMainArea) {
-			_destX = pathPoint(_pathPoints->size() - 1).x;
-			_destY = pathPoint(_pathPoints->size() - 1).y;
-			_inMainArea = false;
-			if (_x <= 20)
-				_exitDirection = 1;
-			else if (_x >= 620)
-				_exitDirection = 3;
-			else if (_y <= 20)
-				_exitDirection = 2;
-			else if (_y >= 460)
-				_exitDirection = 4;
-			if (_exitDirection != 0 && _isBraking) {
-				_isBraking = false;
-				_steps = 11;
-			}
-		}
-		if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) ||
-			(_exitDirection == 0 && _lastDistance + 20 < distance))
-			_isBraking = true;
-		if (distance < _lastDistance)
-			_lastDistance = distance;
-		if (_currPointIndex == (int)_pathPoints->size() - 1) {
-			_isBraking = true;
-			_yMoveTotalSteps = 0;
-			sendMessage(this, 0x1019, 0);
-			sendMessage(_parentScene, 0x2006, 0);
-		}
-	}
-
-}
-
-void AsCommonCar::suMoveToPrevPoint() {
-	int16 newX = _x, newY = _y;
-
-	if (_currPointIndex == 0 && _stepError == 0) {
-		_yMoveTotalSteps = 0;
-		sendMessage(this, 0x1019, 0);
-		sendMessage(_parentScene, 0x2005, 0);
-		return;
-	}
-
-	if (_isBraking) {
-		if (_steps <= 0) {
-			sendMessage(this, 0x1019, 0);
-			return;
-		} else
-			_steps--;
-	} else if (_steps < 11)
-		_steps++;
-
-	bool firstTime = true;
-	_ySteps = _steps;
-	int stepsCtr = _steps;
-	
-	while (stepsCtr > 0) {
-		if (_stepError == 0)
-			_currPointIndex--;
-		NPoint pt1;
-		NPoint pt2 = pathPoint(_currPointIndex);
-		if (_currPointIndex + 1 >= (int)_pathPoints->size())
-			pt1 = pathPoint(0);
-		else
-			pt1 = pathPoint(_currPointIndex + 1);
-		int16 deltaX = ABS(pt1.x - pt2.x);
-		int16 deltaY = ABS(pt1.y - pt2.y);
-		if (deltaX >= deltaY) {
-			_newMoveDirection = 4;
-			if (pt1.x < pt2.x)
-				_newMoveDirection = 2;
-			if (_stepError == 0)
-				_stepError = deltaX;
-			if (stepsCtr > _stepError) {
-				stepsCtr -= _stepError;
-				_stepError = 0;
-				if (_currPointIndex == 0)
-					stepsCtr = 0;
-				newX = pathPoint(_currPointIndex).x;
-				newY = pathPoint(_currPointIndex).y;
-			} else {
-				_stepError -= stepsCtr;
-				if (pt1.x >= pt2.x)
-					newX -= stepsCtr;
-				else
-					newX += stepsCtr;
-				if (pt1.y >= pt2.y)
-					newY = pt2.y + (deltaY * _stepError) / deltaX;
-				else
-					newY = pt2.y - (deltaY * _stepError) / deltaX;
-				stepsCtr = 0;
-			}
-		} else {
-			_newMoveDirection = 1;
-			if (pt1.y < pt2.y)
-				_newMoveDirection = 3;
-			if (firstTime) {
-				if (pt1.y >= pt2.y) {
-					stepsCtr -= 4;
-					if (stepsCtr < 0)
-						stepsCtr = 0;
-				} else {
-					stepsCtr += 7;
-				}
-				_ySteps = stepsCtr;
-			}
-			if (_stepError == 0)
-				_stepError = deltaY;
-			if (stepsCtr > _stepError) {
-				stepsCtr -= _stepError;
-				_stepError = 0;
-				if (_currPointIndex == 0)
-					stepsCtr = 0;
-				newX = pathPoint(_currPointIndex).x;
-				newY = pathPoint(_currPointIndex).y;
-			} else {
-				_stepError -= stepsCtr;
-				if (pt1.x >= pt2.x)
-					newX = pt2.x + (deltaX * _stepError) / deltaY;
-				else
-					newX = pt2.x - (deltaX * _stepError) / deltaY;
-				if (pt1.y >= pt2.y)
-					newY -= stepsCtr;
-				else
-					newY += stepsCtr;
-				stepsCtr = 0;
-			}
-		}
-		firstTime = false;		
-	}
-
-	if (_yMoveTotalSteps != 0) {
-		_x = newX;
-		_y = newY;
-		_yMoveTotalSteps -= _ySteps;
-		if (_yMoveTotalSteps <= 0) {
-			_isBraking = true;
-			_yMoveTotalSteps = 0;
-		}
-	} else {
-		int distance = calcDistance(_destX, _destY, _x, _y);
-		_x = newX;
-		_y = newY;
-		if (newX > 20 && newX < 620 && newY > 20 && newY < 460) {
-			_exitDirection = 0;
-			_inMainArea = true;
-		} else if (_inMainArea) {
-			_destX = pathPoint(0).x;
-			_destY = pathPoint(0).y;
-			_inMainArea = false;
-			if (_x <= 20)
-				_exitDirection = 1;
-			else if (_x >= 620)
-				_exitDirection = 3;
-			else if (_y <= 20)
-				_exitDirection = 2;
-			else if (_y >= 460)
-				_exitDirection = 4;
-			if (_exitDirection != 0 && _isBraking) {
-				_isBraking = false;
-				_steps = 11;
-			}
-		}
-		if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) ||
-			(_exitDirection == 0 && _lastDistance + 20 < distance))
-			_isBraking = true;
-		if (distance < _lastDistance)
-			_lastDistance = distance;
-		if (_currPointIndex == 0 && _stepError == 0) {
-			_isBraking = true;
-			_yMoveTotalSteps = 0;
-			sendMessage(this, 0x1019, 0);
-			sendMessage(_parentScene, 0x2005, 0);
-		}
-	}
-
-}
-
-void AsCommonCar::updateSound() {
-	int maxSoundCounter = 0;
-	_soundCounter++;
-	if (_steps != 0 && !_isIdle) {
-		if (_currMoveDirection == 1)
-			maxSoundCounter = 18 - _steps;
-		else if (_currMoveDirection == 3) {
-			maxSoundCounter = 5 - _steps;
-			if (maxSoundCounter < 1)
-				maxSoundCounter = 1;
-		} else
-			maxSoundCounter = 14 - _steps;
-	} else
-		maxSoundCounter = 21;
-	if (_soundCounter >= maxSoundCounter) {
-		sendMessage(_parentScene, 0x200D, 0);
-		_soundCounter = 0;
-	}
-}
-
-AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y)
-	: AnimatedSprite(vm, 0x1209E09F, 1100, x, y) {
-
-	setDoDeltaX(1);
-	startAnimation(0x1209E09F, 1, -1);
-	_newStickFrameIndex = 1;
-}
-
-AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y)
-	: AnimatedSprite(vm, 0x1209E09F, 100, x, y) {
-
-	setDoDeltaX(1);
-	_newStickFrameIndex = 0;
-}
-
-AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar)
-	: AnimatedSprite(vm, 1100), _asCar(asCar) {
-	
-	createSurface1(0x60281C10, 150);
-	startAnimation(0x60281C10, -1, -1);
-	_newStickFrameIndex = STICK_LAST_FRAME;
-	SetUpdateHandler(&AsCommonCarConnector::update);
-}
-
-void AsCommonCarConnector::update() {
-	_x = _asCar->getX();
-	_y = _asCar->getY();
-	AnimatedSprite::update();
-}
-
-void Tracks::findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance,
-	DataResource &dataResource) {
-	const uint trackCount = size();
-	minMatchTrackIndex = -1;
-	minMatchDistance = 640;
-	for (uint trackIndex = 0; trackIndex < trackCount; trackIndex++) {
-		NPointArray *pointList = dataResource.getPointArray((*this)[trackIndex]->trackPointsName);
-		for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) {
-			NPoint testPt = (*pointList)[pointIndex];
-			int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y);
-			if (distance < minMatchDistance) {
-				minMatchTrackIndex = trackIndex;
-				minMatchDistance = distance;
-			}
-		}
-	}
-}
-
-Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which)
-	: Scene(vm, parentModule), _asCar(NULL), _countdown1(0) {
-
-	setGlobalVar(V_CAR_DELTA_X, 1);
-	
-	SetMessageHandler(&Scene1608::hmLowerFloor);
-	
-	_asKey = insertSprite<AsCommonKey>(this, 1, 1100, 198, 220);
-	addCollisionSprite(_asKey);
-
-	if (which < 0) {
-		// Restoring game
-		if (_vm->gameState().which == 1)
-			// Klaymen is in the car
-			which = 1;
-		else {
-			// Klaymen is standing around
-			setRectList(0x004B47D0);
-			insertKlaymen<KmScene1608>(380, 438);
-			_kmScene1608 = _klaymen;
-			_klaymenInCar = false;
-			_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
-			setMessageList(0x004B46A8);
-			setBackground(0x10080E01);
-			setPalette(0x10080E01);
-			_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-			addCollisionSprite(_asTape);
-			_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-			SetUpdateHandler(&Scene1608::upLowerFloor);
-			insertScreenMouse(0x80E05108);
-			insertStaticSprite(0x4B18F868, 1200);
-		}
-	} else if (which == 0) {
-		// Klaymen entering from the left
-		_vm->gameState().which = 0;
-		setRectList(0x004B47D0);
-		insertKlaymen<KmScene1608>(0, 438);
-		_kmScene1608 = _klaymen;
-		_klaymenInCar = false;
-		setMessageList(0x004B46B0);
-		setBackground(0x10080E01);
-		setPalette(0x10080E01);
-		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		addCollisionSprite(_asTape);
-		insertScreenMouse(0x80E05108);
-		_sprite1 = insertStaticSprite(0x7D0404E8, 1100);
-		_klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480);
-		SetUpdateHandler(&Scene1608::upLowerFloor);
-		insertStaticSprite(0x4B18F868, 1200);
-	} else if (which == 2) {
-		// Klaymen returning from looking through the upper window
-		_vm->gameState().which = 1;
-		_dataResource.load(0x003C0492);
-		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
-		setBackground(0x98001604);
-		setPalette(0x98001604);
-		_palette->addPalette("paPodRed", 65, 31, 65);
-		insertScreenMouse(0x01600988);
-		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
-		_asCar = createSprite<AsCommonCar>(this, 375, 227); // Create but don't add to the sprite list yet
-		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
-		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
-		_asCar->setVisible(false);
-		if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) {
-			insertKlaymen<KmScene1608>(373, 220);
-			_klaymen->setDoDeltaX(1);
-		} else
-			insertKlaymen<KmScene1608>(283, 220);
-		_kmScene1608 = _klaymen;
-		setMessageList(0x004B47A8);
-		SetMessageHandler(&Scene1608::hmUpperFloor);
-		SetUpdateHandler(&Scene1608::upUpperFloor);
-		_asCar->setPathPoints(_roomPathPoints);
-		sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1);
-		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
-		_clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_clipRect2 = _clipRect1;
-		_clipRect2.y2 = 215;
-		_klaymen->setClipRect(_clipRect1);
-		_asCar->setClipRect(_clipRect1);
-		_asIdleCarLower->setClipRect(_clipRect1);
-		_asIdleCarFull->setClipRect(_clipRect1);
-		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		addCollisionSprite(_asTape);
-		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
-		_klaymenInCar = false;
-		_carClipFlag = false;
-		_carStatus = 0;
-		setRectList(0x004B4810);
-	} 
-
-	// NOTE: Not in the else because 'which' is set to 1 in the true branch	
-	if (which == 1) {
-		// Klaymen riding the car
-		_vm->gameState().which = 1;
-		_dataResource.load(0x003C0492);
-		_roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath"));
-		setBackground(0x98001604);
-		setPalette(0x98001604);
-		_palette->addPalette("paPodRed", 65, 31, 65);
-		insertScreenMouse(0x01600988);
-		_asCar = insertSprite<AsCommonCar>(this, 375, 227);
-		_asIdleCarLower = insertSprite<AsCommonIdleCarLower>(375, 227);
-		_asIdleCarFull = insertSprite<AsCommonIdleCarFull>(375, 227);
-		_sprite2 = insertStaticSprite(0x491F38A8, 1100);
-		_kmScene1608 = createSprite<KmScene1608>(this, 439, 220);
-		sendMessage(_kmScene1608, 0x2032, 1);
-		_kmScene1608->setDoDeltaX(1);
-		SetMessageHandler(&Scene1608::hmRidingCar);
-		SetUpdateHandler(&Scene1608::upRidingCar);
-		_asIdleCarLower->setVisible(false);
-		_asIdleCarFull->setVisible(false);
-		_asCar->setPathPoints(_roomPathPoints);
-		sendMessage(_asCar, 0x2002, 0);
-		sendMessage(_asCar, 0x2008, 90);
-		_sprite3 = insertStaticSprite(0xB47026B0, 1100);
-		_clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2());
-		_clipRect2 = _clipRect1;
-		_clipRect2.y2 = 215;
-		_kmScene1608->setClipRect(_clipRect1);
-		_asCar->setClipRect(_clipRect1);
-		_asIdleCarLower->setClipRect(_clipRect1);
-		_asIdleCarFull->setClipRect(_clipRect1);
-		_asTape = insertSprite<AsScene1201Tape>(this, 13, 1100, 412, 443, 0x9148A011);
-		// ... addCollisionSprite(_asTape);
-		insertSprite<AsCommonCarConnector>(_asCar)->setClipRect(_clipRect1);
-		_klaymenInCar = true;
-		_carClipFlag = true;
-		_carStatus = 0;
-	}
-	
-	_palette->addPalette("paKlayRed", 0, 64, 0);
-	
-}
-
-Scene1608::~Scene1608() {
-	setGlobalVar(V_KLAYMEN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0);
-	if (_klaymenInCar)
-		delete _kmScene1608;
-	else
-		delete _asCar;
-}
-
-void Scene1608::upLowerFloor() {
-	Scene::update();
-	if (_countdown1 != 0 && (--_countdown1 == 0))
-		leaveScene(0);
-}
-
-void Scene1608::upUpperFloor() {
-	Scene::update();
-	if (_carStatus == 1) {
-		removeSurface(_klaymen->getSurface());
-		removeEntity(_klaymen);
-		addSprite(_asCar);
-		_klaymenInCar = true;
-		clearRectList();
-		SetUpdateHandler(&Scene1608::upCarAtHome);
-		SetMessageHandler(&Scene1608::hmCarAtHome);
-		_asIdleCarLower->setVisible(false);
-		_asIdleCarFull->setVisible(false);
-		_asCar->setVisible(true);
-		sendMessage(_asCar, 0x2009, 0);
-		_asCar->handleUpdate();
-		_klaymen = NULL;
-		_carStatus = 0;
-	}
-	updateKlaymenCliprect();
-}
-
-void Scene1608::upCarAtHome() {
-	Scene::update();
-	if (_mouseClicked) {
-		if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) {
-			sendMessage(_asCar, 0x200A, 0);
-			SetUpdateHandler(&Scene1608::upGettingOutOfCar);
-		} else {
-			sendPointMessage(_asCar, 0x2004, _mouseClickPos);
-			SetMessageHandler(&Scene1608::hmRidingCar);
-			SetUpdateHandler(&Scene1608::upRidingCar);
-		}
-		_mouseClicked = false;
-	}
-	updateKlaymenCliprect();
-}
-
-void Scene1608::upGettingOutOfCar() {
-	Scene::update();
-	if (_carStatus == 2) {
-		_klaymen = _kmScene1608;
-		removeSurface(_asCar->getSurface());
-		removeEntity(_asCar);
-		addSprite(_klaymen);
-		_klaymenInCar = false;
-		SetMessageHandler(&Scene1608::hmUpperFloor);
-		SetUpdateHandler(&Scene1608::upUpperFloor);
-		setRectList(0x004B4810);
-		_asIdleCarLower->setVisible(true);
-		_asIdleCarFull->setVisible(true);
-		_asCar->setVisible(false);
-		setMessageList(0x004B4748);
-		processMessageList();
-		_klaymen->handleUpdate();
-		_carStatus = 0;
-	}
-	updateKlaymenCliprect();
-}
-
-void Scene1608::upRidingCar() {
-	Scene::update();
-	if (_mouseClicked) {
-		sendPointMessage(_asCar, 0x2004, _mouseClickPos);
-		_mouseClicked = false;
-	}
-	if (_asCar->getX() < 300) {
-		if (_carClipFlag) {
-			_carClipFlag = false;
-			_asCar->setClipRect(_clipRect1);
-			if (!_asCar->isDoDeltaX())
-				sendMessage(_asCar, 0x200E, 0);
-		}
-	} else if (!_carClipFlag) {
-		_carClipFlag = true;
-		_asCar->setClipRect(_clipRect3);
-	}
-}
-
-uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x20250B1A) {
-			clearRectList();
-			_klaymen->setVisible(false);
-			showMouse(false);
-			_sprite1->setVisible(false);
-			//sendMessage(_asDoor, 0x4809, 0); // Play sound?
-			_countdown1 = 28;
-		}
-		break;
-	case 0x200D:
-		sendMessage(_parentModule, 0x200D, 0);
-		break;
-	case 0x4826:
-		if (sender == _asTape) {
-			sendEntityMessage(_kmScene1608, 0x1014, _asTape);
-			setMessageList(0x004B4770);
-		} else if (sender == _asKey)
-			setMessageList(0x004B46C8);
-		break;
-	}
-	return 0;
-}
-
-uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x100D:
-		if (param.asInteger() == 0x60842040)
-			_carStatus = 1;
-		break;
-	case 0x200D:
-		sendMessage(_parentModule, 0x200D, 0);
-		break;
-	case 0x4826:
-		if (sender == _asKey) {
-			sendEntityMessage(_kmScene1608, 0x1014, _asKey);
-			setMessageList(0x004B4760);
-		}
-		break;
-	}
-	return 0;
-}
-
-uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x2005:
-		leaveScene(1);
-		break;
-	case 0x2006:
-		SetMessageHandler(&Scene1608::hmCarAtHome);
-		SetUpdateHandler(&Scene1608::upCarAtHome);
-		sendMessage(_asCar, 0x200F, 1);
-		break;
-	case 0x200D:
-		sendMessage(_parentModule, 0x200D, 0);
-		break;
-	}
-	return 0;
-}
-
-uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x200A:
-		_carStatus = 2;
-		break;
-	case 0x200D:
-		sendMessage(_parentModule, 0x200D, 0);
-		break;
-	}
-	return 0;
-}
-	
-void Scene1608::updateKlaymenCliprect() {
-	if (_kmScene1608->getX() <= 375)
-		_kmScene1608->setClipRect(_clipRect1);
-	else
-		_kmScene1608->setClipRect(_clipRect2);
-}
-
-Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule)
-	: Scene(vm, parentModule), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) {
-
-	_vm->gameModule()->initCodeSymbolsPuzzle();
-	_noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX);
-	
-	SetMessageHandler(&Scene1609::handleMessage);
-	SetUpdateHandler(&Scene1609::update);
-	
-	setBackground(0x92124A14);
-	setPalette(0x92124A14);
-	insertPuzzleMouse(0x24A10929, 20, 620);
-	
-	for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++)
-		_asSymbols[symbolPosition] = insertSprite<AsScene3011Symbol>(symbolPosition, false);
-	
-	_ssButton = insertSprite<SsScene3011Button>(this, true);
-	addCollisionSprite(_ssButton);
-	loadSound(0, 0x68E25540);
-
-}
-
-void Scene1609::update() {
-	if (!_isSolved && _countdown1 != 0 && (--_countdown1 == 0)) {
-		if (_changeCurrentSymbol) {
-			_currentSymbolIndex++;
-			if (_currentSymbolIndex >= 12)
-				_currentSymbolIndex = 0;
-			_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(VA_CODE_SYMBOLS, _noisySymbolIndex));
-			_changeCurrentSymbol = false;
-			_countdown1 = 36;
-		} else {
-			_asSymbols[_symbolPosition]->hide();
-			_changeCurrentSymbol = true;
-			_countdown1 = 12;
-		}
-	}
-	if (_isSolved && !isSoundPlaying(0))
-		leaveScene(1);
-	Scene::update();
-}
-
-uint32 Scene1609::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
-	Scene::handleMessage(messageNum, param, sender);
-	switch (messageNum) {
-	case 0x0001:
-		if (param.asPoint().x <= 20 || param.asPoint().x >= 620)
-			leaveScene(0);
-		break;
-	case 0x2000:
-		if (!_isSolved) {
-			if (_changeCurrentSymbol)
-				_asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false);
-			_asSymbols[_symbolPosition]->stopSymbolSound();
-			_symbolPosition++;
-			if (_symbolPosition >= 12) {
-				if (testVars()) {
-					playSound(0);
-					setGlobalVar(V_CODE_SYMBOLS_SOLVED, 1);
-					_isSolved = true;
-				} else {
-					_symbolPosition = 0;
-					for (int i = 0; i < 12; i++)
-						_asSymbols[i]->hide();
-				}
-			}
-			_changeCurrentSymbol = true;
-			_countdown1 = 1;
-		}
-		break;
-	}
-	return 0;
-}
-
-bool Scene1609::testVars() {
-	int cmpSymbolIndex = 0;
-
-	// Find the position of the first symbol
-	while ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex())
-		cmpSymbolIndex++;
-
-	// Check if the entered symbols match
-	for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) {
-		if ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex())
-			return false;
-		cmpSymbolIndex++;
-		if (cmpSymbolIndex >= 12)
-			cmpSymbolIndex = 0;
-	}
-
-	return true;
-}
-	
-} // End of namespace Neverhood
diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h


Commit: 163023a8ed85b68ed877e1f3bf2e16cb1ef86862
    https://github.com/scummvm/scummvm/commit/163023a8ed85b68ed877e1f3bf2e16cb1ef86862
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T12:01:54-07:00

Commit Message:
NEVERHOOD: Fix issues in the save/load screens

- Add virtual keyboard support in save/load screens

Changed paths:
    engines/neverhood/menumodule.cpp



diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index d4882c3..a8631cb 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -253,7 +253,7 @@ void MenuModule::handleDeleteGameMenuAction(bool doDelete) {
 
 void MenuModule::loadSavegameList() {
 
-	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+	Common::SaveFileManager *saveFileMan = _vm->_system->getSavefileManager();
 	Neverhood::NeverhoodEngine::SaveHeader header;
 	Common::String pattern = _vm->getTargetName();
 	pattern += ".???";
@@ -606,22 +606,28 @@ void TextEditWidget::initialize() {
 		_parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1,
 		(const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface);
 	_textLabelWidget->initialize();
-	cursorSpriteResource.load(_cursorFileHash, true);
-	_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
-	_cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
-	_cursorSurface->setVisible(!_readOnly);
+	if (_cursorFileHash != 0) {
+		cursorSpriteResource.load(_cursorFileHash, true);
+		_cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
+		_cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height);
+		_cursorSurface->setVisible(!_readOnly);
+	}
 	refresh();
 }
 
 void TextEditWidget::enterWidget() {
-	if (!_readOnly)
+	if (!_readOnly) {
 		_cursorSurface->setVisible(true);
+		_vm->_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
+	}
 	refresh();
 }
 
 void TextEditWidget::exitWidget() {
-	if (!_readOnly)
+	if (!_readOnly) {
 		_cursorSurface->setVisible(false);
+		_vm->_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false);
+	}
 	refresh();
 }
 
@@ -709,7 +715,8 @@ void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) {
 void TextEditWidget::refresh() {
 	refreshPosition();
 	updateString();
-	drawCursor();
+	if (_cursorFileHash != 0)
+		drawCursor();
 }
 
 void TextEditWidget::update() {
@@ -750,7 +757,9 @@ void SavegameListBox::onClick() {
 	mousePos.y -= _y + _rect.y1;
 	if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 &&
 		mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) {
-		int newIndex = _firstVisibleItem + mousePos.y / _fontSurface->getCharHeight();
+		// We add 1 to the char height to ensure that the correct entry is chosen if the
+		// user clicks at the bottom the text entry
+		int newIndex = _firstVisibleItem + mousePos.y / (_fontSurface->getCharHeight() + 1);
 		if (newIndex <= _lastVisibleItem) {
 			_currIndex = newIndex;
 			refresh();
@@ -769,7 +778,7 @@ void SavegameListBox::initialize() {
 	_surface->setVisible(true);
 	buildItems();
 	_firstVisibleItem = 0;
-	_lastVisibleItem = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size());
+	_lastVisibleItem = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size()) - 1;
 	refresh();
 }
 
@@ -789,7 +798,7 @@ void SavegameListBox::buildItems() {
 void SavegameListBox::drawItems() {
 	for (int i = 0; i < (int)_textLabelItems.size(); ++i) {
 		TextLabelWidget *label = _textLabelItems[i];		
-		if (i >= _firstVisibleItem && i < _lastVisibleItem) {
+		if (i >= _firstVisibleItem && i <= _lastVisibleItem) {
 			label->setY(_rect.y1 + (i - _firstVisibleItem) * _fontSurface->getCharHeight());
 			label->updateBounds();
 			label->drawString(_maxStringLength);


Commit: fb0332d8842d7a87435f80a54c91a3a8b324bc8e
    https://github.com/scummvm/scummvm/commit/fb0332d8842d7a87435f80a54c91a3a8b324bc8e
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T12:02:00-07:00

Commit Message:
NEVERHOOD: Fix deletes in SpriteResource::unload() and ResourceMan::purgeResources()

Changed paths:
    engines/neverhood/resource.cpp
    engines/neverhood/resourceman.cpp



diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp
index 22a8028..4427131 100644
--- a/engines/neverhood/resource.cpp
+++ b/engines/neverhood/resource.cpp
@@ -63,7 +63,6 @@ bool SpriteResource::load(uint32 fileHash, bool doLoadPosition) {
 
 void SpriteResource::unload() {
 	_vm->_res->unloadResource(_resourceHandle);
-	delete[] _pixels;
 	_pixels = NULL;
 	_rle = false;
 }
diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp
index f662130..d5e7786 100644
--- a/engines/neverhood/resourceman.cpp
+++ b/engines/neverhood/resourceman.cpp
@@ -119,7 +119,7 @@ void ResourceMan::purgeResources() {
 	for (Common::HashMap<uint32, ResourceData*>::iterator it = _data.begin(); it != _data.end(); ++it) {
 		ResourceData *resourceData = (*it)._value;
 		if (resourceData->dataRefCount == 0) {
-			delete resourceData->data;
+			delete[] resourceData->data;
 			resourceData->data = NULL;
 		}
 	}


Commit: 32c21754e20afd589556ea862876c6e304b3326b
    https://github.com/scummvm/scummvm/commit/32c21754e20afd589556ea862876c6e304b3326b
Author: johndoe123 (john_doe at techie.com)
Date: 2013-05-08T12:02:00-07:00

Commit Message:
NEVERHOOD: Fix member var initializations

Changed paths:
    engines/neverhood/scene.cpp
    engines/neverhood/screen.cpp
    engines/neverhood/sound.cpp



diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp
index 2705668..07d4175 100644
--- a/engines/neverhood/scene.cpp
+++ b/engines/neverhood/scene.cpp
@@ -25,7 +25,8 @@
 namespace Neverhood {
 
 Scene::Scene(NeverhoodEngine *vm, Module *parentModule)
-	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL) {
+	: Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL),
+	_mouseCursorWasVisible(true) {
 	
 	_isKlaymenBusy = false;
 	_doConvertMessages = false;
diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp
index 25b4109..5a748cf 100644
--- a/engines/neverhood/screen.cpp
+++ b/engines/neverhood/screen.cpp
@@ -27,7 +27,7 @@ namespace Neverhood {
 
 Screen::Screen(NeverhoodEngine *vm)
 	: _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL),
-	_yOffset(0) {
+	_yOffset(0), _fullRefresh(false) {
 	
 	_ticks = _vm->_system->getMillis();
 	
diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp
index a479bf2..c84b751 100644
--- a/engines/neverhood/sound.cpp
+++ b/engines/neverhood/sound.cpp
@@ -185,7 +185,7 @@ SoundItem::SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFile
 	bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown)
 	: _vm(vm), _soundResource(NULL), _groupNameHash(groupNameHash), _fileHash(soundFileHash),
 	_playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0),
-	_playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown),
+	_playOnceAfterCountdown(playOnceAfterCountdown), _initialCountdown(initialCountdown),
 	_playLooping(false), _currCountdown(currCountdown) {
 	
 	_soundResource = new SoundResource(vm);
@@ -607,7 +607,7 @@ bool AudioResourceManSoundItem::isPlaying() {
 
 AudioResourceManMusicItem::AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash)
 	: _vm(vm), _fileHash(fileHash), _terminate(false), _canRestart(false),
-	_volume(100), _panning(50),	_start(false), _isFadingIn(false), _isFadingOut(false) {
+	_volume(100), _panning(50),	_start(false), _isFadingIn(false), _isFadingOut(false), _isPlaying(false) {
 
 }
 


Commit: 0638308ef13727b4b359d98d54bc09156752aaaa
    https://github.com/scummvm/scummvm/commit/0638308ef13727b4b359d98d54bc09156752aaaa
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2013-05-15T09:19:34-07:00

Commit Message:
Merge pull request #330 from johndoe123/neverhood

NEVERHOOD: Neverhood engine

Changed paths:
  A devtools/create_neverhood/create_neverhood.cpp
  A devtools/create_neverhood/create_neverhood.h
  A devtools/create_neverhood/module.mk
  A devtools/create_neverhood/tables.h
  A devtools/create_neverhood/util.cpp
  A devtools/create_neverhood/util.h
  A dists/engine-data/neverhood.dat
  A engines/neverhood/background.cpp
  A engines/neverhood/background.h
  A engines/neverhood/blbarchive.cpp
  A engines/neverhood/blbarchive.h
  A engines/neverhood/detection.cpp
  A engines/neverhood/diskplayerscene.cpp
  A engines/neverhood/diskplayerscene.h
  A engines/neverhood/entity.cpp
  A engines/neverhood/entity.h
  A engines/neverhood/gamemodule.cpp
  A engines/neverhood/gamemodule.h
  A engines/neverhood/gamevars.cpp
  A engines/neverhood/gamevars.h
  A engines/neverhood/graphics.cpp
  A engines/neverhood/graphics.h
  A engines/neverhood/klaymen.cpp
  A engines/neverhood/klaymen.h
  A engines/neverhood/menumodule.cpp
  A engines/neverhood/menumodule.h
  A engines/neverhood/messages.h
  A engines/neverhood/microtiles.cpp
  A engines/neverhood/microtiles.h
  A engines/neverhood/module.cpp
  A engines/neverhood/module.h
  A engines/neverhood/module.mk
  A engines/neverhood/modules/module1000.cpp
  A engines/neverhood/modules/module1000.h
  A engines/neverhood/modules/module1100.cpp
  A engines/neverhood/modules/module1100.h
  A engines/neverhood/modules/module1200.cpp
  A engines/neverhood/modules/module1200.h
  A engines/neverhood/modules/module1300.cpp
  A engines/neverhood/modules/module1300.h
  A engines/neverhood/modules/module1400.cpp
  A engines/neverhood/modules/module1400.h
  A engines/neverhood/modules/module1500.cpp
  A engines/neverhood/modules/module1500.h
  A engines/neverhood/modules/module1600.cpp
  A engines/neverhood/modules/module1600.h
  A engines/neverhood/modules/module1700.cpp
  A engines/neverhood/modules/module1700.h
  A engines/neverhood/modules/module1800.cpp
  A engines/neverhood/modules/module1800.h
  A engines/neverhood/modules/module1900.cpp
  A engines/neverhood/modules/module1900.h
  A engines/neverhood/modules/module2000.cpp
  A engines/neverhood/modules/module2000.h
  A engines/neverhood/modules/module2100.cpp
  A engines/neverhood/modules/module2100.h
  A engines/neverhood/modules/module2200.cpp
  A engines/neverhood/modules/module2200.h
  A engines/neverhood/modules/module2300.cpp
  A engines/neverhood/modules/module2300.h
  A engines/neverhood/modules/module2400.cpp
  A engines/neverhood/modules/module2400.h
  A engines/neverhood/modules/module2500.cpp
  A engines/neverhood/modules/module2500.h
  A engines/neverhood/modules/module2600.cpp
  A engines/neverhood/modules/module2600.h
  A engines/neverhood/modules/module2700.cpp
  A engines/neverhood/modules/module2700.h
  A engines/neverhood/modules/module2800.cpp
  A engines/neverhood/modules/module2800.h
  A engines/neverhood/modules/module2900.cpp
  A engines/neverhood/modules/module2900.h
  A engines/neverhood/modules/module3000.cpp
  A engines/neverhood/modules/module3000.h
  A engines/neverhood/mouse.cpp
  A engines/neverhood/mouse.h
  A engines/neverhood/navigationscene.cpp
  A engines/neverhood/navigationscene.h
  A engines/neverhood/neverhood.cpp
  A engines/neverhood/neverhood.h
  A engines/neverhood/palette.cpp
  A engines/neverhood/palette.h
  A engines/neverhood/resource.cpp
  A engines/neverhood/resource.h
  A engines/neverhood/resourceman.cpp
  A engines/neverhood/resourceman.h
  A engines/neverhood/saveload.cpp
  A engines/neverhood/scene.cpp
  A engines/neverhood/scene.h
  A engines/neverhood/screen.cpp
  A engines/neverhood/screen.h
  A engines/neverhood/smackerplayer.cpp
  A engines/neverhood/smackerplayer.h
  A engines/neverhood/smackerscene.cpp
  A engines/neverhood/smackerscene.h
  A engines/neverhood/sound.cpp
  A engines/neverhood/sound.h
  A engines/neverhood/sprite.cpp
  A engines/neverhood/sprite.h
  A engines/neverhood/staticdata.cpp
  A engines/neverhood/staticdata.h
  A engines/neverhood/todo.txt
    engines/configure.engines
    engines/engines.mk
    engines/plugins_table.h
    video/smk_decoder.h









More information about the Scummvm-git-logs mailing list